自动化测试不匹配手动测试

时间:2014-06-13 19:03:26

标签: ruby cucumber capybara

我有以下功能:

@javascript
Scenario: Yahoo sign-in
    Given I am on the "Yahoo" login page #login.yahoo.com
    And I click the "#yucs-login_signIn" link
    When I enter "valid_user" into the "username" field
    And I enter "valid_password" into the "passwd" field
    And I click the "#pLabelC" link #keep me signed in check box
    And I click the ".save" button
    Then I should see "Hi, <<username>>"

但是当测试运行时,测试会在登录后立即挂起。实际上没有登录。如果我控制浏览器并完成登录,它就可以运行!

我尝试使用 show_me_the_cookies gem,但我没有cookie可以清除。 以下是填写步骤的表单字段:

When /^I click the "(.*)" (button|link)$/ do |btn_or_link,ctl|
  case ctl
    when "button"
      click_button(btn_or_link)
    when "link"
      find(btn_or_link).click
    else
      puts "error"
  end
end

When(/^I enter "(.*)" into the "(.*)" field$/) do |value, field|
  fill_in(field, :with=>value)
end

雅虎是否有一些&#34;魔法&#34;在我需要考虑的网站上

1 个答案:

答案 0 :(得分:0)

我不得不重复你采取的步骤,以确保&#34;预先登录&#34;你描述的页面。这里是: enter image description here

如我们所见,右上角的真实姓名和昵称已经显示,但需要重复输入。问题是我们不能完全确定这种形式是否会每次出现,所以我们需要一些奇特的逻辑来传递它。以下是我最终的结果:

And I click the ".save" button
And I verify my password if it is required
Then I should see "Hi, <<username>>"

这里的想法是仅在二级密码提示存在时才填写:

And /^I verify my password if it is required$/ do
  sleep(2) # just to be completely sure the form was displayed
  # in case there is no secondary form, we do not try to input password
  if page.has_css?('#loginBox #login_form #passwd') and page.has_content?('Sign In')
    step %Q{I enter "#{@password}" into the "passwd" field}
    step %Q{I click the ".save" button}
  end
end

我在这里设置@password变量

When(/^I enter "(.*)" into the "(.*)" field$/) do |value, field|
  if field == 'passwd' then @password = value end
  fill_in(field, :with=>value)
end

但是,只需将您的密码填充步骤复制粘贴到普通值即可。

应用此逻辑确实让我以记录用户的身份传递给雅虎的主页。

但是,您应该注意像这样登录,因为像雅虎这样的服务会要求用户不时地使用验证码验证自己(并且它不容易四处走动)。

让我也分享一下调试这种棘手场景的想法。您最好的朋友是sleep方法和pry gem。前往您的方案的失败步骤,在那里设置一个巨大的sleepbinding.pry并检查页面的HTML代码是否具有满足您的选择器的元素,页面是否包含所需的文本等。给出一个关于应该实施(或编辑)其他步骤的提示。