2018年以降の記事はGitHub Pagesに移行しました

Selenium WebDriverでFirefoxがロードできなくなった

あらすじ

Selenium IDE でテストケースを作成し、WebDriver形式でエクスポートしたRSpecファイルを Firefox で実行すると、 invalid byte sequence エラーが表示されるようになった。

どこさわったからこうなったのかわからん……。

(以下では、WebDriver.for時にテスト用のprofileを指定している)

$ rspec test.rb
F

Failures:

  1) test
     Failure/Error: @driver = Selenium::WebDriver.for :firefox, :profile => profile
     ArgumentError:
       invalid byte sequence in UTF-8
     # ./test.rb:13:in `block (2 levels) in <top (required)>'

profileの中かな? とか思っていたけど。

環境

IEのDriverを使うと、正常に起動できる

原因

とりあえず、WebDriver.for :firefox (vendor/bundle/ruby/1.9.1/gems/selenium-webdriver-2.31.0/lib/selenium/webdriver/common/driver.rb) から順々に処理を追っていったら……。

 def for(browser, opts = {})
   listener = opts.delete(:listener)

   bridge = case browser
            when :firefox, :ff
              Firefox::Bridge.new(opts)

どうも、レジストリを読み込むところ (vendor/bundle/ruby/1.9.1/gems/selenium-webdriver-2.31.0/lib/selenium/webdriver/firefox/binary.rb) の reg.keys[0] で処理が止まっていることがわかった。

   def windows_registry_path
     require 'win32/registry'

     lm = Win32::Registry::HKEY_LOCAL_MACHINE
     lm.open("SOFTWARE\\Mozilla\\Mozilla Firefox") do |reg|
# ここ
       main = lm.open("SOFTWARE\\Mozilla\\Mozilla Firefox\\#{reg.keys[0]}\\Main")
       if entry = main.find { |key, type, data| key =~ /pathtoexe/i }
         return entry.last
       end
     end
   rescue LoadError
     # older JRuby or IronRuby does not have win32/registry
   rescue Win32::Registry::Error
   end

HKEY_LOCAL_MACHINE/SOFTWARE/Mozilla/Mozilla Firefox/hogehoge/Main を開こうとして力尽きている模様。。

もしかしてこのレジストリ情報が存在しない?

regedit で確認してみる。

マイ コンピュータ
|
`HKEY_LOCAL_MACHINE
 |
 `SOFTWARE
  |
  `Mozilla
   |
   |`Firefox
   |`MaintenanceService
   |`Mozilla Firefox
   | |
   | `19.0.2 (en-US)
   |  |
   |  |`Main
   |  `Uninstall
   `Mozilla Firefox 19.0.2

19.0.2 (en-US)reg.keys[0] に該当してる部分だなあ。

解決策

WebDriverのソースを直接ベタ書きすると、一応起動させる事ができた。

   lm.open("SOFTWARE\\Mozilla\\Mozilla Firefox") do |reg|
-    main = lm.open("SOFTWARE\\Mozilla\\Mozilla Firefox\\#{reg.keys[0]}\\Main")
+    main = lm.open("SOFTWARE\\Mozilla\\Mozilla Firefox\\19.0.2 \(en-US\)\\Main")
     if entry = main.find { |key, type, data| key =~ /pathtoexe/i }

一応、Firefoxをアンインストールしてレジストリも消してから17.0に落としたり、18.0に上げたり、19.0に戻したりしたけど、全部上記の箇所で引っかかってた。

ベタ書くと動く。

うーん、なんでいきなりレジストリが読めなくなったのかきっかけがわからん。