Capybara で非表示要素を find する

Capybara で style="display: none;" になってる非表示要素を取ろうとしたら Capybara::ElementNotFound になって困った.

結論から言うと,自分の Capybara の環境設定だと非表示要素は無視されるようになってた.

visible: false で見れるようになった

こんな感じで visible: false を付けると非表示要素が見れるようになった.

page.find(:xpath, 'xxx') # => Capybara::ElementNotFound
page.find(:xpath, 'xxx', visible: false) # => Capybara::Node::Element

ドキュメントを見ると :all でも良いし,非表示要素に限定するなら :hidden も使える.ドキュメントに書いてあるとは言え,このオプション自体を知らなかったからちょっと時間掛かった.

  • visible (Boolean, Symbol) — Only find elements with the specified visibility:
    • true - only finds visible elements.
    • false - finds invisible and visible elements.
    • :all - same as false; finds visible and invisible elements.
    • :hidden - only finds invisible elements.
    • :visible - same as true; only finds visible elements.

Capybara の環境設定を変えることもできる

以下の設定値で決めることができる.

Capybara.ignore_hidden_elements

コードを見た感じだと,デフォルト値は true になっている.ようするに非表示要素は取れない.

Capybara.configure do |config|
(中略)
  config.ignore_hidden_elements = true
(中略)
end

デフォルト値を更新するなら spec_helper.rb で設定すれば良いかと.

ただし,グローバルに更新するのも微妙だなという感じもするので,基本的には visible: false を使えば良いと思うけど,もし検証する要素が多くて DRY ではないのであれば,一時的に false にして true に戻すのもあり?

Capybara.ignore_hidden_elements = false

まとめ

少しずつ Capybara スキル高まってきた気がする.キュルキュル!<何

関連エントリー