Request SpecでXPathを使ってクラス名を指定して要素を取得しようとしたんですが、方法がわかったのでメモ。
まず、参考にしたサイトはこちら。
特定のclass属性を持った任意の要素にマッチするXPath
上記のサイトに書かれているようにRSpec側ではこう書く。
find(:xpath, "//*[contains(concat(' ',@class,' '), ' class_name ')]").should have_content "hoge"
みたいな感じです。
これでいけるわー、勝てるわーと思って、spec/supportフォルダ以下に、xpath_helpers.rbを作成。
# coding: utf-8 def find_by_class(tag, class_names) find(:xpath, "//#{tag}[contains(concat(' ',@class,' '), ' #{class_names} ')]") end
ところが、これだと1つめにヒットした要素しか取れなかった…。
2つ目以降どうすんねんと思って調べたら、
page.all(:xpath, …)
という方法があることがわかったので、さらに修正。
# coding: utf-8 def find_by_class(tag, class_names, num=nil) if num.nil? find(:xpath, "//#{tag}[contains(concat(' ',@class,' '), ' #{class_names} ')]") else page.all(:xpath, "//#{tag}[contains(concat(' ',@class,' '), ' #{class_names} ')]")[num] end end
1つ目の引数でタグ名を、2つ目の引数でクラス名を、3つ目の引数で何番目の要素かを指定するようにした。
これで勝てる。