我使用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的最佳方法是什么?


当前回答

使用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")

其他回答

其他答案提供了大量关于检索WebElement标记的细节。然而,一个重要的方面是,现代网站越来越多地实现JavaScript, ReactJS, jQuery, Ajax, Vue.js, Ember.js, GWT等来呈现DOM树中的动态元素。因此,在检索标记之前,有必要等待元素及其子元素完全呈现。


Python

因此,理想情况下,你需要为visibility_of_element_locate()诱导WebDriverWait,你可以使用以下定位器策略之一:

Using get_attribute("outerHTML"): element = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#my-id"))) print(element.get_attribute("outerHTML")) Using 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)) Note: You have to add the following imports: from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC

在当前版本的php-webdriver(1.12.0+)中,您必须使用

$element->getDomProperty('innerHTML');

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

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();

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

将Ruby与Selenium和PageObject宝石一起使用,以获得与某个元素相关联的类,行代码为element.attribute(class)。

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

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

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

or

html = elem.get_attribute('innerHTML')

两者都适合我(selenium-server-standalone-2.35.0)。