gpt4 book ai didi

ruby - 将 JS 文件注入(inject) capybara chrome headless

转载 作者:数据小太阳 更新时间:2023-10-29 07:31:27 25 4
gpt4 key购买 nike

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

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

因此,我考虑在每次访问页面时将某种模拟脚本注入(inject)浏览器。问题是,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

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

一起使用
options.add_extension("spec/support/chrome_extension_test_helper/chrome_extension_test_helper.crx")

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

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

最佳答案

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

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)

关于ruby - 将 JS 文件注入(inject) capybara chrome headless,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51516147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com