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

Get HTML Source of WebElement in Selenium WebDriver using Python

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

1
2
from selenium import webdriver
wd = webdriver.Firefox()

我知道我可以抓取一个这样的webelement…

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

我知道我可以用…

1
wd.page_source

但是有没有办法得到"元素源"?

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

用于Python的SeleniumWebDriver文档基本上不存在,我在代码中看不到任何支持该功能的内容。

对访问元素(及其子元素)HTML的最佳方式有什么想法吗?


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

Python:

1
element.get_attribute('innerHTML')

爪哇:

1
elem.getAttribute("innerHTML");

C:

1
element.GetAttribute("innerHTML");

红宝石:

1
element.attribute("innerHTML")

JS:

1
element.getAttribute('innerHTML');

PHP:

1
$elem.getAttribute('innerHTML');

测试并与ChromeDriver一起工作。


没有一种直接的方法可以获得WebElement的HTML源代码。你必须使用JS。我对Python绑定不太确定,但是在Java中您可以很容易地这样做。我确信在python中一定有类似于JavascriptExecutor类的东西。

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


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

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

如果要将其保存到文件:

1
2
3
f = open('c:/html_source_code.html', 'w')
f.write(source_code.encode('utf-8'))
f.close()

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


在Ruby中,使用Selenium WebDriver(2.32.1),有一个包含整个页面源的page_source方法。


看起来过时了,但还是让它在这里吧。在您的案例中,正确的方法是:

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

1
html = elem.get_attribute('innerHTML')

两者都为我工作(Selenium-Server-Standalone-2.35.0)


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

使用带有Selenium和PageObject宝石的Ruby,为了获得与某个元素相关联的类,行应该是element.attribute(Class)

如果您希望获得与元素相关的其他属性,那么同样的概念也适用。例如,如果我想要元素的字符串,element.attribute(String)


我希望这有助于:http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/webelement.html

这里描述了Java方法:

1
java.lang.String    getText()

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

例如。

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


使用硒2.53.0的Java

1
driver.getPageSource();


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

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

但是,上面的方法会删除所有标记(也是嵌套标记),只返回文本内容。如果您也对获取HTML标记感兴趣,请使用下面的方法。

1
print body_html.getAttribute("innerHTML")


innerhtml将返回所选元素内的元素,outerhtml将与所选元素一起返回HTML内。

例子:现在假设您的元素如下

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

innerhtml元素输出

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

outerhtml元素输出

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

活生生的例子:

http://www.java2s.com/tutorials/javascriptmemo/f/find_out_javascript_example.htm中_innerhtml_和_outerhtml_的区别

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

Python:

1
element.get_attribute('innerHTML')

爪哇:

1
elem.getAttribute("innerHTML");

如果要整页HTML,请使用以下代码:

1
driver.getPageSource();

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

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


如果您对Python中的远程控制解决方案感兴趣,下面介绍如何获取innerhtml:

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


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

这段代码也可以从源代码中获取javascript!