QR Send

スマホとPCのChrome間で、URLやテキストをQRコード1回のペアリングで送り合える自作Chrome拡張。アカウント不要・無料。

使ってみる →

chromedriverのheadlessでファイルをダウンロードする

Selenium・自動化

headlessではないGUIでのコード

まず通常モードでの実装です。
ダウンロード先のパスを指定するダイアログを表示しないようにして、
ダウンロード先のパスを指定します。
今回はコードと同ディレクトリの tmp フォルダを指定します。

prefs = {
  :download => {
  :prompt_for_download => false,
  :default_directory => File.absolute_path("./tmp")
  }
}

d = Selenium::WebDriver.for :chrome, prefs: prefs

# この後にダウンロードリンクをクリックするコードを書く

 

headlessモードでの実装

さっきのコードに単純にheadlessのオプションも渡して実行してもファイルが保存されません。
こんな感じ。

prefs = {
  :download => {
  :prompt_for_download => false,
  :default_directory => File.absolute_path("./tmp")
  }
}

caps = Selenium::WebDriver::Remote::Capabilities.chrome("chromeOptions" => {prefs: prefs, args: ["--headless", "window-size=1280x800"]  } )

d = Selenium::WebDriver.for :chrome,desired_capabilities: caps

# この後にダウンロードリンクをクリックするコードを書く

これではどこにも保存されませんでした。

正解はこうでした。

options = Selenium::WebDriver::Chrome::Options.new
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-gpu')
options.add_argument('--disable-popup-blocking')
options.add_argument('--window-size=1366,768')

d = Selenium::WebDriver.for :chrome, options: options

bridge = d.send(:bridge)
path = "/session/#{bridge.session_id}/chromium/send_command"
command_hash = {
 cmd: 'Page.setDownloadBehavior',
 params: {
  behavior: 'allow',
  downloadPath: File.absolute_path('./tmp').gsub(/\//, "\\")
 }
}
bridge.http.call(:post, path, command_hash)

# この後にダウンロードリンクをクリックするコードを書く

これでいけました。
pathのgsubはwindowsで実行する場合に必要で、linuxでは不要です。

 

単純に今のchromedriver 2.38(2018/5/2現在)が非対応なだけだとは思いますが、
とりあえずはこれでいけます。

コメント

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