Selenium Webdriver在子元素中查找元素

Dom*_*kin 52 python selenium xpath

我试图用Selenium(版本2.28.0)搜索子元素中的元素,但selenium des似乎没有将其搜索限制为子元素.我这样做错了还是有办法使用element.find来搜索子元素?

举个例子,我用这段代码创建了一个简单的测试网页:

<!DOCTYPE html>
<html>
    <body>
        <div class=div title=div1>
            <h1>My First Heading</h1>
            <p class='test'>My first paragraph.</p>
        </div>
        <div class=div title=div2>
            <h1>My Second Heading</h1>
            <p class='test'>My second paragraph.</p>
        </div>
        <div class=div title=div3>
            <h1>My Third Heading</h1>
            <p class='test'>My third paragraph.</p>
        </div>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

我的python(2.6版)代码如下所示:

from selenium import webdriver

driver = webdriver.Firefox()

# Open the test page with this instance of Firefox

# element2 gets the second division as a web element
element2 = driver.find_element_by_xpath("//div[@title='div2']")

# Search second division for a paragraph with a class of 'test' and print the content
print element2.find_element_by_xpath("//p[@class='test']").text 
# expected output: "My second paragraph."
# actual output: "My first paragraph."
Run Code Online (Sandbox Code Playgroud)

如果我跑:

print element2.get_attribute('innerHTML')
Run Code Online (Sandbox Code Playgroud)

它返回第二个分区的html.因此,selenium不会将其搜索限制为element2.

我希望能够找到element2的子元素.这篇文章建议我的代码应该工作Selenium WebDriver访问子元素,但他的问题是由超时问题引起的.

任何人都可以帮我理解这里发生的事情吗?

p0d*_*eje 93

当您启动XPath表达式时//,它会从文档的根目录中搜索,忽略您的父元素.你应该在表达前加上.

element2 = driver.find_element_by_xpath("//div[@title='div2']")
element2.find_element_by_xpath(".//p[@class='test']").text 
Run Code Online (Sandbox Code Playgroud)

  • 这不是WebDriver的设计错误,这就是XPath规范所要求的. (8认同)
  • 这是WebDriver中不幸的设计错误,已被包含为功能。WebDriver中的所有其他`element.find_element_by_whatever()`方法都在指定元素的上下文中执行搜索。find_element_by_xpath()没有。[Selenium bug#403](http://code.google.com/p/selenium/issues/detail?id=403)更加详细。 (2认同)

小智 6

使用以下内容:

element2 = driver.find_element_by_cssselector("css=div[title='div2']")
element2.find_element_by_cssselector("p[@class='test']").text 
Run Code Online (Sandbox Code Playgroud)

如果您有任何问题,请告诉我。


小智 5

我想,当使用“driver.find_element”时,我们需要使用 webdriver.common.by 中的方法“By”。

所以...代码必须是:

from selenium import webdriver

driver = webdriver.Firefox()
from selenium.webdriver.common.by import By

element2 = driver.find_element(By.XPATH, "//div[@title='div2']")
element2.find_element(By.XPATH, ".//p[@class='test']").text
Run Code Online (Sandbox Code Playgroud)