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 スキル高まってきた気がする.キュルキュル!<何