2011年11月19日土曜日

seleniumとブラウザにひもづくアドオン

selenium-webdriverでアドオンを同時起動できる。

FireFox限定の場合だとwebdriverのインスタンス生成時に


   File file = new File("firebug-1.8.1.xpi");
   FirefoxProfile firefoxProfile = new FirefoxProfile();
   firefoxProfile.addExtension(file);
   firefoxProfile.setPreference("extensions.firebug.currentVersion", "1.8.1"); // Avoid startup screen

   WebDriver driver = new FirefoxDriver(firefoxProfile);
 
こんな感じ、この例だとfirebugが同時起動される。
choromeでも同じことができたら先日書いたscriptcoverと連携取れるのに、、

selenium2.13がでました

なんだか宣伝員みたいになってます。

いくつかの不具合修正とmacOSX+firefoxの連携上での不具合、およびちょっとした仕様変更がかかりました。

とりあえず笑ったのが
「Screenshots in Python are now working」(いちいち報告しなくても)
あとビビったのが
「Deprecated methods were removed from the FirefoxDriver and FirefoxProfile classes (saveScreenshot, enableNativeEvents, alwaysLoadNoFocusLib).」(saveScreenshot思いっきりつかおうとしてたよ)

とりあえず思ったのがやっぱりいまだにα版なんだなということ。

一番気になったのが
「Exporting webdriver.promise from the Javascript API」
調べたところ、
http://code.google.com/p/selenium/source/browse/trunk/javascript/webdriver-jsapi/test/asserts_test.html?spec=svn14327&r=14327

Deferredキター!いまだにDeferredの概念ワカンネーからあとで調べるとして
今個人的に周りでホットなjsunitって単語出てきた。 
「もっく」とかいうものといい、勉強することいっぱいあります。

2011年11月18日金曜日

HamcrestWebDriverTestCase

HamcrestWebDriverTestCaseとはselenium-webdriverのソースの中に存在するテスト用のクラス。


1.最初から使用できるメソッド名称がWebDriverよりわかりやすくテストケース作成に向いている。
2.表示値確認のassert系のメソッドやクリック用のメソッドを最初から実装している

ことから「このクラス自体を使用すれば簡単にテストを実行できる! 」と公式wiki(http://code.google.com/p/selenium/wiki/LiftStyleApi)には書いてあった。

が独自に調べたところ、実際は器用貧乏になった感があり、なんともいえないクラス。

具体的にいうと、テストの実行が終わったときに強制的にブラウザが閉じられるため、多くのテストを連続して実行するには向いていない上にクリック処理はFireFoxでは動作するがIEでは動作しない。
(WebElementのclickメソッドは役にたたないお)

残念。
あと俺の日本語も残念

2011年11月15日火曜日

ScriptCover

javascriptのカバレッジを調べるためのツール。
今のところchrome専用。

インストールは簡単でchromeから
http://code.google.com/p/script-cover/
にアクセスしてdownloadからcrxをダウンロードするだけ。
成功すれば右上に【JS】のマークが現れ、現在表示しているページのjavascriptのカバレッジ率、および実際に通ったコード通っていないコードを表示してくれる。

想像できる運用としてはselenium-webdriverでテストを実行した後scriptcoverでカバレッジを確認するといったところか。selenium-webdriverで立ち上がったwebdriverで制御されたchromeからscriptcoverが実行できるかは不明。
firefoxならアドオンをwebdriverから実行できるんだけど。。。
また検証したら結果共有します。。。

<追記>
selenium-webdriverで実行されたchromeにscriptcoverをインストールしたところ、フリーズすました。
びっくり。

2011年11月11日金曜日

Selenium 2.12

2.9から2.11まで一気に出たあと、しばらく何もなかったのだが、昨日2.12が発表された。

変更点、特にwebdriverとしては
1.FireFox8がサポート可能に
2.window操作系メソッドの削除予告
3.firefox限定でwindowの位置やサイズが変更可能に
4.FireFox系のメソッドの改名予告
5.ページサイズ自動調整機能
6.リモート接続エラー時のメッセージ増加
7.PageFactory(今開いているページ情報がため込まれている。プーリングのようなもの)のWebElement情報保持(今回限定?)
8.操作無効コンポーネントを操作しようとした時にエラーを吐くように
9.window消失後にハンドルを取得しようとするとエラーを吐くように
10.HtmlUnitのCSS動作の変更

上記のものになる。

今回はたまった不具合を回収する方向ではない模様。

2011年11月9日水曜日

Seleniumクラスの動作検証

以前

Selenium selenium = new WebDriverBackedSelenium(driver, baseUrl);

こんな感じでSeleniumクラスを生成すれば全てのSeleniumコマンドを実行出来ると書いたけど、間違いでした。


selenium-webdriver自体のソースの中身を見たところ、実装されているのはこのコマンドのみ(Selenium2.11現在)


addLocationStrategy
addSelection
allowNativeXpath
altKeyDown
altKeyUp
assignId
attachFile
captureScreenshotToString
click
clickAt
check
chooseCancelOnNextConfirmation
chooseOkOnNextConfirmation
close
createCookie
controlKeyDown
controlKeyUp
deleteAllVisibleCookies
deleteCookie
doubleClick
dragdrop
dragAndDrop
fireEvent
focus
getAlert
getAllButtons
getAllFields
getAllLinks
getAllWindowTitles
getAttribute
getAttributeFromAllWindows
getBodyText
getConfirmation
getCookie
getCookieByName
getElementHeight
getElementIndex
getElementPositionLeft
getElementPositionTop
getElementWidth
getEval
getExpression
getHtmlSource
getLocation
getSelectedId
getSelectedIds
getSelectedIndex
getSelectedIndexes
getSelectedLabel
getSelectedLabels
getSelectedValue
getSelectedValues
getSelectOptions
getSpeed
getTable
getText
getTitle
getValue
getXpathCount
goBack
highlight
isAlertPresent
isChecked
isConfirmationPresent
isCookiePresent
isEditable
isElementPresent
isOrdered
isSomethingSelected
isTextPresent
isVisible
keyDown
keyPress
keyUp
metaKeyDown
metaKeyUp
mouseOver
mouseOut
mouseDown
mouseDownAt
mouseMove
mouseMoveAt
mouseUp
mouseUpAt
open
openWindow
refresh
removeAllSelections
removeSelection
runScript
select
selectFrame
selectWindow
setBrowserLogLevel
setContext
setSpeed
setTimeout
shiftKeyDown
shiftKeyUp
submit
type
typeKeys
uncheck
useXpathLibrary
waitForCondition
waitForFrameToLoad
waitForPageToLoad
waitForPopUp
windowFocus
windowMaximize


用はmouseDownRightとかは実装していません。

あんまり使う機会無いと思うから、優先順位低いんだと思われる。

上記に引数を指定してコマンドを実行する。
検証した結果
"hogehoge"や"id=hogehoge"などで大丈夫だった。おそらく"name=hogehoge"とかでも大丈夫。検証してないけど。
多分SeleniumIDEで記録した「値」の部分をそのまま引数で指定してあげればいける。
”value=”や"link="などロケーション種別が存在しないときはidもしくはnameとして認識しているのだと思われる。
そこら辺はリファレンス通りの仕様。

2011/12/22追記
なんと上記コマンドはIE8上では動作しない。
javascriptを実行することによって代替機能を実装するか、webdriverの機能を使って実装しなおす必要がある。

残念すぎる。

2011/12/28追記
実行出来ないのはfucusやmauseOverなど一部のみ。waitForPopup等は実行出来る。よかた。
でも安定しない。結局何もかもwebdriverベースで書いたほうがよさそうだ。

2011年11月5日土曜日

ドラッグアンドドロップ

 Actions builder = new Actions(driver);

 Action dragAndDrop = builder.clickAndHold(someElement)
       .moveToElement(otherElement)
       .release(otherElement)
       .build();

 dragAndDrop.perform();
いろいろ方法はあるものの、とりあえずはこれででできるらしい。 
ちなみにIEはできなくてFireFox限定らしい。
何かにつけてalpha版なんですね。

2011年11月4日金曜日

selenium-webdriverで出来ないこと

どうやらファイルをダウンロードしたりすると表示されるダイアログに関しては操作が出来ない模様。。。
独自実装するしかないのだろうか。。。
alertやconfirmは出来るのにね。

2011年11月2日水曜日

selenium-webdriverのクリック動作

driver.findElement(By.id(id)).click()はchromeだけで動作する
ほかのブラウザでも動作するが、コンポーネントがアクティブになる(?)ぐらいで、クリックイベントまでは実行されない

FireFoxやIEは
ボタンなどの場合:driver.findElement(By.id(id)).sendkey("\n")
チェックボックスなどの場合:driver.findElement(By.id(id)).sendkey(" ")
で解決。
お後がよろしいようで。

2011年10月31日月曜日

selenium-webdriverでSafariを起動

WebDriver driver = new SafariDriver();
っていつになったらできるの、、、

現状(Selenium2.11)の場合、Selenium-RC使えばいけるっぽい(砂場からは抜け出せそうにないけど)

Capabilities capabilities = new DesiredCapabilities()
capabilities.setBrowserName("safari");
CommandExecutor executor = new SeleneseCommandExecutor("http:localhost:4444/", "http://www.google.com/", capabilities);
WebDriver driver = new RemoteWebDriver(executor, capabilities);
 
こんな感じ。
このペースだと年内に2.14ぐらいまで出そうな雰囲気 
 
追記:こんな感じで出来るみたい。 
WebDriver browser = new RemoteWebDriver(
              new SeleneseCommandExecutor(
                            new DefaultSelenium("localhost",
                                                4444,
                                                "*safari",
                                                url)),
                        new DesiredCapabilities()); 
 
追記
selenium2.21から 
WebDriver driver = new SafariDriver(); 
できるようになった。

WebDriveとSeleniumコマンド

Selenium selenium = new WebDriverBackedSelenium(driver, baseUrl);
こんな感じでSeleniumクラスを生成すると
 
selenium.open("http://www.google.com");
selenium.type("name=q", "cheese");
selenium.click("name=btnG");
のようにseleniumのコマンドがそのままjavaで実行できてたいそう便利そうである。
 
いままで苦労しながらwebdriverクラスを使用してごちょごちょ作っていたのが非効率に感じてしまう。
しかしながら
・遅くなる可能性がある
・すべての動作(Seleniumコマンド)を網羅しているわけではない
・ぶっちゃけあまり複雑なことはできない

らしい、あくまでselenium-webdriverとの下位互換用なわけでした。

2011年10月26日水曜日

selenium2のsafari対応

他のブラウザ通り
new SafariDriver();
的なことをすればsafari が起動するのかと思いきや、全くそんなことは無かった罠。
ソースだけはネットに上がっているので、勝手にコンパイルして使ってくれというスタンスか。

試しにIphoneDriverなるものを試したところ、強制exception。
前途多難ですな。

2011年10月24日月曜日

Subversion

Subversionをコマンドを使って操作する。

注意しなければいけないのは、どうやらGUIベースでチェックアウトを行ったフォルダはコマンドではupdateが実行されないということ(なんでかは分かんない)

コマンドで
svn checkout {svnアドレス} {チェックアウトしたい場所} --username {ユーザ名称} --password {パスワード}
とした後
svn update
とすれば更新がかかるようになる。

2011年10月22日土曜日

selenium-webdriverと対応ブラウザ

selenium-webdriverの中のコードを見ていく。

ブラウザ一通り対応しているよう。
ただ、やはりブラウザ自体の問題か、多少の動作の違いが見受けられる。

selenium-webdriverを使いIEでテストコードを実行する際、起動時に

WebDriver driver = new InternetExplorerDriver()
てな感じでWebDriverのインスタンスを生成する。

FireFoxも同様に
WebDriver driver = new FirefoxDriver()
とするのだが、firefoxだけコンストラクタにて実行exeの情報を持ったパスを指定する機能がついている。

おそらくひとつのクライアントに複数のバージョンをインストールできるFireFoxとできないそれ以外のブラウザからくる特性だと考えられる。

用はIE8とIE9の自動実行テストをどっちもやりたければ環境二つ用意しなければいけないということ。

補足:やろうと思えばChromeもIEも一つの筐体に複数バージョンインストールができるのだが、IEの場合は特にレジストリの変更の必要があるので、お勧めしない。

どっち道selenium-webdriverが対応していないので、環境でカバーする必要がある。

WEBアプリケーションのテストコスト削減とselenium-webdriver

Seleniumと出会ったのは9月のこと、調べていくうちにWebDriverやselenium-webdriverのことを知る。
詳細は ググればいくらでも出てくるので省略。
気持ち悪いぐらいぬるぬる動く。どうやらクリックイベントやテキストの入力イベントだけではなく それに伴うマウスの移動もエミュレートしているみたい。

開発者ブログを見たが、今後はSelenium→selenium-webdriverに移行していくよう。

selenium-webdriverはseleniumと違い、WebDriverベースでテストケースを表現する。

具体的にいうと
Selenium.click("hogehoge")がseleniumの実行コードで
driver.findElement(By.id("hogehoge")).click()がselenium-webdriver
junitを使用しての連続実行やassert系関数もつかえるんで、便利。
 
とりあえず詰まったところを書いていこうと思う。