Selenium-WebDriverNokogiriで同じファイルを開いても違うxpathを書かないといけないとダメで少しハマったのでメモ。

違いの原因

同じHTMLを解析してもSelenium-WebDriverChromeFirefoxで開いた時は任意の要素である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]