RSpecでlabelのクリックがうまくいかない場合の対応

RSpecでE2Eテスト(system spec)を書いていて、labelのクリックがうまくいかなかったときの対応。

まずはバッドケース。タグはこんな感じ。

<label for='good-check'>
  <input type='checkbox' id='good-check' />
  ここをチェック
</label>

これをrspecの以下のテストコードだとうまくチェック状態にすることができなかった。

check('ここをチェック')

とか

find("good-check").click

でもダメ

結論、テスト用にspanタグを忍ばせることにした。

本来はテストの目的でタグを増やしたくはないけれど、背に腹は変えられない。

<label for='good-check'>
  <input type='checkbox' id='good-check' />
  <span class="check-text">ここをチェック</span>
</label>

あとは、xpathで設定すればOK。これで動いた。RSpecは環境やコーディングの仕方によって、大分挙動が不安定になる。
内部的にはブラウザが立ち上がって、動作しているのだから、大変なことをしているわけでそりゃそうかという気もする。

find(:xpath, "//span[@class='check-text']").click