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
假设我们有一个 <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