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


102

我在HTML中有以下两个元素

<a href="/berlin" >Berlin</a>
<a href="/berlin" >Berlin Germany </a>

我正在尝试通过使用以下Capybara方法来查找元素

find("a", :text => "berlin")

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

有没有办法匹配水豚中的确切文本?


水豚还是nokogiri?为什么两者都被标记?
pguardiario

Answers:



139

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

find("a", :text => /\ABerlin\z/)

查看Method: Capybara::Node::Finders#all 文档的“选项哈希”部分。

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

find("a", :text => "berlin")
# => Capybara::ElementNotFound:
#    Unable to find css "a" with text "berlin"

13
这是最好的答案,这很可怕。:cry:
BM5k

为什么我们在柏林之间有\ A和\ z?
Karan Verma 2014年

1
我如何在正则表达式中添加占位符
FluffyBeing

这可以通过写来解决click_link(link_text, :text => link_text)
记住为什么您

52

根据您使用的宝石版本

find('a', text: 'Berlin', exact: true)

可能已弃用。在这种情况下,您将不得不使用

find('a', text: 'Berlin', match: :prefer_exact)

4

我的偏好是使用have_selectorwith textexact_text: true

expect(body).to have_selector 'a', text: 'Berlin', exact_text: true

4

您也可以这样做:

find('a', text: 'Berlin', exact_text: true)

这将在CSS中找到。

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


2
甚至更多,你可以使用find("a", exact_text: "berlin")
Kukunin

0

要在水豚中使用click_link,您需要在使用它的方法中添加另一个属性。

click_link(link_name, :text => link_name)

这里的link_name是链接的文本值。使用:text关键字,我们指定我们要单击具有与我们的要求完全匹配的文本值的链接。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.