2013-09-05 216 views
3

我與水豚2.1有問題以匹配確切的文本。水豚精確匹配

我有一個選擇的形式看起來像這樣:

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

我的測試應選擇標籤2

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

否則,保持選擇標籤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 

我知道我可以在這裏使用一些正則表達式來避免這個問題,但我想下站在我做錯了那個測試。

回答

3

的主要問題的基礎上,query.rb文件,就是:確切的選項並不適用於:文本選項:

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> 

你的方法也可能會失敗,因爲你的查找方法真的返回了選擇列表,而不是選項(即我相信你是點擊錯誤的元素)。以下將點擊正確的選項,但是你仍然有準確性問題。

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

要解決正確性問題,您需要將文本值傳遞給查找器而不使用文本選項。

如果你只是選擇一個選項,使用select方法DevDude提到:

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

如果你真正需要做的點擊,而不是,你可以這樣做:

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

這是完美的。感謝您的好解釋! – Evers

0

問題在於,您在具有多個選項的元素上使用文本選擇器。您應該爲包含該選項的選擇器使用另一個規範。此外,您應該爲每個選項添加一個值,因爲它們都是等價的(空值)。我會重做你的工作是這樣的:

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

,然後嘗試選擇與此選項:

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