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

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

from selenium import webdriver
wd = webdriver.Firefox()

我知道我可以像这样抓取一个webelement:

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

我知道我可以得到整页的源代码…

wd.page_source

但是有办法得到“元素源”吗?

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

Python的Selenium WebDriver文档基本上不存在,我在代码中没有看到任何支持该功能的东西。

访问一个元素(及其子元素)的HTML的最佳方法是什么?

639697 次浏览

实际上没有一种直接的方法来获取webelement的HTML源代码。你必须使用JavaScript。我不太确定python绑定,但在Java中可以很容易地这样做。我相信在Python中一定有类似JavascriptExecutor类的东西。

 WebElement element = driver.findElement(By.id("foo"));
String contents = (String)((JavascriptExecutor)driver).executeScript("return arguments[0].innerHTML;", element);
我希望这可以帮助: # EYZ0 < / p >

下面介绍Java方法:

java.lang.String    getText()

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

如。

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

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

Python:

element.get_attribute('innerHTML')

Java:

elem.getAttribute("innerHTML");

c#:

element.GetAttribute("innerHTML");

Ruby:

element.attribute("innerHTML")

JavaScript:

element.getAttribute('innerHTML');

PHP:

$element->getAttribute('innerHTML');

它被测试并与ChromeDriver一起工作。

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

这段代码真的可以从源代码获得JavaScript !

当然,我们可以用下面的脚本在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'))

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

实际上,使用属性方法更简单、更直接。

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

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

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

如果你对Python中硒遥控器的解决方案感兴趣,下面是如何获得innerHTML:

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

它看起来过时了,但不管怎样,就让它留在这里吧。在你的情况下,正确的做法是:

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)。

PHPUnit) Selenium测试中,它是这样的:

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

Java与Selenium 2.53.0

driver.getPageSource();

InnerHTML将返回所选元素内部的元素,outerHTML将返回所选元素的内部HTML

例子:

现在假设您的Element如下所示

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

innerHTML元素输出

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

outerHTML元素输出

<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

Python:

element.get_attribute('innerHTML')

Java:

elem.getAttribute("innerHTML");

如果你想要整个页面的HTML,使用下面的代码:

driver.getPageSource();

获得我喜欢的渲染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")

这对我来说非常有效。

element.get_attribute('innerHTML')

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


Python

因此,理想情况下,你需要为visibility_of_element_located()诱导WebDriverWait,你可以使用以下定位策略中的任何一个:

  • 使用# EYZ0 < p >:

    element = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#my-id")))
    print(element.get_attribute("outerHTML"))
    
  • 使用# EYZ0 < p >:

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

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

使用execute_script get html

bs4(BeautifulSoup)也可以快速访问html标签。

from bs4 import BeautifulSoup
html = adriver.execute_script("return document.documentElement.outerHTML")
bs4_onepage_object=BeautifulSoup(html,"html.parser")
bs4_div_object=bs4_onepage_object.find_all("atag",class_="attribute")

php-webdriver(1.12.0+)的当前版本中,您可以使用

$element->getDomProperty('innerHTML');

正如本期所指出的:https://github.com/php-webdriver/php-webdriver/issues/929

PHP Selenium WebDriver中,你可以得到这样的页面源代码:

$html = $driver->getPageSource();

或者像这样获取元素的HTML:

// innerHTML if you need HTML of the element content
$html = $element->getDomProperty('outerHTML');