簡単・便利、ブラウザの自動操作!~Selenium WebDriver~
はじめに
今回はSelenium WebDriverをご紹介します。ブラウザ 操作を自動化する際には最適な仕組みです。Webシステムのend-to-endテストを自動化する際には、ブラウザ操作が必要になることがあります。そんな時にSelenium WebDriverはとても便利です。
Selenium
Seleniumとは、ブラウザをプログラムで動かすフレームワークです。この仕組みを使うことで、ユーザーテストなど、様々な処理を自動化できます。現在のところ、Seleniumは以下のWebブラウザを制御できます(公式サイト)。
- Internet Explorer
- Firefox
- Chrome
- Opera
- Android標準Webブラウザ
- Safari (iPhone標準Webブラウザ)
実際に使用する際には、以下の2つの仕組みのどちらかを使用します。
今回は、ブラウザ制御を全て自動化できるSelenium WebDriverを使ってみます。Javaを使って、以下の2つのことをしてみましょう。
- PC上でのブラウザ操作
- Android端末(実機)上でのブラウザ操作
画面遷移、JavaScriptのクリックイベント実行、JUnitとの組み合わせなども試してみます。
プロジェクト作成
まずは、Javaのパッケージを下記サイトからダウンロードします。2013年7月5日現在では、selenium-java-2.33.0.zipが最新版のようです。
http://docs.seleniumhq.org/download/
ダ ウンロードしたファイルを展開すると、無意味に深い階層が現れます。最後のselenium-2.33.0ディレクトリをそのままeclipseインストールディレクトリのdropinsディレクトリへ移動しておきます。
selenium-2.33.0
└ selenium-2.33.0
└ selenium-2.33.0
├ libs
├ selenium-java-2.33.0.jar
└ selenium-java-2.33.0-srcs.jar
次に、プロジェクトを作成します。Javaプロジェクトをeclipseで作成し、SeleniumのJARファイルをプロジェクトへ追加します。JARの追加方法は以下の通りです。
- プロジェクトを右クリック
- Java Build Pathを選択
- Add External JARsをクリック
- eclipse/dropins内のselenium-java-2.33.0.jarとlibs内の全てのjarを追加
ここまで出来たら、後はコードを書いてブラウザを動かしてみるだけです!
- プロジェクトディレクトリへselenium-2.33.0ディレクトリをコピー
- プロジェクトを右クリック
- Java Build Pathを選択
- Add JARsをクリック
- プロジェクト内のselenium-java-2.33.0.jarとlibs内の全てのjarを追加
PCブラウザ操作
ブラウザの起動・終了
まずは、ブラウザを単純に開いて閉じることをしてみましょう。ここではアシアルのサイトを見てみます。今回はFirefoxを使います。
package jp.co.asial.test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class AsialHpTest {
public static void main(String[] args) {
WebDriver driver = new FirefoxDriver();
driver.get("http://www.asial.co.jp");
driver.quit();
}
}
WebDriverのget()メソッドで画面を開き、quite()で閉じます。後は、Java Applicationとして実行します。すると、しばらくしてFirefoxが立ち上がり、アシアルのサイトが表示され、すぐにブラウザが閉じると思います。起動するまでに若干時間がかかります。
画面遷移
せっかくブラウザを開いたのだから、何らかの操作をしてみます。画面のリンクをクリックし、別の画面へ遷移してみます。下記のコードでは、各処理の間に1秒間処理を止めています。これを入れないと、処理が速すぎて何をしているかよく分からないためです。もちろん、テストを運用する時には外します。
package jp.co.asial.test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
public class AsialHpTest {
public static void main(String[] args) {
WebDriver driver = new FirefoxDriver();
driver.get("http://www.asial.co.jp");
sleep(1000);
driver.findElement(By.cssSelector("ul.globalMenuNormal li:first-child")).click();
sleep(1000);
driver.quit();
}
private static void sleep(int microtime) {
try {
Thread.sleep(microtime);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
ここでは、WebDriverのfindElement()メソッドとBy.cssSelector()メソッドを使ってCSSセレクタから対象要素(WebElement)を取得しています。そして、その要素(Aタグ)をクリックしています。WebDriverがこのクリックをブラウザ上で実行することで、実際に画面遷移が行われます。JavaScriptを使えるエンジニアであれば、サクサク記述できると思います。
ちなみに、WebDriverのfindElement()メソッドでは、WebElementインタフェースを実装したオブジェクトを取得できます。そのオブジェクトを使えば、要素が現在見えているのか否か、どこに表示されているか、要素の表示サイズ、などを取得できます。例えば以下のように記述できます。
WebElement element = driver.findElement(By.cssSelector("ul.globalMenuNormal li:last-child"));
System.out.println("displayed = " + String.valueOf(element.isDisplayed()));
System.out.println("enabled = " + String.valueOf(element.isEnabled()));
System.out.println("position = " + element.getLocation());
System.out.println("dimension = " + element.getSize());
System.out.println("font-size = " + element.getCssValue("font-size"));
JavaScript実行
次に、JavaScriptのクリックイベントを実行してみます。アシアルのサイトでは、サイト上部の画像の両脇のボタンを押すことで、画像を左右に移動して変更できます。プログラムからこの操作をしてみたいと思います。
package jp.co.asial.test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.remote.RemoteWebDriver;
public class AsialHpTest {
public static void main(String[] args) {
RemoteWebDriver driver = new FirefoxDriver();
driver.get("http://www.asial.co.jp");
sleep(1000);
WebElement element = driver.findElement(By.cssSelector("ul.flex-direction-nav a.prev"));
for (int i=0; i<5; i++) {
driver.executeScript("arguments[0].click();", element);
sleep(1000);
}
driver.quit();
}
private static void sleep(int microtime)
{
// 省略
}
}
ポイントは、RemoteWebDriverのexecuteScriptメソッドを使用している点です。RemoteWebDriverはWebDriverインタフェースを実装したクラスです。さらに、RemoteWebDriverはJavascriptExecutorインタフェースも実装しており、ここからJavaScriptを処理できます。FirefoxDriverはRemoteWebViewのサブクラスです。
上記コードにて、element(WebElementオブジェクト)のclick()メソッドを実行するとエラーとなります。
もちろん、WebDriverインタフェースの形でも同様のことをできま す。
public class AsialHpTest {
public static void main(String[] args) {
WebDriver driver = new FirefoxDriver();
JavascriptExecutor executor = (JavascriptExecutor)driver;
...
for (int i=0; i<5; i++) {
executor.executeScript(...);
}
...
}
...
}
スクリーンショット
スクリーンショットも軽々と撮れます。テスト結果の検証物件として納品する場合に便利そうです。
package jp.co.asial.test;
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebDriverException;
import org.openqa.selenium.firefox.FirefoxDriver;
public class AsialScreenShot {
public
