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コンストラクタに起動ブラウザをセットして使用する方法をとるといい。 ちょっと残念。

2012年4月12日木曜日

selenium 2.21はいろんな意味でやばい

2.20がでてしばらく音沙汰がなかったので、googleの天才方はサボっているのかなと思いきや、やはりいい仕事をしていたようです。というよりガッツリ変わりすぎ。

大きな変更点としてはFireFoxの安定化と、ついにきたsafari対応(マジデキターーー)
その他こまごまとしたものがいっぱい。

①今までと同じ通りWebDriver driver = new SafariDriver();でいける。
windowsでもmacでも起動するようなので、早くmacで試したい。

②FireFoxの安定化の要因はポートの制御にあるようで。中身を見ていると大きく仕様が変わっている。
まれにFireFoxで動作していると「portが既に使用されていて接続できません」的なエラーが出ていたので、これで直るかもしれない。やっほい。

③WebElementのclickメソッドについて。コメント部分だけが変わっていただけなので、なんともいえないが、
**********************************************************************************
2.20以前:webeleをクリックしてロードする場合、ページは待機する。そのときに何もやっちゃだめよ。
2.21から:クリックされた後、こちら側の操作をブロックするから、安全になったよ(とくにIEとFireFoxで)
**********************************************************************************
ということらしい。
英語が詳しい人、もうちょっといい感じに訳してくれたらうれしいです。
でも、IEやFireFoxでclickメソッドが実行されないから、sendkeys("\n")で代用してるんだよな、今回から動くのかな、、、

④FireFoxDriverにkillメソッド追加。強制プロセス停止用らしい。最悪これで切れということなのか。

⑤RemoteWebDriverのfindElementとfindElementsにsetFoundByというなぞメソッドが追加されている。どうやらエレメントの情報を文字列かするために内部的に保存しているようだ。
何かあったときのログ出力に便利ですね。

⑥WebDriverにmaximizeメソッドが追加。独自実装していた部分を置換できますな。こんな感じでできる

driver.manage().window().maximize();

後は
・ChromeDriverService(chromeを連続で起動して試験するにはこのクラスを使えば速度が早いですよというクラス)の起動ロジックの変更とログ出力の設定メソッドの追加
・AndroidDriverにgetStatusメソッド追加(なに取得すんのかわからないけど)
・IEドライバでよくわからないけどバグってるからコメントアウトするねっていう笑いを誘うメッセージ

ぐらい。

乗るしかないだろ、このビッグウェーブに。

2012年3月27日火曜日

WebDriverとプロキシ

プロキシを通してWebDriverを起動して自動でWebモジュールを起動する方法の覚書

String PROXY = "localhost:8080";

【IE】

DesiredCapabilities capabilities = new DesiredCapabilities();
Proxy proxy = new Proxy();
proxy.setHttpProxy(PROXY);
capabilities.setCapability(CapabilityType.PROXY, proxy);

WebDriver driver = new InternetExplorerDriver(capabilities);

【Chrome】
ChromeOptions option = new ChromeOptions();
option.addArguments("--proxy-server=http://" + PROXY);
WebDriver driver = new ChromeDriver(option);

ChromeOptionsのaddArgumentsはその名前の通りchorome起動時の引数がそのまま使用可能
だから、
http://yuichi.tea-nifty.com/blog/2008/12/googlechrome-c0.html
とか
http://chrome.half-moon.org/43.html
とかがそのまま利用できる。

【FireFox】
FirefoxProfile profile = new FirefoxProfile();

Proxy proxy = new Proxy();
proxy.setHttpProxy(PROXY);
profile.setProxyPreferences(proxy);

WebDriver driver = new FireFoxDriver(profile);

か、もっと正確な設定をしたければ、
https://developer.mozilla.org/ja/Mozilla_Networking_Preferences

profile.setPreference("network.proxy.type", 1);
profile.setPreference("network.proxy.http", "localhost");
profile.setPreference("network.proxy.http_port", 3128);
とかして設定するのもよい。
(もしくはProxyのsetProxyTypeメソッドを使うか)


こんな感じでOK。わざわざ起動前に設定を変更しなくても大丈夫。
これと組み合わせて、jscoverageと組み合わせ、カバレッジを取得したりできる。

2012年3月26日月曜日

FireFoxの機動設定

FirefoxProfileという便利なクラスが存在する。

使い方は

FirefoxProfile profile = new FirefoxProfile();
profile.setPreference("browser.download.folderList", 0);
driver = new FirefoxDriver(profile);

こんな感じ。起動時の設定を行うことが出来る。

で、その設定内容は
https://developer.mozilla.org/ja/Download_Manager_preferences
とか
general.useragent.override
とか、そのまま利用できるみたい。

便利ですね。ダウンロードファイルの比較も可能なんですね。