将 JS 文件注入水豚无头镀铬

23t*_*tux 4 ruby selenium capybara selenium-chromedriver google-chrome-headless

我在测试中使用了带有 Capybara 和 Chrome Headless 的 RSpec。对于某些页面,我加载了其他 javascript 依赖的外部 JS 文件。

我想让我的测试独立于这个外部 JS 调用,例如,当我离线时,它们将无法工作并抛出 JS 错误。更改生产代码(例如测试环境然后加载或不加载文件或执行脚本)感觉非常难看,因此这不是一个选项。

因此,我正在考虑在每次访问页面时将某种模拟脚本注入浏览器。问题是,像page.evaluate_scriptpage.execute_script只在页面加载时运行脚本的方法。而此时,生产 JS 代码已经抛出错误。

我正在四处寻找解决方案,但我还没有找到 chrome headless 加载文件或在每个页面加载时执行脚本的选项。

我的设置目前看起来像这样

Capybara.register_driver :chrome_headless do |app|
  options = Selenium::WebDriver::Chrome::Options.new
  options.add_argument("no-sandbox")
  options.add_argument("headless")
  options.add_argument("disable-gpu")
  options.add_argument("window-size=1400,1400")

  capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(
    acceptInsecureCerts: true
  )

  Capybara::Selenium::Driver.new(
    app, browser: :chrome, options: options, desired_capabilities: capabilities
  )
end
Capybara.javascript_driver = :chrome_headless
Run Code Online (Sandbox Code Playgroud)

我还尝试构建一个扩展并将其与

options.add_extension("spec/support/chrome_extension_test_helper/chrome_extension_test_helper.crx")
Run Code Online (Sandbox Code Playgroud)

但似乎没有加载扩展(我console.error("foobar")在扩展中添加了一个但没有显示任何内容。所以也许不允许自签名扩展?此外,我想即时构建这样的扩展,而不必通过 chrome 打包每次我改变一些东西。

那么,有没有办法使用水豚将模拟 JS 文件加载到 chrome headless 中?=

Tho*_*ole 5

Capybara 和 selenium 都不直接支持这一点,但 Chrome 通过其 DevTools 协议Page.addScriptToEvaluateOnNewDocument命令支持。如果您正在运行最新的 selenium-webdriver 和 chromedriver,则可以使用它,但不能保证永远工作,因为它涉及调用bridgeselenium 驱动程序上的私有方法

params = {
  cmd: 'Page.addScriptToEvaluateOnNewDocument',
  params: {
    source: '<The JS you want run before scripts on every page load>'
  }
}
page.driver.browser.send(:bridge).send_command(params)
Run Code Online (Sandbox Code Playgroud)