FURYU Tech Blog - フリュー株式会社

フリュー株式会社の開発者が技術情報を発信するブログです。

Selenium WebDriverを利用したテスト その1

初めまして。ソフトウェア開発部の川下といいます。

今回は 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ソースに指定した文字列が含まれているか でチェックしています。)

とても便利なので、ぜひ一度、試してみてください。