2012年3月26日月曜日

chromedriver.exeへのパス

webdriverでchromeを起動する際

System.setProperty("webdriver.chrome.driver","chromedriver.exeのパス");


と記述しなければならないのは周知の事実だが、この値は実は定数がきられている。

ChromeDriverService.CHROME_DRIVER_EXE_PROPERTY

いやはや、お恥ずかしい限り。

2012年3月23日金曜日

ctrlやshift、altとの同時押し

ActionsクラスにkeyDown等のメソッドがあるのだが、ctrlボタンを押下するように実装すると
『そんなメソッドねーよ』といわれて怒られる。思いのほか理不尽。

で、長い間実装方法が不明だったのだが、今しがた判明。

例)ctrl+vを押下する場合
driver.findElement(By.id("text_id")).sendKeys(Keys.CONTROL + "v");

同様にshiftやaltも実装できる。
やっほい。

2012年3月6日火曜日

executeScriptの引数

(公式のまんまだけど、、、覚書として)

((JavascriptExecutor)driver).executeScriptには引数をいくつも指定することができる。



 List<WebElement> labels = driver.findElements(By.tagName("label"));
List<WebElement> inputs = (List<WebElement>) ((JavascriptExecutor)driver).executeScript(
    "var labels = arguments[0], inputs = []; for (var i=0; i < labels.length; i++){" +
    "inputs.push(document.getElementById(labels[i].getAttribute('for'))); } return inputs;", labels);

こんな感じ。
ちょうどjavascriptのargumentsのように引数を設定出来る。
戻ってきた値を WebElementに変換もできる。まじやばい。

webdriverでのalert検証方法

Alert al = driver.switchTo().alert();
と記述すると画面上にalert、及びconfirm等が表示されている場合にオブジェクトを取得できる。

alert、及びconfirmが表示されていない場合、NoAlertPresentExceptionが発生する(chromeの場合はchromedriver.exeを使用しているため、WebDriverExceptionも発生する)ため、例外処理を行わなければいけない。

また、chromeの場合は alertが表示されていないのに、driver.switchTo().alert()を実行すると『No modal dialog is showing』とSystem.errに出力されてしまう。(非常に不細工)
これもchromedriver.exeを使用しているためである。

なので、これが嫌なら一旦
Selenium selenium=new WebDriverBackedSelenium(driver,baseUrl);
selenium.isAlertPresent()
と実行し、alertが表示されているかどうか確認してから、driver.switchTo().alert()を実行すればいい。

ただし、新しめのブラウザではSeleniumクラスはまともに動作しない可能性があるので注意。
また、selenium2 ver2.20から実行出来るようになった
Alert al = (new WebDriverWait(driver, time)).until(ExpectedConditions.alertIsPresent())
という方法は、FireFoxなどで設定した秒数(time)分だけ待機してくれない現象がある(?)ので
要注意。
selenium.isAlertPresent()で確認してから実行するが吉、かと思いきや、alertが表示されている時に
isAlertPresent を実行すると、alert表示されてるからjavascript実行出来ないよ的な
SeleniumExceptionが発生する。なんだそりゃ。

org.openqa.selenium.internal.seleniumemulation.AlertOverrideを使用すれば、もっといろいろできるかもしれない。

webdriverを使っての実行環境取得

selenium-webdriverを使った時の実行環境情報
・OS
・ブラウザ種別
・ブラウザバージョン
・プロキシの設定
etc...
を取得する方法がある。

いままで出来るんじゃないかなぁとずっと思っていたけど、わからなくて
独自実装(navigator.userAgentとかjavascriptで投げてた)して取得していたのが
あほみたいになる。

こんな感じ
Capabilities cap = ((RemoteWebDriver) wd).getCapabilities();
でCapabilitiesクラスを取得するあとは
cap.getBrowserName() でブラウザ種別
cap.getVersion() でブラウザバージョン
cap.isJavascriptEnabled() でjavascript有効確認
内部にマップも持っていて、プロキシの設定などはそこに入っている模様。
そのあたりは
 org.openqa.selenium.remote.CapabilityTypeの変数呼び出し先を見たら詳しくわかる。

2012年2月28日火曜日

2.20がでたよ

今回は大幅に変わりましたね。

1)pageLoadTimeoutってメソッドがwebdriverクラスに追加された
独自実装していた部分ロードの最大待機時間部分をwebdriverベースに切り替えることが出来る。やっほい。
こんな感じ
 driver.manage().timeouts().pageLoadTimeout()


2)org.openqa.selenium.support.ui.ExpectedConditionsっていうクラスにalertIsPresentっていうメソッドが
 追加された。これで同じく独自実装してたalertの表示チェックが代替できる
こんな感じ
Alert al = (new WebDriverWait(driver, time)).until(ExpectedConditions.alertIsPresent())

速く変更せねば、、、


以下、補足。
Sleeper.sleepTightっていうスリープしてくれるメソッドを発見。当たり前だが、これも代替する。

org.openqa.selenium.lift.match配下の表示確認関数軍発見、これも使えるかも。

2012年2月11日土曜日

Color

seleniumにバージョン2.19が出ました。
が、FireFoxの既存のバグが潜んでいるようなので、いったん使うのは控えようかと考え中。

あとよくわからないクラスを発見。

package org.openqa.selenium.support.Color

なにやってんの?と思って中身を見てみたら、rgbで色の情報を保持する、色情報を保存するクラスでした。
いったい何に使うんだろうか、よくわからん。中からも呼ばれてないし。

でも、なにかに使ってみたい。今日この頃。