はじめに
tr
1行目のtd
3番目と指定したいときに悩んだんで備忘録として残しておきます。
よく見かけるやつ
xxx_spec.rb
all('tbody tr')[0]
# tbodyの中の一行目のtrを取得する
all('tbody td')[0]
# tbody中から、tdの一つ目を取得する
上記のコードを自分はよく使ってます。
ただ、日付
をeach
でまわしてtable
を作成したときに、n番目のtd
を取得したいときに問題発生。
1月時点で1行目のみテストする場合は問題ないですが、tr
の2行目にtd
要素があるかどうかみたいなとき、
1月は31日までなので、2行目まで数えようとしたら、all('tbody td')[32]
のようにわざわざ要素を数えて、みたいなことしてると3行目のtd
数えるとかしんどーー!!ってなります。
ちなみに、こういう場合月によって末日が変わるので、travel_to
でテストを書く日付を固定しないといけなくなるので良くないかもしれないです。
実装
xxx.html.haml
%table
%thead
%tr
%th 名前
%tbody
%tr
%td てつお君
%td ひろみちゃん
%tr
%td まさし君
%td ひろたか君
上記のようなtable
がある場合、ひろみちゃん
を取得したい場合はこれだけでいけます。
xxx_spec.rb
# trの1行目取得
tds = all('tbody tr')[0].all('td')
expect(tds[1]).to have_content 'ひろみちゃん'
# trの2行目のまさし君取得
tds = all('tbody tr')[1].all('td')
expect(tds[0]).to have_content 'まさし君'
これでテスト完了です。
ちなみに、('tbody tr')
のtbody
としてるのは、thead
の部分のテストは不要だったので書いていません。
このあたりはご自身が取得されたい要素によって使い分けてもらえればと思います。
まとめ
ひたすら数えたりとかすることの手間がこれで省ければと思います。