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

时间:2012-12-14 12:43:31

标签: ruby regex capybara

我在HTML中有以下两个元素

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

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

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

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

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

6 个答案:

答案 0 :(得分:132)

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

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

查看Method: Capybara::Node::Finders#all documentation

的“选项哈希”部分

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

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

答案 1 :(得分:47)

取决于您使用的宝石版本

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

可能已弃用。在这种情况下,你必须使用

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

答案 2 :(得分:7)

您也可以这样做:

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

这将在CSS中找到。

仅使用exact: true而不是exact_text会向您显示消息exact选项仅对XPATH有效。

答案 3 :(得分:3)

只需使用Capybara's exact option

Capybara.exact = true

答案 4 :(得分:0)

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

click_link(link_name, :text => link_name)

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

答案 5 :(得分:0)

我更喜欢将have_selectortextexact_text: true结合使用:

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