使用包含链接的Webrat查找标签

时间:2009-09-24 20:44:58

标签: ruby-on-rails cucumber webrat

所以我正在使用Cucumber进行BDD,并且有一个带有从数据库填充的复选框的表单。复选框的标签包含超链接。到目前为止,不是太奇特(注意,这是HAML而不是Erb,但对于任何Rails人员来说它应该足够可读了):

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

问题在于,在我的Cucumber功能中,我无法弄清楚如何找到该复选框来检查它。故事的相关部分是:

  Scenario: Happy path
    Given I am on the home page
    When I fill in "My email address" with "john@example.org"
     # 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”成为实际网站的超链接。但我无法从我的Cucumber步骤轻松访问link_to,我无法弄清楚任何合理的方式将Webrat指向右边的复选框,而不是克服一大堆超链接我的步骤中的代码(这使得它非常脆弱)。

我的BDD此时已停滞不前。我不想因为它很难测试而取出链接。感觉它不应该难以测试。 Webrat只是限制了我可以传递给checks()方法的内容。有人能为此提出一个优雅的答案吗?

2 个答案:

答案 0 :(得分:2)

简短的回答是使用field_by_xpath或其他一个Webrat :: Locators方法来选择要在步骤中操作的元素:

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

您可能需要稍微使用该xpath,或使用field_by_id代替。记住它看起来是标签的html id而不是数据库中的id。

答案 1 :(得分: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 /等会起作用