💎

【RSpec/Capybara】dt要素に隣接するdd要素のテキストが空文字であることをテストする

2024/07/23に公開

問題

下記のようなDOMツリーにおいて、dt要素に隣接するdd要素のテキストが空文字であることをテストしたいことがありました。

<dl>
  <dt>ラベル</dt>
  <dd></dd>
</dl>

findsibling を使って次のようにテストケースを書きましたが、dd 要素が取得できずテストが失敗してしまいました。

expect(find("dt", text: "ラベル", match: :first).sibling("dd").text).to eq ""

# エラー
eval error: Unable to find visible css "dd"

原因

findsibling を含む 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 オプションで見えなものを探すように設定します。

siblingvisible: :all を指定しているところがポイントです。

expect(find("dt", text: "ラベル", match: :first).sibling("dd", visible: :all).text).to eq ""

Discussion