サイトマップ

Selenium 2.XをJavaScriptで使う

しばらくWeb開発から離れていて、Seleniumについてもチェックしていませんでしたが、Googleの手が入ってずいぶんと様変わりしたようです。 SeleniumはHTMLが書ければWebサイトの自動テストができるというお手軽さが良かったのですが、SeleniumRCなどが登場してよりプログラマ向けのツールになってしまいました。 あのお手軽さを犠牲にしてしまうのは少々残念な感じもしますが、実際プログラマでない人はそもそも自動テストなどしない、だったらよりプログラマ向けに特化してもいいではないかと判断かもしれません。

さて、Selenium 2.Xは基本的にはJavaで作られていますが、各種言語のbindingも用意されているため、Java以外のプログラマにも敷居が低くなっています。 ところが、Webプログラマ必修言語であるJavaScriptのbindingがありません。 ひょっとして当たり前過ぎて誰も書いてないだけで、Rhino使えばいいじゃないかということなのでしょうか?

できるかどうかくらいは検証しておきたいということで、調査しました。

準備

  • js.jar - Rhinoのライブラリ。
  • selenium-server-standalone-2.XX.XX.jar - Selenium Serverのライブラリ。クライアントもすべての関連ライブラリも1つにまとめられているので、これ1つあれば全機能が使えるはず。

スタンドアロンで実行

  • Selenium Serverのライブラリを指定してRhinoを起動。
    C> java -cp "js.jar;selenium-server-standalone-2.20.0.jar" org.mozilla.javascript.tools.shell.Main
    Rhino X.X release X YYYY MM DD
    js>
  • Seleniumのパッケージをインポート
    js> importPackage(org.openqa.selenium)
    js> importPackage(org.openqa.selenium.firefox)
  • FireFoxを起動
    js> driver = new FirefoxDriver()
    org.openqa.selenium.firefox.FirefoxDriver@b60b93
  • 弊社サイトのトップページを開く
    js> driver.get('http://shorindo.com')
  • 「会社案内」のリンクをクリックする
    js> links = driver.findElementsByLinkText('会社案内')
    [org.openqa.selenium.firefox.FirefoxWebElement@e50ac2ba, org.openqa.selenium.firefox.FirefoxWebElement@e753aaac]
    js> links.get(0).click();
  • 「会社名」のカラムの次のカラム、すなわち会社名そのものを取得する。
    js> e = driver.findElementsByXPath("//td/div[text()='会社名']/../following-sibling::node()")
    [org.openqa.selenium.firefox.FirefoxWebElement@39ff214]
    js> e.get(0).getText()
    有限会社松林堂(ゆうげんがいしゃしょうりんどう)
  • 画面のスナップショットを撮る。
    js> driver.getScreenshotAs(OutputType.FILE)
    C:\DOCUME~1\XXXX\LOCALS~1\Temp\screenshot1079032477667427469.png

    Windowsなのでユーザのテンポラリフォルダに自動的にファイル名が生成されて保存された。

  • どういうメソッドが使えるか、リファレンスを睨みながらコードを書くのも大変なので、以下の関数を定義しておく。
    function $fn(target) {
        var fn = [];
        for (var key in target) {
            if (typeof (target[key]) == "function") {
                fn.push(key);
            }
        }
        return fn.sort();
    }

    これで、FirefoxDriverのインスタンスのメソッドを調べる。

    js> $fn(driver)
    close,equals,executeAsyncScript,executeScript,findElement,findElementByClassName
    ,findElementByCssSelector,findElementById,findElementByLinkText,findElementByNam
    e,findElementByPartialLinkText,findElementByTagName,findElementByXPath,findEleme
    nts,findElementsByClassName,findElementsByCssSelector,findElementsById,findEleme
    ntsByLinkText,findElementsByName,findElementsByPartialLinkText,findElementsByTag
    Name,findElementsByXPath,get,getCapabilities,getClass,getCommandExecutor,getCurr
    entUrl,getErrorHandler,getFileDetector,getKeyboard,getMouse,getPageSource,getScr
    eenshotAs,getSessionId,getTitle,getWindowHandle,getWindowHandles,hashCode,manage
    ,navigate,notify,notifyAll,quit,setFileDetector,setLogLevel,switchTo,toString,wa
    it
  • 引数に何を指定したらいいかわからないので調べる
    js> driver.getCommandExecutor
    function getCommandExecutor() {/*
    org.openqa.selenium.remote.CommandExecutor getCommandExecutor()
    */}
  • FireFoxを閉じて終了。
    js> driver.quit()
    js> quit()

結論

  • あっさりと簡単にSeleniumからブラウザを起動して操作をすることができた。
  • 気になることはパフォーマンスだが、ブラウザそのもののレスポンスが支配的と思われるので、JavaScript⇔Javaのオーバーヘッドは無視できる。
  • Javaの実行環境さえあれば、インストール不要でテストを実行できる。(開発環境でないマシンをちょっと借りて、ということがやりやすい)
  • テキストエディタさえあれば、テストプログラムをちょこちょこ修正しつつテストできることはとてもお気楽で良い。
  • よって、Selenium2はRhino経由でJavaScriptで使うべきである。

参考

 
research/1331463211.txt · 最終更新: 2012/03/23 06:24 by Kazuyuki Matsuda
特に明示されていない限り、本サイトの内容は次のライセンスに従います:Copyright(C) 2011 Shorindo, Inc. All Rights Reserved
Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki