使用Python在Selenium WebDriver中获取WebElement的HTML源代码

Chr*_* W. 434 python selenium automated-tests webdriver selenium-webdriver

我正在使用Python绑定来运行Selenium WebDriver.

from selenium import webdriver
wd = webdriver.Firefox()
Run Code Online (Sandbox Code Playgroud)

我知道我可以抓住这样的一个元素......

elem = wd.find_element_by_css_selector('#my-id')
Run Code Online (Sandbox Code Playgroud)

而且我知道我可以获得完整的页面来源...

wd.page_source
Run Code Online (Sandbox Code Playgroud)

但无论如何要获得"元素来源"?

elem.source   # <-- returns the HTML as a string
Run Code Online (Sandbox Code Playgroud)

用于Python的selenium webdriver文档基本上不存在,我在代码中看不到任何似乎启用该功能的内容.

有关访问元素(及其子元素)的HTML的最佳方法的任何想法?

小智 689

您可以读取innerHTML属性以获取元素内容outerHTML来源或使用当前元素获取源的来源.

蟒蛇:

element.get_attribute('innerHTML')
Run Code Online (Sandbox Code Playgroud)

Java的:

elem.getAttribute("innerHTML");
Run Code Online (Sandbox Code Playgroud)

C#:

element.GetAttribute("innerHTML");
Run Code Online (Sandbox Code Playgroud)

红宝石:

element.attribute("innerHTML")
Run Code Online (Sandbox Code Playgroud)

JS:

element.getAttribute('innerHTML');
Run Code Online (Sandbox Code Playgroud)

PHP:

$element->getAttribute('innerHTML');
Run Code Online (Sandbox Code Playgroud)

经过测试和使用ChromeDriver.

  • 虽然innerHTML不是DOM属性,但它得到了所有主流浏览器的良好支持(http://www.quirksmode.org/dom/w3c_html.html).它也适合我. (21认同)
  • **这对于'HtmlUnitDriver`来说是失败的.**适用于`ChromeDriver`,`FirefoxDriver`,`InternetExplorerDriver`(IE10)和`PhantomJSDriver`(我没有测试过其他人). (21认同)
  • innerHTML是一个非DOM属性.所以上面的答案是行不通的.innerHTML是一个javascript javascript值.执行上述操作将返回null.尼尔什的答案是正确的答案. (9认同)
  • 这对我很有用,并且比公认的答案更优雅.我正在使用Selenium 2.24.1. (6认同)
  • +1这似乎也适用于红宝石.我觉得`getAttribute`方法(或其他语言中的等价方法)只调用名称为arg的js方法.但是文档没有明确说明这一点,所以nilesh的解决方案应该是一个后备. (3认同)
  • 在Node中:`element.getAttribute('innerHTML')` (2认同)

nil*_*esh 88

实际上并没有一种直接获取webelement的html源代码的方法.你将不得不使用JS.我不太确定python绑定,但你可以在Java中轻松做到这一点.我确信JavascriptExecutor在Python中必须有类似于类的东西.

 WebElement element = driver.findElement(By.id("foo"));
 String contents = (String)((JavascriptExecutor)driver).executeScript("return arguments[0].innerHTML;", element); 
Run Code Online (Sandbox Code Playgroud)

  • 我认为下面的答案,使用element.getAttribute("innerHTML")更容易阅读.我不明白为什么人们会投票. (7认同)
  • @Anthon`innerHTML`不是DOM属性.当我在2011年回答这个问题时,它对我不起作用,看起来现在有些浏览器支持它.如果它适合你,那么使用`innerHTML`更清洁.但是,无法保证它适用于所有浏览器. (6认同)
  • 显然,这是使用RemoteWebDriver时获取innerHTML的唯一方法 (2认同)

Mar*_*ark 64

当然,我们可以在Selenium Python中使用以下脚本获取所有HTML源代码:

elem = driver.find_element_by_xpath("//*")
source_code = elem.get_attribute("outerHTML")
Run Code Online (Sandbox Code Playgroud)

如果要将其保存到文件:

f = open('c:/html_source_code.html', 'w')
f.write(source_code.encode('utf-8'))
f.close()
Run Code Online (Sandbox Code Playgroud)

我建议保存到文件,因为源代码非常长.

  • 我可以设置延迟并获取最新的来源吗?使用javascript加载动态内容. (2认同)

小智 12

在Ruby中,使用selenium-webdriver(2.32.1),有一个page_source包含整个页面源的方法.


Deb*_*anB 9

其他答案提供了有关检索WebElement标记的大量详细信息。然而,一个重要的方面是,现代网站越来越多地实现JavaScriptReactJSjQueryAjaxVue.jsEmber.jsGWT等来渲染DOM 树中的动态元素。因此,在检索标记之前,有必要等待元素及其子元素完全渲染。


Python

因此,理想情况下,您需要引发WebDriverWaitvisibility_of_element_located(),并且可以使用以下任一定位器策略

  • 使用get_attribute("outerHTML")

    element = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#my-id")))
    print(element.get_attribute("outerHTML"))
    
    Run Code Online (Sandbox Code Playgroud)
  • 使用execute_script()

    element = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#my-id")))
    print(driver.execute_script("return arguments[0].outerHTML;", element))
    
    Run Code Online (Sandbox Code Playgroud)
  • 注意:您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
    Run Code Online (Sandbox Code Playgroud)


Tif*_*y G 5

实际上,使用属性方法更容易,更直接。

将Ruby与Selenium和PageObject宝石一起使用,以获取与某个元素关联的类,该行将为element.attribute(Class)

如果您想将其他属性绑定到元素,则适用相同的概念。例如,如果我想要元素的String element.attribute(String)


nef*_*ski 5

它看起来过时了,但无论如何让它在这里。在您的情况下执行此操作的正确方法:

elem = wd.find_element_by_css_selector('#my-id')
html = wd.execute_script("return arguments[0].innerHTML;", elem)
Run Code Online (Sandbox Code Playgroud)

或者

html = elem.get_attribute('innerHTML')
Run Code Online (Sandbox Code Playgroud)

两者都为我工作(selenium-server-standalone-2.35.0)。