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の中かな? とか思っていたけど。

環境

  • Ruby 1.9.3
    • RubyGems 2.0.1
    • bundler (1.3.1)
    • childprocess (0.3.9)
    • diff-lcs (1.2.1)
    • ffi (1.4.0)
    • multi_json (1.6.1)
    • rspec (2.13.0)
    • rspec-core (2.13.0)
    • rspec-expectations (2.13.0)
    • rspec-mocks (2.13.0)
    • rubyzip (0.9.9)
    • selenium-webdriver (2.31.0)
    • websocket (1.0.7)
  • Firefox 19.0.2 (x86 en-US)
    • プロファイルは C:/Selenium/ のものを使用 ( firefox.exe -ProfileManager から)
    • Selenium IDE 1.1.0
    • Selenium IDE: Ruby Formatters 1.1.0

※ 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に戻したりしたけど、全部上記の箇所で引っかかってた。

ベタ書くと動く。

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

関連記事(この記事の初版より古い記事はリンクがグレーで表示されます)

  1. 2013/03/07 [Ruby] [Selenium] [iPhone] [IE] [Test] IEとかiPhoneWebView上でSeleniumを走らせる
  2. 2013/12/24 [Ruby] RubyでQRコードを生成してみる
  3. 2013/09/07 [Ruby] [Git] [Jekyll] Jekyllバージョンアップの際に思いのほか手こずった話 てっく煮さん製プラグインの更新に追従したい編
  4. 2013/09/03 [Ruby] [Rails] Ruby1.9.3のWebrickで出るCould not determine content-length...エラーを消す方法(2.0.0では解決済)
  5. 2013/08/26 [Ruby] ソースコード中に0xC2A0(UTF-8のNO-BREAK SPACE)が混ざり実行できなくて困った話
  6. 2013/08/20 [Ruby] [Rails] [Redmine] Rails3のログ出力にANSIカラーコードを使用しない設定
  7. 2013/08/09 [Ruby] [Redmine] [MySql] [StartUp] WindowsにRedmine2.3をインストールする手順と、プラグイン作成用メモ
  8. 2013/08/07 [Ruby] [Jekyll] [Git] Jekyllバージョンアップの際に思いのほか手こずった話 Jekyll Bootstrapの更新に追従したい編
  9. 2013/05/27 [Jekyll] [Ruby] Jekyll@GitHub Pagesの運用形態を変えたのでAnalyticsの設定が効かなくなっていた
  10. 2013/05/23 [Jekyll] [Liquid] [Ruby] 記事の目次を出力するJekyllプラグインの改良
  11. 2013/04/27 [Ruby] [Chef] [イベント] BPStudy#68に参加しました #bpstudy
  12. 2013/04/11 [Ruby] [Jekyll] Jekyllのバージョンを 0.12.0 にあげた
  13. 2013/04/01 [Ruby] [StartUp] [Chef] 入門Chef Solo - Infrastructure as Code を読みながらChef Soloで遊べるようになるまで
  14. 2013/03/03 [Ruby] [Evernote] [OAuth] 自作EvernoteスクリプトをOAuth対応する
  15. 2013/02/25 [Ruby] [StartUp] Ruby 2.0.0 をpikとrvm経由でインストール&環境構築