IEとかiPhoneWebView上でSeleniumを走らせる

あらすじ

  1. Firefoxのアドオンである Selenium IDE で作ったテストケースをWebDriver, RSpec形式でエクスポート
  2. このソースは、デフォルトではFirefoxでテストが開始されるようになっている
  3. これを、 IE でテストするようにしたり、 iPhoneWebView (内部ブラウザ)を起動してテストするようにしたい
  4. 結果としては、どちらもテスト可能だが、準備が若干めんどい

IEでテストをするには

環境

  • IE 9

手順

基本的には、 Selenium IDE で生成したテストコードの「何のブラウザを開くか」ってところを変えればいいはず……。

-  @driver = Selenium::WebDriver.for :firefox
+  @driver = Selenium::WebDriver.for :ie

……が、それだけではダメ。実行すると以下のようなエラーが出る。

Failures:

  1) MailcheckSpec test_mailcheck_spec
     Failure/Error: @driver = Selenium::WebDriver.for :ie
     Selenium::WebDriver::Error::WebDriverError:
       Unable to find standalone executable. Please download the IEDriverServer
from http://code.google.com/p/selenium/downloads/list and place the executable o
n your PATH.
     # ./mailcheck_spec.rb:10:in `block (2 levels) in <top (required)>'

Finished in 0.05651 seconds
1 example, 1 failure

Failed examples:

rspec ./mailcheck_spec.rb:24 # MailcheckSpec test_mailcheck_spec

むむ。IEを動かすには IEDriverServer というものが必要なのか。

You do not need to run an installer before using the InternetExplorerDriver, though some configuration is required. The standalone server executable must be downloaded from the Downloads page and placed in your PATH.

上記のサイトからIEWebDriver(64bitか32bit)をダウンロードし、パスが通っている場所に移す。

この時、 IE -> ツール -> インターネット オプション -> セキュリティ -> インターネット、イントラ、信頼済み、制限つきサイト全ての保護モードの設定を同じ にする必要がある(揃っていればON/OFFはどちらでも良いらしい)

で、再び実行すると、IEDriverServerが起動し、IEが開かれる!

iPhoneでテストをするには

環境

  • Xcode 4.5 (4.2以上)
  • Java 1.6 (SE Runtime Environment (build 1.6.0_29-b11-402-11M3527))

参考サイト

手順

  • git clone https://code.google.com/p/selenium/ でソースをDL
$ cd selenium/
$ ./go iphone
(in /Users/user/Desktop/selenium)
Using iPhoneSDK: 'iphonesimulator6.0'
Building iWebDriver iphone app.
Build settings from command line:
    ARCHS = i386
    SDKROOT = iphonesimulator6.0

=== BUILD NATIVE TARGET iWebDriver OF PROJECT iWebDriver WITH CONFIGURATION Debug ===
Check dependencies

(略)

** BUILD SUCCEEDED **

Compiling: //java/client/src/org/openqa/selenium/remote:api as build/java/client/src/org/openqa/selenium/remote/api.jar
Compiling: //java/client/src/org/openqa/selenium:beta as build/java/client/src/org/openqa/selenium/beta.jar
Compiling: //java/client/src/org/openqa/selenium/logging:api as build/java/client/src/org/openqa/selenium/logging/api.jar
Compiling: //java/client/src/org/openqa/selenium:base as build/java/client/src/org/openqa/selenium/base.jar
Compiling: //java/client/src/org/openqa/selenium/logging:logging as build/java/client/src/org/openqa/selenium/logging/logging.jar
Compiling: //java/client/src/org/openqa/selenium:codecs as build/java/client/src/org/openqa/selenium/codecs.jar
Compiling: //java/client/src/org/openqa/selenium/interactions:api as build/java/client/src/org/openqa/selenium/interactions/api.jar
Compiling: //java/client/src/org/openqa/selenium/security:security as build/java/client/src/org/openqa/selenium/security/security.jar
Compiling: //java/client/src/org/openqa/selenium:webdriver-api as build/java/client/src/org/openqa/selenium/webdriver-api.jar
Compiling: //java/client/src/org/openqa/selenium/remote:base as build/java/client/src/org/openqa/selenium/remote/base.jar
Compiling: //java/client/src/org/openqa/selenium/interactions:interactions as build/java/client/src/org/openqa/selenium/interactions/interactions.jar
Compiling: //java/client/src/org/openqa/selenium/browserlaunchers:proxies as build/java/client/src/org/openqa/selenium/browserlaunchers/proxies.jar
Compiling: //java/client/src/org/openqa/selenium/remote:common as build/java/client/src/org/openqa/selenium/remote/common.jar
Compiling: //java/client/src/org/openqa/selenium/net:net as build/java/client/src/org/openqa/selenium/net/net.jar
Compiling: //java/client/src/org/openqa/selenium/os:os as build/java/client/src/org/openqa/selenium/os/os.jar
Compiling: //java/client/src/org/openqa/selenium/io:io as build/java/client/src/org/openqa/selenium/io/io.jar
Compiling: //java/client/src/org/openqa/selenium/remote:remote as build/java/client/src/org/openqa/selenium/remote/remote.jar
Compiling: //java/client/src/org/openqa/selenium/iphone:iphone as build/java/client/src/org/openqa/selenium/iphone/iphone.jar

実機にインストール

もちろん、iPhoneシミュレータでも動かせるようだが、今回はいきなり実機に放り込む。

  • git clone してきたseleniumディレクトリの下にある selenium/iphone/iWebDriver.xcodeproj をXcodeで起動
    • iPhoneを接続、ビルド
  • ビルド成功したら、 iWebDriver アプリがiPhoneにインストールされる
    • 起動すると、白い画面と画面下にアドレスが表示される( Started at http://xx.xx.xx.xx:3001/wd/hub/ のような感じ)

Xcode上の設定としては以下を行った。

  • Build Settingsの Valid architecturesi386 から armv7 に変えた
  • 同じく Code Signing IdentityiPhone Developer に変えた
  • Info.plist ファイルに Application does not run in background: YES を追加した
    • 一回終了したら、またはじめからとしたいため

操作

http://code.google.com/p/selenium/wiki/IPhoneDriver には以下のようにdriverの定義しろとある。

@driver = Selenium::WebDriver.for :remote, :url => "http://localhost:3001/wd/hub", :desired_capabilities => :iphone
# or use the convenience class which uses localhost:3001 by default
@driver = Selenium::WebDriver.for :iphone

ただし、これはローカル上(シミュレータ?)の場合で、実機につなぎたい場合は :url のlocalhostを上記のiPhoneアプリ上に表示されたアドレスに置き換える。

……が、どうも動かない。以下のようなエラーが出る。

An error occurred in an after hook
  RSpec::Expectations::ExpectationNotMetError: expected: []
     got: nil (using ==)
  occurred at /hogeproject/vendor/bundle/ruby/1.9.1/gems/rspec-expectations-2.13.0/lib/rspec/expectations/fail_with.rb:32:in `fail_with'

F

Failures:

  1) MailcheckSpec test_mailcheck_spec1
     Failure/Error: @driver = Selenium::WebDriver.for :iphone
     Selenium::WebDriver::Error::WebDriverError:
       unexpected response, code=403, content-type="text/html"
       <html>
       <head>
       <title>Error 403 Forbidden for Proxy</title>
       </head>
       <body>
       <h2>HTTP ERROR: 403</h2><pre>Forbidden for Proxy</pre>
       <p>RequestURI=/wd/hub/session</p>
       <p><i><small><a href="http://jetty.mortbay.org">Powered by Jetty://</a></small></i></p>

二つ目のWebDriver.forをコメントアウトすると動いた。

@driver = Selenium::WebDriver.for :remote, :url => "http://localhost:3001/wd/hub", :desired_capabilities => :iphone
# or use the convenience class which uses localhost:3001 by default
# @driver = Selenium::WebDriver.for :iphone

注意

動かすタイミングとしては、

  1. iPhoneのiWebDriverアプリを立ち上げ、 Started at: ... と表示されるのを待つ
  2. PCからテストを実行する

iWebDriverが起動しきる前に先走ってテスト実行してしまうと余裕でエラーになったりする。

それでちょっとハマった。

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

  1. 2013/03/18 [Selenium] [Firefox] [Ruby] Selenium WebDriverでFirefoxがロードできなくなった
  2. 2013/12/24 [Ruby] RubyでQRコードを生成してみる
  3. 2013/09/25 [iOS] [iPhone] iOSのUIWebViewのキャッシュがどういうタイミングでリセットされているのかわからんという話
  4. 2013/09/07 [Ruby] [Git] [Jekyll] Jekyllバージョンアップの際に思いのほか手こずった話 てっく煮さん製プラグインの更新に追従したい編
  5. 2013/09/03 [Ruby] [Rails] Ruby1.9.3のWebrickで出るCould not determine content-length...エラーを消す方法(2.0.0では解決済)
  6. 2013/08/26 [Ruby] ソースコード中に0xC2A0(UTF-8のNO-BREAK SPACE)が混ざり実行できなくて困った話
  7. 2013/08/20 [Ruby] [Rails] [Redmine] Rails3のログ出力にANSIカラーコードを使用しない設定
  8. 2013/08/09 [Ruby] [Redmine] [MySql] [StartUp] WindowsにRedmine2.3をインストールする手順と、プラグイン作成用メモ
  9. 2013/08/07 [Ruby] [Jekyll] [Git] Jekyllバージョンアップの際に思いのほか手こずった話 Jekyll Bootstrapの更新に追従したい編
  10. 2013/07/18 [iPhone] [iOS] iOSのバックアップ/リストアで残るもの/消えるもの それを編集する手段
  11. 2013/06/05 [iPhone] [iOS] Over-the-Airという形式でiOSアプリのインストールを試みるが失敗する場合がある
  12. 2013/05/27 [Jekyll] [Ruby] Jekyll@GitHub Pagesの運用形態を変えたのでAnalyticsの設定が効かなくなっていた
  13. 2013/05/23 [Jekyll] [Liquid] [Ruby] 記事の目次を出力するJekyllプラグインの改良
  14. 2013/04/27 [Ruby] [Chef] [イベント] BPStudy#68に参加しました #bpstudy
  15. 2013/04/11 [Ruby] [Jekyll] Jekyllのバージョンを 0.12.0 にあげた