在Capybara中,确实:或者Capybara.exact适用于have_selector?

时间:2014-04-24 03:27:43

标签: ruby cucumber capybara

在尝试匹配文本与完全匹配的元素时,我很难使用Capybara have_selector。我知道这可以使用正则表达式来完成,但是我对Capybara's blog post的阅读使我相信我可以使用:exact arg或设置Capybara.exact = true。我目前正在使用Capybara 2.2.1。这就是我所拥有的:

假设我有一个页面(称为"测试页面")。在这个页面上是这样的:

<div id="my_div">abcdef</div>

我有一个Cucumber功能测试,如下所示:

Feature: Test for exact text matches in have_selector
Scenario:
  Given I am on the test page
  Then I should get a partial text match "bcde" in my div
  And I should get a partial text match "abcdef" in my div
  And I should get an exact text match using regexp "abcdef" in my div
  And I should not get an exact text match using regexp "bcde" in my div
  And I should get an exact text match using arg "abcdef" in my div
  And I should not get an exact text match using arg "bcde" in my div

我的步骤定义如下:

Then /^I should get a partial text match "([^\"]*)" in my div$/ do |text|
  page.should have_selector('div#my_div', :text => text)
end

Then /^I should get an exact text match using regexp "([^\"]*)" in my div$/ do |text|
  page.should have_selector('div#my_div', :text => /^#{text}$/)
end

Then /^I should not get an exact text match using regexp "([^\"]*)" in my div$/ do |text|
  page.should_not have_selector('div#my_div', :text => /^#{text}$/)
end

Then /^I should get an exact text match using arg "([^\"]*)" in my div$/ do |text|
  page.should have_selector('div#my_div', :text => text, :exact => true)
end

Then /^I should not get an exact text match using arg "([^\"]*)" in my div$/ do |text|
  page.should_not have_selector('div#my_div', :text => text, :exact => true)
end

与我的期望相反,我收到以下错误:

And I should not get an exact text match using arg "bcde" in my div
expected not to find css "div#my_div" with text "bcde", found 1 match: "abcdef" (Capybara::ExpectationNotMet)

这让我相信:exact => truehave_selector电话中没有做任何事情。我已经尝试在我的测试设置配置中设置Capybara.exact = true,但这似乎也不会影响我的测试方式。

我错过了什么吗?或者我误解了该选项应该如何使用?我知道我总是可以使用正则表达式语法来匹配精确的文本字符串,但我认为:exact选项专门针对这种情况。

2 个答案:

答案 0 :(得分:7)

有一个开放的功能请求Capybara Github Issue 1256,让have_selector(和其他人)支持精确的文字匹配。

但是,目前(在Capybara 2.x中),:exact选项不适用于:text选项。如果我没记错的话,可以使用以下代码(来自query.rb)进行文本选项过滤。如您所见,:exact选项没有逻辑或考虑因素。

def matches_filters?(node)
  if options[:text]
    regexp = options[:text].is_a?(Regexp) ? options[:text] : Regexp.escape(options[:text].to_s)
    return false if not node.text(visible).match(regexp)
  end

根据Capybara docs:exact选项实际上是:

  

控制给定XPath中的is表达式是否完全匹配或   部分

这基本上只用于Capybara::Node::Actions,其中文本(或id,name等)未指定为选项 - 例如:

# Will match links that exactly match 'Password'
click_link('Password', :exact => true)

# Will match links that contain the word 'Password' - ex 'Password Confirmation'
click_link('Password', :exact => false)

答案 1 :(得分:1)

Capybara现在有一个exact_text:选项供您使用:

page.should have_selector('div#my_div', exact_text: text)

您也可以使用Capybara.exact_text = true将其设置为默认值。 Docs here