selenium + capybara:在元素内的任何地方找到选择器

selenium + capybara: find selector anywhere within element

假设我们有一个 <div class='whatever'> 并且在内部深处的某处有一个元素 <div class='inside-whatever'>

我需要的 是一种使用 Capybara 的 and/or Selenium 的方法。

问题是,页面上还有一个<div class='inside-whatever'>不是里面<div class='whatever'>,所以

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

returns 一个错误,基本上是说页面上有多个 inside-whatever div。

有效的方法 是从 任何 构建 xpath,例如

'//div[@class="whatever"]/div/div[3]/div/div[5]'

但这纯粹是疯狂。

那么,有没有更好的方法可以在任何给定元素内的任意位置 中查找选择器 而无需指定直接路径?

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

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

这里真正的问题是您掉入了 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 选择器没有这个问题,对于大多数元素,人们都选择读取清洁器,这就是 Capybara 默认使用 :css 选择器

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