Archive for the '技術' Category

Selenium RC ServerとNTLM認証

先日、Selenium Remote ControlのJava Serverのビルド方法のメモを書いたのですが、なんでビルドしないといけなかったかというと、テスト対象のアプリがIISでホストされていて、NTLM認証を使っていたのですが、ProxyであるSelenium RCのJava Serverを通す場合に、どうもその認証が正しく処理されないために、アクセス権がないと言われてテスト対象のサーバにアクセスできないという現象に当たってしまったのがきっかけでした。
で、フォーラムを調べていたら下記のバグ修正が見つかりました。
http://jira.openqa.org/browse/SRC-252
この修正を入れると、一度普通にIEで対象サイトにアクセスしておけば認証されたセッションの情報が記録されるので、Selenium RCから起動されたIEフレームでも問題なくアクセスできるようになりました。似たような現象に遭遇した場合は、試す価値ありと思います。
インターネット コンピュータ IE Internet java server jira ntlm proxy remote control Selenium

Selenium Remote ControlのJava Selenium Serverのビルド方法

Selenium Remote Controlを使っていて、どうしてもサーバーを修正する必要があってビルドしないといけなくなったのでその時のメモ。
1. ビルドに必要なもの: JDK, Ant, Maven (私が使用したのはJDK 1.5.0 Update11, Ant 1.7.0, Maven 2.0.6です)
2. ビルド方法は、http://www.openqa.org/selenium-rc/building.htmlに書いてあったのですが、ちょっと説明が古いようでどうもうまく行かない。
で、以下が私がやってうまくビルドが通った手順:
A. subversion (私は1.4.3を使用)をインストールして以下のコマンドをコマンドラインで実行。
svn co https://svn.openqa.org/svn/selenium-rc/trunk

B. 最新のソースツリーができるので、trunkディレクトリへ移動し、以下のコマンドを適宜実行します(pom.xml の中の<phase> タグで定義されている部分を検索して取得):
mvn -Dnotest compile
mvn -Dnotest package
他に、mvn testやmvn installがありますが私はjarファイルが欲しかっただけなので、packageまでで十分でした。
それと、フォーラムには、テストをスキップするには、-Dmaven.test.skip を指定しろと書いてある部分があるのですが、少なくともこの記事を書いている時点では、何の効果もありませんでした。
C. Operaをインストールしていない環境の場合は、testOpera がOpera ブラウザがないと言って失敗します。この場合は下記を実行。(http://forums.openqa.org/thread.jspa?messageID=22833が元記事)
以下のファイル内のtestOpera()の定義部分をすべてコメントアウトします。
server-coreless\src\test\java\org\openqa\selenium\server\WindowsHTMLRunnerMultiWindowTest.java(25): public void testOpera() throws Exception {
server-coreless\src\test\java\org\openqa\selenium\server\WindowsHTMLRunnerTest.java(17): public void testOpera() throws Exception {

とりあえず、ここまでです。
インターネット コンピュータ […]

SeleniumでXPath Locatorを使うとIEと相性悪そう

Selenium IDEとXPatherを使っているとついつい手軽にXPathが記述できるので、それを多用してテストを作成していたのですが、FireFoxで実行しているとサクサク動作してくれて、これはいいという感じなのが、IEで実行するとXPath Locatorが使われているところでやたらと遅くなります。CPU使用率もほとんど100%の状態になるし、ちゃんと確認していませんがどうもメモリーリークも発生しているようです。ひとつのブラウザセッションで連続してそういうコマンドを実行しているとどこかでおかしくなって、コマンドタイムアウト例外を投げて結果ファイルも残さずに異常終了してしまいます。
仕方がないので、いくつかにテストを分割してRCをテスト毎に起動することで回避しました。これってDOMに変更するしかないんですかね?
インターネット Firefox IE Selenium XPath

Seleniumでテスト作成するときの留意点

先日書いたTestRunnerだと少し遅くしてやらないとテストが通らない場合があると書いたのですが、そういう場合もあるにはあるのですが、少し注意しないといけない点に気付きました。
waitForNotElementPresent を使って何かが存在しないことをチェックしようとする場合に、チェックする対象が現在のページにも次のページにも存在しない場合、現在のページから次のページに切り替わったことを別なコマンドできちんと確認してからwaitForNotElementPresentで対象をチェックしてやらないと、現在のページでもTrueになってしまうので、不具合が生じる場合があります。って当たり前ですが、最初はちょっと気がつきにくかったりします。検証は基本的にassert*系かverify*系のコマンドで行うべきなのですが、ページの切り替えのついでにwaitFor*でとかやっているうちに上記のような状態に陥る可能性がありますので、やはりルールを決めてそれに従ってページ切り替え確認を行うようにした方がよさそうです。例えば、clickAndWaitでリンククリック後、必ずassertTitleかwaitForTitleをはさんでからverify*系で対象が存在することを検証するとか。
インターネット Internet Selenium

Selenium RCでTestRunnerのデフォルトの速度を設定する

Selenium RCを使ってテストを自動実行させるときに、ブラウザが自動的に起動してTestRunnerが実行されるのですが、この時、コントロールパネルにある速度調整のスライダーは、一番左にあって最速の設定になってしまいます。
これはバグだと思うのですが、Selenium IDEやCoreで実行するとすべて正常終了するのに、RCで実行するとwaitFor*コマンド等であるエレメントが認識されるまで待機するようにしてあげても、そのエレメントにアクセスした時点でそのエレメントが存在しないというようなエラーが発生する場合があります。この場合、TestRunnerの速度スライダーを手動で少し遅くしてあげれば、大抵の場合は、うまく通るようになるようです。それでも通らない場合は、本当にAjax等で何かを待たないといけない場合なので、waitFor*を入れてあげる必要があります。
で、毎回このスライダーを動かす手動操作が入るのは面倒なので、その速度を指定してやりたいのですが、どうも現時点では、RCのコマンドラインパラメータでは指定できないようです。リファレンスには、setSpeedというコマンドが使えるように書いてあるのですが、これを指定するとIDEでもRCでもエラーになってそこで止まってしまいます。さて、どうしようと思い、現時点では直接ソースをいじるしかないと思い、それでやっつけてしまったので、とりあえずメモしておきます。尚、これはSeleneseではなく、JavaやPerl等のプログラミング言語インターフェイスを介せば簡単にsetSpeed相当のコールが使えるはずです。
以下、手順です(jarコマンドを使うのでJDKが必要):
1. まず、selenium-server.jarファイルからcore/scripts/selenium-testrunner.jsというファイルを取り出します。
jar -xvf selenium-server.jar /core/scripts/selenium-testrunner.js
2. runIntervalという変数に値を代入している箇所を見つけます。このメモを書いている時点では、次の2箇所です。
2-1.
変更前:
var runInterval = 0;
変更後:
var runInterval = 100;
2-2.
変更前:
this.runInterval = 0;
変更後:
this.runInterval = 100;
この修正だけでも一応速度は落ちますが、スライダーの表示が左端にあるままなので、ちょっと気持ち悪いので、下記の場所を修正します(他にもオプションがあります。使用しているのはこちら)。
変更前:

objectExtend(HtmlTestRunnerControlPanel.prototype, {
initialize: function() {
this._acquireQueryString();
this.runInterval = 100;

this.speedController = new Control.Slider(’speedHandle’, ’speedTrack’, {
range: $R(0, 1000),
onSlide: fnBindAsEventListener(this.setRunInterval, this),
onChange: fnBindAsEventListener(this.setRunInterval, this)
});

this._parseQueryParameter();
},

変更後:

objectExtend(HtmlTestRunnerControlPanel.prototype, {
initialize: function() {
this._acquireQueryString();

this.runInterval = 100;

this.speedController = new Control.Slider(’speedHandle’, ’speedTrack’, {
range: $R(0, 1000),
sliderValue: 100,
onSlide: fnBindAsEventListener(this.setRunInterval, this),
onChange: fnBindAsEventListener(this.setRunInterval, this)
});

this._parseQueryParameter();
},

3. […]

Seleniumでコメントを入れる方法

Selenium IDEでは、Commentを挿入できますが、これはHTMLの通常のコメントとして保存されるだけで、TestRunnerでテストを実行するときには、当然のことながら表示されません。XPathやDOMオブジェクトでテストターゲットを指定してしまうとテストを作成したときには、何をチェックしているか明白なつもりでも少し時間が経過してから見直すと一見しただけでは一体何をチェックしていたのかわからにくくなってしまうことはよくありそうです。
Seleniumのユーザフォーラムをチェックしていたら、やはりその話題とその解決案が下記に記されていました。
Comment command
ちょっとスレッドが長いので要約・整理すると、

Selenium IDEではコメントを挿入すると通常のHTMLコメントとしてしか保存しない。読み込むときも通常のHTMLコメントをテストのコメントとして表示する。
TestRunnerでは、カラムが3つより少ない行は無視する。
これらの性質を利用して、TestRunnerを走らせるときにHTMLのコメントをカラムが1つだけの行に変換して挿入してやれば、テスト実行時や結果ファイルでもIDEで入れたコメントが表に出る。

ということで、下記のスクリプトをSelenium Coreのuser-extensions.js(現在使用していなければこの名前で保存)に追加してやれば、上記のようにIDEで入れたコメントがTestRunnerでも表示されるようになります。Selenium RCの場合は、コマンドラインの引数でユーザエクステンションファイルを指定してやれば、同様の結果を得られます。
フォーラムで指摘されていた修正も反映済みです。
user-extensions.zip
コンピュータ Firefox Internet Selenium

Selenium と使うと便利なユーティリティ

またSeleniumの話ですが、前のエントリでも書いたとおり、TDDで使う分にはソース側を変えれば良いので特に問題にはならないのですが、既存のWebアプリに対してリグレッションテストを作成しようとすると今のバージョンでは、結構致命的になりかねない制限があります。
リファレンスに次のように書いてあります。
In some cases, Selenium will be unable to intercept a call to window.open (if the call occurs during or before the “onLoad” event, for example).
今私がテストを作成しているアプリケーションも結構古いもので、ページの切り替え時にJavascriptのAlertでポップアップウィンドウを出しているようなのですが、これのOKボタンを押すことが今のSeleniumだとどう転んでも出来ないのです。
でも、そこで手動操作を交えないといけないとなるとかなり魅力半減になってしまうのも事実で、少しの変更でバグが沢山出てしまうようなつくりの悪くなってしまったソースをリグレッションテストを通すために修正するというのも本末転倒のような話になってしまいかねません。
解決方法としては、Selenium RCを使用して.netプログラムにテストを変換して(テストの部分の変換はIDEがほぼ自動的にやってくれます)、Seleniumだけではどうしても手が出ない部分は、C#の力技で無理やり操作してしまうというのが一つの方法ですが、これだと開発者でない人にも何とかテストが作成できるというストーリーから離れていってしまうなあと考えあぐね、何か他の操作自動化するツールと組み合わせてできないかなと思って見つけたのがこれです。
UWSC
これもブラウザ操作等ができるのですが、その辺はSeleniumの方がずっと出来がよいと思いますが、SeleniumがJavascriptベースのために対応できない部分を補完するのには、結構最適な感じ(通常のWindowsプログラムなのでJavascriptの部分でかち合うことはない)です。私の場合、何とかこのユーティリティを組み合わせることで、Seleniumで閉じれなかったポップアップを閉じれるようになり、ほぼテストを自動化することに成功しました。このツールはオープンソースではありませんが、無償で提供してくださっているので大変ありがたいです。WindowsのAPIやCOM呼び出しもできるので頑張ればかなり強力なツールだと思います。ちょっと困った問題が、UIが全部日本語なんですよね。こちらの人にこれを使えとはちょっと言えないので、何か同等のツールを探さないといけないかも知れません。WinBatchなんかも使えるのかも知れませんが有料ですし、何かいいツールをご存知の方はぜひ教えてください。
とりあえず、Seleniumでのテスト自動化をしようとして、JavascriptのアラートウィンドウをSeleniumで閉じれなくて使用を断念しそうな方は、大いに試す価値があると思います。
インターネット コンピュータ Firefox Selenium UWSC

Selenium は使えそう

食べ物の話題ばかりだとちょっと知性を疑われかねないので、一応本職関連の話をたまには書きます。
先週、遅ればせながらSeleniumというWebサイトのテスト自動化ツールがあるのを知って、今仕事で移行作業中のサイトの動的コンテンツのRegression Test Suiteを作成してみました。
Selenium IDEというもののおかげで非常にテストケースを作成しやすくなっていることがわかり、オープンソースやっぱすごいなと感心した後、その作者は日本の方であることを知り、さらに感心。インターネットの進歩のおかげで国際的なコラボレーションの垣根は秒進分歩で低くなって行っていることを改めて実感しました。
で、大方、Firefoxで通るようになったテストケースをIEで実行してみると通らないのが一杯出てきて、調べてみると、VerifyTextPresentは特に、表組みを使ってレイアウトされている場合は、IEだと個別にしか認識できないようで、<td>タグに対応して1つのテストケースを作成する必要があるみたい。Firefoxだと行単位で1つのテキストとしてみなしてくれるのだが、これはどちらがいいとは言えないので、仕方ないところか。仕方ないので、表の一つ一つの要素単位で検証するようにテストケースのコマンドを分割して両ブラウザでOKとなった。
しかし、なぜか下記のようなxpath表記はIEだとfalseになってしまう場合があり、今のところ理由は不明。HTMLのできが悪いのかも知れませんが。
<tr>
<td>verifyElementPresent</td>
<td>//h1/IMG[@src=’images/image3.gif’]</td>
<td></td>
</tr>
それと、これは今のところ制限らしいが、target=_blankでオープンされたウィンドウはSelectWindowできない。テストドリブン開発では、テストを先に書いてから開発にかかるので、こういう制限は問題にならないのはわかるが、既に開発されたサイトに対して適用するテストを書こうとするとこの辺は結構引っかかってしまう感じがする。
それにしても、まだまだバージョン0.8台ですから将来が期待できそうなツールです。今のままでも、ちょっとしたテストならこれで十分いけそうな感じがします。
とりあえず3日程度はまって使ってみた感想でした。
インターネット コンピュータ Firefox Internet Selenium

Better Gmail

Better Gmail(Gmailを便利にするスクリプトを集めてくれたもの)というのがあるのを知って試してみました。結構便利ですね。
でも、ラベルの色付けがFirefoxのタブを一旦クローズしたりしないと変更が反映されなかったりで、今ひとつ動作が釈然としない部分がありますね。というか私がGreasemonkeyスクリプトの動きをきちんと理解していないのかも知れませんが。
でも、使い勝手が少しでも向上することは間違いないです。GMailを使っている人は使う価値ありと思います。
インターネット Gmail

SharpDevelop 2.1

昨日のエントリでSharpDevelopのv1.1の使用感を書いてv2.1を試しているところと書いた直後なのだが、デバッグ機能に「プロセスにアタッチ」がないということに気がついた。で、よく本家のサイトを読んでみるとasp.netは本気でサポートしていないということらしい(というか優先順位を下げているという感じだが)。「プロセスにアタッチ」も中間ぐらいの優先順位で作業中のようなのでいつかは入ると思うが、しばらくは難しそうですね。
なので、結局はDbgCLR.exe(.NET SDKに付属のデバッガ)を起動して、aspnet_wp.exe(ASP.NETのワーカプロセス)にアタッチしてやる方法でデバッグするか、cassiniという.NETを使って書かれた簡易サーバをかませてIIS直でなく間接的に(擬似的に)デバッグするという手を使うことになるようです。
clrdbg.exeもなかなかしっかりしたデバッガなのでそんなに文句はないのですが、SharpDevelopのデバッガも立派なものなので、IDEとしては統合環境内で閉じたデバッグができないのはASP.NET向けの開発環境としては、ちょっと魅力薄となってしまうのは否めない感じですね。
Tool->Optionからは、まだUIの言語に日本語の選択肢は入っていないようで(まだ、別途日本語版サイトから入れる形なのかな?)、日本語GUIはまだ試していません。でも、エディタはShift_JISを選択してちゃんと表示編集ができて、この辺はv1.1よりはぐっとよくなった感じ。でも、IMEの入力はあまりきちんと制御できていないようで、日本語を入力するときは少し違和感あり。これも何か回避策はあるのかも知れないけど、ソースに日本語を入力することは、とりあえずそんなに必要ないのでまた後日調べます。
と、とりあえず1日使ってみての感想でした。
インターネット コンピュータ

Pages (4): « 1 2 [3] 4 »