如何通过匹配Capybara中元素的确切文本来查找元素

amj*_*jad 99 ruby regex capybara

我在HTML中有以下两个元素

<a href="/berlin" >Berlin</a>
<a href="/berlin" >Berlin Germany </a>
Run Code Online (Sandbox Code Playgroud)

我试图通过使用以下Capybara方法找到元素

find("a", :text => "berlin")
Run Code Online (Sandbox Code Playgroud)

上面将返回两个元素,因为它们都包含文本柏林.

有没有办法匹配Capybara的确切文字?

pje*_*pje 134

使用正则表达式而不是字符串作为:text键的值:

find("a", :text => /\ABerlin\z/)
Run Code Online (Sandbox Code Playgroud)

查看Method: Capybara::Node::Finders#all 文档的"选项哈希"部分.

PS:文本匹配区分大小写.您的示例代码实际上引发了一个错误:

find("a", :text => "berlin")
# => Capybara::ElementNotFound:
#    Unable to find css "a" with text "berlin"
Run Code Online (Sandbox Code Playgroud)

  • 这是最好的答案,这很糟糕.:哭: (11认同)

Gab*_*ple 50

取决于您使用的宝石版本

find('a', text: 'Berlin', exact: true)
Run Code Online (Sandbox Code Playgroud)

可能会被弃用.在这种情况下,您将不得不使用

find('a', text: 'Berlin', match: :prefer_exact)
Run Code Online (Sandbox Code Playgroud)


Cam*_*oVA 12

你也可以这样做:

find('a', text: 'Berlin', exact_text: true)
Run Code Online (Sandbox Code Playgroud)

这将为 CSS 找到。

并且使用 onlyexact: true而不是exact_text将向您显示一个消息,该exact选项仅对 XPATH 有效。

  • 甚至更多,您可以使用 `find("a", exact_text: "berlin")` (4认同)
  • 这也适用于其他匹配器,例如“have_button('Copy', excact: true)”。 (2认同)

Paw*_*cki 6

我的偏好是使用have_selectorwithtextexact_text: true

expect(body).to have_selector 'a', text: 'Berlin', exact_text: true
Run Code Online (Sandbox Code Playgroud)