7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Capybaraでtrタグのtdタグを指定してテストする方法

Last updated at Posted at 2020-01-17

はじめに

tr1行目のtd3番目と指定したいときに悩んだんで備忘録として残しておきます。

よく見かけるやつ

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の部分のテストは不要だったので書いていません。
このあたりはご自身が取得されたい要素によって使い分けてもらえればと思います。

まとめ

ひたすら数えたりとかすることの手間がこれで省ければと思います。

7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?