Posts Tagged: selenium

WebDriverEventListener

SeleniumやWebDriverの日本語サイトまだまだ少ない。
簡単な使い方に関してはたくさん出てくるけど、
一歩踏み込んだ内容になると全然ない。
自分はまだまだリファレンスを読んだだけでは使い方がわからないことが良くある。
StackOverflowとかはたくさん出てくるから何とかなっているけど(^ ^)

ということでWebDriverEventListenerを悩みながら使ってみたのでメモです。
これはWebDriverが発生させるイベントにリスナーをつけるものらしい。
使いどころ、、、ありそうな、なさそうな、(^^;

WebDriverEventListenerはインタフェースなので具象クラスにて実装する。
今回はサンプルということで全部のメソッドを実装するのは面倒なのでbeforeFindByメソッドだけに処理を書いている。
名前から察するにfindElementする前にこのメソッドがコールされるっぽい。

package common;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.events.WebDriverEventListener;

public class SampleEventListener implements WebDriverEventListener{

	@Override
	public void afterChangeValueOf(WebElement arg0, WebDriver arg1) {
		// TODO Auto-generated method stub

	}

	@Override
	public void afterClickOn(WebElement arg0, WebDriver arg1) {
		// TODO Auto-generated method stub

	}

	@Override
	public void afterFindBy(By arg0, WebElement arg1, WebDriver arg2) {
		// TODO Auto-generated method stub

	}

	@Override
	public void afterNavigateBack(WebDriver arg0) {
		// TODO Auto-generated method stub

	}

	@Override
	public void afterNavigateForward(WebDriver arg0) {
		// TODO Auto-generated method stub

	}

	@Override
	public void afterNavigateTo(String arg0, WebDriver arg1) {
		// TODO Auto-generated method stub

	}

	@Override
	public void afterScript(String arg0, WebDriver arg1) {
		// TODO Auto-generated method stub

	}

	@Override
	public void beforeChangeValueOf(WebElement arg0, WebDriver arg1) {
		// TODO Auto-generated method stub

	}

	@Override
	public void beforeClickOn(WebElement arg0, WebDriver arg1) {
		// TODO Auto-generated method stub

	}

	@Override
	public void beforeFindBy(By arg0, WebElement arg1, WebDriver arg2) {

		System.out.println("beforeFindBy");
	}

	@Override
	public void beforeNavigateBack(WebDriver arg0) {
		// TODO Auto-generated method stub

	}

	@Override
	public void beforeNavigateForward(WebDriver arg0) {
		// TODO Auto-generated method stub

	}

	@Override
	public void beforeNavigateTo(String arg0, WebDriver arg1) {
		// TODO Auto-generated method stub

	}

	@Override
	public void beforeScript(String arg0, WebDriver arg1) {
		// TODO Auto-generated method stub

	}

	@Override
	public void onException(Throwable arg0, WebDriver arg1) {
		// TODO Auto-generated method stub

	}
}

次にJUnitのテストケースにてSampleEventListenerクラスを使う処理を書く。
これを実行するとコンソールに
beforeFindBy
と出ます。

package test;

import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.events.EventFiringWebDriver;

import common.SampleEventListener;

public class EventTest {

	private WebDriver driver;
	private SampleEventListener listener;
	private EventFiringWebDriver efwdriver;

	public EventTest() {
		driver = new FirefoxDriver();
		efwdriver = new EventFiringWebDriver(driver);
		listener = new SampleEventListener();
		efwdriver.register(listener);
	}

	@Test
	public void test() {
		efwdriver.get("https://www.google.co.jp/");
		efwdriver.findElement(By.id("gbqfq"));
	}

}

SeleniumやWebDriverは調べてみると
「Seleniumにこんな機能が。。。」
と驚くことが多い笑
EventFiringWebDriverとか知らなかった。
まだまだ知らない便利なものがたくさんあるかもしれない。

[参考]
https://groups.google.com/forum/?fromgroups#!topic/webdriver/4i0r_0JEoi8
https://gist.github.com/1728633

Selenium 2.x Web Driverでファイルをダウンロードをする

しばらくSeleniumを触ってなかったらいつの間にかSeleniumがバージョンアップしてた。
どうやら今年(2011年)の夏くらいに革命が起きたらしい。
(気付くの遅い…。)

今まではSelenium Serverというプロキシを起動して、テストケースを実行してたけど、新しいSeleniumではWeb Driverを統合したため直接ブラウザをコントロールできる。
使ってみた感触だと、今までより良くなっていると感じたのは次のようなこと。
「それ、前からできたよ。」っていう突っ込みがあるかもしれませんが、Selenium暦の浅い若輩者ゆえご容赦くださいm(_ _)m
でも新Seleniumになる前はわからなかった使い方がわかるようになったということも改善点の1つではないでしょうか。(詭弁だ。)

  • Selenium Serverを起動せずに直接ブラウザを操作できるせいか、余計な手間がなくテストコードが書きやすくなった
  • なんか前より速い気がする
  • Firefoxのバージョンが最新(現在7.0.1)でも動作する
  • Firefoxのプロファイルの設定が簡単かつ自由にできるようになった(僕がSeleniumで使ったことあるのはFirefoxだけなので他はわかりません)
  • 今までどうにもならなかったポップアップなどのJS絡みの挙動に対応できるようになった
  • ファイルのダウンロードなどができるようになった

簡単ですが、こんな感じです。

今まではファイルのダウンロードができなかったため、そいういった機能絡みのテストシナリオがかけなかったのですが今回苦心の末ファイルのダウンロードができるようになったためメモを残しておきたいと思う。

Selenium 2.x Web Driverを使う

なにはともあれまずは新しいSeleniumを動かしてみるところから始める。
なにかと 設定が面倒そうだなぁ(旧Seleniumの経験より)と思っていたけど、すごく簡単に動いた。
このはてなダイアリーをそのまま実践させていただきました。すごい簡単でしたよ。感謝です。ありがとうございますm(_ _)m

ごにょろぐ WebDriverを統合したSelenium 2を使ってみる

Seleniumでファイルのダウンロードを行う

さて、いよいよSeleniumでファイルをダウンロードしてみる。
新しくtestというパッケージを作成し、SeleniumTestというクラスを作成することにする。
そのコードは以下。なぜこんな郵便番号を落としているのか、特に深い意味はありません。

package test;

import org.junit.Test;
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.firefox.FirefoxProfile;

public class SeleniumTest{

    private static WebDriver driver;

    @Test
    public void SeleniumWebsite() throws Exception {

    	// プロファイルの作成
    	FirefoxProfile profile = new FirefoxProfile();
    	profile.setPreference("browser.download.folderList", 0); // ダウンロードするファイルの保存先フォルダを指定 0:デスクトップ 1:ダウンロードフォルダ 2:ダウンロードに指定された最後のフォルダ
    	profile.setPreference("browser.download.useDownloadDir", true); // ダウンロードするファイルの保存先フォルダが指定してあればそれを使う
    	profile.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/zip;"); // 指定したmimeタイプは有無を言わさずダウンロードする
        driver = new FirefoxDriver(profile); // 作成したプロファイルでFirefox(のドライバー)を起動する
        driver.get("http://www.post.japanpost.jp/zipcode/dl/jigyosyo/index-zip.html");

        FileLoader();

        driver.quit();

    }

    private static void FileLoader() throws InterruptedException {

    	WebElement download = driver.findElement(By.linkText("最新データのダウンロード"));
    	download.click();
    	Thread.sleep(3000);

    }
}

以上を実行すると、デスクトップにzipファイルが保存されるはずだ。

プロファイルが簡単にカスタマイズできていることがお分かり頂けると思う。
これがファイル保存を可能にする肝の部分。
setPreference()のkeyとvalueは以下のサイトが参考になる。

about:config – Firefox – b
About:config entries – MozillaZine Knowledge Base

または、自分のブラウザで設定を行って、そのプロファイル設定ファイルを直接開いて見るのも参考になる。
プロファイルの場所は次のようにして調べる。

コマンドプロンプトで
>cd [firefox.exeのあるフォルダ] #自分の場合はC:\Program Files (x86)\Mozilla Firefox
>firefox.ext -profileManager
というコマンドでFirefoxを起動するとプロファイル設定画面が出る。
そこで作成されたプロファイル名にカーソルを合わせるとツールチップにプロファイルの場所が表示される。
ツールチップに表示されたフォルダにある”prefs.js”というファイルがプロファイルの設定パラメータが書かれたファイルになる。

ということで無事ファイル保存が可能になった。
これでテストシナリオのレパートリーが増えるね。