在水豚完全匹配

时间:2013-09-05 14:36:05

标签: ruby-on-rails capybara

我遇到Capybara 2.1的问题,以匹配确切的文字。

我的选择表格看起来像这样:

<select class='tags-select'>
  <option>Tag 1</options>
  <option>Tag 2</options>
</select>

我的测试应该选择Tag 2

page.find('.tags-select', :text => 'Tag 2').click

否则即使在我的助手中使用此Capybara配置,也会继续选择标签1:

Capybara.configure do |config|
  config.match = :prefer_exact
  config.exact = true
  config.exact_options = true
  config.ignore_hidden_elements = true
  config.visible_text_only = true
  config.default_wait_time = 10
end

我知道我可以在这里使用一些正则表达式来避免这个问题,但我想了解我在测试中做错了什么。

2 个答案:

答案 0 :(得分:3)

基于query.rb文件的主要问题是:exact选项不适用于:text选项:

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

所以发现者:

page.click_link('id', :text => 'Password', :exact => true)

将匹配以下两个元素

<a id="id" href="#">Password</a>

<a id="id" href="#">Password Other</a>

您的方法也可能失败,因为您的find方法实际上是返回选择列表而不是选项(即我相信您单击了错误的元素)。以下将单击右侧选项,但您仍会遇到准确性问题。

page.find('.tags-select option', :text => 'Tag 2').click

要解决严格性问题,您需要将文本值传递给finder而不使用text选项。

如果您只是选择一个选项,请使用DevDude提到的select方法:

page.find('.tags-select').select("Tag 2")

如果你真的需要点击一下,你可以这样做:

page.find('.tags-select').find(:option, 'Tag 2').click

答案 1 :(得分:0)

问题在于您在Element上使用带有多个选项的文本选择器。您应该为包含该选项的选择器使用另一个规范。此外,您应为每个选项添加一个值,因为它们都是等效的(空值)。我会像这样重做你的工作:

<select class='tags-select'>
  <option value="1">Tag 1</options>
  <option value="2">Tag 2</options>
</select>

然后尝试选择以下选项:

page.find('.tags-select').select("1")