rails 3.1,capybara-webkit,如何在链接中执行javascript?

sim*_*imo 2 capybara ruby-on-rails-3 capybara-webkit

我可以在与capybara的链接中执行javascript click_link('next_page')吗?

链接如下所示:

<a onclick="$('#submit_direction').attr('value', '1');$('#quizForm').submit()" id="next_page" href="#">Next Question</a>
Run Code Online (Sandbox Code Playgroud)

我在github的capybara读到,我可以点击提交按钮提交表单,如下所示:

click_on('Submit Answer')
Run Code Online (Sandbox Code Playgroud)

但是,在我的情况下,我需要在链接中使用javascript提交表单,那么,如何测试里面有javascript的链接?还click_link('next_page')不够吗?

编辑

设置:js=> true我的测试后看起来像这样:

   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
Run Code Online (Sandbox Code Playgroud)

之前:js => true,我可以正常访问页面,但是,我注意到在以下页面之后无法访问页面:js => true,这是我访问页面后得到的错误:

在2012-01-23 06:29:26 +0200(5010.7ms)开始获取127.0.0.1的"/ student_courses"更新"学生"SET"last_sign_in_at"='2012-01-23 04:29:26.274285'," current_sign_in_at"='2012-01-23 04:29:26.274285',"last_sign_in_ip"='127.0.0.1',"current_sign_in_ip"='127.0.0.1',"sign_in_count"= 1,"updated_at"='2012-01 -23 04:29:26.276279'WHERE"学生"."id"= 1 SQLite3 :: BusyException:数据库被锁定:UPDATE"students"SET"last_sign_in_at"='2012-01-23 04:29:26.274285'," current_sign_in_at"='2012-01-23 04:29:26.274285',"last_sign_in_ip"='127.0.0.1',"current_sign_in_ip"='127.0.0.1',"sign_in_count"= 1,"updated_at"='2012-01 -23 04:29:26.276279'WHERE"学生"."id"= 1 HTML:------------ _ _内部服务器错误

内部服务器错误

无法回滚事务 - 正在进行的SQL语句
WEBrick/1.3.1(Ruby/1.9.3/2011-10-30),版本127.0.0.1:34718

那么,为什么SQLite3 :: BusyException:数据库现在被锁定了?!

Ami*_*ana 8

我花了8个小时来解决类似的问题,然后我找到了解决方案.解决方案很简单,我可以哭.

一,诊断

你得到" SQLite3::BusyException: database is locked" 的原因是你正在启动一个异步线程,即一个表单提交,最终失去了对你的测试主线程的"数据库写入"竞争.实际上,当您的测试已经完成并且正在运行"每个"之后的数据库清理例程(在spec_helper中定义)时,表单操作才刚刚开始尝试运行业务逻辑(它依赖于您的测试之后的数据) :每个钩子都在忙着毁灭).

对于单击AJAX POST按钮然后终止而不断言视图更改的测试,更有可能发生此问题.

第二,修复

事实证明,Capybara旨在"同步"您的所有请求.但只有你暗中让它.请注意,在您提交表单后,您没有让Capybara查看您的页面.因此,它认为你已经完成并将你的数据带出范围(当你的表单提交线程挂在后台.)

只需在测试结束时添加以下代码行,它就会突然起作用:

page.should_not have_content "dude, you forgot to assert anything about the view"
Run Code Online (Sandbox Code Playgroud)

第三,让它漂亮

不要使用execute_script.这就是Capybara的用途.但也不要依赖"click_on",因为它不是一个很好的抽象.你需要对它的内部结构了解太多.相反,使用CSS选择器,如下所示:

page.find("#submit_button").click
Run Code Online (Sandbox Code Playgroud)

还有一件事 - 你的测试不应该试图操纵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
Run Code Online (Sandbox Code Playgroud)