在 Rails 3.2 中,我使用 rspec (2.11.0) 和 capybara 1.1.2(并且尚未安装 webrat),当我单击网页上的链接时,它会执行一些奇怪的操作。
我正在尝试单击主页上的链接转到另一个页面。以下是基本的 rspec 测试。
it "should go to agents page" do
visit 'home'
#puts page.body
#links = page.all('a')
#links.each do |l|
# puts l.text
#end
page.find_by_id('menu_agents').click
puts page.body
#<various content asserts on page currently commented out>
end
我基本上会进入一个页面,抓取一个链接并单击
链接存在。正如您从注释掉的语句中看到的那样,我通过查看控制台中的页面并查看链接列表确认了这一点。我尝试不仅单击上面的链接,还尝试使用
click_link
并引用 id。当我运行代码时,查看页面的代码和 html,我看到元素的 id。
在所有情况下我都会得到以下结果:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
使用
rails s
运行软件时,单击链接会加载正确的页面。同样,当我在测试中访问主页时,它也会正确加载,因为当我将正文打印到控制台时,我看到了正确的 html。
当我单击链接时,页面加载似乎出现问题,并且页面加载出现某种类型的失败(尽管测试本身没有失败)。有什么想法吗?
请尝试这个:
页面加载需要一些时间。使用睡眠功能。这需要一些时间等待。
然后使用 page.find("#menu_agents").click 而不是 page.find_by_id('menu_agents').click
验证menu_agents ID名称不存在于结果页面的任何其他位置。
注意:确保menu_agents id是唯一的。
it "should go to agents page" do
visit 'home'
sleep 5
page.find("#menu_agents").click
puts page.body
#<various content asserts on page currently commented out
end
我的测试间歇性失败,因为有时水豚会在元素加载之前尝试单击某些内容,因此它找不到它并且测试会失败。
我重构了我的代码,告诉水豚在尝试单击该元素之前找到该元素。
这里有两个例子。我改变了这个:
click_button 'Submit'
check('booking_accept_waiver')
对此:
find_button('Submit').click
find('input[type="checkbox"][id="booking_accept_waiver"]').check
现在水豚会等待这些元素出现后再与它们交互,并且测试不再间歇性失败。