Ruby on rails RubyonRails-使用Capybara进行RSpecJavaScript测试(RoR的新功能)

Ruby on rails RubyonRails-使用Capybara进行RSpecJavaScript测试(RoR的新功能),ruby-on-rails,rspec,capybara,capybara-webkit,Ruby On Rails,Rspec,Capybara,Capybara Webkit,Ruby、Rails和TDD的新功能。我将RSpec与Capybara和Capybara webkit一起使用 正在尝试测试页上是否存在div元素 测试代码: require 'spec_helper' describe "Login module" do before do visit root_path end it "should have a module container with id mLogin" do page.s

Ruby、Rails和TDD的新功能。我将RSpec与Capybara和Capybara webkit一起使用

正在尝试测试页上是否存在div元素

测试代码:

require 'spec_helper'
describe "Login module" do

    before do 
        visit root_path
    end

    it "should have a module container with id mLogin" do
        page.should have_css('div#mLogin')
    end

    it "should have a module container with id mLogin", :js => true do
        page.evaluate_script('$("div#mLogin").attr("id")').should eq "mLogin"
    end

end
第一次测试通过,但第二次测试失败,原因如下:

Login module should have a module container with id mLogin
     Failure/Error: page.evaluate_script('$("div#mLogin").attr("id")').should eq "mLogin"

       expected: "mLogin"
            got: nil
在浏览器开发工具中运行JS并获得“mLogin”而不是nil

有什么想法吗?谢谢

find('div#mLogin')[:id].should eq 'mLogin'
见以下文件:

#evaluate_script
Evaluate the given JavaScript and return the result. Be careful when using this with scripts that return complex objects, such as jQuery statements. execute_script might be a better alternative.
据我记忆所及,evaluate_脚本总是返回nil


无论如何,您的第二个测试似乎是测试capybara是否有效,因为您的第一个测试就足够了。

一个可能的问题是
have\u css
matcher支持capybara的同步功能。如果没有立即找到选择器,它将等待并重试,直到找到它或超时

关于这方面的更多文档,请访问

另一方面,
evaluate\u脚本
会立即运行。由于这是访问页面后的第一件事,因此存在一个竞争条件:它可能在页面完成加载之前执行此脚本

您可以通过在调用
evaluate\u script
之前,尝试在页面上查找在页面加载之前不会显示的元素来解决此问题


或者,您可以将调用包装为要显式重试的调用,但通常不建议这样做。在这种情况下,你最好使用水豚的内置匹配器。
evaluate\u script
方法只能在没有内置方法来完成您需要做的事情时作为最后的手段使用,并且您需要非常小心地避免比赛条件。

是的,我只是想看看是否可以让它工作。我认为反过来,evaluate返回一个结果,execute不返回。这很奇怪,因为:page.evaluate_script('1+1')。如果eq 2起作用,但我的id get脚本失败,
execute_script
总是返回nil-
evaluate_script
返回经过评估的脚本,就像您引用的文档所说的那样。。。