Selenium-RCとは
JUnit や TestNG などから 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 を使う。