Selenideを使ったブラウザテストのコードの書き方を見ていきます。Selenideを使った自動テストの書き方は、以下のような手順です。
紹介するサンプルコードを含んだEclipseプロジェクトはこちらからダウンロードできます。サンプルプロジェクトを実行する際は幾つか準備することがあるため、プロジェクト内のREADMEファイルを参照してください。
まずは「ブラウザを起動し指定のページを開く」というコードを見てみます。ページを開くには、「com.codeborne.selenide.Selenide」クラスのstaticメソッドである「open」メソッドを利用します。以下のコードを実行すると、ブラウザが起動し「http://localhost:8080/calc.html」を開いた後、すぐにブラウザが閉じます。デフォルトでは利用されるブラウザはFirefoxです。
- import static com.codeborne.selenide.Selenide.open;
- import org.junit.Test;
- public class OpenTest {
- @Test
- public void addTest() {
- open("http://localhost:8080/calc.html");
- }
- }
利用するブラウザを変更したい場合、以下のように「com.codeborne.selenide.Configuration」クラスの「browser」フィールドの値を変更することで対応できます。
- import com.codeborne.selenide.Configuration;
- import com.codeborne.selenide.WebDriverRunner;
- ……
- @BeforeClass
- public static void setUp() {
- Configuration.browser = WebDriverRunner.CHROME;
- }
コードを修正せず、プログラムの実行時引数の指定でも利用するブラウザを変更することができます。メニューから「Run」→「Run Configurations…」を選択し、「Arguments」タブの「VM arguments」に以下を入力してください。
-Dselenide.browser=chrome
指定するブラウザ名は「com.codeborne.selenide.WebDriverRunner」の定数の値を見ることで確認できます。
もしここで実行時に何らかのエラーが出てしまった場合、「利用するブラウザ」と「対応するWebDriver」がどちらも最新バージョンであるか確認してみてください。ブラウザのバージョンとWebDriverのバージョンが一致していないと、エラーが出ることがあります。
また上記の例では、テスト対象のURLを絶対パスで指定していますが、基準となるURLを設定し、そこからの相対パスで指定することも可能です。基準となるURLはデフォルトでは「http://localhost:8080」となっているため、openメソッドの引数を「/calc.html」としても、同じように動作します。
基準となるURLの設定は、利用するブラウザを変更する際と同様に「Configurationの値を変更する」「実行時引数を指定する」ことで変更可能です。値を設定するプロパティ名は「baseUrl」です。実行時引数で指定する場合は「-Dselenide.baseUrl=http://example.com」のように値を設定します。ローカル環境でもテスト環境でも同じテストコードで動かせるよう、テスト対象のURLは絶対パスで記述するのではなく相対パスで書いておくといいでしょう。
Webページ上から操作したい対象の要素を取得するためには、Selenideクラスのstaticメソッドである「$」メソッドを使います。このメソッドの引数に対し、「By」という要素の取得方法を表すクラスを渡すことで、返り値として対象の要素を表す「SelenideElement」クラスのインスタンスを取得できます。Byのインスタンスは「com.codeborne.selenide.Selectors」クラスのstaticメソッドを使って生成します。
まずはHTML中の以下の要素を取得するコードの例を見てみます。
- <input type="text" id="value1" class="ui-input" />
上記の要素を取得するためには、IDを指定する「byId」メソッド、CSSのクラス名を指定して取得する「byClassName」メソッド、任意の属性の値を参照する「byAttribute」メソッドが利用できます。サンプルコードは以下の通りです。
- import static com.codeborne.selenide.Selectors.byAttribute;
- import static com.codeborne.selenide.Selectors.byClassName;
- import static com.codeborne.selenide.Selectors.byId;
- import static com.codeborne.selenide.Selenide.$;
- import com.codeborne.selenide.SelenideElement;
- ……
- @Test
- public void selectorTest() {
- open("/simpleSelector.html");
- // ID指定で取得
- SelenideElement byIdElem = $(byId("value1"));
- // CSSのクラス名指定で取得
- SelenideElement byStyleElem = $(byClassName("ui-input"));
- // 任意の属性の値指定で取得
- SelenideElement byAttrElem = $(byAttribute("type", "text"));
- }
上記で利用したメソッド以外にも、以下のメソッドが要素の取得に利用できます。
メソッド名 | 意味 |
---|---|
byText(String) | テキストが引数に完全一致する要素を取得する |
withText(String) | テキストが引数に部分一致する要素を取得する |
byValue(String) | valueが引数に一致する要素を取得する |
byName(String) | nameが引数に一致する要素を取得する |
上記のように、IDや属性の値で一意に操作したい要素を取得できればいいのですが、「指定のIDを持つtableタグの中にある最初のtr要素」といったように、HTMLの構造を考慮して要素を取得したい場合もあります。この場合は、「CSSセレクタ」、もしくは「XPath」という形式を使って要素を指定できます。
今回はCSSセレクタを使った例を紹介します。
CSSセレクタとは、CSSを適用する対象のHTML要素を選択するための記述方法です。基本的なCSSセレクタとしては、以下のようなものがあります。
セレクタの種類 | 記述例 | 意味 |
---|---|---|
タイプセレクタ | input | 「input」というタグ名の要素 |
クラスセレクタ | .classname | 「classname」というclass属性の値を持つ要素 |
IDセレクタ | #userCode | 「userCode」というIDを持つ要素 |
属性セレクタ | attr="value" | 「attr」という属性の値がvalueである要素 |
コンビネータ | table input | tableタグの中にあるinputタグ |
また、上記のセレクタの後ろに、コロンとともに付けて条件を付与する「疑似クラス」という記述もあります。
疑似クラス名 | 記述例 | 意味 |
---|---|---|
first-child | table td:first-child | tableタグの中で最初のtdタグ |
nth-child() | table td:nth-child(2) | tableタグの中で2番目のtdタグ |
checked | input[type=”radio”]:checked | チェックされているラジオボタン |
focus | input:focus | フォーカスが当たっているinputタグ |
その他のCSSセレクタについてはこちらを参照してください。
CSSセレクタを使って要素を取得するにはSelectorsクラスの「byCssSelector」メソッドを利用して「By」のインスタンスを作成します。また、「$」メソッドの引数に「By」ではなく、文字列でCSSセレクタを渡すことも可能です。
下記HTMLの10行目のinputタグを、CSSセレクタを使って取得したいとしましょう。
- <table id="employeeTable" class="editable-table">
- <thead>
- <tr>
- <th>社員番号</th>
- <th>名称</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td><input id="employeeCode1" type="text" class="ui-input" /></td> <!-- この行の要素を取得する -->
- <td><input id="employeeName1" type="text" class="ui-input" /></td>
- </tr>
- <tr>
- <td><input id="employeeCode2" type="text" class="ui-input" /></td>
- <td><input id="employeeName2" type="text" class="ui-input" /></td>
- </tr>
- </tbody>
- </table>
その実装例は以下のようになります。
- @Test
- public void selectorTest() {
- open("/structSelector.html");
- // IDがemployeeCode1である要素を取得
- SelenideElement cssSelectorElem = $("#employeeCode1");
- // 「editable-table」というスタイル名を持ったtableタグの中で最初のtdタグの中にあるinput要素を取得
- SelenideElement cssSelectorElem2 = $("table.editable-table td:first-child input");
- // 「employeeTable」というIDを持ったtableタグの中で、typeが「text」である最初のinput要素を取得
- SelenideElement cssSelectorElem3 = $("table#employeeTable input[type=\"text\"]:first-child");
- }
XPathを使って要素を取得したい場合はSelectorsクラスの「byXpath」メソッドの引数にXPathの文字列を渡すことで利用できます。XPathを利用する例はサンプルプロジェクトを参照してください。
また、XPathの基本的な使い方についてはこちらを参照してください。
Copyright © ITmedia, Inc. All Rights Reserved.
Test & Tools 記事ランキング