読者です 読者をやめる 読者になる 読者になる

きよくらの備忘録

「三日坊主と呼ばせない!日記」改め。主にソフトウェア開発関連の話題。

Selenium IDEでHTML中の何処かに出力されている文字列をひっかける

最近、諸事あってSelenium IDEを使い始めてみました。色々便利ではかどりますね*1


DOMの何処かに特定の文字が出力されたらassertしたい

今日、どうやればいいのか解らずに困ったのが『HTML中の何処かに出力されている文字』をひっかける方法でした。もう少し正確に言うと『特定の文字列出力されたHTMLソース中の何処かにあればassertで止まりたい』という感じです。


さらに具体的に言えば、以下のようにHTML出力中にサーバサイドスクリプトがこけて中途半端な感じでエラーを出してしまっているのをフックしたいわけです*2

<!-- 
  サーバサイドからJavascriptの変数に値を書きだそうとしてコケた例(イメージ)
-->
<html>
<head><title>test</title></head>
<body>
  <h1>Test</h1>
  <script>
    var i = 500;
    var s = サーバでエラーが発生しました:文字列を数値に変換できません
[EOF]


画面に表示される状態であればassertTextNotPresent等でフックできるわけですが、scriptタグ内等、画面に表示されない場所では反応してくれません。当初どうすればいいか悩んだのですが、しばらく試したり調べたりしていると、assertNotHtmlSourceでパターンマッチでひっかければ良いことがわかりました。

例えば以下のようにすることで、DOMの何処かに『サーバでエラーが発生しました』の文字列があれば検出できるようになります。

コマンド assertNotHtmlSource
対象 glob:*サーバでエラーが発生しました*



DOMに含まれているか、がポイント

とは言えどんなケースでも引っかけれるかというとそういう訳でも無さそうです。ポイントはDOMツリーに含まれるかどうか、の模様。

検出できないケース

例えば以下のようにちゃんと開始タグが完成していない場合、検出できないようです。

<!-- 
  tableの要素の属性を何等かサーバサイドの処理で動的に書こうとしてコケた例
-->
<body>
  <h1>Test</h1>
  <table サーバでエラーが発生しました:xxが定義されていません

上記をfirefoxの開発者ツールで見ると、DOMの中にそもそもtableタグがないことがわかります。なので、このケースでは前述の方法では検出不可能


検出できなさそうで出来るケース1

しかし、某クラシックASなんちゃらのようにエラーをタグで包んで出力してくれる場合はなんとか大丈夫そう。

<!-- 
  tableの要素の属性を何等かサーバサイドの処理で動的に書こうとしてコケた例(2)
-->
<body>
  <h1>Test</h1>
  <table <p>サーバでエラーが発生しました:xxが定義されていません</p>


これをfirefoxの開発者ツールでみると、なんか微妙に怪しいDOMが構築されて...いますが文字列はDOMツリーの中に存在しています。従って、前述の方法で検出可能です。


検出できなさそうで出来るケース2

また以下のようにソース上はhtmlタグ外に書かれている場合であっても、あくまでブラウザがDOMツリーでどう扱うか次第の模様。

<html>
<head><title>test</title></head>
<body>
  <h1>Test</h1>
</body>
<html>
サーバでエラーが発生しました


上記のDOMはfirefox的にはこんな感じのためか、ちゃんと検出されます。

ブラウザ依存の可能性もアリ?

このあたりはブラウザのDOM解釈しだいな気がするので、ひょっとしたらブラウザによって挙動が変わってくる可能性があると思っています(未検証ですが)。WebDriverを使ってfirefox以外のブラウザで走らせる場合はまた検証が必要と思います。

*1:本当はVisual Studioの同様の機能を使いたいところですが、今回は諸事情あって(以下略

*2:『そもそもそういう造りになっているのが(』というのは重々承知していますが、諸事情あるわけで