2021年5月23日日曜日

Selenium + Firefox でファイルをダウンロードのダウンロードはできなさそう

Selenium + Firefox でファイルをダウンロードのダウンロードはできなさそう

概要

ブラウザでダウンロードする際にダウンロードするファイルをどうするかという確認のダイアログが表示されます これを Selenium + Firefox で消そうと思ったのですがどうやってもできなかったので紹介します

環境

  • macOS 11.3.1
  • Ruby 3.0.0
    • selenium-webdriver 4.0.0.beta3
  • Firefox 88

Ruby3 を使う場合は selenium-webdriver 4 が必要になります

インストール

  • bundle init
  • vim Gemfile
gem "selenium-webdriver", "4.0.0.beta3"
  • bundle install

プロファイルを指定して Firefox を起動すれば特定のファイルのダウンロードルールを使えるのでは

既存の Firefox でダウンロードしたいファイルを一度ダウンロードします その際に指定のファイルは次回以降同じ設定でダウンロードすることができるという機能があります

この機能を使ってプロファイルを作成しそのプロファイルを selenium で指定することでプロファイル付きの Firefox を起動することができるようになります

options = Selenium::WebDriver::Firefox::Options.new(args: ['-profile', '/path/to/profile'])

@driver = Selenium::WebDriver.for :remote, url: "http://#{host}:4444/wd/hub", options: options

一応公式でも手順が公開されてはいるのですがバグの回避策として紹介されている感じです 確かにプロファイル付きで Firefox は起動できるのですがそのあと selenium に接続することができません

どうやらプロファイル付きだと geckodriver が見つからなくなってしまうようで結局動作しません

調べてみると marionette を有効にすれば動作するという記事もみたのですが自分はダメでした

プロファイルを設定すればいけるという情報がかなりあったがダメだった

例えば以下のような感じでプロファイルを設定し Firefox ドライバを作成します これで localhost でも docker 上でも試したのですが結局ダイアログが出なくなることはありませんでした

profile = Selenium::WebDriver::Firefox::Profile.new
profile['browser.download.folderList'] = 2
profile['browser.download.useDownloadDir'] = true
profile['browser.download.dir'] = '/tmp'
profile['browser.download.lastDir'] = '/tmp'
profile['browser.download.downloadDir'] = '/tmp'
profile['browser.download.defaultFolder'] = '/tmp'
profile['browser.download.manager.showWhenStarting'] = false
profile['browser.download.manager.useWindow'] = false
profile['browser.download.manager.focusWhenStarting'] = false
profile['browser.download.manager.showAlertOnComplete'] = false
profile['browser.download.manager.closeWhenDone'] = true
profile['browser.download.viewableInternally.enabledTypes'] = ""
profile['browser.helperApps.alwaysAsk.force'] = false
profile['browser.helperApps.neverAsk.saveToDisk'] = 'text/plane,text/csv,application/x-ofx,text/comma-separated-values,application/octet-stream,application/vnd.ms-excel,application/x-gzip,text/txt,application/gzip,application/zip,text/html,txt,text'

options = Selenium::WebDriver::Firefox::Options.new(:profile => profile)

@driver = Selenium::WebDriver.for :remote, url: "http://#{host}:4444/wd/hub", options: options

原因を考える

もしかしたら自分の設定が足りていないだけかもしれないので少し原因を考えてみました

content-type が足りていない

browser.helperApps.neverAsk.saveToDisk にダイアログを表示しない content-tyep を記載するのですがそこにダウンロードするファイルの content-type がない可能性があります

しかし自分の場合はちゃんとブラウザなどで content-type を調べた上で記載したので漏れはないかなと思っています

handlers.json が優先されているのか

上記のプロファイルの記載よりもプロファイルフォルダ配下にある handlers.json の設定が優先されているのかもしれません むしろここに記載がないと意味がない可能性すらありそうです

なので今回プロファイル付きの Firefox を起動するようにしたのですが結局 selenium 経由では動作できませんでした 別の方法で handlers.json を上書きできればもしかしたら動作させることができるかもしれません

最後に

いろいろ試してみたのですが結局 Selenium + Firefox でダウンロードのダイアログを消すことはできませんでした

回避策としては chrome や edge ドライバを使うことかなと思います

参考サイト

0 件のコメント:

コメントを投稿