提问人:Chris W. 提问时间:9/1/2011 最后编辑:Peter MortensenChris W. 更新时间:6/28/2023 访问量:701347
使用 Python 在 Selenium WebDriver 中获取 WebElement 的 HTML 源代码
Get HTML source of WebElement in Selenium WebDriver using Python
问:
我正在使用 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 的最佳方式是什么?
答:
实际上没有一种直接的方法来获取 .你将不得不使用 JavaScript。我不太确定 python 绑定,但您可以在 Java 中轻松做到这一点。我敢肯定 Python 中一定有类似于类的东西。webelement
JavascriptExecutor
WebElement element = driver.findElement(By.id("foo"));
String contents = (String)((JavascriptExecutor)driver).executeScript("return arguments[0].innerHTML;", element);
评论
innerHTML
innerHTML
我希望这能有所帮助: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')
评论
您可以读取该属性以获取元素内容的源或包含当前元素的源。innerHTML
outerHTML
蟒:
element.get_attribute('innerHTML')
爪哇岛:
elem.getAttribute("innerHTML");
C#:
element.GetAttribute("innerHTML");
红宝石:
element.attribute("innerHTML")
JavaScript的:
element.getAttribute('innerHTML');
PHP的:
$element->getAttribute('innerHTML');
它已经过测试并与 .ChromeDriver
评论
getAttribute
HtmlUnitDriver
,此操作失败。适用于 、 、 (IE10) 和 (我没有测试过其他人)。ChromeDriver
FirefoxDriver
InternetExplorerDriver
PhantomJSDriver
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("xpath", "//*")
source_code = elem.get_attribute("outerHTML")
以下是将该 HTML 保存到文件的方法:
with open('c:/html_source_code.html', 'w') as f:
f.write(source_code.encode('utf-8'))
评论
time.sleep(x) # Where x is seconds
find_element_by_xpath
AttributeError: 'WebDriver' object has no attribute 'find_element_by_xpath'
driver.find_element_by_xpath("//*")
driver .find_element("xpath", "//*")
事实上,使用属性方法更容易、更直接。
将 Ruby 与 Selenium 和 PageObject gem 一起使用,要获得与某个元素关联的类,该行将是 .element.attribute(Class)
如果您想将其他属性绑定到元素,则相同的概念也适用。例如,如果我想要一个元素的字符串,.element.attribute(String)
在 Ruby 中,使用 selenium-webdriver (2.32.1),有一个包含整个页面源代码的方法。page_source
如果您对 Python 中的 Selenium Remote Control 解决方案感兴趣,以下是获取 innerHTML 的方法:
innerHTML = sel.get_eval("window.document.getElementById('prodid').innerHTML")
评论
innerHTML = {solenium selector code}.text
它看起来已经过时了,但无论如何都让它在这里。在您的案例中执行此操作的正确方法:
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');
评论
带有 Selenium 2.53.0 的 Java
driver.getPageSource();
评论
getPageSource
$driver->getPageSource()
InnerHTML 将返回所选元素内的元素,outerHTML 将返回内部 HTML 以及您选择的元素
例:
现在假设你的元素如下
<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>
现场示例:
您将在下面找到根据不同绑定所需的语法。根据需要更改为。innerHTML
outerHTML
蟒:
element.get_attribute('innerHTML')
爪哇岛:
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 标记的详细信息。然而,一个重要的方面是,现代网站越来越多地实现 JavaScript、ReactJS、jQuery、Ajax、Vue.js、Ember.js、GWT 等,以呈现 DOM 树中的动态元素。因此,在检索标记之前,有必要等待元素及其子元素完全呈现。
蟒
因此,理想情况下,您需要为 Web DriverWait 诱导 并且可以使用以下任一定位器策略:visibility_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"))
用:
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))
注意:您必须添加以下导入:
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获取 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');
评论
更新了 2022 Selenium 检索 HTML
首先,下载 Selenium WebDriver 的 Python 绑定。
- 可以从 Selenium 包的 PyPI 页面执行此操作。
- 或者,可以使用 pip 安装 Selenium 软件包。Python 3.6 在标准库中提供了 pip。
方法 1
读取属性以获取元素内容的来源。 是 DOM 元素的属性,其值是开始标记和结束标记之间的 HTML。innerHTML
innerHTML
例如,下面代码中的 innerHTML 属性带有值“text”
<p>
a text
</p>
element.get_attribute('innerHTML')
方法 2
读取 以获取当前元素的源。 是一个元素属性,其值是开始和结束标记之间的 HTML 以及所选元素本身的 HTML。outerHTML
outerHTML
例如,代码的属性带有一个值,该值包含 和 。outerHTML
div
span
<div>
<span>Hello there!</span>
</div>
ele.get_atrribute("outerHTML")
评论
wd.page_source