環境想定
capybara
+ selenium-webdriver
でリモートマシンのブラウザを用いて実行しているとき
※ 一応 selenium-webdriver
は 2.34.0 で確認していますが、きっと前のバージョンでも使えると思います
目的
-
Capybara::Node::Actions#attach_file
でファイル添付を行いたいと考えるattach_file('import', '/home/gongo/fixtures/hoge.csv')
-
ブラウザがローカルで動いている分には問題ない。
-
ブラウザがリモートで動いている場合に失敗する。なぜならリモートマシンに
/home/gongo/fixtures/hoge.csv
が 存在しないから
対応策としては、リモートマシンにも /home/gongo/fixtures/hoge.csv
を配置しておけばいい。しかし……
- 並列化のためリモート環境を大量に準備したい → 配置めんどい
- もしリモート環境が Windows だったら → いちいちリモート環境に併せてパスの記述を変えたくない(
C:\Users\gongo\fixtures/hoge.csv
みたいに)- 実は
/path/to
形式でもよしなにしてくれるんですかね……
- 実は
対策
Selenium::WebDriver::Driver#file_detector
を使います。
Capybara.register_driver :remote_windows do |app|
# リモートマシンのブラウザを使う場合によくやる設定
caps = Selenium::WebDriver::Remote::Capabilities.internet_explorer
url = "http://#{host}:#{port}}/wd/hub/"
opts = { desired_capabilities: caps, browser: :remote, url: url }
driver = Capybara::Selenium::Driver.new(app, opts)
# ここからが本題。driver を返す前に ↓ をしておく。
driver.browser.file_detector = lambda do |args|
str = args.first.to_s
str if File.exist? str
end
driver
end
この設定をすることで、 attach_file
に指定したファイルが selenium webdriver の機能で リモートマシンに転送 され、リモートマシンのブラウザからアクセスできるようになります。
補足ですが、lambda
の書き方的には
- まずは
attach_file
で指定されたファイルを ローカルマシンで検索 - ローカルになかった場合、今度は リモートマシンで検索
- どっちにも無かったら
raise Capybara::FileNotFound
となります
参考
別記事でもまとめてあります。