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

时间:2011-08-31 21:44:11

标签: python selenium selenium-webdriver webdriver automated-tests

我正在使用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的最佳方法的任何想法吗?

15 个答案:

答案 0 :(得分:627)

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

的Python:

element.get_attribute('innerHTML')

爪哇:

elem.getAttribute("innerHTML");

C#:

element.GetAttribute("innerHTML");

红宝石:

element.attribute("innerHTML")

JS:

element.getAttribute('innerHTML');

PHP:

$elem.getAttribute('innerHTML');

经过测试并使用ChromeDriver

答案 1 :(得分:86)

没有一种直接获取webelement的html源代码的方法。你将不得不使用JS。我不太确定python绑定,但你可以在Java中轻松做到这一点。我确信在Python中必须有类似于JavascriptExecutor类的东西。

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

答案 2 :(得分:63)

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

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

如果您要将其保存到文件:

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

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

答案 3 :(得分:11)

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

答案 4 :(得分:4)

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

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

如果您想获得与元素相关联的其他属性,则适用相同的概念。例如,如果我想要一个元素的字符串element.attribute(String)

答案 5 :(得分: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)

答案 6 :(得分:2)

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

这里描述了Java方法:

java.lang.String    getText() 

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

E.g。

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

答案 7 :(得分:1)

使用Selenium 2.53.0的Java

driver.getPageSource();

答案 8 :(得分:0)

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

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

答案 9 :(得分:0)

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

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

答案 10 :(得分:0)

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>

直播示例: -

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

爪哇:

elem.getAttribute("innerHTML");

如果您希望整页HTML使用以下代码: -

driver.getPageSource();

答案 11 :(得分: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")

答案 12 :(得分:0)

这对我来说是无缝的。

element.get_attribute('innerHTML')

答案 13 :(得分:0)

其他答案提供了有关检索WebElement的标记的许多详细信息。但是,一个重要方面是,现代网站越来越多地实施JavaScriptReactJSjQueryAjaxVue.jsEmber.js,{{ 3}}等以呈现GWT中的动态元素。因此,在检索标记之前,必须等待元素及其子元素完全呈现。


Python

因此,理想情况下,您需要为visibility_of_element_located()引入DOM tree,并且可以使用以下任一WebDriverWait

  • 使用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
    

答案 14 :(得分:-1)

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

此代码也可以从源代码获取JavaScript!