💎
【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