XPath找不到元素

时间:2019-05-28 03:05:26

标签: xpath rspec capybara

我选择以下内容的路径出了什么问题?

<label class="form-control-label" for="profile_form_state">State</label>

Xpath:

xpath = '//label[ends-with(@for, "_state")]'

我正在使用rspec和capybara

 expect(rendered).to have_xpath(xpath)

错误:

   xmlXPathCompOpEval: function ends-with not found

4 个答案:

答案 0 :(得分:0)

看起来您的XPath处理器仅支持XPath 1.0,而ends-with是在XPath 2.0及更高版本中定义的。但是您可以simulate ends-with() in XPath 1.0使用substring()string-length()

xpath = '//label["_state" = substring(@for, string-length(@for) - string-length("_state") +1)]'

您可以通过将string-length("_state") +1替换为预先计算的值5(单词的长度_state减去1)来缩短表达式:

xpath = '//label["_state" = substring(@for, string-length(@for) - 5)]'

答案 1 :(得分:0)

其他可能的Xpath

// label [包含(@for,'_state')]

// label [text()='State']

// label [包含(text(),'State')]

答案 2 :(得分:0)

尝试以下Xpath。

xpath = '//label[contains(., "State")]'

答案 3 :(得分:0)

@ har07回答说,XPath 1.0(由浏览器实现)没有ends-with,但是CSS提供了以-end结尾的属性选择器$=

expect(rendered).to have_css(‘label[for$=“_state”]’)

或者您可以将正则表达式与Capybaras内置的:label selector一起使用

expect(rendered).to have_selector(:label, for: /_state$/)

如果您真的想在CSS上坚持使用XPath,则可以使用Capybara内部使用的xpath gem来生成自己的XPath并编写

xpath = XPath.descendant(:label).where(XPath.attr(:for).ends_with('_start'))
expect(rendered).to have_xpath(xpath)
相关问题