つれづれなるままに。

webテストの自動化について備忘録のつもりで書いています

Selenium IDE Javascript を使って TABキーを入力する

firefox22 + Selenium2.2.0 環境より前の環境では実行できていたJavascript を使ってキーコードを送る込む方法です

<tr>
<td>getEvel</td>
<td>
var elm = selenium.browserbot.findElement('//div[@id="ent"]');
var evt = document.createEvent('KeyboardEvent');
evt.initKeyEvent("keypress", true, true, null, false, false, false, false, 9, 0);
elm.dispatchEvent(evt);
</td>
<td></td>
</tr>

これで実行すると
[error] Threw an exception: Value does not implement interface Event.
というエラーが firefox22 + Selenium2.2.0 環境で、でるようになりました。

あれやこれや探してみると
「Selenium2.3.0から sendkeysコマンドで スペシャルキーも入力できるようにするよ」
的な記述が。

しばらく・・・・

バージョンアップを受けて早速試してみましたが、まずキーの指定方法がわからん。
いろいろさまよって結局 ソースを見ることに。
どうやら 
Key.TAB
でよいのか?
が、エラーはでないが、期待した挙動にならない。そもそもちゃんとコードが送り出されている気配がない。

と、ここまでが前回の話(長い!)

で、結局 sendkeysはとりあえず置いておいて Javascript から攻めることに。

そもそも、Javascriptを使った場合Seleniumとは別のところで動く訳で、バージョンアップによる影響を何故受けるのか?
これがもしfirefox側の仕様変更だとしたら、いくらなんでもこれをネタにして記事を書いている人が世界中のどこかに居るはず。
が、検索をかけても引っかかってこないのは、検索キーワードが間違っているか、もしくはそもそものこの疑問自体が間違っている のどちらかということになる。

と、いうことで Javascriptをつかってのイベント発火をfirebugs内で実行してみる。
・・・・・
うごいた。えーーー、ってことは?

試行錯誤中
試行錯誤中
試行錯誤中
試行錯誤中
試行錯誤中
試行錯誤中

結論

<tr>
<td>getEvel</td>
<td>
var elm = selenium.browserbot.findElement('//div[@id="ent"]');
var doc = this.page().getDocument();
var evt = doc.createEvent('KeyboardEvent');
evt.initKeyEvent("keypress", true, true, null, false, false, false, false, 9, 0);
elm.dispatchEvent(evt);
</td>
<td></td>
</tr>

ドキュメントオブジェクトの取り扱いがかわったというか正しい挙動にされたというか・・・
そもそも、これはどっちの修正だろうか???
|