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