Headless Chromeでダウンロードできない
PR

Headless Chromeでダウンロードできない

DockerでSeleniumとRSpec ソフトウェア
記事内に広告が含まれています。
スポンサーリンク
スポンサーリンク
スポンサーリンク

Headless Chromeを使ってみた

オートパイロットでWebページをたどり、ファイルをダウンロードする仕掛けが必要になった。Headless Chromeを使えば、Window Systemのセットアップを行わずにお手軽にできると思ってやってみたところ、ファイルのダウンロードはできなかった。

  • ChromeDriver 2.43.600233 (523efee95e3d68b8719b3a1c83051aa63aa6b10d)
  • Google Chrome 70.0.3538.77
  • Ruby 2.5の公式Dockerイメージ
スポンサーリンク

設定を追加すれば、ダウンロードできるようになる

696481 – Headless mode doesn’t save file downloads – chromium – Monorailに解決方法が載っていた。1年近く前の記事だけど、まだ修正版がリリースされていないのか…。

Ruby, Capybara, Seleniumの組み合わせだと、こんな感じ。

Capybara.register_driver :selenium_chrome do |app|
  options = Selenium::WebDriver::Chrome::Options.new
  options.add_argument('headless')
  options.add_argument('disable-gpu')
# 696481 - Headless mode doesn't save file downloads - chromium - Monorail https://bugs.chromium.org/p/chromium/issues/detail?id=696481
  options.add_preference(:download, directory_upgrade:true,
  prompt_for_download: false, default_directory: '/tmp')
  options.add_preference(:browser, set_download_behavior: {behavior: 'allow'})
  driver = Capybara::Selenium::Driver.new(app, browser: :chrome, options: options)
  bridge = driver.browser.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: '/tmp'
  })
  driver
end


chromedriverに用意されているheadless chromeの設定だとダウンロードできないため、新たにdriverを定義して、ダウンロードできるように設定を追加するのがポイント。
これを使うには

Capybara.default_driver = :selenium_chrome
Capybara.javascript_driver = :selenium_chrome


と、ドライバーをセットすればよい。

スポンサーリンク

相変わらず難しい

いくつものライブラリ(gem)やドライバーを用意しないとブラウザを操作できないため、単純なものであっても一番最初に作る時の難易度は高い。
が、やってみて最初の壁を乗り越えないと、次の世界に進めない。

ちょっと古めのサイトだと、jQueryでCSSをいじっていたりするので、scriptから操作するのも結構大変だったりする。が、何度も行う必要があるものであれば、苦労に見合うだけの価値はきっとある。

コメント

タイトルとURLをコピーしました