質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.49%

Dockerを使用したRailsアプリのRSpecテストで、attach_fileを使いたい。

受付中

回答 0

投稿

  • 評価
  • クリップ 1
  • VIEW 446

score 10

実現したいこと

画像のアップロードテストにattach_fileを使用したいのですが、エラーが出てしまいます。

前提

  • DockerRailsアプリを作成しています。
  • system spec用のコンテナを別に作成し、js: trueの時はそこでテストを行っています。
  • 他のテストは、エラーなく通っています。
  • 実装した機能自体は、ブラウザで動くことを確認しています。

発生している問題・エラーメッセージ

Failure/Error: attach_file 'item[image]', image

ArgumentError:
  Selenium < 3.14 with remote Chrome doesn't support multiple file upload

# /usr/local/bundle/gems/capybara-3.33.0/lib/capybara/selenium/nodes/chrome_node.rb:29:in `rescue in set_file'
# /usr/local/bundle/gems/capybara-3.33.0/lib/capybara/selenium/nodes/chrome_node.rb:17:in `set_file'
# /usr/local/bundle/gems/capybara-3.33.0/lib/capybara/selenium/node.rb:72:in `set'
# /usr/local/bundle/gems/capybara-3.33.0/lib/capybara/node/element.rb:123:in `block in set'
# /usr/local/bundle/gems/capybara-3.33.0/lib/capybara/node/base.rb:83:in `synchronize'
# /usr/local/bundle/gems/capybara-3.33.0/lib/capybara/node/element.rb:123:in `set'
# /usr/local/bundle/gems/capybara-3.33.0/lib/capybara/node/actions.rb:303:in `attach_file'
# /usr/local/bundle/gems/capybara-3.33.0/lib/capybara/session.rb:753:in `attach_file'
# /usr/local/bundle/gems/capybara-3.33.0/lib/capybara/dsl.rb:53:in `call'
# /usr/local/bundle/gems/capybara-3.33.0/lib/capybara/dsl.rb:53:in `attach_file'
# ./spec/system/item_spec.rb:15:in `block (3 levels) in <top (required)>'
# ------------------
# --- Caused by: ---
# Selenium::WebDriver::Error::InvalidArgumentError:
#   invalid argument: File not found : /myapp/spec/factories/image/item-test_image.png
#     (Session info: headless chrome=85.0.4183.83)
#   #0 0x564a9db06aa9 <unknown>

該当のソースコード

RSpec.describe 'Item', type: :system do
  describe '新規登録', js: true do
    let(:name) { Faker::Lorem.word }
    let(:image) { "#{Rails.root}/spec/factories/image/item-test_image.png" }
    let(:url) { Faker::Internet.url }

    before do
      visit items_path
    end

    it '登録できること' do
      fill_in 'item[name]', with: name
      attach_file 'item[image]', image
      fill_in 'item[url]', with: url
      click_on '登録'
      expect(page).to have_selector 'li', text: name
    end
end
= form_with model: @item do |f|
  = f.label :name, '名前'
  = f.text_field :name

  = f.label :image, '画像'
  = f.file_field :image

  = f.label :url, 'サイトURL'
  = f.text_field :url
%ul
  - @items.each do |item|
    %li
      = medicine.name


capybara.rb

Capybara.register_driver :chrome_headless do |app|
  options = Selenium::WebDriver::Chrome::Options.new
  options.add_argument('--headless')
  options.add_argument('--no-sandbox')
  options.add_argument('--disable-dev-shm-usage')
  options.add_argument('--window-size=1680,1050')
  url = ENV.fetch('SELENIUM_DRIVER_URL')
  Capybara::Selenium::Driver.new(app, browser: :chrome, url: url, options: options)
end

RSpec.configure do |config|
  config.before(:each, type: :system) do
    driven_by :rack_test
  end

  config.before(:each, type: :system, js: true) do
    driven_by :chrome_headless
    Capybara.server_host = IPSocket.getaddress(Socket.gethostname)
    Capybara.server_port = 3000
    Capybara.app_host = "http://#{Capybara.server_host}:#{Capybara.server_port}"
  end
end


docker-compose.yml

version: '3'

volumes:
  db-data:

services:
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    ports:
      - '3000:3000'
    volumes:
      - '.:/myapp'
    environment:
      DATABASE_PASSWORD: ${MYSQL_PASSWORD}
      SELENIUM_DRIVER_URL: http://selenium_chrome:4444/wd/hub
    tty: true
    stdin_open: true
    depends_on:
      - db
      - selenium_chrome

  db:
    image: mysql
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - 'db-data:/var/lib/mysql'
    environment:
      MYSQL_USER: root
      MYSQL_ROOT_PASSWORD: ${MYSQL_PASSWORD}
    ports:
      - '4306:3306'

  selenium_chrome:
    image: selenium/standalone-chrome-debug
    ports:
      - '4444:4444'


テスト用画像のパス
./spec/factories/image/item-test_image.png

試したこと

  • js: true を消し、デフォルトのdriverでテストを行うと通りました。
  • エラー文にdoesn't support multiple file uploadとありましたが、画像は1枚しか使用していません。
  • エラー文にinvalid argument: File not foundとあったため、画像を見つけられていないのかと思い、capybaraやdockerの設定に問題があると考え、いろいろ調べましたが改善方法はわかりませんでした。

補足情報(FW/ツールのバージョンなど)

rails (6.0.3.2)
rspec-rails (4.0.1)
faker (2.13.0)
capybara (3.33.0)
selenium-webdriver (3.142.7)

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る