NokogiriとSelenium-WebDriverのxpathの違い
Selenium-WebDriver
とNokogiri
で同じファイルを開いても違うxpath
を書かないといけないとダメで少しハマったのでメモ。
違いの原因
同じHTMLを解析してもSelenium-WebDriver
でChrome
やFirefox
で開いた時は任意の要素であるtbody
が挿入されるために違いが発生します。
実際の例
例えば
<table> <tr> <td></td> </tr> </table>
とある時に
Nokogiri の場合
require 'nokogiri' doc = Nokogiri::HTML(File.read("test.html")) doc.xpath("//table/tr")
Selenium WebDriver の場合
require 'selenium-webdriver' driver = Selenium::WebDriver.for :chrome driver.get("file:///C:/Users/ironsand/test.html") driver.find_element(:xpath, "//table/tbody/tr")
基本的な対策
大体の場合は//table//tr
とどちらにも対応できるように書いたらいいわけですが、汚いHTMLを解析するときに
//tr/td/font[contains(text(), 'Keyword')]/../../following-sibling::tr[3]/td
な感じで正確なタグの数が必要になることがあるのでそういう時に気をつけましょう。
参考
[ruby – How to get element that have same parent and n th different position by xpath – Stack Overflow][1]