XPath 没有定位元素

XPath not locating element

我通往 select 以下内容的路径有什么问题:

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

Xpath:

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

我正在使用 rspec 和水豚

 expect(rendered).to have_xpath(xpath)

错误:

   xmlXPathCompOpEval: function ends-with not found

看起来您的 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 替换为 pre-calculated 值 5 来稍微缩短表达式(单词的长度 _state 减一):

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

其他可能的 Xpath

//label[contains(@for, '_state')]

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

//label[contains(text(), 'State')]

尝试以下 Xpath。

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

正如@har07 的回答,XPath 1.0(浏览器实现)没有 ends-with 但 CSS 提供了 ends-with 属性选择器 $=

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

或者您可以对水豚使用正则表达式 built-in :label selector

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

如果你真的想坚持使用 XPath 而不是 CSS 那么你可以使用 xpath gem Capybara 在内部使用来生成它自己的 XPath 并写

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