ruby-on-rails - Chrome无头下载pdf使用capybara和selenium
问题描述
我在我的 Ruby on Rails (5.2.1) 项目中使用带有 Selenium (3.14.0) 和 Capybara (3.8.0) 的 chrome headless,我有一个测试可以在非无头 chrome 中工作,但不能在无头 chrome 中使用。我在 google chrome 稳定版 69 上使用了“--headless”标志。
我已经使用以下内容设置了我的无头 chrome,这适用于所有不下载文件的测试。
download_path="#{Rails.root}/tmp/downloads"
Capybara.register_driver(:headless_chrome) do |app|
caps = Selenium::WebDriver::Remote::Capabilities.chrome(
chromeOptions: {
prefs: {
'download.default_directory' => download_path,
"download.extensions_to_open" => "applications/pdf",
'download.directory_upgrade' => true,
'download.prompt_for_download' => false,
'plugins.plugins_disabled' => ["Chrome PDF Viewer"]
},
binary: "/opt/google/chrome/google-chrome",
args: %w[headless disable-gpu window-size=1920,1080]
}
)
Capybara::Selenium::Driver.new(
app,
browser: :chrome,
desired_capabilities: caps
)
end
我已经读到我应该向 selenium chrome 驱动程序发送一个命令以允许下载,但我无法弄清楚如何通过我的设置来做到这一点。这是我正在尝试的工作,但使用我的设置;(不是来自我的代码库);
@driver = Selenium::WebDriver.for :chrome, options: options
bridge = @driver.send(:bridge)
path = '/session/:session_id/chromium/send_command'
path[':session_id'] = bridge.session_id
bridge.http.call(:post, path, cmd: 'Page.setDownloadBehavior',
params: {
behavior: 'allow',
downloadPath: download_path
})
如何在我的设置中访问 selenium 桥,以便我可以发送这个 http 调用?
解决方案
您不再需要手动发送它,它已添加到 selenium 作为Selenium::WebDriver::Chrome::Server#download_path=
. 您可以通过Capybara::Selenium::Driver
实例在您的驱动程序注册中设置它
...
Capybara::Selenium::Driver.new(
app,
browser: :chrome,
desired_capabilities: caps
).tap { |d| d.browser.download_path = <your download path> }
推荐阅读
- php - 具有多个客户端和防止缓存踩踏的 PHP Web 服务的最佳方法
- python - 已安装 Conda 虚拟环境和软件包
- c - 为什么hiredis函数使用void*而不是redisReply*?
- javascript - 下载按钮在 Internet Explorer 上不起作用
- javascript - 有人可以解释npm依赖吗?
- ios - iOS 13 beta 外屏上的 OverscanCompensation
- python - Pig_Latin 大写
- azure - Gzip 解压缩不能作为流分析作业中的配置输入工作
- c# - 微软 Azure 人脸对比
- css - SCSS 中创建扩展类名的未知 @ 规则?