Ruby on rails 3 rails 3.1,capybara webkit,如何在链接内执行javascript?

Ruby 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

我是否可以使用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 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”谢谢您的详细回答,我在一年前问了这个问题,哇。。时间过得很快。这几乎完全解决了问题,但我仍然会遇到可怕的
数据库被锁定
错误,除非我为所有规范设置
数据库清理器。策略=:截断
。。。这让他们的速度慢了很多。我希望水豚只是在等待数据库!谢谢你回答中的“第二步,修复”部分让我省去了很多麻烦!