💎
【RSpec/Capybara】dt要素に隣接するdd要素のテキストが空文字であることをテストする
問題
下記のようなDOMツリーにおいて、dt
要素に隣接するdd
要素のテキストが空文字であることをテストしたいことがありました。
<dl>
<dt>ラベル</dt>
<dd></dd>
</dl>
find
と sibling
を使って次のようにテストケースを書きましたが、dd
要素が取得できずテストが失敗してしまいました。
expect(find("dt", text: "ラベル", match: :first).sibling("dd").text).to eq ""
# エラー
eval error: Unable to find visible css "dd"
原因
find
や sibling
を含む Capybara::Node::Finders
には visible
というオプションがあり、デフォルトでは見えないものは探さないという設定になっていました。
- visible (Boolean, Symbol) — Only find elements with the specified visibility. Defaults to behavior indicated by ignore_hidden_elements.
- 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.
参考: Module: Capybara::Node::Finders
つまり、見えないものを探すためには visible
オプションを false
, :all
, :hidden
のいずれかに設定する必要があります。
解決方法
visible
オプションで見えなものを探すように設定します。
sibling
に visible: :all
を指定しているところがポイントです。
expect(find("dt", text: "ラベル", match: :first).sibling("dd", visible: :all).text).to eq ""
Discussion