テキスト指定は単に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のコマンドでそこからさらに絞り込むことができますよ~っていうだけの話なんだけど、自分は知らなかったので。