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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Capybara

Capybaraは、 Rubyで開発されているWebアプリケーションテストフレームワークです。Webブラウザ不要でブラウザ上のユーザー操作及びJavaScriptの挙動を自動化することができます。

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

0回答

536閲覧

[Rails]RSpecで"<%= f.collection_select ... %>"テスト時の"Capybara::ElementNotFound:"が解決できない

hajsu00

総合スコア151

Capybara

Capybaraは、 Rubyで開発されているWebアプリケーションテストフレームワークです。Webブラウザ不要でブラウザ上のユーザー操作及びJavaScriptの挙動を自動化することができます。

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2022/07/06 13:25

編集2022/07/06 13:26

Rails 6 によるポートフォリオのRSpecテストを書いています。

レコードの新規登録画面でインスタンス変数に配列を代入して<%= f.collection_select ... %>に渡しているのですが、システムスペックでCapybaraを用いたテストがうまくいかずに長時間詰まっています。

ご助言をいただけると幸いです。

起きている問題

RSpecのシステムスペックで、Capybaraにより<%= f.collection_select ... %>からselect要素を生成すると、<option value=\"<モデルのid>\">となってしまう。

その結果、find("#glider_flight_aircraft_type_id").find("option[value='1]").select_optionを通すことができない。

期待する要素

html

1"<select class="select required" name="***[***]" id="***_id"><option value=""></option> 2<option value="1">A</option> 3<option value="2">B</option> 4<option value="3">C</option> 5... 6</select>"

今回

html

1"<select name=\"glider_flight[aircraft_type_id]\" id=\"glider_flight_aircraft_type_id\"><option value=\"\"></option>\n 2<option value=\"553\">ASK_4</option>\n 3<option value=\"554\">ASK_5</option>\n 4<option value=\"555\">ASK_6</option> 5</select>"

関連するコード

src/app/controllers/glider_flights_controller.rb

ruby

1class GliderFlightsController < ApplicationController 2... 3 before_action :set_glider_flight_selectors, only: [:new, :edit, :new_from_groups] <= ここでselect boxの値をセット 4 5 def new 6 @glider_flight = GliderFlight.new 7 end 8 9 def create 10 @glider_flight = current_user.glider_flights.build(glider_flight_params) 11 if @glider_flight.save 12 new_log_number 13 flash[:success] = "フライトログを投稿しました。" 14 redirect_to glider_flights_url 15 else 16 render 'glider_flights/new' 17 end 18 end

src/app/controllers/application_controller.rb

ruby

1class ApplicationController < ActionController::Base 2... 3 def set_glider_flight_selectors 4 @glider_type = AircraftType.where("category = ?", 'glider') 5 end 6... 7end

src/app/views/glider_flights/new.html.erb

erb

1<% provide(:button_text, '登録する') %> 2... 3<%= form_with(model: @glider_flight, local: true) do |f| %> 4 <%= render 'shared/error_messages', object: f.object %> 5... 6 <%= f.collection_select :aircraft_type_id, @glider_type, :id, :aircraft_type, prompt: "選択してください" %> 7... 8 <%= f.submit yield(:button_text) %> 9<% end %>

@glider_typeの中身(手動で)

bash

1[1] pry(#<#<Class:0x00007f773cacbd08>>)> @glider_type 2=> [#<AircraftType:0x00007f773cb2bd70 3 id: 1, 4 aircraft_type: "ASK21", 5 category: "glider", 6 created_at: Sun, 19 Jun 2022 21:53:58.084863000 JST +09:00, 7 updated_at: Sun, 19 Jun 2022 21:53:58.084863000 JST +09:00>, 8 #<AircraftType:0x00007f773cb95b30 9 id: 2, 10 aircraft_type: "ASK21B", 11 category: "glider", 12 created_at: Sun, 19 Jun 2022 21:53:58.104022000 JST +09:00, 13 updated_at: Sun, 19 Jun 2022 21:53:58.104022000 JST +09:00>, 14 #<AircraftType:0x00007f773cb95a68 15 id: 3, 16 aircraft_type: "ASK23b", 17 category: "glider", 18 created_at: Sun, 19 Jun 2022 21:53:58.127391000 JST +09:00, 19 updated_at: Sun, 19 Jun 2022 21:53:58.127391000 JST +09:00>]

src/spec/factories/aircraft_types.rb

ruby

1FactoryBot.define do 2 factory :aircraft_type do 3 sequence(:aircraft_type) { |n| "ASK_#{n}" } 4 category { "glider" } 5 end 6end

src/spec/systems/glider_glights_spec.rb

ruby

1require 'rails_helper' 2require 'glider_flights_helper' 3 4RSpec.describe GliderFlight, type: :system do 5 describe 'logged in user' do 6 before do 7 user = create(:user) 8 user.confirm 9 user.avatar.attach(io: File.open(Rails.root.join('app/assets/images/t_kyab.jpg')), filename: 't_kyab.jpg') 10 user.user_cover.attach(io: File.open(Rails.root.join('app/assets/images/test/user_test_cover/user_test_cover_4.jpg')), filename: 'user_test_cover_4.jpg') 11 create(:glider_initial_log, user: user) 12 sign_in user 13 @glider_type = create_list(:aircraft_type, 3) 14 end 15 it 'should get new_glider_flight_path' do 16 get new_glider_flight_path 17 expect(response).to have_http_status 200 18 end 19 context 'with valid value' do 20 it 'glider flight can be registered' do 21 visit new_glider_flight_path 22 fill_in 'glider_flight[date]', with: Date.today 23 24 binding.pry 25 26 find("#glider_flight_aircraft_type_id").find("option[value='1]").select_option 27 select 'JA21MA', from: 'glider_flight[glider_ident]' 28 fill_in 'glider_flight[departure_point]', with: '***' 29 fill_in 'glider_flight[takeoff_time]', with: Time.current 30 fill_in 'glider_flight[release_alt]', with: '400' 31 fill_in 'glider_flight[number_of_landing]', with: 1 32 fill_in 'glider_flight[arrival_point]', with: '***' 33 fill_in 'glider_flight[landing_time]', with: Time.current + 6 34 choose 'ウインチ曳航' 35 choose '機長' 36 check '野外飛行' 37 fill_in 'glider_flight[note]', with: '備考欄です。' 38 click_button '登録する' 39 expect(GliderFlight.all).to change{ GliderFlight.all.size }.by(1) 40 expect(current_path).to eq glider_flights_path 41 end 42 end 43 end 44end

RSpecエラー文

bash

1Failures: 2 3 1) GliderFlight logged in user with valid value glider flight can be registered 4 Failure/Error: find("#glider_flight_aircraft_type_id").find("option[value='ASK_4']").select_option 5 6 Capybara::ElementNotFound: 7 Unable to find css "option[value='ASK_4']" within #<Capybara::Node::Element tag="select" path="/html/body/header/div/main/article[2]/div/div[2]/form/div[1]/div/div[2]/div[2]/div[1]/select"> 8 # /usr/local/bundle/gems/capybara-3.37.1/lib/capybara/node/finders.rb:310:in `block in synced_resolve' 9 # /usr/local/bundle/gems/capybara-3.37.1/lib/capybara/node/base.rb:83:in `synchronize' 10 # /usr/local/bundle/gems/capybara-3.37.1/lib/capybara/node/finders.rb:299:in `synced_resolve' 11 # /usr/local/bundle/gems/capybara-3.37.1/lib/capybara/node/finders.rb:60:in `find' 12 # ./spec/systems/glider_glights_spec.rb:23:in `block (4 levels) in <main>'

@glider_typeの中身(RSpecを実行した場合)

前項該当箇所の直前でbinding.pryしました。

bash

1[1] pry(#<RSpec::ExampleGroups::GliderFlight_2::LoggedInUser::WithValidValue>)> @glider_type 2=> [#<AircraftType:0x000055895018fd60 3 id: 553, 4 aircraft_type: "ASK_4", 5 category: "glider", 6 created_at: Wed, 06 Jul 2022 21:59:31.387230000 JST +09:00, 7 updated_at: Wed, 06 Jul 2022 21:59:31.387230000 JST +09:00>, 8 #<AircraftType:0x0000558950175cf8 9 id: 554, 10 aircraft_type: "ASK_5", 11 category: "glider", 12 created_at: Wed, 06 Jul 2022 21:59:31.394274000 JST +09:00, 13 updated_at: Wed, 06 Jul 2022 21:59:31.394274000 JST +09:00>, 14 #<AircraftType:0x00005589501e7970 15 id: 555, 16 aircraft_type: "ASK_6", 17 category: "glider", 18 created_at: Wed, 06 Jul 2022 21:59:31.402043000 JST +09:00, 19 updated_at: Wed, 06 Jul 2022 21:59:31.402043000 JST +09:00>]

capybaraで取得した要素の中身

bash

1[1] pry(#<RSpec::ExampleGroups::GliderFlight_2::LoggedInUser::WithValidValue>)> find('#glider_flight_aircraft_type_id').native.to_s 2=> "<select name=\"glider_flight[aircraft_type_id]\" id=\"glider_flight_aircraft_type_id\"><option value=\"\">選択してください</option>\n<option value=\"553\">ASK_4</option>\n<option value=\"554\">ASK_5</option>\n<option value=\"555\">ASK_6</option></select>"

お手数お掛けしますが、よろしくお願いいたします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問