おもしろwebサービス開発日記

Ruby や Rails を中心に、web技術について書いています

capybara 2.1 を学ぶ

Introducing Capybara 2.1 — Elabs を読んでのメモです。

capybara 2.1 を 2.0 と同じ挙動にする

capybara 2.1 を 2.0 と同じ挙動にするには下記のように設定する

Capybara.configure do |config|
  config.match = :one
  config.exact_options = true
  config.ignore_hidden_elements = true
  config.visible_text_only = true
end

capybara 1.x から 2.1 にアップグレードする

1.x から 2 系に上げると、互換性がない変更があって大変だけど、下記の設定をしておけばあとは簡単(らしい)。

Capybara.configure do |config|
  config.match = :prefer_exact
  config.ignore_hidden_elements = false
end

Matching exactly or allowing substrings, Behaviour when multiple elements match a query

READMEのこの辺りの話とほぼ同じ。

Exactness of options

下記のように書いたとき、optionタグの値と"1"を正確にマッチさせたい。でも "smart" なマッチにしてたら "10" にマッチしてしまう可能性もある。

select "1", :from => "Number of people"

正確にマッチさせたい場合は exact_optionstrue に設定すると良い。

Visibility

前のバージョンから、hidden な要素を無視するためのオプション、 Capybara.ignore_hidden_elements が存在していた。false がデフォルトだったのを true に変更した。前の挙動に戻したければ

Capybara.ignore_hidden_elements = false

とするとよい。

Visibilily of text

見えないテキスト(display:none)が text メソッドの戻り値に含まれるかどうかについて

  • capybara 1.x
    • RackTest では含まれる
    • 他のドライバは含まれない
  • capybara 2.0
    • RackTest 含む全てのドライバで含まれない
  • capybara 2.1
    • ignore_hidden_elementsfalse にしたら含まれる

2.1 では、text メソッドの引数によって挙動を切り替えることもできる

find("#thing").text           # Capybara.ignore_hidden_elements によって挙動が変わる
find("#thing").text(:all)     # 見えないテキストも含む
find("#thing").text(:visible) # 見えるテキストだけ

2.0.x から、ignore_hidden_elementsfalse でも、見えるテキストだけを返すオプションがある

Capybara.visible_text_only = true

Asserting against the page title

下記のコードは 2.0 からまともに動かない。

page.should have_css("title", :text => "Whatever")

title 要素は見えない要素なので、text には含まれない。title の内容を取得したり、想定している title かどうかを確認するには下記のようにする。

page.title # => "The title"
page.has_title?("The title") # => true
page.should have_title("The title")

Finding disabled elements

  • fill_inclick_button などの、フォームやボタンを操作する系のメソッドは、2.0 から disabled な要素に対しては操作できなくなった。
  • has_field?find_field も同じく disabled な要素に対しては効かないけど、findhas_selector? は効く。
  • 上記で上げたメソッドに disabled: true を引数として渡すと、disabled な要素だけに効くよう動作を変更できる。