LoginSignup
10
5

More than 5 years have passed since last update.

local のファイルを remote のブラウザで attach_file させるには

Posted at

環境想定

capybara + selenium-webdriver でリモートマシンのブラウザを用いて実行しているとき

※ 一応 selenium-webdriver は 2.34.0 で確認していますが、きっと前のバージョンでも使えると思います

目的

  1. Capybara::Node::Actions#attach_file でファイル添付を行いたいと考える

    attach_file('import', '/home/gongo/fixtures/hoge.csv')
    
  2. ブラウザがローカルで動いている分には問題ない。

  3. ブラウザがリモートで動いている場合に失敗する。なぜならリモートマシンに /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 の書き方的には

  1. まずは attach_file で指定されたファイルを ローカルマシンで検索
  2. ローカルになかった場合、今度は リモートマシンで検索
  3. どっちにも無かったら raise Capybara::FileNotFound

となります

参考

別記事でもまとめてあります。

10
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
5