2011年10月25日火曜日

Selenium with JUnit(その2 解説)

Selenium のWebDriverを利用したJUnit(Java)によるプログラミングの解説です。

サンプルや, 設定などは前回のブログ Selenium with JUnit を参照してください。

Web Driverのプログラムにおいて, 核となるクラス(インターフェイス)はたった2つです。(Waitも使いますが, とりあえず)

WebDriver   :  org.apache.selenium.WebDriver   インターフェイス,  Webブラウザのコントロールのコアクラス,  ブラウザの初期設定, ブラウザタイトルの取得, HTML 要素の取得などを行います。

Selenium :  com.thoughtworks.selenium.Selenium クラス   Selenium IDEで利用していた関数をそのまま使えたりします。 つまり, click やtype などのブラウザ操作に利用できます。

※WebDriverは実際には,  FirefoxDriverであったり, RemoteWebDriverであったり具体的なクラスが入ります。

プログラミングの細かい点を見ていきましょう

初期化(Firefox)
Firefox profile = new Firefox
WebDriver driver = new FirefoxDriver(profile);
String baseURL = "http://localhost/index.html";
Selenium selenium = new WebDriverBackedSelenium(driver, baseURL);    // これでSelenium のインスタンスが利用できる

※Firefoxでの初期化です。WebDriverをつくって, 最終的に Selenium のインスタンスを取得します
selenium でopen などを行って移動してくと, WebDriverは自動的に, そのページの情報を取得していきます


要素の取得
WebElement element = driver.findElement(By.id("1st-id"));    //  id属性が 1st-id の要素を取得

List<WebElement> element = driver.findElements(By.id("multi-id"));

※findElementsだと複数取得できます。findElementの場合, 上から最初の要素となります

要素の特定には, By.xxx(""); を使いますおもなものをあげておきます。

By.id("");                    //  ID属性
By.linkText("");          //  link つまり  <a> の href属性
By.tagName("");         //  <div>  div などのタグの名前
By.className("");      //   class属性
By.xPath("");              //  XPath
By.cssSelector("");     //  CSS セレクタ
By.name("");              //   name属性


URLを開く
selenium.open("/");    //   / ルート(baseURL)を開く
selenium.waitForPageToLoad(TIMEOUT);

/ と指定した場合は, baseURLで設定した, URLを開きます。
base URLは通常は, テストしたい, Webページを書きます
"" 中にURLを書きます

ページをopenするときは, 必ず, waitForPageToLoadを入れましょう(引数はtimeout時間(ms)です)
ページのロード(描画)を待ちます。


ボタンをクリック
selenium.click("name=fine");    // name属性が fineのボタンをクリック

※ 引数は, Selenium IDEであった4つの方法と同じ書き方になります。

入力ボックスに値を入れる
selenium.type("//input[@class='test']", "Test");    // <input type="text" class="test"> にTestと入力   

終了処理
終了処理を行わないと, Webブラウザが開きっぱなしの状態になるので, JUnit (サンプルでは, @Afterで処理しました)以外の部分で利用する場合は, 必ず finally ブロックの中に入れましょう。
Selenium のインスタンス, WebDriverのインスタンスそれぞれclose()します

try
{
      //   ...   Seleniumの処理
}
finally
{
     selenium.close();
     driver.close();
}

いかがでしたでしょうか, 次回は, Chromeの設定方法です。




2011年10月23日日曜日

Selenium with JUnit

今回は, Selenium と Java の Unit テスト JUnit を使ってWebアプリケーションをテストする方法についてです。(Selenium のJUnit テストは, client のドライバを使うことから, WebDriverという言葉がしばし用いられます, 今後WebDriverによるテストと何度か使うかもしれません)

環境   MacOS X   Windows7   Firefox はいずれも7.0.1
(プログラムの動作はMacで確認いたしましたが,普段Windows7でもプログラムを作成して動作しているので問題ありません)

WebDriver によるプログラミングは, Javaのほかにも C#, Python, Ruby, Perl, PHPなどでも可能です。 ブラウザは, Defualt で Firefox , そのほか拡張Driverを利用すれば, IE, Chrome, Safari, Opera, などでも可能です。(今回は, Firefoxで試してみます, Chromeもいずれの機会に)


Selenium は, すでに予備知識がある前提といたします。また, JUnit の設定も同様とします。 Selenium に関しては,  筆者のIDEに関する記述をご覧ください。

Selenium IDE その1
Selenium IDEその2(コマンド)
Selenium IDEその3(Locators)
Selenium IDEその4(Ajax)

では,さっそく準備をしましょう。

1. Selenium のライブラリのダウンロード
2. JUnit のコードを書く


SeleniumのWebページより, Selenium Client Drivers の項目から, JavaのClientライブラリ一式を
ダウンロードします。(2011/10/23時点でVersion2.9)


このフォルダを解凍すると,  selenium の中に, core である selenium-java-.x.x.x.jar があります。
依存ライブラリは, lib の中にあります。

筆者が確認したところ, WebDriverのプログラムに必要な, Minium Requirements は以下になります。
commons-logging-1.1.1.jar
guava-r09.jar
httpclient-4.1.2.jar
httpcore-4.1.3.jar
json-20080701.jar
selenium-java-2.9.0.jar


※バージョン 2.13.0 では, さらに commons-exec-1.1.jar が必要なようです 
2.20 でも2.13と同じことを確認いたしました(2012/03/22)

です。 これらをJUnit のプログラムの Build Path に入れていただく必要があります。

次に, JUnit4 を使ってプログラムを書きましょう。今回はSelenium IDEその1でも利用した, Googleのサーチを使ったテストです。

テスト手順
1.  Google のWebサイト(http://www.google.co.jp)を開く
2.  検索Box に "AKB48" と入力
3.  自動検索を待ち, AKB48公式サイトの文字が出るまで待機
4.  AKB48公式サイトのリンクをクリックしてページを表示
5.  Web ページのタイトルが 「AKB48公式サイト」であることを確かめる


プログラムを動かすと, 自動的に Firefox を立ちあげ, テストを行います。
JUnit のプログラムなので, Breakpointを追加して止めることも可能です。
Selenium IDEと違って, verify, assert 系の関数はないので,  JUnit の Assert.assertXxxx 系の関数を使用しましょう。

プログラムは  WebDriver interface と Selenium class を利用して, テストを書きます(これらの説明は次回)

WebDriver を使用して立ち上がったFirefox には, 右下に, WebDriverと表記しています。


今回使用したプログラムは以下です。詳しいコードの解説は次回に
●Test のメインクラス   SearchTest.java

package com.atmarkplant.test.selenium.sample;

import junit.framework.Assert;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebDriverBackedSelenium;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxProfile;

import com.thoughtworks.selenium.Selenium;

public class SearchTestCase
{
WebDriver driver;

Selenium selenium;

private static String TIMEOUT = "5000";

private static String SEARCHTEXT = "AKB48";

@Before
public void setup()
{
FirefoxProfile profile = new FirefoxProfile();
driver = new FirefoxDriver(profile);
String baseURL = "http://www.google.co.jp";
selenium = new WebDriverBackedSelenium(driver, baseURL);
}

@After
public void tearDown()
{
if ( selenium != null )
{
selenium.close();
}
if ( driver != null )
{
driver.close();
}
}

@Test
public void searchTest() throws InterruptedException
{
// Open base URL
selenium.open("/");
selenium.waitForPageToLoad(TIMEOUT);

// Input something in search text box
selenium.type("id=lst-ib", SEARCHTEXT);
WaitUtils.waitText(selenium, SEARCHTEXT, 5000);

// Click link
selenium.click("link=AKB48公式サイト");
selenium.waitForPageToLoad(TIMEOUT);

         
Assert.assertEquals("AKB48公式サイト", driver.getTitle());
Thread.sleep(4000);  // For testing
}
}


●Ajax 対策用  Textが出現するまで待つ用途のクラス
TextWait.java


package com.atmarkplant.test.selenium.sample;

import com.thoughtworks.selenium.Selenium;
import com.thoughtworks.selenium.Wait;

public class TextWait extends Wait
{
Selenium selenium;
String text;

public TextWait(Selenium selenium, String text)
{
this.selenium = selenium;
this.text = text;
}
@Override
public boolean until()
{
return selenium.isTextPresent(text);
}
}

● 上記のクラスを利用するためのUtility関数のためのクラス
WaitUitls.java

package com.atmarkplant.test.selenium.sample;

import com.thoughtworks.selenium.Selenium;
import com.thoughtworks.selenium.Wait;

public class WaitUtils
{
public static void waitText(Selenium selenium, String text, long timeout) throws InterruptedException
{
Wait wait = new TextWait(selenium, text);
synchronized(wait)
{
wait.wait(timeout);
}

}
}











2011年10月22日土曜日

Ruby on Rails 3 インストール

-  インストールメモ
環境  Windows 7  64bit
Ruby 1.9.2   -  インストーラーを使ってインストール済み(C:\Ruby192)
Pathにc:\Ruby192を追加済み

※1.9.3 でも動作確認いたしました

Ruby1.9 系には, すでに gem も含まれているので問題なし。

さてさっそくインストールしようとすると, json のところでエラーが出て終了。
依存関係上 Devkit の設定が必要らしいです。

そこで, まず, Devkit の設定をしましょう。
(一度エラーが出てしまった場合は,  gem uninstall railsで cleanしましょう, それでダメな場合は
Ruby のディレクトリ内の
lib\ruby\gems\<gemsのversion> 内の cache, doc, gems, specifications の中をclean しましょう)
※くれぐれも他で gem install したものを削除しないように注意!)

1.  Devkit のinstall

Devkit  より,  devkit-xxx.exe  (xxxはバージョン)  を download,  c:\Devit など, Devkit 解凍用のディレクトリを作成して, そこへ devkit-xxx.exe を移動させて, 実行します

・コマンドプロンプトで, c:\Devkit つまり, 解凍先へ移動します
cd c:\Devkit

・ init を実行します(config.yml が生成されます)
ruby dk.rb init

・インストールします
ruby dk.rb install

これで /lib/ruby/site_ruby/  というところに,  devkit.rb が出てきます


※Devkit の詳しい説明は,  上記の Devkit のWeb サイトにあります
2.  Rails のインストール
gem install rails

でjson のところで引っかかることなく, インストールできます。

・確認
rails -v  

これでバージョンが出てくるはずです

3.   Rails が動かせるか確認します
新しく Rails 用のディレクトリを作りましょう   c:\Rails とか

・コマンドプロンプトでそこへ移動, 新しいrails プロジェクトを作りましょう
rails new appName     

※ appName はプロジェクトの名前
これでアプリケーションのひな形が完成します

・コマンドプロンプトで, appName で作ったrailsのアプリディレクトリ内に移動しましょう
cd c:\Rails\appName

・rails のサーバーを起動します(アプリを起動します)
rails server

※rails の開発テストでは, WEBrick というサーバソフトウェアを利用します

4. はじめてのアプリの確認
http://loclhost:3000
   
にブラウザでアクセスしましょう(デフォルトではポートが3000になっています)

上記の画面が表示されれば成功です。