水豚中的正则表达式 have_xpath

Regex in capybara have_xpath

我有一个文本,当它被点击时会改变装饰。在我点击之前的测试中,我想检查它是否已经被点击过。它改变了我想检查的颜色、文字装饰和 href。

由于 href 包含会话特定信息,所以我想使用正则表达式。

if page.have_xpath("//a[contains(@href,\"%20Administrators?\")]")

即使页面已经更新并且管理员文本已更改为其他内容,这也会通过。

我应该如何更正语法以接受所有包含“%20Administrators”的 href?文本。我想将它添加到 if 子句中,就好像页面中有 link 和文本管理员一样。

点击前:href="/sometext/%20Administrators?redirect=sometext" 点击后:href="/sometext/%20Standard?redirect=sometext"

您在这里遇到的主要问题是使用 have_xpath 而不是 has_xpath?have_xpath returns 一个 RSpec 匹配器,因此当与 if 一起使用时将始终评估为真(因为它 returns 一个对象并且实际上还没有评估传入的任何 XPath)。 has_xpath? returns 真或假的布尔结果。

if page.has_xpath?('.//a[contains(@href,"%20Administrators?")]')

第二个问题是您的问题询问的是正则表达式,但是 XPath 1.0(浏览器支持)不支持正则表达式并且您的 XPath 根本没有使用正则表达式(只是一个 contains 表达式) .如果你真的想使用正则表达式来测试 href(并且有更好的阅读代码)你应该使用 has_link? 布尔方法 - 沿着

if page.has_link?(href: /Administrators/) 
如果需要,

has_link? 也可以验证 link 的可见文本

if page.has_link?('Visible text of the link', href: /Administrators/)

最后,当将 XPath 与 Capybara 一起使用时,99% 的情况下您应该以 .// 开始您的 XPath 而不仅仅是 // - 请参阅 https://github.com/teamcapybara/capybara#beware-the-xpath--trap - 这就是为什么通常使用 CSS and/or Capybara 提供的更具体的方法比 xxx_xpath 方法更干净。

另一件需要注意的事情是,所有提到的方法默认情况下都有等待行为,因此它们最多会等待 Capybara.default_max_wait_time 秒,以便页面有匹配的 link。如果您知道该页面是稳定的并且只想立即知道匹配的 link 是否存在,您可能希望将 wait: false 作为选项传递

if page.has_link?(href: /Administrators/, wait: false)