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から操作するのも結構大変だったりする。が、何度も行う必要があるものであれば、苦労に見合うだけの価値はきっとある。
コメント