ruby - 有没有办法使用 Ruby 在 Centos 中使用 headless chromedriver 下载文件?
问题描述
我尝试使用无头 chrome 下载文件,但该文件似乎没有在任何地方下载。我可以看到它实际上是一种安全功能,可以限制无头文件下载,但是,在 Ruby 中是否有相同的解决方法?尝试了下面的代码,但没有运气。
download_path = "#{Pathname.pwd}/test-data/downloaded"
options = Selenium::WebDriver::Chrome::Options.new
options.add_argument("--disable-dev-shm-usage");
options.add_argument('--headless') #Declaring the browser to run in headless mode
options.add_preference(
:download, directory_upgrade: true,
prompt_for_download: false,
default_directory: download_path
)
options.add_preference(:browser, set_download_behavior: { behavior: 'allow' })
@driver = Selenium::WebDriver.for :chrome, options: options #Browser object initialization
set_screen_resolution(1400, 900)
$driver = @driver
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
})
我希望使用无头 chrome 下载文件,但它没有发生。
解决方案
当您单击下载链接并且如果它在文件开始下载之前在单独的选项卡中打开时,那么您还需要将上述脚本应用到新打开的选项卡,因为您只为当前选项卡设置了会话 ID而不是新打开的标签。因此,在尝试下载文件之前,请尝试将此脚本应用于新打开的选项卡。我相信它会起作用的。
def download_file(label, download_path)
ele = Locator.new(:xpath, "//ul[@class='cnt']//div[text()='#{label}']/..//a")
download_url = get_attribute(ele.get_how, ele.get_what, "href")
@driver.execute_script("window.open()")
@driver.switch_to.window(@driver.window_handles.last)
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
}
})
@driver.get(download_url)
@driver.close
@driver.switch_to.window(@driver.window_handles.last)
end
推荐阅读
- c# - Blazor Server 应用 + 外部登录 Facebook:用户名已被占用
- javascript - 类构造函数没有被调用
- javascript - 当主体更改为 DOM 元素时,循环无法正常工作
- python - Python enumerate 没有绘制正确的 matplotlib 数字?
- c++ - 为什么我们需要 rbegin 和 Rend?
- ios - 使用 Firebase Auth 使用 Google 登录时,如何在某些视图控制器中提供登录数据?
- python - 如何比较数据框两列中的值
- docusignapi - 文档 | 嵌入式签名 | 发件人如何与收件人/签名者共享“收件人签名 URL”?
- inno-setup - 使用 PrivilegesRequired=admin 从浏览器运行 InnoSetup 安装程序
- sql - 在检查是否需要保留旧值或插入新值时在 postgres SQL 上进行 Upsert 查询?