初めまして。ソフトウェア開発部の川下といいます。
今回は Selenium WebDriver(Selenium 2.0)を利用したテストの自動化についてです。
Seleniumは2.0系でWebDriverを統合して、より柔軟なテストができるようになりました。
javaのユニットテストから実行する方法をここでは紹介します。
WebDriverの使い方をここでは3つに分けて紹介させてもらいます。
1.WebDriverを生成する
2.指定のURLへアクセスする
3.結果を処理する
です。
1. WebDriverを生成する。
WebDriverはブラウザ操作テスト用に切り出された共通インターフェースです。
以下の3種類の処理を行うためのメソッドを提供しています。
1.Control of the browser itself(ブラウザ事態の制御)
2.Selection of WebElements(WebElementsの選択 ※WebElementsに関しては後述)
3.Debugging aids (デバッグ)
実装事体は各ブラウザごとに異なっています。
エミュレートしたいブラウザごとに対応するDriverを選択します。
Firefox -> FireFoxDirever
Chrome -> ChromeDriver
InternetExplorer -> InternetExplorerDriver
といった感じです。
また、ブラウザの細かい挙動の違いを気にしないのであれば、
HtmlUnitDriver (最軽量/高速)を使うこともできます。
WebDriverの生成は以下のように行います。
proxy(proxy-addreses, proxy-port)のところは必要なら設定してください。
//Firefoxの場合 WebDriver createFirefoxDriver() { FirefoxProfile profile = new FirefoxProfile(); profile.setPreference("network.proxy.type", 1); profile.setPreference("network.proxy.http", "proxy-address"); profile.setPreference("network.proxy.http_port", proxy-port); return new FirefoxDriver(profile); } //HtmlUnitDriverの場合 WebDriver createHtmlUnitDriver() { HtmlUnitDriver htmlUnitDriver = new HtmlUnitDriver(); htmlUnitDriver.setProxy("proxy-address", proxy-port); return htmlUnitDriver; } //ChromeDriverの場合 WebDriver createChromeDriver() { ChromeOptions options = new ChromeOptions(); options.addArguments("--proxy-server=proxy-addreses:proxy-port"); return new ChromeDriver(options); }
2. 指定のURLへアクセスする
driver.get("http://xxxxxxxxxxxxxxxx");
cookieを利用する場合は、以下のようにセットできます。
driver.manage().addCookie(new Cookie("cookieKey", "value"));
3. 結果を処理する
WebDriverでアクセスすると、結果として、
DOMの要素(を操作するための WebElementクラスのインスタンス)
現在のURL
HTMLソース
タイトル
等を取得することができます。
//DOMのエレメント name = "aaaa" の要素 WebElement element = driver.findElement(By.name("aaaa")) //現在のURL driver.getCurrentUrl() //HTMLソース driver.getPageSource() //HTMLのheadタグ内のタイトル文字列 driver.getTitle()
JUnitから走らせてみる
次にJUnitから走らせてみましょう。
テスト用のデータを作成して登録 → 画面に表示されていることをアクセスして確認する
ようなテストを想定しています
JUnitから走らせるために今回は2つクラスを用意します。
サンプル実装なので、URLや未実装の部分は必要に応じて置き換えてください。
/** * User一覧ページの回帰テスト用 */ public class UserListRegressionTest extends TestCase { WebDriver driver; protected void setUp() throws Exception { driver = createFirefoxDriver(); }; public void test_rankingList_Tx() throws Exception { driver.get("http://xxxxxxxxxx/xxxxxxx/userList/"); //accessするページを指定する // テスト用のユーザ情報を登録する処理 // ~ 中略 3件くらい登録していたと仮定する ~ // //一覧ページにはユーザ名が3件表示されていること assertTrue(isDisplayed("userName1", "userName2", "userName3")); } protected WebDriver createFirefoxDriver() { FirefoxProfile profile = new FirefoxProfile(); profile.setPreference("network.proxy.type", 1); profile.setPreference("network.proxy.http", "proxy-address"); profile.setPreference("network.proxy.http_port", proxy-port); return new FirefoxDriver(profile); } /** * WebDriverで取得したpageのhtml-souceに、指定したキーワドが表示されているかを検証する。 * * @param displayWord html-sourceにキーワードが含まれているかを検証する。(複数指定可) * @return true 指定したキーワードが全て含まれている場合, false otherwise. */ private boolean isDisplayed(String... displayWord) { String pageSource = driver.getPageSource(); for (String eachWord : displayWord) { if (pageSource.indexOf(eachWord) == -1) { return false; } } return true; } }
あとはEclipseのコンソールなどから、JUnitを実行してもらうと
自動的にブラウザが立ち上がり、試験が実施できます。
(※ 今回はhtmlソースに指定した文字列が含まれているか でチェックしています。)
とても便利なので、ぜひ一度、試してみてください。