TIPS > capybaraとwebdriverで画像をダウンロードする

capybaraでselenium webdriverを用いた際の画像のダウンロード方法について記述します。

従来の方法について

  • こちらにあるようにwebdriverでは画像をダウンロードするための方法は提供されていないようです。
  • javascriptを用いた方法などもあるようですが個人的にイマイチ。
  • ログインが必要なwebサイト上にある画像だと、単純なGETではセッションが引き継がれず画像取得は不可。
  • FireFox Driverなら以下のような設定をプロファイルにしておくことでvisitすれば一応ダウンロードは可能。
    • ただし、原因は不明ですがブラウザ上で画像が開かれる場合があり回避方法がわかりませんでした。
- コード
Capybara.register_driver :selenium do |app|
  profile = Selenium::WebDriver::Firefox::Profile.new
  profile['browser.download.dir'] = "/tmp/webdriver-downloads"
  profile['browser.helperApps.neverAsk.saveToDisk'] = "application/pdf,image/jpeg"
  profile['browser.download.progressDnlgDialog.dontAskForLaunch'] = true
  Capybara::Selenium::Driver.new(app, :profile => profile)
end
Capybara.default_driver = :selenium

mechanizeでセッションを引き継いでダウンロードする方法

  • mechanizeではダウンロードメソッドが提供されています。
  • このため、webdriverからセッション(クッキー)を引き継いでメソッドを使用してみたところ、うまく画像をダウンロードできました。

試した環境

  • ruby 1.9.3p0
  • capybara 1.1.2
  • selenium-webdriver 2.20.0
  • mechanize 2.3
  • capybara-mechanize 0.3.0

試したコード

- コード
# -*- encoding: UTF-8 -*-
require 'capybara'
require 'capybara/dsl'
require "selenium-webdriver"
require 'capybara/mechanize'
 
include Capybara::DSL
 
Capybara.register_driver :selenium do |app|
  profile = Selenium::WebDriver::Firefox::Profile.new
  Capybara::Selenium::Driver.new(app, :profile => profile)
end
Capybara.default_driver = :selenium
Capybara.app_host = 'https://hogehoge'
Capybara.run_server = false
 
# (ログイン処理略)

# 現状のcookie取得
cookies = Capybara.current_session.driver.browser.manage.all_cookies
cookie = cookies.inject({}) { |all, c| all[c[:name]] = c[:value]; all }
begin
  Capybara.current_driver = :mechanize
  agent = page.driver.browser.agent
  # 対象webサイトではuser_agentを空にするか、default_driverと同じにしておくと同セッションとして扱われた。
  agent.user_agent = ""
  agent.request_headers = {'Accept-Language' => 'ja'}
  # cookieの引き継ぎ
  mcookies = agent.cookie_jar
  cookies.each { |cookie|
    mcookies << Mechanize::Cookie.new(cookie[:name], cookie[:value], cookie)
  }
  agent.cookie_jar = mcookies
  # 画像をダウンロードする
  agent.download('https://hogehoge/画像へのパス', "/tmp/test.dat")) 
  # 取得しなおしたcookieの保存
  cookies = []
  agent.cookie_jar.each do |mcookie|
    cookies << {:name => mcookie.name,
                :value => mcookie.value,
                :path => mcookie.path,
                :domain => mcookie.domain,
                :expires => mcookie.expires}
  end
ensure
  Capybara.use_default_driver
end
 
# 一応cookieをdefault_driverに戻しておく
cookies.each do |cookie|
  page.driver.browser.manage.add_cookie(cookie)
end
 
最終更新:2012年04月22日 14:38