Ruby で DOM 要素にイベント リスナーがあるかどうかを確認する方法
概要
Watir と Nokogiri を使用して Web ページを解析し、操作しています。 DOM 要素をクリックしたときにスクリプトがトリガーされるかどうかを確認したいと考えています。私の調査によると、これは JavaScript と Chrome 開発ツールで可能であることがわかっていますが、Ruby でこれを実現したいと考えています。
たとえば、http://worrydream.com。表示された画像を検査すると、CSS スタイルが設定された div だけが表示されますが、それがリンクであることや、クリックしたときに反応することは示されていません。ただし、特定の要素をクリックすると、アニメーション (またはスクリプト) が実行されます。画像をクリックすることがイベントであることを示すものは何でしょうか?
アップデート: 当初、私がやろうと考えていたのは、ページに関連付けられた JavaScript をスクレイピングして、イベントがトリガーされるかどうかを何らかの方法で判断することでした。しかし、Mark Thomas が提案した解決策を試し、テストが完了したら彼の答えを正しいものとしてマークするつもりです。
解決策
簡単に言うと?何もない。
長い答え:
どの要素がスクリプトをトリガーするかを調べるには、各要素にリスナーをアタッチするために実行された Javascript を知る必要があります。そのためには、JavaScript を実行できる必要があります。 WATIR と Nokogiri は、それ自体では Javascript を実行しません。 WATIR は内部で JavaScript を実行するブラウザを使用します。 Watir-webdriver は、ページの JavaScript を実行する JavaScript エグゼキュータも備えた Java ベースのブラウザ エミュレータ (Selenium) を使用します。 Nokogiri は JavaScript をまったく実行しません。
したがって、特定の要素にどのリスナーがアタッチされているかを「読み取る」には、独自の Javascript を挿入する必要があります。 JavaScript 環境を制御できないため、これは簡単ではありません。ただし、その方法が見つかったとしても、特定の要素にどのイベント リスナーがアタッチされているかを確認するための、W3C DOM インターフェイスが提供する標準的な方法がないことがわかります。 JQuery などの個々の JavaScript ライブラリはリスナーをキャッシュしますが、それぞれが独自の方法でキャッシュを実行します。
つまり、これは非常に複雑になります。
考えられる解決策
以下はすべて推測ですが、この情報を Ruby の世界に戻すことを本当に追求したい場合、これは試してみる価値があります。
まず、JS をページに挿入して結果を取得する方法が必要です。 Selenium にはこれを行うためのフックがあるため、watir-webdriver を使用するとこれが可能になる場合があります。 Selenium で JS を挿入し、呼び出し元に結果を返す方法については、このページの最後を参照してください。もう 1 つのオプションは、JS API を備えたヘッドレス ブラウザである PhantomJS です。
次に、一般的な JS ライブラリのそれぞれがどのようにリスナーをキャッシュし、情報を収集できるかを理解する JavaScript ライブラリを見つける必要があります。そのためには、Visual Event 2 を試してください。
これらを接続する必要があり、それには少しの JS ハックが必要になります。幸運を。