覚書き/Selenium

Selenium2.0が出た。
1.xから、Javaで操作する部分が変わっている。
WebDriverベースになっているとのこと。
⇒WebDriverベースのものが追加されたってのが正しいみたい。置き換わったわけじゃない。
1.xでは、クライアント/サーバベースだったけど、果たしてどうなっているのか。⇒まだあった。
いろいろとお試ししたので、書いてみようと思う。少しずつ。。。

目次


ダウンロード

以下の場所からダウンロードできた。
http://code.google.com/p/selenium/downloads/list

Javaなら、以下のファイルをダウンロードして解凍です。(2011/08/29時点)
selenium-java-2.5.0.zip

実装してみたメモ

参照 Selenium Documentation - Selenium 2.0 and WebDriver

前提

WebDriver driver = new FirefoxDriver();

複雑なHTMLの操作はXPATHで。

NAMEタグやIDタグで指定できないときは、XPATH指定を使う。

WebElement element;
element = driver.findElement(By.id("passwd-id"));
element = driver.findElement(By.name("passwd"));
element = driver.findElement(By.xpath("//input[@id='passwd-id']"));

XPATHを使うと、RADIOボタンもVALUE指定で選択できる。

フレームの移動

これは、以下のコードで実現できる。

driver.switchTo().frame("frameName");

上記の実行でフレームを移動する。フレームが入れ子になっている場合は、次のフレーム名へ移動するコードをもう一度実行すればよい。

driver.switchTo().frame("frameName");
driver.switchTo().frame("frameName_child");

問題は一度移動して、別のフレームに移動しなおすとき。ドキュメントは読んでみたけど、やり方は分からなかった。
いろいろ試した結果、以下で top に戻ることが分かった。

driver.switchTo().defaultContent();

JavaDocには、それらしいこと書いてあった。以下、抜粋。
defaultContent()
Selects either the first frame on the page, or the main document when a page contains iframes.

新しいWindowを開くとき

以下で実現できる。

driver.switchTo().window("windowName");

困ったのは、Windowを閉じてしまった後。そのままでは、driverが無効なオブジェクトを指しているのかエラーになる。
これは、新しいWindowを開く前に、Window Handleを取得して、閉じた後に、このWindow Handleを使って戻ればよいことが分かった。

String wh = driver.getWindowHandle();
driver.switchTo().window("windowName");
〜処理〜
driver.switchTo().window(wh);

ドキュメントをよく読めば分かるのだろうけど、はまりました。

alert、confirmの場合はどうする?

先日まで調べていた方向、alertやconfirmが出てしまってからの制御は、いろいろやってみてもうまくいかなかった。
調べていると、別の観点での解決策がみつかった。
これは、Selenium1.xでも通用する方法だ(※コードは異なる)。
その方法はココでみつけた。→ http://d.hatena.ne.jp/taskaruy/20110618/1308418000
具板的には、JavaScriptでwindow.alertや、window.confirmを置き換えてしまう。
さらにココに詳しい。→ http://rostislav-matl.blogspot.com/2011/04/moving-to-selenium-2-on-webdriver-part.html

JavaScriptExecutor js = (JavascriptExecutor)driver;

// 関数置き換え
js.executeScript("window.orig_confirm = window.confirm;"); 
js.executeScript("window.confirm = function(msg){ document.last_confirm=msg; return true;};");

// ★処理★

// 元に戻す
js.executeScript("window.confirm = window.orig_confirm;");

これは盲点だった。
JavaScriptって、こういうところ、柔軟な言語だなあ。

ちなみに、ページ遷移すると、JavaScriptもクリアされるので、上記は毎回実行する必要がある。
あと、上記のコードで表示メッセージを覚えているので、以下のコードで取得できる。

String message = (String)js.executeScript("return document.last_confirm");

以下の方法は解決できなかった。
submitのonclick内でのwindow.confirm使っている場合は何か特別な方法が必要なのかな。
−−−−−−−−(以下駄目だった方法)
ドキュメントを読むと以下が書いてあった。

Alert alert = driver.switchTo().alert();

後は、JavaDoc読めと。
Alertに4つほどメソッドあったので、どうにかなりそうだ。

accept() 
dismiss() 
getText() 
sendKeys()

駄目だった。
ポップアップを表示するエレメントのclickメソッドで動作が止まってしまって以下のコードに到達しなかった。

Alert alert = driver.switchTo().alert();

うむむ、記事なんかではポップアップもいけるとか書いてあったけど、これはどう対処したらいいんだろう?調査中です。
−−−−−−−−(ここまで)

蛇足

ページの遷移待ちは、ドキュメント内に以下のコード記述があった。

(new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() {
    public Boolean apply(WebDriver d) {
        return d.getTitle().toLowerCase().startsWith("cheese!");
    }
});

今、試しに Scala で実装試していたのだけど、上のコードが書けない。
まだまだ、だなあ。

継続中。。。

ライブラリの動作を検証するのは、

Groovy がいい。
Eclipse に Groovy のプラグイン入れて、Groovy Project でプロジェクトを作って、Javaのコードをコピーすれば、ほぼそのまま動作する。
Groovy の方が記述量が少なくなる。お試しでの動作確認なので、できるだけ素早く書いて動かしたいよね。
既にJavaで記述したものがあっても、Groovy から呼び出せる。

Scala は、、、Java から変えないといけない記述が多いので、ベースが Java だと手間がかかる。
あと Scala については、ひらりんが慣れてないのもデメリット。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-02-14 (火) 00:58:42 (2131d)