【问题标题】:Finding a label with Webrat that contains a link使用 Webrat 查找包含链接的标签
【发布时间】:2010-08-09 01:32:14
【问题描述】:

所以我正在使用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() 方法的内容。谁能为此提出一个优雅的答案?

【问题讨论】:

    标签: ruby-on-rails cucumber webrat


    【解决方案1】:

    简短的回答是使用 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。

    【讨论】:

    • 谢谢约翰——我知道field\_by\_ 定位器,但是能够将它们作为参数传递是我遗漏的线索。他们现在更有意义了,我很欣赏这种洞察力。不幸的是,您提供的 XPath 不起作用,因为它指向标签,而不是复选框。试图将它与field\_labeled\_ 结合起来没有用。我可以编写一个 XPath 查询来定位标签 before 的元素 - 但后来我意识到超链接作为一个标签的整体是一个坏主意,因为你不能点击标签来选中该框。所以重新思考整个想法。还是——谢谢!
    【解决方案2】:

    您能否在有问题的复选框附近的渲染页面中发布您的 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/等会起作用

    【讨论】:

      猜你喜欢
      • 2014-11-08
      • 2020-07-23
      • 2016-05-30
      • 1970-01-01
      • 2016-11-24
      • 2012-12-22
      • 2014-06-30
      • 1970-01-01
      • 2020-03-19
      相关资源
      最近更新 更多