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的最佳方式有什么想法吗?
您可以读取
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'); |
测试并与
没有一种直接的方法可以获得WebElement的HTML源代码。你必须使用JS。我对Python绑定不太确定,但是在Java中您可以很容易地这样做。我确信在python中一定有类似于
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),有一个包含整个页面源的
看起来过时了,但还是让它在这里吧。在您的案例中,正确的方法是:
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,为了获得与某个元素相关联的类,行应该是
如果您希望获得与元素相关的其他属性,那么同样的概念也适用。例如,如果我想要元素的字符串,
我希望这有助于: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_的区别
下面您将找到根据不同绑定需要的语法。按要求将
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!