2013年2月12日火曜日

Selenium2使ってみた

Playで作ってるものも形になってきたのでいよいよテスト. そこで挙がった名前が

Selenium2

しかし「名前ちょっと聞いたことあるかなー」程度の知識だったのでイロイロ調べて簡単に使ってみた記録をメモメモφ(・ω・ )

Selenium2使ってみた

1. そもそもSelenium2って?

SeleniumはWebアプリケーションのUIテスト用フレームワーク. 簡単に言えば, 「ページ上でこう動いて欲しいなーなんて動きをコードで作って自動でテストしてくれる」ようなものを作れる. なんかニホンゴヘンダorz
2があるからには1があり, そのバージョンアップ. 具体的にはSimon Stwart氏作成の「WebDriver」をSelenium1に統合したものが2ということらしい. WebDriverの持つオブジェクト指向なAPIを取り込んでさらにできるようになったらしい. 1を知らないからなんとも言えないけど.
以上薀蓄

2. 言語と対応ブラウザ

言語は
javaC#RubyPython
の4種類. 1の時代にはPHPとかもあったらしいけどWebDriver統合時にWebDriverの方が対応していなかったため切り捨てられたとか(・ω・`)

また対応ブラウザは
Firefox
Google Chrome
IE
Opera
Apple iPhone
Android ブラウザ
Safari(ver2.21.0より)
となかなか豊富.BlackBerryは対応予定とだけ見たけど未確認. もう対応してるのかね('A`)
まぁ基本は上3つか.
ちなみにこれらはもちろんこのメモ書いてる時点でのお話.
この時点でのバージョンは2.29.0
マイナーチェンジしすぎだろ・・・(・ω・`)

3. Selenium-ServerとWebDriver

この辺正直よくわからないヽ('A`)ノ
Selenium-Serverは実際にブラウザを動かす係. これが無いとテストできない.
対応ブラウザにいっぱい書いたが, 実は標準ではIE と Firefox しかサポートしていないという事実. Opera/Chromeを使うなら別途サードパーティ製のServerが必要になるので注意. まぁ割と簡単な手順なんだけどね.
特にChromeに関しては比較的安心して使えるとかなんとか.
iPhoneとAndroid, Safariは未確認.

4-a. 入手

ここからまずは必要なファイルを入手.
必要なのは
Selenium-java-"ver".zip
Selenium-server-"ver".zip
の2つ. "ver"の部分にはもちろん数字が入ります.
他にも先に書いたとおり, Chromeでテストするにはこちらから
chromedriver_win_"ver".zip
が必要. "ver"の部分がバージョンじゃなかったらごめんなさい. この時点では26.0.1383.0. バージョンか?これ.

2014/01/24 追記
何やら場所が変わったみたいです
こちら
上記のページの 「Download chromedriver」 の先になります
追記・2
きちんと最新をもらってこないと、
unknown command 'waitforalltabstostoploading'
でググることになりそうです orz

4-b. 導入

必要なものを入手したら解凍, 今度はテストプロジェクトを作る.
プロジェクトにSelenium-javaおよびSelenium-serverに入っているsrcs以外のjarをとにかくパスを通す. 適当にぶち込んで設定から読み込んでやればOK. この時両方に「libs」ディレクトリがあるが, 中身は同じなのでどちらかひとつを入れればいい.
具体的には
selenium-java-"ver".jar
Selenium-server-"ver".jar
Selenium-server-standalone-"ver".jar
libsディレクトリの中身全部
を全部通す.
すっごいにぎやかになります.
ついでにどこかにchromedriver.exeも放り込んでおこう. なるべくコード中でパスがわかりやすいところに.(自分はパスすっごい苦手なので直下に「selenium」ディレクトリ作って全部放り込む始末orz)
これで準備はOK.

5. 簡単なコード1

ためしに簡単なコードで動きを見る. ちなみにもちろんJava. 他の言語書けない(・ω・`) テスト対象はPlayのWebアプリケーションなので, 事前に play runしておく.
public class Example {
  public static void main(final String[] args) {
    WebDriver driver = new FirefoxDriver();
    driver.get("http://localhost:9000");
    driver.quit();
  }
}
まだローカルでplayアプリを走らせている状態. 懐かしきmain関数.
3行目で使用するブラウザを選択. 今回はFirefoxでやってみる. これがWebDriver統合の強み?
4行目で立ち上げたブラウザにURLを入力, getしてもらう. このgetメソッド, ブラウザにきちんと表示されるまで先に処理が進まないので注意. 逆に言うとこのメソッドが終わった時点で画面は表示されているものとしてこの先の処理を書いていける. 実にありがたい.
5行目はブラウザの終了メソッド. これをしないといつまでもブラウザが居座り続けます. 今はいいけどテストがの量が増えたときは・・・Σ(||゚Д゚)ヒィィィィ

これを実行→JavaApplicationで実行するとFirefox起動→アプリ表示!→終了!!となる. まだテストには程遠い・・・
なお今回はPlayで作ったアプリのテストなので localhost:9000 だけど,  http://www.google.co.jpにするとグーグルのトップを開いて即終了します

6. 簡単なコード2

こんどはChromeでテストがしたい. ので4-b. にあるとおりドライバを用意しましょう.
コードもjUnitTestcaseを使用. jUnit4で.

@Test
public class Example {
  public static void main(final String[] args) {
    System.setProperty("webdriver.chrome.driver", "selenium/chromedriver.exe");
    String strURL = "localhost:9000/";
    WebDriver driver = new ChromeDriver();
    driver.get(strURL);
    WebElement element = driver.findElement(By.id("id"));
    element.sendKeys("id");
    element = driver.findElement(By.id("password"));
    element.sendKeys("pass");
    element.submit();
    assertThat(driver.getTitle(), is("ホーム"));
    driver.quit();
  }
}
ほぼまんまiUnit.  importするのは
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
のあたり. なんか isみたいに打ち消し線出るけど大丈夫なのだろうか….

なおこのアプリは localhost:9000 を入力すると, idと パスワードを入力してログインするだけの簡単なページに出る.

4行目が拾ったchromedriverの宣言. これが無いとChromeではテストができない. まだ直下/seleniumにしまってあるorz
6行目で今度は WebDriverは ChromeDriverで newする.
7行目で getしたらいよいよテスト.
8行目,  findElement()は引数の条件に一致する, 現在開いているHTMLの中で最初に見つかった要素を返す.
引数の By.id("id")は, HTMLタグの id のこと. 他にも name等でも検索できる. がそのHTML中に該当するものが無ければエラーが返るので注意. ここでログイン idを入力するフォームを探している.
9行目 sendKey()は引数の値(文字列)を, 指定したフォームに入力するメソッド. この場合 8行目で見つけた idの入力フォームに "「id」 と入力する, というだけの動き.
この時も element が入力を受け付ける要素ではない場合エラーが返る.
10, 11行目も同様に, こんどはログインパスワードの入力フォームを取得 → 「pass」と入力.
12行目の submit()で elementのある formを submitする. この場合は最後に elementにはパスワード入力フォームが入っているので, これを子要素に持つ formがあればそれを submitする. やっぱりそんなものが無ければエラー. 何かとエラーが返ってくる.
13行目がいよいよチェック. ここまでの入力でログインが済んだはずなので, タイトルは ホーム になっているはず, というテスト.

これを今度は 実行→jUnitTestCaseで実行.
おなじみのウィンドウが登場し, テストの進行状況と結果を表示してくれるはず.

他にも, HTML文の中に指定の文字列が含まれているか探す
driver.contains()などもある.

とりあえずここまでで "それっぽく" Selenium2は動かせるはず.






次はどこをテストするかだなー(・ω・`)

0 件のコメント:

コメントを投稿

AWS CDKで立てたEC2インスタンスのTimeZoneとかいじりたかった話

EC2を立てることはできたけど、立てたインスタンスは UTCのままだし設定ファイルとかいちいちscpしてくるのはダルい。 当初UserDataでなんとかしようとしたものの、「書く量がヤバいしメンテしにくい」と悩んでいたところ見かけたのが  AWS::CloudFormation:...