2014年7月4日金曜日

Windows + MavenでSeleniumのUIテスト

■環境
Windows7 64bit
Java 1.7.0_25
Maven 3.1.1
Selenium API 2.42.2
Firefox 30.0

■プロジェクト作成
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-quickstart -DgroupId=com.sample.selenium -DartifactId=selenium_test
※maven-archetype-quickstart を使います

バージョンを入力し内容の確認に答えればOKです(そのままエンターでOKです)

■pom.xml編集
作成されたpom.xmlを以下の用に編集してください
Seleniumのライブラリを使用する定義を追加します

<dependency>
  <groupId>org.seleniumhq.selenium</groupId>
  <artifactId>selenium-api</artifactId>
  <version>2.42.2</version>
</dependency>
<dependency>
  <groupId>org.seleniumhq.selenium</groupId>
  <artifactId>selenium-java</artifactId>
  <version>2.42.2</version>
</dependency>

mvn clean install
するとライブラリがダウンロードされてきます

ついでにMaven経由でJavaを実行するためのプラグインもインストールします
<build>
  <plugins>
    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>exec-maven-plugin</artifactId>
      <version>1.2.1</version>
      <configuration>
        <mainClass>com.sample.selenium.App</mainClass>
      </configuration>
    </plugin>
  </plugins>
</build>

■サンプルテストコード
emacs src/main/java/com/sample/selenium/App.java

package com.sample.selenium;

import com.thoughtworks.selenium.*;
import org.openqa.selenium.*;
import org.openqa.selenium.firefox.*;

public class App {

  private static int SLEEP_TIME = 5000;
  
  public static void main(String args[]) throws Exception {
    new App().updateRanking();
  }

  public void updateRanking() throws Exception {
    FirefoxProfile profile = new FirefoxProfile();
    profile.setAcceptUntrustedCertificates(true);
    FirefoxDriver driver = new FirefoxDriver(profile);

    driver.get("http://fc2.com/login.php?ref=blog");
    driver.findElement(By.id("id")).click();
    Thread.sleep(SLEEP_TIME);
    driver.findElement(By.id("id")).sendKeys("username");
    Thread.sleep(SLEEP_TIME);
    driver.findElement(By.id("pass")).click();
    Thread.sleep(SLEEP_TIME);
    driver.findElement(By.id("pass")).sendKeys("password");
    Thread.sleep(SLEEP_TIME);
    driver.findElement(By.name("image")).click();
    Thread.sleep(SLEEP_TIME);
    driver.findElement(By.linkText("プラグインの設定")).click();
    Thread.sleep(SLEEP_TIME);
    driver.findElement(By.xpath("(//a[contains(text(),'詳細')])[2]")).click();
    Thread.sleep(SLEEP_TIME);
    driver.findElement(By.linkText("【HTMLの編集】")).click();
    Thread.sleep(SLEEP_TIME);
    driver.findElement(By.name("value1")).clear();
    Thread.sleep(SLEEP_TIME);
    driver.findElement(By.name("value1")).sendKeys("test contents for plugins in side bar");
    Thread.sleep(SLEEP_TIME);
    driver.findElement(By.cssSelector("input.submitAddButton")).click();
    Thread.sleep(SLEEP_TIME);
    driver.quit();
  }

}

完全にプライベートなソースコードですが
fc2 blogにログインしてサイドバーの内容を更新するサンプルです
XML-RPCでは記事本文しか自動更新できないのでサイドバー等はUIを使って変更するしかありません

mvn clean compile
でソースをコンパイルします
M2_HOME等のmavenの設定がうまくできていれば問題なくコンパイルできるかと思います

■サンプルの実行
mvn clean compile exec:java

とコマンドプロンプト上で実行するとFirefoxが立ち上がりブラウザが自動で動きはじまると思います
ネットワーク等が重く動作が安定しない場合はSLEEP_TIMEを5000から10000(10秒)等に変更して試してみてください

以上です
MavenからSeleniumを動作させることができました
SeleniumIDEでJavaのソースコードをExportする場合はJUnitかTestNGのどちらかでテスト形式であることが前提なので
必ずテストコードにする必要がありましたが、それを書き換えて通常のJavaプロジェクトとして動作させてみました
また、今回はWindows環境で実施しましたが、Seleniumのテストを実施する場合どうしてもGUI環境が必要になるので
仕方なくWindows環境を使用しました
Mac または X のあるLinux環境でも問題なく動作すると思います

■参考サイト

■Tips
maven の場合は依存関係をいい感じの解決してくれたのですが、
maven を使わない場合はselenium系の jar 以外に Guava や Json のライブラリで40個以上必要になるみたいです
http://stackoverflow.com/questions/9699997/selenium-2-webdriver-noclassdeffounderrors

なので通常のJavaプロジェクトの場合はselenium-server-standalone-2.39.0.jarを使ってあげるといろいろな jar をインストールしなくて済むので楽です

0 件のコメント:

コメントを投稿