Ruby on rails 3 rails 3.1,capybara webkit,如何在链接内执行javascript?
我是否可以使用capybaraRuby on rails 3 rails 3.1,capybara webkit,如何在链接内执行javascript?,ruby-on-rails-3,capybara,capybara-webkit,Ruby On Rails 3,Capybara,Capybara Webkit,我是否可以使用capybara单击链接(“下一页”)在链接中执行javascript 链接如下所示: <a onclick="$('#submit_direction').attr('value', '1');$('#quizForm').submit()" id="next_page" href="#">Next Question</a> click_on('Submit Answer') it "should pass when answering all
单击链接(“下一页”)在链接中执行javascript
链接如下所示:
<a onclick="$('#submit_direction').attr('value', '1');$('#quizForm').submit()" id="next_page" href="#">Next Question</a>
click_on('Submit Answer')
it "should pass when answering all correct", :js=>true do
login_as(student, :scope => :student)
visit ("/student_courses")
#page.execute_script("$('#submit_direction').attr('value', '1');$('#quizForm').submit()")
trace "HTML:------------", page.html
end
但是,在我的例子中,我需要在链接中使用javascript提交表单,那么,如何测试包含javascript的链接呢?点击链接(“下一页”)是否足够
编辑
设置:js=>true
后,我的测试如下所示:
<a onclick="$('#submit_direction').attr('value', '1');$('#quizForm').submit()" id="next_page" href="#">Next Question</a>
click_on('Submit Answer')
it "should pass when answering all correct", :js=>true do
login_as(student, :scope => :student)
visit ("/student_courses")
#page.execute_script("$('#submit_direction').attr('value', '1');$('#quizForm').submit()")
trace "HTML:------------", page.html
end
在:js=>true之前,我可以正常访问页面,但是,我注意到在:js=>true之后无法访问页面,下面是我访问页面后出现的错误:
2012-01-23 06:29:26开始为127.0.0.1的学生开设“/student_课程”
+0200(5010.7ms)更新“学生”设置“最后一次签名在”='2012-01-23 04:29:26.274285',“当前签名在”='2012-01-23
04:29:26.274285',“ip中的最后一个符号”='127.0.0.1',
“当前登录ip”='127.0.0.1',“登录计数”=1,“更新位置”
='2012-01-23 04:29:26.276279'其中的“学生”。“id”=1 SQLite3::BusyException:数据库已锁定:更新“学生”集
“上次登录时间”=“2012-01-23 04:29:26.274285”,“当前登录时间”
='2012-01-23 04:29:26.274285',“最后一次登录ip”='127.0.0.1',“当前登录ip”='127.0.0.1',“登录计数”=1,“更新时间”
=“2012-01-23 04:29:26.276279”其中“学生”。“id”=1 HTML:------------__
内部的
服务器错误
内部服务器错误
无法回滚事务-SQL语句正在进行
WEBrick/1.3.1(Ruby/1.9.3/2011-10-30)网址:
127.0.0.1:34718
那个么,为什么SQLite3::BusyException:数据库现在被锁定了 它应该有用。使用capybara,您基本上是通过浏览器测试您的应用程序,它的行为也会相同 要扩展Alex的评论,Capybara不会执行JS,除非为给定的测试显式打开JS
为此,在descripe块或单个测试中使用:js=>true
describe "in such and such a context", :js => true do
# some stuff
end
我刚刚花了8个小时解决了一个类似的问题,我找到了解决方案。解决办法很简单,我都哭了
首先,诊断
您得到“SQLite3::BusyException:数据库被锁定
”的原因是您正在启动一个异步线程,即表单提交,它最终失去了与测试主线程的“数据库写入”竞赛。实际上,由于您的测试已经完成,并且正在运行“每次之后”数据库清理例程(在spec_helper中定义),因此表单操作刚刚开始尝试运行业务逻辑(这取决于您的测试之后的数据:每个钩子都在忙着销毁)
如果测试单击AJAX POST按钮,然后在没有声明视图更改的情况下终止,则更可能出现此问题
第二,修复
事实证明,水豚被设计用来“同步”你的所有请求。但前提是你默许。请注意,提交表单后,您没有让水豚查看页面。因此,它认为您已经完成并将数据移出范围(而表单提交线程挂在后台)
只需在测试结束时添加以下代码行,它就会突然起作用:
page.should_not have_content "dude, you forgot to assert anything about the view"
第三,把它弄得漂亮些
不要使用执行脚本。这就是水豚的作用。但也不要依赖“点击”,因为它不是一个很好的抽象。你需要对它的内部结构了解太多。相反,请使用CSS选择器,如下所示:
page.find("#submit_button").click
还有一件事——您的测试不应该试图操纵DOM。良好的Selenium测试假定必须遵循正常用户遵循的相同步骤
总而言之
it "should pass when answering all correct", :js => true do
login_as(student, :scope => :student)
visit ("/student_courses")
page.find(".my-js-enabled-button").click
page.find("#submit_button").click
# Synchronizes your view to your database state before exiting test,
# Therefore makes sure no threads remain unfinished before your teardown.
page.should_not have_content "dude, you forgot to expect / assert anything."
end
您的测试套件中是否打开了js?可能问题在于您使用的是事务性策略,而不是数据库清理器?我还发现SQLite3::BusyException:运行cucumber/capybara时数据库被锁定了错误。只有当我打开javascript时才会发生。你知道吗?奇怪。。尝试重置数据库/服务器等?如何重置数据库或服务器?你建议我读什么?@SamirSabri要重新启动你的服务器,只需点击ctrl-C并用“rails服务器”再次启动它。。对于您的数据库,请使用“rake db:reset”谢谢您的详细回答,我在一年前问了这个问题,哇。。时间过得很快。这几乎完全解决了问题,但我仍然会遇到可怕的数据库被锁定
错误,除非我为所有规范设置数据库清理器。策略=:截断
。。。这让他们的速度慢了很多。我希望水豚只是在等待数据库!谢谢你回答中的“第二步,修复”部分让我省去了很多麻烦!