2009-09-24 2 views
1

Итак, я делаю BDD с Cucumber и имею форму с флажками, заполненными из базы данных. Ярлыки для флажков содержат гиперссылки. До сих пор не слишком экзотическое (обратите внимание, что это HAML и не Эрб, но он должен быть доступен для чтения достаточно для любого человека Rails):Поиск метки с Webrat, которая содержит ссылку

I would like my donation to support: 
%br 
- for podcast in @podcasts 
    = check_box_tag "donation[podcast_ids][]", podcast.id, true 
    = donation.label "donation[podcast_ids][]", link_to(podcast.name, podcast.url), :value => podcast.id 
    %br 

Проблема в том, что в моих особенностях огурца, я не могу понять как найти, что checkbox, чтобы проверить его. Соответствующая часть этой истории заключается в следующем:

Scenario: Happy path 
    Given I am on the home page 
    When I fill in "My email address" with "[email protected]" 
    # Skipped for brevity... 
    And I check the "Escape Pod" podcast 
    And I check the "PodCastle" podcast 
    And I press "I'm ready!" 
    Then I should see "Thank you!" 
    And there should be 2 podcast donation records 

Если я использую голый webrat_steps.rb файл я получаю следующую ошибку:

Could not find field: "Escape Pod" (Webrat::NotFoundError) 

Я совершенно уверен, что это из-за что метод link_to(), который я использую, чтобы сделать «Escape Pod» гиперссылкой на фактический веб-сайт. Но я не могу легко получить доступ к link_to с моего шага огурца, и я не могу определить любой разумный способ указывать Webrat на флажке справа, чтобы не допустить целую кучу гиперссылок на моем шаге (что делает его очень хрупкий).

My BDD застопорился на этом этапе. Я не хочу вынимать ссылку только потому, что ее трудно проверить. И это похоже на то, что не должно быть трудно тестировать. Webrat просто ограничивает то, что я могу передать в метод checks(). Может ли кто-нибудь предложить элегантный ответ для этого?

ответ

2

Короткий ответ является использование field_by_xpath или один из других Webrat :: методов локаторов, чтобы выбрать, какой элемент для управления в вашем шаге:

When(/^I check the "(.+?)" podcast$/) do |name| 
    check(field_by_xpath("//label/a[.=#{name}]") 
end 

Вам может понадобиться, чтобы играть с этим XPATH немного, или вместо этого используйте field_by_id. Помните, что он ищет html-идентификатор тега, а не идентификатор из базы данных.

+1

Спасибо John - Я знал о локаторах 'field \ _by \ _', но мог передавать их как параметр был ключом, которого я отсутствовал. Теперь они имеют гораздо больше смысла, и я ценю понимание. К сожалению, предложенный XPath не работает, поскольку он указывает на метку, а не на флажок. Попытка совместить его с полем \ _labeled \ _' не работала. Я мог бы написать запрос XPath, чтобы найти элемент только _before_ ярлыка, но затем я понял гиперссылки, так как вся этикетка - это плохая идея, так как вы не можете щелкнуть по метке, чтобы установить флажок. Поэтому переосмысление всей идеи. Еще ... спасибо! – SFEley

0

Можете ли вы разместить то, что ваш HTML-код выглядит на отображаемой странице рядом с проблематичным флажком? Иногда вы должны играть с именованием поля ... У меня был все виды проблем с формой входа ... Я в конечном итоге делаю это:

<%= submit_tag 'Enter', {:id => "login_button"} %> 

, так что следующий работал:

Given /^I am logged in as admin$/ do 
    visit login_path 
    fill_in "login", :with => "admin" 
    fill_in "password", :with => "password" 
# click_button "login_button" 
    click_button 
end 

Я знаю, что это не пример флажка, но, может быть, возиться с вашим именем/id/etc будет работать