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


474

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

from selenium import webdriver
wd = webdriver.Firefox()

我知道我可以像这样抓取网络元素:

elem = wd.find_element_by_css_selector('#my-id')

我知道我可以通过...

wd.page_source

但是无论如何,有没有获得“元素来源”?

elem.source   # <-- returns the HTML as a string

Python的Selenium Webdriver文档基本上不存在,我在代码中看不到任何能够启用该功能的东西。

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


8
您也可以wd.page_source使用beautifulsoup 解析所有内容
eLRuLL 2013年

Answers:


746

您可以读取innerHTML属性以获取元素内容outerHTML来源或包含当前元素的来源。

蟒蛇:

element.get_attribute('innerHTML')

Java:

elem.getAttribute("innerHTML");

C#:

element.GetAttribute("innerHTML");

红宝石:

element.attribute("innerHTML")

JS:

element.getAttribute('innerHTML');

PHP:

$element->getAttribute('innerHTML');

经过测试并与ChromeDriver


9
innerHTML是非DOM属性。因此,以上答案不起作用。innerHTML是一个javascript javascript值。进行上述操作将返回null。nilesh的答案是正确的答案。
bibstha 2012年

6
这对我来说效果很好,并且比接受的答案优雅得多。我正在使用Selenium 2.24.1。
Ryan Shillington

22
尽管innerHTML不是DOM属性,但是所有主流浏览器(quirksmode.org/dom/w3c_html.html)都很好地支持它。对我来说也很好。
CuongHuyTo

3
+1这似乎也适用于红宝石。我感觉该getAttribute方法(或其他语言的等效方法)仅调用名称为arg的js方法。但是文档没有明确说明这一点,因此nilesh的解决方案应该是一个后备。
开尔文2012年

23
失败HtmlUnitDriver工程ChromeDriverFirefoxDriverInternetExplorerDriver(IE10)和PhantomJSDriver(我没有测试等)。
acdcjunior 2014年

91

获取a的html源代码实际上并没有直接的方法webelement。您将不得不使用JS。我不太确定python绑定,但是您可以在Java中轻松地做到这一点。我确信一定有一些类似于JavascriptExecutorPython中的类。

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

1
尽管与Python相当,但这实际上是我最终要做的。
克里斯·W.

8
我认为下面的答案使用element.getAttribute(“ innerHTML”)更容易阅读。我不明白为什么人们对此表示反对。
Ryan Shillington

1
完全不需要调用javascript。在Python中,只需使用element.get_attribute('innerHTML')
Anthon

6
@Anthon innerHTML不是DOM属性。当我在2011年回答此问题时,它对我不起作用,看起来现在有些浏览器正在支持它。如果它适合您,则使用innerHTML更清洁。但是,不能保证它将在所有浏览器上都能正常工作。
nilesh 2014年

2
显然,这是使用RemoteWebDriver时获取innerHTML的唯一方法
Illidan

73

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

elem = driver.find_element_by_xpath("//*")
source_code = elem.get_attribute("outerHTML")

如果要保存到文件:

with open('c:/html_source_code.html', 'w') as f:
    f.write(source_code.encode('utf-8'))

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


2
我可以设置延迟并获取最新消息吗?使用javascript加载了动态内容。
CodeGuru

即使页面未完全加载,此方法也有效吗?此外,有没有办法设置像@FlyingAtom这样的延迟?
TheRookierLearner

13

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


5

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

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

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


4

看起来已经过时了,但无论如何还是要放在这里。在您的情况下,正确的做法是:

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

要么

html = elem.get_attribute('innerHTML')

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


3

Java与Selenium 2.53.0

driver.getPageSource();

这不是问题所要的
Corey Goldberg

根据网络驱动程序的不同,该getPageSource方法可能不会返回实际的页面源(即可能更改了JavaScript)。返回的源可以是服务器发送的原始源。必须检查webdriver文档以确保这一点。
斯蒂芬,

2

希望对您有所帮助:http : //selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/WebElement.html

这里介绍Java方法:

java.lang.String    getText() 

但不幸的是,它在Python中不可用。因此,您可以将方法名称从Java转换为Python,并使用当前方法尝试另一种逻辑,而无需获取整个页面的源代码...

例如

 my_id = elem[0].get_attribute('my-id')

6
Python实际上确实有一个等效的“ gettext”(我认为它只是“ text”属性?),但实际上它只是返回HTML标签之间的“纯文本”,而实际上不会返回完整的HTML源代码。
克里斯·W.

2
这也只返回Java中的纯文本(而不是html)。
瑞安·希灵顿

您必须像说elem [0]一样引用它,否则它将不起作用
HelloW 2013年


1

InnerHTML将返回所选元素内的元素,而outerHTML将连同所选元素一起返回HTML内

示例:-现在假设您的Element如下

<tr id="myRow"><td>A</td><td>B</td></tr>

innerHTML元素输出

<td>A</td><td>B</td>

outsideHTML元素输出

<tr id="myRow"><td>A</td><td>B</td></tr>

现场示例:-

http://www.java2s.com/Tutorials/JavascriptDemo/f/find_out_the_difference_between_innerhtml_and_outerhtml_in_javascript_example.htm

在下面,您将找到根据不同绑定要求的语法。根据需要将更innerHTML改为outerHTML

蟒蛇:

element.get_attribute('innerHTML')

Java:

elem.getAttribute("innerHTML");

如果您想使用整页HTML,请使用以下代码:-

driver.getPageSource();

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

该代码也确实可以从源代码中获取JavaScript!


0

在PHPUnit硒测试中,它是这样的:

$text = $this->byCssSelector('.some-class-nmae')->attribute('innerHTML');

0

如果您对Python中的远程控制解决方案感兴趣,请按照以下方法获取innerHTML:

innerHTML = sel.get_eval("window.document.getElementById('prodid').innerHTML")

感谢您的帮助,我已经用过了。我也发现innerHTML = {solenium selector code}.text作品是一样的。
Shane

0

我更喜欢获取呈现的HTML的方法如下:

driver.get("http://www.google.com")
body_html = driver.find_element_by_xpath("/html/body")
print body_html.text

但是,上述方法会删除所有标签(也是嵌套标签),并且仅返回文本内容。如果您也有兴趣获取HTML标记,请使用以下方法。

print body_html.getAttribute("innerHTML")

1
您也可以使用driver.find_element_by_tag(“ body”)到达页面的正文内容。
生锈的
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.