我有以下功能:
@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;在我需要考虑的网站上
答案 0 :(得分:0)
我不得不重复你采取的步骤,以确保&#34;预先登录&#34;你描述的页面。这里是:
如我们所见,右上角的真实姓名和昵称已经显示,但需要重复输入。问题是我们不能完全确定这种形式是否会每次出现,所以我们需要一些奇特的逻辑来传递它。以下是我最终的结果:
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。前往您的方案的失败步骤,在那里设置一个巨大的sleep
或binding.pry
并检查页面的HTML代码是否具有满足您的选择器的元素,页面是否包含所需的文本等。给出一个关于应该实施(或编辑)其他步骤的提示。