1
2

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.

Seleniumで、タグやクラスなどではなくテキストで要素を特定する方法

Last updated at Posted at 2021-03-18

テキスト指定は単にxpathつかえばいいだけだった

コメントで指摘されて初めてしったxpathの使い方。
特定のテキストのみを含むタグを指定したい場合は、単に

 driver.find_element(xpath: "div[contains(text(), '目印にしたい文章')]")

で指定してやればいいだけだった。こんな便利な方法があったとは…。

以前やってた方法

Seleniumはブラウザ上で自動化して情報を取得したり、操作したりできて大変お役立ちなわけだが、要素の取得方法は限定的だったりして迷うことが多かったのでメモ的に(自分はruby使ってるのでrubyについてだが、多分他の言語でも同じようなこととは思う)。当たり前だろって感じなので、そんなに目新しいものはないけど。

通常、Seleniumによって要素を取得する方法はclassやid、xpathによって行う。

 driver = Selenium::webDriver.for :chrome

 obj = driver.find_element(xpath: "//div[@class='hoge']/p")

多くはこのようにかいて、divタグのクラスhoge内のpタグの要素を取得するなど指定するわけだ。

しかしいずれの場合でもHTMLタグで取得したい情報の位置を指定するので、HTMLタグ側に特定の文字列がないと、とりたい情報を特定出来ない場合がある。同じようなHTMLが並んでて、テキストだけが違う場合はどうしたらよいだろう?

この場合でも同じように、まずは最低限しぼりこむところまでは同様のコマンドをかく。find_elementsコマンドを使って、候補になる要素の配列までは獲得しておこう。

その上で、一端.textで、配列を生成しておく。

obj = driver.find_elements(xpath: "//div[@class='hoge']")

ary = []

obj.each do |d|
 if d.text.include?("hogehoge")
       ary.push(d)
 end
end

これでhogehogeをテキストに含んだ要素の配列だけに絞れる。そしてさらにこの<div class='hoge'>以下のタグをとりたいなら

ary2 = []

ary.each do |d|
 ary2.push(d.find_elements(xpath: "div[@class=fuga]/a"))
end

などすると<div class="hoge">以下の<div class="fuga"> <a>タグの要素が取得できる。

要するに、seleniumで取得した要素は、seleniumのコマンドでそこからさらに絞り込むことができますよ~っていうだけの話なんだけど、自分は知らなかったので。

1
2
2

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
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?