2012年5月31日木曜日

seleniumの2.22(その4 DriverService)

差分が発生しているjavaファイルを開き、著作権表記のみが
変わっていることを確認する簡単なお仕事です。

さてさて、Chromeだけではなく、本バージョンから新たにIEにも
DriverServerが出現した。

Chromeの時は特に動作速度に問題がなかったためスルーした
(というよりも勝手にChromeDriverがDriverServerを使用する)が、
IEは遅いため、使用してもいいかもしれない、というより、
使用しないとエラーになる。

以下やり方

System.setProperty( InternetExplorer DriverService.IE_DRIVER_EXE_PROPERTY,
                            "c:\\IEDriverServer.exe");

WebDriver driver = new InternetExplorerDriver()

こんな感じ、これでIEの起動が完了する。
IEDriverServer.exe自体はseleniumと同じ場所からダウンロードできる。
32bit版と64bit版のDriverが存在するので、ロジック内で
System.getProperty("os.arch")
を実行し、戻り値によって、セットするDriverを変更させればいい感じだと思う。


今までどおり、DriverServer無しで起動したい場合は


DesiredCapabilities capability = DesiredCapabilities.internetExplorer();
capability.setCapability("useLegacyInternalServer",true);
WebDriver driver = new InternetExplorerDriver(capability);

でOK。
ただし、イベント発生概念の関係からオススメはしない。


実行速度って重要ですから、終いにはFireFoxDriverServerとか出るかもしれない。
DriverServer怖い。

seleniumの2.22(その3 FileDetector)

ChromeやIE、FireFoxを含む全てのWebDriverにsetFileDetectorというメソッドが
実装された。
結果的にはExceptionを吐くだけだが、RemoteWebDriverを使用した
リモート起動の場合のみ、サーバー側のファイルを指定して、
ブラウザからのファイルアップロード動作を行うことができるようになる。

実装方法

生成したRemoteWebDriverクラスのsetFileDetectorメソッドを使い、

rdriver.setFileDetector(new LocalFileDetector())

でFileDetectorをセットした後、

rdriver.getFileDetector.getLocalFile({アップロードファイルパス})

でok

直接起動するDriverたちには不要なものなので、ほっといていい。


seleniumの2.22(その2 ライブラリ)

GoogleブログのエディターがなぜかChromeよりFireFoxのほうがきちんと動作する。
GoogleブログなのにデバッグやテストはFireFoxで行っているのだろうか。
そんなことで世界の情報を統合できるのか。
Googleの天才はやることが違う。


 とりあえずjavaの6に対応したというのを大きく歌っているものの、何が違うのかわからん。
詳しい人はコメント求む。

selenium2.21に比べ、参照されている外部jarで新しくなっているものは下記の3つ
  1.  guava(11.0.1→12.0)
  2.  operadriver(v0.11→0.14)
  3.  webbit(0.4.6-full→0.4.8-SNAPSHOT)

guavaはjavaのライブラリ、他のgoogleプロジェクトでもよく使われている、ググればよく出てくる。
http://d.hatena.ne.jp/mtoyoshi/20100725/1280040233
ここに詳しく書いている、痒いところに手が届く素敵なライブラリ。個人的にも使っていきたい。

webbitなんかはサーバークライアントの通信部分。現在(2012/05)公開されているのは0.4.7。
一番がっつり変わったoperadriverの現在の最新版は0.13

公開されていないjarをふんだんに使うgoogle素敵過ぎ。




seleniumの2.22(その1 大まかな変更点)

きたか…!! 


  ( ゚д゚ ) ガタッ 
  .r   ヾ 
__|_| / ̄ ̄ ̄/_ 
  \/    / 


とまぁ件名の通りです。
なにやらソースもがっつり変化して、その辺もいつもどおりです、もう驚きません。


主な不具合対応はSafariDriverの機能追加(*1)何だけれども、ほかのDriverでは
既に出来ていたものなので、そんなに目新しくなかったり。
というよりSafariDriver中身変わりすぎ(コマンドを実行して、ブラウザのイベントを発生させる、
Driverの基幹部分) 
リッピングしてるから問題ないんだろうけど、
運用乗っけてたら、バージョンアップを考えるレベル。まだ使うのは時期早々かね。 


あとはframe配下での最大化やalertの不具合修正、FireFoxの動作安定性
(xhtml対応、クリーンアップ対応)等々。


ソース差分を見ていたけれど、著作権表記が全ソースで書き換えられていて、
winmergeが大変反応されまして、大仕事になっています。やだやだ。


他にも、いっぱい変更箇所あるんですよ、これが。
一番大きなところはIEDriverServerではなかろうか。
Chromeのように別ファイルが必要になるっぽい。


長くなるし、眠いのでまた次回。


(*1)
  •  スクショ取れるようになったり
  •  フレームきりかえれるようになったり
  •  javascript実行できるようになったり

2012年5月29日火曜日

SafariDriverの動作性

2.21から実装されたSafariDriverは、いかんせん動作に不具合が多いようで。

javascriptでwindow.openが使用できないという致命的なものから、スクショがうまく取れないという(windowのサイズを変更しないと、viewpointが表示されないとか、、、)ものまで幅広く。

windowsとmacでのsafariの仕様差を吸収仕切れていないのか、わからんけど。なんかエンジン違うらしいね。知らんけど。

他のブラウザと違って毎回プレーンで起動しない(前回起動時のクッキーとか残っちゃう)なども問題。キャッシュとかも残っているのかも。
現状は起動時の引数でプレーンで起動することを明示的に指定するしかない。

DesiredCapabilities capability = DesiredCapabilities.safari();
capability.setCapability("ensureCleanSession",true);
WebDriver driver = new SafariDriver(capability);
こんな感じ。
何にせよ、これからの物。

2012年5月4日金曜日

InternetExplorerをselenium-webdriverで操作する方法


InternetExplorerをselenium-webdriverで操作すると、

org.openqa.selenium.WebDriverException: Unexpected error launching Internet Explorer. Protected Mode must be set to the same value (enabled or disabled) for all zones. (WARNING: The server did not provide any stacktrace information)


というエラーが発生し、動作がストップしてしまう。
これを回避するには、
http://code.google.com/p/selenium/issues/detail?id=1795
に記述されているようにセキュリティの設定を変更しなければ行けない。

ただし、それ以外にもプログラム側で設定を変更することによって、設定を変更する手間を削減することが出来る。


DesiredCapabilities capability = DesiredCapabilities.internetExplorer();
capability.setCapability(
              InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS,         true);
WebDriver webdriver = new InternetExplorerDriver(capability);

こんな感じ。
普段からIEを使用していて、テストのたびに設定を変更したくない人は考慮してもいい。

//追記
2.22以降でIEDriverServerを使用する場合は上記設定を行わなくても大丈夫。

2012年5月3日木曜日

LoggingHandler

またもやorg.openqa.selenium.loggingパッケージのお話。

Selenium2はブラウザとの通信ログを取得することが出来る。

具体的には

WebDriver driver  = new FirefoxDriver();
Iterator<LogEntry> it = driver.manage().logs().get("logType").iterator();

こんな感じでログの内容をそのまま保持することも出来るし、LoggingHandlerクラスを使用すれば、ログをアタッチすることも可能。

LoggingHandler.getInstance().attachTo(Logger logger, Level level);

仕様としてログ情報が1000件超えたら自動的に削除されるので、それまでに読み取るか、ファイルに吐くかして保持しなければならない。その辺は注意。



LoggingPreferences

selenium-webdriverにはorg.openqa.selenium.loggingというパッケージが存在する。
具体的にはその名の通り、ブラウザ自動実行時のログを出力する機能が実装されている。

その中にはLoggingPreferencesというクラスが存在し、その名の通り、ログ出力に関係する設定を行うことが出来る。 が、見たところ、Chrome、IE、Safariには対応しておらず、FireFoxでしか使用できない(なぜゆえに、、)

実装方法は

  DesiredCapabilities caps = DesiredCapabilities.firefox();
  LoggingPreferences logs = new LoggingPreferences();
  logs.enable(LogType.DRIVER, Level.INFO);
  caps.setCapability(CapabilityType.LOGGING_PREFS, logs);

  WebDriver driver = new FirefoxDriver(caps);

とすれば、ログが出力される。
「LogType.DRIVER」と記述しているが、LogType.DRIVERしか現在存在しないので、おまじない的に記述する。
下記はブラウザとの対応表(2.21)現在
ドライバ名称 実装可能かどうか 不可能な理由
FireFoxDriver -
ChromeFoxDriver DesiredCapabilitiesに対応するコンストラクタが非推奨
InternetExplorerDriver × 非推奨でないDesiredCapabilitiesに対応するコンストラクタが存在するものの、CapabilityType.LOGGING_PREFSに対応する設定が存在しても無視している(プロキシの設定しか見ていない、、、)
SafariDriver × DesiredCapabilitiesに対応するコンストラクタが存在すらしていない

なので、使用する際は各ブラウザのリッピングされた~Driverコンストラクタではなく、RemoteWebDriverコンストラクタに起動ブラウザをセットして使用する方法をとるといい。 ちょっと残念。