23t*_*tux 4 ruby selenium capybara selenium-chromedriver google-chrome-headless
我在测试中使用了带有 Capybara 和 Chrome Headless 的 RSpec。对于某些页面,我加载了其他 javascript 依赖的外部 JS 文件。
我想让我的测试独立于这个外部 JS 调用,例如,当我离线时,它们将无法工作并抛出 JS 错误。更改生产代码(例如测试环境然后加载或不加载文件或执行脚本)感觉非常难看,因此这不是一个选项。
因此,我正在考虑在每次访问页面时将某种模拟脚本注入浏览器。问题是,像page.evaluate_script或page.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 中?=
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)
| 归档时间: |
|
| 查看次数: |
923 次 |
| 最近记录: |