代码之家  ›  专栏  ›  技术社区  ›  Bharath M

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

  •  0
  • Bharath M  · 技术社区  · 8 年前

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

    柏林

    德国柏林

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

    查找(:xpath,“//div[contains(text(),\“Berlin\”)和contains(@class,\“menu1\”))

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

    建议将不胜感激,提前感谢。

    1 回复  |  直到 8 年前
        1
  •  3
  •   Thomas Walpole    8 年前

    如果部分类名的意思是 <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')
    

    如果出于性能原因(很多 div.menu1 页面上的元素,由于某些疯狂的原因,您无法扩展到页面的有限部分),然后您可以执行以下操作

    find(:xpath, './/div[text()="Berlin"][contains(@class, "menu1")]')
    

    注意前导 . 在XPath表达式中。99.9%的情况下,当使用水豚并手动编写自己的XPath表达式时,您希望用 .// ,否则您将破坏您所做的任何范围界定-请参阅 https://github.com/teamcapybara/capybara#beware-the-xpath--trap

    xpath gem 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 方法可以从contains更改为equals,具体取决于 exact 选项,如果字符串没有“Berlin”那么简单,它还可以根据需要处理所有字符串的规格化和转义