miau's blog?

Selenium IDE のケースを IE でも動くように

前項 の続きというか、はみ出した部分。

元々 Selenium IDE で検証してたんだけど、よくよく聞いてみると今回の対象ブラウザは IE6 とのことで。じゃあ Selenium Core 使って IE で・・・と動かしてみたら結構問題があったのでその辺のお話。




■Firefox と IE だと href 属性が違う

まずコケてるところが目立ったのは、

<a href="/users/update/1"><img src="update.png" alt="更新"></a></td>

こんなリンクを辿るための、

clickAndWait
//a[@href = '/users/update/1']/img/[@alt='更新']

みたいなアクション。(※img をクリックする必要はないんですけど、わかりやすいようにこういう書き方にしてます。)

Firefox だと @href が「/users/update/1」がになるけど、IE の場合は「http://localhost/users/update/1」のように絶対 URL で取得されてしまうのが原因。

この現象&解決案は

Selenium 0.7 TipsとExcelによるDB初期化:CodeZine

に載っていて。Page2 「FireFoxの場合」の項によると、

厳密ではなくなってしまうのですが、パターンマッチングを行う部分にワイルド
カード(*)を使用するという方法もあります。この場合、IEでもFirefoxでもエ
ラーを発生させずに動作させることが可能です。
<tr>
<td>assertAttribute</td>
<td>xpath=//a@href</td>
<td>*026_guide.jsp</td>
</tr>

とのこと。でも今回の場合は XPath 内部だからワイルドカードは使えなくて。

調べてみると XPath には ends-with という文字列関数があるようなので、

clickAndWait
//a[ends-with(@href, '/users/update/1')]/img/[@alt='更新']

こんな感じに変更。ひとまず IE では動作した。

■Firfox では ends-with 関数は使えない

なぜか今度は Firefox のほうで動作しなくなってしまった。Firefox のほうが XPath とか強そうだけど、なんで?

と、調べてみると・・・

CSS Xpath 対応 (practice input output)

>XPath 1.0にはend-with()が無いので、文字列操作を使う必要がある。

Selenium: How do I execute an Xpath function or expression in my test? - Stack Overflow

>Especially the "ends-with" function is not available

とのこと。IE はそもそも XPath が使えないから JavaScript とかでうまいことやってて、ends-with もちゃんと動作しているという話らしい。

で、どういう風に書けばいいかというと、上記の例だと

clickAndWait
//a[substring(@href, string-length(@href) - string-length('/users/update/1') + 1) = '/users/update/1']/img/[@alt='更新']

こんな感じ。明らかに保守性は下がっちゃうけど、今回は可搬性重視でとりあえずこの書き方にしておいた。

■ファイルアップロード

IE ではセキュリティの理由で、スクリプトから <input type="file"> フィールドに値を設定できない。つまりファイルアップロードの処理は実行できない。

のだけど、それだとテストにならないので、たまに手を動かせばケースを通せるようにしてみた。user-extensions.js で、

// input type="file" フィールド専用の入力アクション。
// IE や HTA では入力できないので、入力補助のプロンプトを表示する。
Selenium.prototype.doTypeFile = function(locator, value) {
if (browserVersion.isIE || browserVersion.isHTA) {
// IE、HTA の場合

// コピーできるようにプロンプト表示
// ※文字化けするのでメッセージは英語で表記している
var element = this.page().findElement(locator);
prompt('Copy the file name below, and paste it into file input box.', value);

// ペーストしやすいように対象エレメントにフォーカス
element.focus();

// ペーストが完了するまで待機(参考: doWaitForCondition)
return Selenium.decorateFunctionWithTimeout(function () {
var window = selenium.browserbot.getCurrentWindow();
return (element.value === value);
}, Selenium.DEFAULT_TIMEOUT);
} else {
// それ以外の場合は type アクションに丸投げ
this.doType(locator, value);
}
};

こんな感じのアクションを定義。この typeFile アクションを type の代わりに使えば、まあ半自動化っぽくなりますよと。

そういえば Selenium RC を使えばアップロードもできる、という話もあったけど(下記 URL)、今回は IDE でも動かしたいのでまたの機会に。

Selenium RC 1.0 betaでのファイルアップロードのテスト - azlab 開発Memo

javascript-xpath は?→今のところ導入見送り

"I" novel?(2008-01-06)

>JavaScript-XPathを読み込むようにしたら、それだけでIEでのテストがめちゃはやくなった。最高!

というのを見かけて気にはなってたんだけど、Selenium Core 1.0 beta 2 からは組み込みで使えるようになってるそうで。

OpenQA: Selenium: Selenium RC Beta-2 Goodies and Gotchas

useXpathLibrary
javascript-xpath

みたいなアクションで javascript-xpath のほうが使われるようになる、と。

試しに使ってみると・・・むしろ実行が遅くなってしまった。サーバサイドの処理が多いから数字に意味はないんだけど、90 秒くらいで終わってたところが 100 秒くらいに。IE6 で実行してるから JavaScript が遅いとかかなぁ。

でも、これを Firefox からも使えれば、Firefox で ends-with が使えるってこと?だったら実行速度遅くなってもいいから取り入れたいなー、と、Selenium IDE で実行してみると。

[error] Unknown command: 'useXpathLibrary'

と怒られたorz

よくよく調べてみると、

OpenQA: Chrome is not woking with Selenium Core ...

とのことで、Selenium IDE には組み込まれていないらしい。ちゃんと要望には上がっているから、とりあえず投票しておいた。

[#SEL-629] Chrome is not woking with Selenium Core 1.0-beta-2 - OpenQA Bug Tracker

■その他細かい IE 対応

○verifyText の動作違い

table タグをまとめて verifyText やってるような手抜きケースが、IE ではエラーになっていた。どうも空白、タブ、改行あたりが入ったり入らなかったり、というところが Firefox と IE で挙動が違う模様。ここは素直に個別のフィールドについて verifyTable する形に書き換え。

○イベント名の表記は小文字で?

<input type="button" value="更新" onClick="location.href=&#039;/users/update/1&#039;" />

こんな感じのボタンがあるとして、

clickAndWait
//input[@value='更新' and contains(@onClick, '/users/update/1')]

こんなテストケースを書いていた場合、IE だと

Element //input[@value='更新' and contains(@onClick, '/users/update/1')] not found

こんなエラーになってしまう。どうも @onClick でなく @onclick(すべて小文字)で拾う必要があるらしい。前も JavaScript 周りで悩まされた箇所だけど、詳細忘れた&現象自体も忘れてた。
posted at 19:49:28 on 2009-04-14 by miau - Category: General No Trackbacks - Permalink

TrackBack

このエントリにトラックバックはありません
現在トラックバックは受け付けていません。

Comments

No comments yet

Add Comments

現在コメントは受け付けていません。
お手数ですが、 こちら のコメント欄にでも記載していただければと思います。