概要
ブラウザでダウンロードする際にダウンロードするファイルをどうするかという確認のダイアログが表示されます これを 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 件のコメント:
コメントを投稿