使用部分类名称和精确文本在ruby中使用capybara查找元素的Xpath

时间:2017-11-02 14:13:35

标签: ruby regex xpath capybara

我有一个带有div的html代码,其类名与menu1相同,文本类似

  

柏林

  

柏林德国

当我使用下面的代码时返回不明确的元素

find(:xpath,“// div [contains(text(),\”Berlin \“)并包含(@class,\”menu1 \“)]”)

注意:我希望类和文本都在我的xpath中

建议将不胜感激,谢谢。

1 个答案:

答案 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;

那么简单