Capybara Webkit 是否识别 JavaScript 的 Array.includes() 方法?

Does Capybara Webkit recognize JavaScript's Array.includes() method?

在我的 Rails 应用程序前端中,我使用 JavaScript 的 Array.includes 方法如下

if (['a', 'b', 'c'].includes('b')) {
  // do stuff

它在实时 Chrome 浏览器中工作正常,但我的 RSpec 测试失败了。我相信 Capybara Webkit 似乎不支持它?

我可以通过 binding.pry 和 运行

暂停规范来确认这一点
> page.evaluate_script("['a', 'b', 'c'].includes('b')")
=> nil

它 returns nil 当它应该 return true.

出于好奇,我在另一个 Rails 应用程序上尝试了同样的事情,奇迹般地它在那个应用程序上起作用了

> page.evaluate_script("['a', 'b', 'c'].includes('b')")
=> true

所以我绞尽脑汁想知道为什么它可以在一个应用程序上运行但不能在另一个应用程序上运行?

事实上,第一个失败的应用程序似乎有更新版本的 Capybara/Webkit..

谢谢!

capybara-webkit 基于它所针对的 QtWebkit 版本获得它的 JS 支持。 QtWebkit 最新发布的稳定版支持 ES5(以及大部分 ES 5.1),基本相当于 6-7 岁的 Safari 版本。

由于 Array.prototype.includes() 直到 ES2015 才包含在 JS 标准中,因此 capybara-webkit 本身不支持它。但是,您可以通过 polyfill 添加对 includes 的支持,我猜这就是您的 App #2 中的内容。

为了 capybara-webkit 对现代应用程序有用,您需要确保应用程序中使用的所有 JS 都被转换为 ES5 并填充(使用 babel 等)。如果您的应用程序要求不包括 old/obsolete 浏览器,则更好的无头测试解决方案是通过 capybaras selenium 驱动程序使用无头 Chrome 或 Firefox,因为这些组合支持现代 JS 和 CSS.

根据文档,execute_script 将执行并且 javascript 更好,我在我的 e2e 测试中用执行替换了评估