(Codeception + Selenium2) Acceptance Testに複数種類のブラウザを利用する

久しぶりの更新です。

CodeceptionのAcceptance TestにSeleniumを利用する場合のTIPSになります。
とある場所にて、Codeceptionのレクチャーをした際に、「IE, ChromeでもAcceptance Testは可能ですか?」という質問をいただきましたので、ここにまとめておきます。

はじめに

このエントリではCodeceptionのバージョン 1.6.10を利用しています。
最新の1.7系ではSelenium2モジュールの改善版であるWebDriverモジュールというものが利用できますので、そちらを利用した方が良いです。

参考

1. Firefox

特殊な設定は必要ないです。
マニュアルどおりにやっていけばできます。

1.1. acceptance.suite.yml
class_name: WebGuy
modules:
    enabled:
        - Selenium2
        - WebHelper
    config:
        Selenium2:
           url: http://localhost:8000
           browser: firefox
           delay: 200
           capabilities:
               unexpectedAlertBehaviour: 'accept'

browserに「firefox」を指定します。

1.2. Seleniumの起動
java -jar selenium-server-standalone-2.37.0.jar

参考:http://codeception.com/docs/modules/Selenium2

2. Internet Explorer

2.1. IEDriverをインストール

SeleniumDownloads ページの

f:id:piccagliani:20131031114958p:plain

からダウンロードして、jarファイルと同じ場所に配置しておきます。

2.2. acceptance.suite.yml

browserの指定を「ie」にします。

modules:
    config:
        Selenium2
           browser: ie

※↑抜粋

2.3. Seleniumの起動
java -jar selenium-server-standalone-2.37.0.jar -Dwebdriver.ie.driver=.\IEDriverServer32.exe

IEDriverを指定して起動します。

3. Chrome

Internet Explorerとほぼ同じです。

3.1. ChromeDriverをインストール

chromedriver - WebDriver for Google Chrome - Google Project Hosting からダウンロードして、jarファイルと同じ場所に配置しておきます。

3.2. acceptance.suite.yml

browserの指定を「chrome」にします。

modules:
    config:
        Selenium2
           browser: chrome

※↑抜粋

3.3. Seleniumの起動
java -jar selenium-server-standalone-2.37.0.jar -Dwebdriver.chrome.driver=.\chromedriver.exe

4. トラブルシューティング・未解決の問題

実際に自分が体験した内容をまとめておきます。
未解決のもの、どなたか知っていたら教えて下さい。

4.1. IE:フォームの文字入力がめっさ遅い!

Selenium の IE Driver で SendKeys したときに1文字ごとの入力が異様に遅い場合の対処 : @jsakamoto と同様、32bit版のドライバを使うことで解決しました。

4.2. (未解決)IE:texteareaにplaceholderが設定されている場合にテストが失敗する

フォームの初期表示で「何も入力されていないよね?」というテストをしたく、

<textarea class="form-control" id="Detail" placeholder="詳細" rows="10" name="task[detail]"></textarea>

というtextareaに対して、

<?php
$I->seeInField('詳細', '');

と記述していましたが、placeholderに設定した値がすでに入力されているとみなされてしまうのか、テストに失敗しました。

4.3. (未解決)Chrome: 日本語のフォーム入力がおかしくなる。
<?php
$I->fillField('題名', '受入試験を行う');
$I->fillField('詳細', 'CodeceptionとSeleniumを上手に使ってね');

f:id:piccagliani:20131031121625p:plain

という悲惨な結果に。。文字化けしているようで、そうでないようにも思える。
Codeception側がおかしいのか、Selenium側がおかしいのか。。。

4.3. (未解決)Chrome:「input type="date"」に対して入力できない
<?php
$I->fillField('開始日', '2013-10-31');

が落ちます。。。

最後に

複数種類のブラウザを利用してAcceptance Testを実行したい場合、現状では一つのSuitesにつき一種類のブラウザしか指定ができないため、複数Suitesを用意するしかないようです。
その際に発生するコードの重複は PageObjects"StepObjects" 等でリファクタリングするのが良いかと。

一つのSuitesで複数種類のブラウザを利用可能とするための提案はすでにされており、
Multiple Selenium2 Sessions for Acceptance tests · Issue #154 · Codeception/Codeception · GitHub
開発者の @davert さん曰く、

f:id:piccagliani:20131031122824p:plain

とのことです。先日1.7がリリースされたばかりなのに、もうバージョン1.8が楽しみです。