我选择以下内容的路径出了什么问题?
<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
答案 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)