2012-01-25 180 views
15

当我运行rspec时,是否有可能让水豚/硒报告任何javascript console.errors和其他异常返回到rspec?有没有办法打印javascript console.errors到Rspec/Capybara/Selenium的终端?

我有一大堆测试失败,但我的应用程序工作时,我手动测试它。如果不知道在测试过程中可能会阻止我的单页Web应用程序的JavaScript错误,则很难弄清楚为什么测试失败。

我环顾四周,并没有真正能够找到解决方案。

回答

3

我不知道这是否会有所帮助,但可以尝试切换到thinkbot的capybara-webkit驱动程序。这是Selenium的一个替代品,它是无头的,这意味着它不会打开浏览器来运行测试。当我使用此驱动程序运行测试时(在RSpec + Capybara安装程序中),所有Javascript错误都将与RSpec输出一起打印。

我从来没有尝试从Selenium切换到capybara-webkit,所以我不知道这对现有项目是多么可行。如果你对Selenium没有什么特别的想法,那么过渡可能会非常顺利。但是,如果你依赖于能够观察在浏览器中运行的测试,或者对Selenium有其他特定需求,那么我的答案不会太有用。

你可以在这里找到水豚,WebKit的:https://github.com/thoughtbot/capybara-webkit

获取安装它可能是一个痛苦的,因为你需要的Qt4函数库。如果您的系统中尚未安装Qt4,则构建过程可能需要多长时间。对我来说,这是非常值得的麻烦。我更喜欢capybara-webkit到我试过的任何其他解决方案。

+0

我使用常绿宝石与水豚-webkit。除了一些解析问题,它似乎工作正常。 –

6

这并不美观,但您可以注入一个脚本来将错误导入DOM并通过Selenium监视这些更改。

更具体地说,在每个页面中插入一个替代window.onerrorconsole的脚本,以便将错误信息附加到您注入DOM的某个隐藏节点。然后,通过Selenium,定期检查并清空该元素的内容,将清空的数据打印到Java控制台。

+1

有点太复杂。我觉得有人已经这样做了。不过谢谢。 –

12

在这个要点https://gist.github.com/gkop/1371962(来自alexspeller的)的末尾有一个代码示例,它对我来说工作得非常好。

我结束了在JS测试中,我试图调试

after(:each) do 
    errors = page.driver.browser.manage.logs.get(:browser) 
    if errors.present? 
    message = errors.map(&:message).join("\n") 
    puts message 
    end 
end 
+1

这个我发现有帮助的另一个变种:'expect(page.driver.browser.manage.logs.get(:browser).select {| m | m.level =='SEVERE'}} .to eq( 0)' – Julie

1

我在做类似的东西狮子座的情况下这样做,但包括浏览器日志,测试失败消息的一部分:

def check_browser_logs_after_each_test(rspec_config) 
    rspec_config.before(:each) { 
    @prev_browser_logs = @browser.driver.manage.logs.get(:browser) 
    } 

    rspec_config.after(:each) { 
    logs = @browser.driver.manage.logs.get(:browser) 
    new_logs = logs - @prev_browser_logs 
    if example.exception then 
     s = new_logs.map { |l| l.to_s }.join("\n") 
     example.exception.message << "\nConsole logs:\n#{s}" 
    else 
     new_logs.should eq [ ] 
    end 
    } 
end 
4

这里是另一种方式,目前正与硒和铬无头(也应该与Firefox工作)工作。

将以下内容添加到spec/rails_helper.rb,在RSpec.configure do |config|块内,并且所有功能规格说明将使用js: true元数据将显示JS错误。

class JavaScriptError< StandardError; end 
RSpec.configure do |config| 
    config.after(:each, type: :feature, js: true) do |spec| 
    errors = page.driver.browser.manage.logs.get(:browser) 
       .select {|e| e.level == "SEVERE" && e.message.present? } 
       .map(&:message) 
       .to_a 
    if errors.present? 
     raise JavaScriptError, errors.join("\n\n") 
    end 
    end 
end 

该代码是this的修改。

相关问题