2013年4月29日月曜日

WebDriverでのalert(confirm)検知方法

WebDriverでのalertを検知する方法として、
switchToメソッドを使ってalertオブジェクトを取得する方法等が存在した。
しかしながら、この方法ではオブジェクトを取得するまでに一定時間待機してしまい
時間がかかりすぎてしまう。

先人の知恵を元に強制js書き換えを行うのが通例とされてきたが、2.32から
selenium自体がこの方法をラッピングしてくれた。


WebDriver driver = new ChromeDriver();
AlertOverride alertOverride = new AlertOverride(true);
alertOverride.replaceAlertMethod(driver);                //①

 ・
 ・
 ・
if(alertOverride.isAlertPresent(driver)){                                     //②
    String alertMsg = alertOverride.getNextAlert(driver);               //③
}
if(alertOverride.isConfirmationPresent(driver)){                          //④
    String confirmMsg = alertOverride.getNextConfirmation(driver);//⑤
}


①でwindow.alert、confirmを上書きし、内部バッファに溜め込むようにしている
②でalertが発生しているかどうか確認し、③でそのメッセージを取得している。
④、⑤も同様。

Jsの書き換えを行っているため、各画面を開くごとに実行する必要があるところが
注意点。WebDriverぐらい内部に保持して、いちいち引数に指定しなくて
いいようにしてほしいなと思う今日この頃。

alertやconfirmはスクリーンショットで取得できないので、実装ミスによる
alertが表示された場合、この方法をとらないとどんなメッセージが表示されたか
わからない。

JQueryのメッセージボックスを使用していて、alertやconfirmは使用していないという
場合は、あらいざらいこの方法ですくってやればいい。

2013年3月3日日曜日

【JavaFX2】コントローラクラス

コンポーネントのイベントを貼り付けたりコンポーネントにアクセスするために
フィールド変数を保持したり、何かと忙しいコントローラクラス。

それに対する覚書。

 1.コントローラでないとコンポーネントを認識しない
 @FXMLアノテーションをつけることによって、java側から画面のコンポーネントにアクセスするが、
 そもそもこの機能はコントロールクラスでないと動作しないようだ。

 2.フォーム1つにつきコントローラも1つ
  SCENE Buiderを見る限り、どうもそうっぽい。最終的にごちゃごちゃしてくるのではないだろうか。

 3.初期処理はinitializeで
  コンポーネントに対する初期処理は、コントロールクラスにInitializableを実装し、
  initializeメソッドでやるのが流儀のようだ。

 4.コントローラのインスタンス取得方法
  URL file = new File("fxmlファイルパス").toURI().toURL();
  FXMLLoader loder = new FXMLLoader();
   Conroller controller = (Controller) loader.getController()
    こんな感じ。

さくさく十同できますなぁ。
SCENE Buider自体のバグが気になるけど。

2013年2月24日日曜日

JavaFX2での実装所感

たぶん生きてる間はJavaはなくならないと思うんだ、cobol的に。

いまさらながら、JavaFX2に触れてみた。
・NetBeans最新版ダウンロード
・JavaFXSDKダウンロード
・Scene Builderダウンロード
基本これだけで開発環境が構築される。eclipseとはまだまだ親和性が低い模様。

実装方法もVisual StudioやDelphiと同じくコンポーネントをマウスで設定したり
イベントを紐付けて記述したりと、今までのノウハウがそのまま使えていい感じ。

Mavenで開発環境を構築しようとしたら、ソースのコンパイルはうまくいくが、
JavaFX関連のクラスが参照できず、デバッグ実行がうまくいかなかった。

ローカルに配置したJavaFXSDKのパスをMavenのsettingファイルに環境変数として登録し、
参照させる(ネットワーク経由では参照できない)らしく、やってもうまくいかないので、
いったん保留。

標準のメッセージボックスが存在しないという点が今のところ驚いた点になる。
フリーのライブラリを使用するか、出なければ独自にwindowをモーダル生成し、実装するしかない。

とはいえ、画面をソースで直接記述するSwingよりはかなりいい。関連書籍が少ないのが気になるが。
画面ファイル(fxmlファイル)で他の画面ファイルを継承したり出来るのだろうか。

数年後に消えませんように。

2013年2月20日水曜日

v2.30の追加機能

いろいろな不具合を直しつつ、新機能としては

1. Chromeの動作ログが出力されるようになった。

System.setProperty(ChromeDriverService.CHROME_DRIVER_LOG_PROPERTY,"C:\\abc.log");
WebDriver chrome = new ChromeDriver();

こんな感じ

2.IEの起動オプションが追加
DesiredCapabilities caps = DesiredCapabilities.internetExplorer();
caps.setCapability(InternetExplorerDriver.ENABLE_PERSISTENT_HOVERING, true);
caps.setCapability(InternetExplorerDriver.REQUIRE_WINDOW_FOCUS, true);
WebDriver ie = new InternetExplorerDriver(caps);

こんな感じ


正直秋田。
違う方向性を探らなければ。

今のところ、一番興味があるのはJavaFX2。
適当にもの作って、再配布しても著作権的に問題にならないかが気になるところ。

2013年1月5日土曜日

WebDriverでjs単体テスト

最近Seleniumとphantomjsが怪しい。
2.27からごちょごちょやっていて、2.28になって、こんなことを言い出した。

「Added the PhantomJS bindings to the release」

  DesiredCapabilities caps = new DesiredCapabilities();
  caps.setCapability(PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY, "/usr/local/bin/phantomjs");
  WebDriver driver = new PhantomJSDriver(caps);
  driver.get("http://gugurekasu.blogspot.jp/");
  System.out.println("TITLE : " + driver.getTitle());
  System.out.println("URL : " + driver.getCurrentUrl());

こんな感じで使える。

http://cdn.ivandemarino.me/slides/speed_up_selenium_with_phantomjs/index.html#title
上記に書いているが、画面を表示しない分、速度が速くなる。
ただしjsのエンジンがwebkit固定なので、WindowsFireFoxなどとはお庭が違う。
そういう意味では、JsTestDriverのほうが起動ブラウザを選択できる分優秀。

残念。