【问题标题】:Cucumber: selecting an element from a table for deletion or additionCucumber:从表中选择一个元素进行删除或添加
【发布时间】:2010-11-22 18:30:31
【问题描述】:

我在使用 ruby​​ on rails 开发的应用程序中有下表:

我想在 cucumber 中创建一个测试,从表中选择一个用户并将其删除或编辑。

我不知道它的步骤定义是什么。

我希望能够做类似的事情:

Feature: User Manegement
         In order to manage users
         As an admin 
         I want to see a users list and change user properties

Background:
Given the following activated users exists
  | name         | email                    | 
  | Alice Hunter | alice.hunter@example.com |
  | Bob Hunter   | bob.hunter@example.com   |
And the following user records
  | name     | email                    | 
  | Jonh Doe | jonh.doe@example.com     |

    Scenario: I delete a user from the table
      Given I am logged in as admin
      When I follow "Administration"
      And I follow "User Management"
      And I delete "Alice Hunter"
      Then I should not see "Alice Hunter"`

有人可以帮忙吗? 谢谢。

@布拉德

返回的错误:

  wrong number of arguments (2 for 1) (ArgumentError)
  ./features/step_definitions/table_steps.rb:26:in `within'
  ./features/step_definitions/table_steps.rb:26:in `/^I delete "(.*)"$/'


【问题讨论】:

  • 您可以将您的功能/场景添加到帖子中吗?
  • 添加了我想做的例子。基本上我想模拟点击 Alice Hunter 旁边的删除链接。

标签: ruby-on-rails cucumber webrat


【解决方案1】:

经过一些广泛的搜索和小的重构,我设法解决了这个问题。

我使用了以下步骤:

When /^as admin I (press|follow|check|uncheck|choose) "([^\"]*)" for (.*) whose (.*) is "([^\"]*)"$/ do |action, whatyouclick, class_name, var_name, value|
  unless var_name == "id" then
    id = eval("\"#{class_name}\".classify.constantize.find_by_#{var_name}(\"#{value}\").id.to_s")
  else
    id = value
  end
  within("tr[id=as_admin__#{class_name}-list-#{id}-row]") do
    case action
      when "press"
        click_button(whatyouclick)
      when "follow"
        click_link(whatyouclick)
      when "check"
        check(whatyouclick)
      when "uncheck"
        uncheck(whatyouclick)
      when "choose"
        uncheck(whatyouclick)
    end
  end
end

我也对 webrat 的 RDoc 很感兴趣,但我发现的一切似乎都不正常。

【讨论】:

    【解决方案2】:

    我有一些旧版应用程序在有用的链接 ID 甚至类方面都不是很好(即 class="deleteLink")。我必须在 href 中找到“删除”的链接。显然这很容易出错,但它现在正在工作。这是它的代码。

    When /^I delete "([^"]*)"$/i do |value|
      page.evaluate_script('window.confirm = function() { return true; }') 
      within(:xpath, "//tr[.//*[contains(text(), '#{value}')]]") do
        find(:xpath, ".//a[contains(@href,'delete')]").click
      end
    end
    

    xpath 有点乱,但我终于可以开始工作了。我正在使用 Cucumber/Rspec/Capybara/Selenium 来测试 Java 应用 BTW。

    【讨论】:

      【解决方案3】:

      我假设是删除部分搞砸了你,因为其他东西是相当标准的(设置给定和跟踪链接等......)

      那么,您使用什么作为浏览器抽象?韦拉特?水豚?看起来好像你有一个“删除”链接,这样做就足够了吗?

      And /I delete "(.*)"/ do |person|
        # Use webrat or capybara to find row based on 'person' text... then find 'delete' link in row and click it
        # example (untested, pseudo code)
        within(:xpath, "//table/tr[contains(#{person})") do
          find('.deleteLink').click
        end
      end
      

      而且我相信像“不应该看到”这样的东西可能会通过生成的 webrat/capybara 步骤开箱即用地得到支持。

      这就是你要找的吗?

      【讨论】:

      • 这就是我要找的东西。我正在使用 webrat。基本上我希望能够按下上表给定行上的删除/编辑/详细信息链接。可能对同类型的其他表是可抽象的。公告、群组等……你的伪代码对我不起作用。我会把上面的错误贴出来……
      • 抱歉,inside 语法适用于 capybara ...已经不存在了??我会继续寻找,看看能不能给你一个链接
      【解决方案4】:

      我遇到了同样的问题,并查看了“我跟随“abcd””到 click_link() 的翻译,我发现有一个可选的 :method。所以我定义了这个:

      When /^(?:|I )follow "([^"]*)" as delete$/ do |link|
        click_link(link, :method => :delete)
      end
      

      这行得通...然后我决定让它更通用,而不仅仅是“删除”:

      When /^(?:|I )follow "([^"]*)" as ([a-z]+)$/ do |link,method|
        click_link(link, :method => method.to_sym)
      end
      

      效果很好。我也尝试使用“我按照“mylink”作为获取方式进行操作,并且效果很好,因此方法部分似乎具有适当的灵活性。

      【讨论】:

        【解决方案5】:

        按照下面布拉德的回答,我选择了:

        When /^I follow "([^"]*)" for "([^"]*)"$/ do |link, person|
          # Use capybara to find row based on 'person' text... no need for the additional 'find'
          # the '.,' sets the scope to the current node, that is the tr in question
          within(:xpath, "//table/tr[contains(.,'#{person}')]") do
            click_link(link)
          end
        end
        

        【讨论】:

          猜你喜欢
          • 2021-11-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-18
          • 1970-01-01
          • 2014-05-13
          • 1970-01-01
          相关资源
          最近更新 更多