カテゴリー:
Rails
タグ:
 メモ Capybara

このエントリーをはてなブックマークに追加
更新日時:
2014年09月04日(木)
作成日時:
2014年06月05日(木)

前の記事 / 次の記事

ページのレンダリングを試みる

visit

visitした結果のページ

page

cssの要素を検証する

expect(page).have_css "h1", text: タイトル

ステータスコード(rspecのresponse)

page.status_code

Deviseのログイン状態をつくる*

参考:rspec-rails (2.14.0) + devise (3.2.1, 3.2.0) + capybara (2.2.0) でsign in判定

vi spec/spec_helper.rb
Rspec.configure do |config|
  config.include Capybara::DSL
  include Warden::Test::Helpers
end

hover状態を得る

page.find( "#elem" ).hover

or

page.find( "#elem" ).trigger(:mouseover)

hoverはJavaScriptが動かなくても使えそうな気持ちがするけど
Capybara上ではJavaScriptドライバを介さないと使えない。

複数ある要素の最初の要素を得る

要素が複数ある要素を選択しようとするとAmbigiousエラーになるので
具体的にどの要素なのかを1つに特定する必要がある。

page.first( ".elem" )

ある要素が何かを持っている(いない)ことを調べるメソッド

page.find("#elem").send :method_name

  • has_selector?
  • has_no_selector?
  • has_xpath?
  • has_no_xpath?
  • has_css?
  • has_no_css?
  • has_text?
  • has_content?
  • has_no_text?
  • has_no_content?
  • has_link?
  • has_no_link?
  • has_button?
  • has_no_button?
  • has_field?
  • has_no_field?
  • has_checked_field?
  • has_no_checked_field?
  • has_unchecked_field?
  • has_no_unchecked_field?
  • has_select?
  • has_no_select?
  • has_table?
  • has_no_table?

session変数にアクセスしたいんだけど?

インストール

$ vi Gemfile
group :test do
  gem 'rack_session_access'
end    
$ bundle install

設定

Rails
(セキュリティ上の問題があるので必ずテスト系の設定ファイルに記述する。)

$ vi config/environments/test.rb
AppName::Application.configure do
  config.middleware.use RackSessionAccess::Middleware
end

Rspec

$ vi spec/spec_helper.rb
require "rack_session_access/capybara"

フォームを入力して送信する

%form#from-submit
  %input{ type: :text, name: "title" }
  %input{ type: :text, name: "description" }
  %input{ type: "checkbox", name: "numbers[]", value: "1" }
  %input{ type: "checkbox", name: "numbers[]", value: "2" }
  %input{ type: "checkbox", name: "numbers[]", value: "3" }
  %submit{ name: "commit" }

みたいな時。

within( "#form-submit" ) do
  fill_in "title", with: "俺の備忘録"
  fill_in "description", with: "忘れたくない記録。"
  all( "input[type=checkbox]" )[2].set(true)
end

セレクトボックス

select "ラベル", from: "id or name"

セレクトボックスをクラスで指定したい

find(".the_class").select "ラベル"

複数のセレクトボックスからクラスで指定したい

all(".the_class")[0].select "ラベル"
all(".the_class")[3].select "ラベル"
all(".the_class")[5].select "ラベル"

※ラベルはvalueじゃなくて実際にブラウザ上に表示される値。

セレクターの書き方は色々あるけど、唯一の何かにセレクトできれば書き方はなんでもいい。
複数の要素がヒットするとAmbigiousエラーになる(曖昧エラー)。

ラジオボタンを選択する

表示されるラベルかcssのidを指定する。

choose "ラベル"
or
choose "#radio_button_id"

任意のメソッドでリクエストを送る

Capybara POST requests
stackoverflow / how to make capybara do a delete request in a cucumber feature?

page.driver.submit :put,    put_path,    {}
page.driver.submit :delete, delete_path, {}

自分の環境に依存してるのかも知れないけど、
page.driver.submit すると current_path とか session が引き継がれるというか、
例えば

before { page.driver.submit :post, post_path, {} }

context "case 1" do
  let(:user) { admin_user   }
  specify { p current_path }
  specify { expect(current_path).to eq success_path }
end
context "case 2" do
  let(:user) { general_user }
  specify { p current_path }
  specify { expect(current_path).to eq failure_path }
end

みたいなテストを書いた時、上から順に実行されるとすると、
case 1 の p current_path は nil だけど、
case 2 の p current_path は success_path になる。

まあ、rspecのrequest specで書けばいいんだろうけど。

だるい。

不可視要素のjs時、非js時の扱いの違い

次のような要素に対して、

%p#the-elem.hidden

非js時

# 次のテストが通る
specify { expect(page).to be_has_css "#the-element.hidden" }

js時

# 次のテストは通らない
specify { expect(page).to be_has_css "#the-element.hidden" }
# 次のテストは通る
specify { expect(page).to be_has_no_css "#the-element"}

任意のパラメーターを送る

Capybara便利だけどViewから送れるようにしてない値を送ってみたい時もある。
で、page.driver.submitを使って、

page.driver.submit :post, post_path, { key: :value }

とかすればいいんだけど、パラメーターがコレクションの時にちょっと注意。
StrongParametersではパラメーターがコレクションの時は配列として定義すれば
受け取るころができる。

params.fetch(:you, {}).permit(:name, items_attributes: [:name, :price])

とか。だからCapybaraに渡す時も同じように配列で渡したくなるけど、
Rails上で実際に渡っているのは、フォームヘルパーを使っていれば、
敢えて配列で受け取るようにしてない限りハッシュで渡してるケースの方が多いと思うので
Capybaraに渡すのもハッシュにしないとうまくいかないケースが出てくる。

でもハッシュで渡すところを配列で渡してしまってもうまくいくケースもあって、
うまく行くケースはなんでうまくいってるのか謎だけどキモいからハッシュで渡すようにする。

ヘルパーの種類によってハッシュになるか配列になるか違うんだけど、
何がどうなるのかは忘れたし調べない。