Selenium-RC の利用

Selenium-RCとは

JUnitTestNG などから Selenium によるインテグレーションテストを実行できる。本家は以下。
http://seleniumhq.org/

Selenium Server

Selenium Server はテストコードなどから Selenium コマンドを受け、コマンドを実行し、結果を返却する。Selenium Server には Selenium Core のJavaScriptがバンドルされており、このサーバを通してブラウザ操作をエミュレートするテストが実施できる。

Client Libraries

Client Libraries は Selenium コマンドをテストコードから実行できるようにするライブラリ。Javaや.Net Ruby など多くのプラットフォームがサポートされている。

インストール

ダウンロードページ(http://seleniumhq.org/download/)から Selenium-RC のzipファイルをダウンロードして解凍すると、いくつかのサブディレクトリがある。Javaであれば以下のjarファイルをクラスパスに追加する。

Selenium テストの実行

以下のコマンドで Selenium Server を起動。

java -jar selenium-server.jar


以下のようなテストコードを実行すると、Selenium Server 経由でテストが実行される。

package com.example.tests;

import com.thoughtworks.selenium.*;
import java.util.regex.Pattern;

public class NewTest extends SeleneseTestCase {
    public void setUp() throws Exception {
        setUp("http://www.google.com/", "*firefox");
    }
    public void testNew() throws Exception {
        selenium.open("/");
        selenium.type("q", "selenium rc");
        selenium.click("btnG");
        selenium.waitForPageToLoad("30000");
        assertTrue(selenium.isTextPresent("Results * for selenium rc"));
    }
}

実際には Selenium-IDE を使用して操作コードを得る。

Selenium Server の自動起動

SeleniumServer 起動サンプル - etc9のようなコードにて Selenium Server を自動起動できるようにしておくと楽。

テストケースからのJavaScript実行

selenium.getEval にてJavaScriptの実行結果を得ることもできる。

public static String[] getAllCheckboxIds () {
    String script = "var inputId  = new Array();";
           script += "var cnt = 0;";
           script += "var inputFields  = new Array();";
           script += "inputFields = window.document.getElementsByTagName('input');"
           script += "for(var i=0; i<inputFields.length; i++) {";
           script +=     "if(inputFields[i].id !=null " +
                             "&& inputFields[i].id !='undefined' " +
                             "&& inputFields[i].getAttribute('type') == 'checkbox') {";
           script +=         "inputId[cnt]=inputFields[i].id ;" +
                             "cnt++;" + // increment the counter.
                         "}" +
                     "}";
           script += "inputId.toString();" ;
    String[] checkboxIds = selenium.getEval(script).split(",");
    return checkboxIds;
}

Selenium Server の起動オプション

プロクシ利用

java -jar selenium-server.jar -Dhttp.proxyHost=proxy.com -Dhttp.proxyPort=8080 -Dhttp.proxyUser=username -Dhttp.proxyPassword=password


HTMLSuiteの直接指定

java -jar selenium-server.jar -htmlSuite "*firefox" "http://www.google.com" "c:\absolute\path\to\my\HTMLSuite.html" "c:\absolute\path\to\my\results.html"


ログファイル指定

java -jar selenium-server.jar -log selenium.log

Ajax アプリケーションのテスト

Ajax アプリケーションでは waitForPageToLoad などのメソッドでページのロードを待機しても、非同期での通信が完了していないことがある。固定の待機時間を設けるのも非効率である。以下のようにエレメントの出現を待機するのが良い方法。

for (int second = 0;; second++) {
    // If loop is reached 60 seconds then break the loop.
    if (second >= 60) break;

    // Search for element "link=ajaxLink" and if available then break loop.
    try { if (selenium.isElementPresent("link=ajaxLink")) break; } catch (Exception e) {}

    // Pause for 1 second.
    Thread.sleep(1000);
}

上記例では要素として link=ajaxLink の出現を待機している。waitForElementPresent や waitForVisible が使える。

Assertion と Verification

Selenium では assert 系と verify 系の検証メソッドが提供されている。違いは以下。

  • assert は失敗した場合に現在のテストケースをアボートする
  • verify は失敗を記録してテストケースを継続する

そもそも異なるページが表示されている場合はテストを継続しても仕方がないので、そのような検証には assert を使う。