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)
我通往 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)