我遇到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
我知道我可以在这里使用一些正则表达式来避免这个问题,但我想了解我在测试中做错了什么。
答案 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")