Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

Selenium 2.0 を使ってJavaからWeb画面をテスト

ども。toshiです。

今回は、Web系テストといえばSelenium.
というわけで、Selenium 2.0 (WebDriver) を試してみたいと思います。


そもそもSeleniumといえば、FirefoxSelenium-IDEを利用して、
画面を操作しながら、画面テストのシナリオを作成して、
レグレッションテストに利用するイメージです。

そのSleniumが今回の2.0では、WebDriver を統合し、
より強力なテストフレームワークとなったと。

もともとSelenium 1.0のときからSeleniumのコマンドをJava上から実行するための
APISelenium RCとして提供されていましたが、
このWebDriverを利用するとJavaからWeb画面が
より便利に操作できるようになってるみたいです。


とにかく、
SeleniumのHPには、WebDriverを試すサンプルが紹介されていますので
試してみましょう。

あ、WebDriverそのものは
Javaである必要はないのですが、これは私の好みです^^;


環境準備

環境準備は、eclipse上でプロジェクトを作成してjarを配置するだけです。

pom.xmlのサンプルがHPにもありますので、
環境はMavenを利用して準備します。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>jp.seleniumtest</groupId>
  <artifactId>SeleniumTestPrj</artifactId>
  <version>1.0</version>
  <packaging>jar</packaging>

  <name>SeleniumTestPrj</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>2.2.0</version>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

</project>

pom.xmlを準備して、

mvn clean install

Mavenのコマンドを実行すれば必要なjarが手に入ります。
こういうときは、やはりMavenが便利ですね。

Firefoxでテストするサンプルを試してみる

WebDriverのjarを利用可能なeclipseプロジェクトができたら、
サンプルを動かしてみましょう。

package jp.seleniumtest;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;

public class App  {
    public static void main(String[] args) {
        WebDriver driver = new FirefoxDriver();

        driver.get("http://www.google.com");

        WebElement element = driver.findElement(By.name("q"));
        
        element.sendKeys("Cheese!");
        
        element.submit();
        
        System.out.println("Page title is: " + driver.getTitle());
        
        (new WebDriverWait(driver, 30)).until(new ExpectedCondition<Boolean>() {
            public Boolean apply(WebDriver d) {
                return d.getTitle().startsWith("cheese!");
            }
        });

        System.out.println("Page title is: " + driver.getTitle());
        
        driver.quit();
    }
}


それでは実行してみましょう。
mainを実行すると

Firefoxが起動してgoogleにアクセスしたところ。

おお、Firefox立ち上がりました。
コンソールには、以下のようにメッセージがでました。

Page title is: Google
Page title is: cheese! - Google 検索

ちゃんと動いてますね。

WebDriverはIEでも動くよ。

では、IEでも動かしてみましょう。

DriverをIEに変えてあげればOKです。

package jp.seleniumtest;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;

public class App  {
    public static void main(String[] args) {
        // ここのところでFirefoxからIEに切りかえます。
        WebDriver driver = new InternetExplorerDriver();

        // 以下は同じです。
        driver.get("http://www.google.com");

        WebElement element = driver.findElement(By.name("q"));
        
        element.sendKeys("Cheese!");
        
        element.submit();
        
        System.out.println("Page title is: " + driver.getTitle());
        
        (new WebDriverWait(driver, 30)).until(new ExpectedCondition<Boolean>() {
            public Boolean apply(WebDriver d) {
                return d.getTitle().startsWith("cheese!");
            }
        });

        System.out.println("Page title is: " + driver.getTitle());
        
        driver.quit();
    }
}


IEで検索しようとしているところ。

こちらも無事動きました。


ちなみに、最初にIEだと実行した際に、以下のメッセージが出て失敗しました。

Unexpected error launching Internet Explorer. 
Protected Mode must be set to the same value (enabled or disabled) for all zones.

これはインターネットオプション→セキュリティタブの設定で
すべてのゾーンで保護モードの設定を同じにすればOKでした。参考


まぁ、このサンプルではありがたみが少ないですが^^;
Javaで動かせるとなると、他の処理と組み合わせて実行できたりと便利ですね。


ちなみに、Selenium 2.0 のドキュメントはこちら