【问题标题】:Temporarily set js_errors to false in Poltergeist在 Poltergeist 中临时将 js_errors 设置为 false
【发布时间】:2014-02-25 16:44:35
【问题描述】:

我有一组测试导致用户登录的 Facebook 页面。不幸的是,这个页面有一些我无法影响的 JavaScript 错误,所以我的测试永远不会完成。

有什么方法可以暂时禁用对 JS 错误的检查?我正在考虑类似:Capybara.javascript_driver.js_errors = false,然后稍后将其设置为true,但不幸的是这不起作用。我已经尝试过这种变体,但无济于事。

关于如何解决我的问题的任何想法?

【问题讨论】:

  • 你能把测试代码包装到try{}catch(e){}块吗?我的意思是 Facebook 页面打开的部分。或者测试本身不是用 javascript 编写的?

标签: javascript capybara poltergeist


【解决方案1】:

感谢 Roman Pominov 的评论,我能够找到解决方案。其实很简单:

我刚刚在有问题的声明之后添加了rescue Capybara::Poltergeist::JavascriptError,然后它就像一个魅力。我最初的想法太复杂了;)

【讨论】:

  • 您最初的想法是什么?我有大量的测试,所以禁用前/后块中的 js_errors 比在每个测试中添加救援语句更可取
  • 好吧,如果可能的话,我建议处理所有 JS 错误(毕竟它们是错误)。如果不可能,我会坚持rescue。据我记得,我最初的想法在问题中有所描述。有没有可能解决那些 JS 错误?
  • 啊,我的错,我想也许你有另一个想法,你在编辑时删除了。它是一个抛出外部服务的 JS 错误?我想我更大的问题是我首先有一个访问外部服务的功能规范。
  • 请记住,这可能会回滚发生错误时正在运行的任何操作,即当我从中捕获错误 js 错误时,我没有提交登录表单。
  • 你成就了我的一天! ;)
【解决方案2】:

这就是诀窍:

page.driver.browser.js_errors = false

你也可以添加环绕回调:

# spec_helpers.rb
config.around(:each) do |example|
  original_value = page.driver.browser.instance_variable_get(:@js_errors)
  if example.metadata.has_key?(:js_errors)
    page.driver.browser.js_errors = example.metadata[:js_errors]
  end

  example.run

  page.driver.browser.js_errors = original_value
end

在你的测试中:

# my_feature_spec.rb
it "should ignore errors", js_errors: false do
  ...
end

【讨论】:

  • 如果您有非请求规格,这将不起作用,对吧?是否要为其他规范定义页面?
  • 请注意,如果您在例如 Cucumber 中采用这种方法,那么 JS 错误对于所有后续测试也将保持禁用!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-08
  • 2013-10-17
  • 1970-01-01
  • 1970-01-01
  • 2018-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多