3

我在使用 Capybara 2.1 来匹配精确文本时遇到问题。

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

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

我的测试应该选择标签 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

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

4

2 回答 2

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

要解决准确性问题,您需要将文本值传递给查找器,而不使用文本选项。

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

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

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

page.find('.tags-select').find(:option, 'Tag 2').click
于 2013-09-05T21:11:06.553 回答
0

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

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

然后尝试使用以下选项选择选项:

page.find('.tags-select').select("1")
于 2013-09-05T14:53:30.617 回答