selenium + capybara:在元素中的任何位置找到选择器

时间:2017-01-10 16:08:26

标签: selenium xpath capybara

假设我们有一个<div class='whatever'>,并且内部有一个元素<div class='inside-whatever'>

我需要的是是一种使用Capybara和/或Selenium的方法访问特定 inside-whatever -div的方法。

问题<div class='inside-whatever'>内的网页上有另一个{{1>} ,所以

<div class='whatever'>

返回一个错误,主要是说页面上有多个 inside-whatever div。

什么有用是从 构建xpath,如

within(:xpath,'//div[@class="whatever"]') do find(:xpath,'//div[@class="inside-whatever"]) end

但那是纯粹的疯狂。

那么,有没有更好的方法可以在任何给定元素中查找任何地方而无需指定直接路径?

2 个答案:

答案 0 :(得分:2)

您可以像这样合并您的xpath:

//div[@class="whatever"]//div[@class="inside-whatever"]

答案 1 :(得分:2)

这里真正的问题是你已经陷入了XPath //陷阱

find(:xpath,'//div[@class="inside-whatever"])

全局搜索而不是从上下文节点搜索。相反,您应该习惯使用.//启动XPath,它将从当前上下文节点

进行搜索
within(:xpath,'.//div[@class="whatever"]') do
  find(:xpath,'.//div[@class="inside-whatever"])
end

并按照您的期望行事。这在Capybara README中提到 - https://github.com/teamcapybara/capybara#beware-the-xpath--trap

注意:CSS选择器没有这个问题,对于大多数元素,人们都选择了read cleaner,这就是为什么Capybara默认使用:css选择器

within('div.whatever') do
  find('div.inside-whatever")
end