我有一个带有div的html代码,其类名与menu1相同,文本类似
柏林
和
柏林德国
当我使用下面的代码时返回不明确的元素
find(:xpath,“// div [contains(text(),\”Berlin \“)并包含(@class,\”menu1 \“)]”)
注意:我希望类和文本都在我的xpath中
建议将不胜感激,谢谢。
答案 0 :(得分:1)
如果通过部分类名称,您的意思是<div class="blah menu1 other">Berlin</div>
,那么您可以通过类似
find('div.menu1', exact_text: 'Berlin')
或
find('div.menu1', text: 'Berlin', exact: true)
如果它更像<div class="blah menu1_part other">Berlin</div>
,您仍然可以使用更易读的CSS选择器,例如
find('div[class*=menu1]', exact_text: 'Berlin')
如果你出于性能原因需要在一个XPath中完成所有这些操作(页面上有很多div.menu1
个元素,你可以将这些元素放在页面的有限部分,这是出于某种疯狂的原因)然后你可以做类似
find(:xpath, './/div[text()="Berlin"][contains(@class, "menu1")]')
注意XPath表达式中的前导.
。 99.9%的时间使用Capybara并手动编写自己的XPath表达式时,您希望使用.//
启动XPath表达式,否则您将击败您所做的任何范围 - 请参阅https://github.com/teamcapybara/capybara#beware-the-xpath--trap
另一种选择是使用内部xpath
宝石Capybara用于生成XPath,这类似于
find(:xpath, XPath.css('div.menu1')[XPath.string.n.is('Berlin')], exact: true)
或
find(:xpath, XPath.css('div[class *= "menu1"]')[XPath.string.n.is('Berlin')], exact: true)
取决于partial class name
的具体含义。这样做的好处是is
方法的含义可以根据exact
选项的值从contains更改为equals,并且它还处理字符串的所有规范化和转义为如果你的字符串不像柏林&#39;