XPathでclass指定で要素を取る方法

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つ目の引数で何番目の要素かを指定するようにした。

これで勝てる。


カテゴリー Ruby, Ruby on Rails | タグ   | パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です