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

スポンサーリンク

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

SeleniumとWebDriverでWebサイトのテストコードをRspecで書く
概要 テストコードを書いて動かしてみる。テストコードと設定ファイルはHost側にあるが、テストに必要なライブラリはコンテナ内にインストール...

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

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存

フォローする

この記事へのコメント

Loading Facebook Comments ...

No Trackbacks.