aar*_*rkk 13 javascript jquery selenium ruby-on-rails capybara
我有一个失败的Rails集成测试,我无法弄清楚原因.我正在使用Capybara和Selenium作为驱动程序.
在AJAX调用发生后,测试检查页面内容是否已被删除.相关操作是单击一个按钮,单击该按钮会导致页面的一部分通过jQuery remove()
调用删除.以下是集成测试代码的近似值:
click_button("Remove stuff")
assert has_no_link?("This should be removed")
Run Code Online (Sandbox Code Playgroud)
断言失败,暗示链接仍然存在.
我一直在阅读Capybara,我知道你可以延长默认的等待时间.我把它扩展到一个荒谬的值(20秒),但断言仍然失败.
当我自己手动跟踪测试过程时,页面源仍然显示内容,但DOM不显示(通过查看Firefox的DOM Inspector并查找元素).这是问题吗?我甚至已经试过检查DOM ,而该测试是在Firefox中运行,以检查内容在那里,它不似乎是.
我不知道Capybara如何仍然找到DOM中不再存在的链接.Capybara是在检查源而不是DOM并在那里找到链接吗?如果是这样,我不知道如何修复此测试以确保测试通过.刷新页面可以解决问题,但这不完全是用户会做的事情,所以我犹豫改变页面只是为了让测试通过......
会喜欢有关如何解决这个问题的任何建议.
谢谢!
有一种巧妙的方法可以检查 ajax 请求是否已完成,这是我从本文中学到的。wait
您可以使用 ajax$.active
函数(该函数不在实际 API 中,但已公开,以便您可以使用),而不需要特定的时间。$.active
告诉您到服务器的活动连接数,因此当它降至零时您就知道 ajax 请求已完成:
wait_until do
page.evaluate_script('$.active') == 0
end
Run Code Online (Sandbox Code Playgroud)
如果这不起作用,那么问题出在其他地方(从您所写的内容来看,这似乎很可能)。如果更改仅发生在 DOM 中,那么您必须确保为您的测试/规范启用了 javascript。例如,在 rspec 中,您可以:js => true
这样做;在 Cucumber 中,您可以在场景上方添加一行@javascript
. 我不使用 Rails 的默认测试,但必须有一个设置来执行相同的操作。