2013-05-14 11 views
5

私はWatirとNokogiriを使ってWebページを解析し、それらと対話しています。私は、クリックされたときにDOM要素がスクリプトをトリガするかどうかを識別したいと思います。私の研究から、JavaScriptとchromeの開発ツールでこれが可能であることを理解していますが、Rubyでこれを実現したいと思います。DOM要素にRubyのイベントリスナーがあるかどうかを調べるには

たとえば、http://worrydream.com。私が表示された画像を調べると、CSSスタイルのdivが表示されますが、リンクであるか、クリックしたときに反応するという表示はありません。しかし、特定の要素をクリックすると、アニメーション(またはスクリプト)が実行されます。画像をクリックしたことがイベントであることを示すには、何がありますか?

更新: もともと、私はマーク・トーマスによって提案された解決策を試してみて、と彼の答えをマークします私は、イベントがトリガされるかどうかを判断何とかそのページに関連付けられているJavaScriptをこするとしてやって検討していたが、私は一度それをテストした正しい。

答えて

1

短い答えは?何もない。

長い答え:

要素はスクリプトをトリガする何かを見つけるために、あなたはJavascriptが各要素にリスナーを添付している実行されたかを知るする必要があると思います。それを行うには、Javascriptを実行できる必要があります。 WATIRとNokogiriはJavascriptを単独で実行しません。 WATIRはJavaScriptを内部的に実行するブラウザを使用します。 Watir-webdriverは、Javaベースのブラウザエミュレータ(Selenium)を使用しています。このエミュレータには、ページのJavaScriptを実行するJavaScriptエグゼキュータもあります。 NokogiriはJavaScriptをまったく実行しません。

したがって、特定の要素にどのリスナーが関連付けられているかを「読み込む」独自のJavascriptを挿入する必要があります。 JavaScript環境を制御できないため、これは簡単ではありません。 しかし、でも、それを行う方法が見つかったとしても、W3C DOMインターフェイスが提供する標準的なメソッドがないため、特定の要素にどのイベントリスナーが関連付けられているかを調べることはできません。 JQueryのような個々のJavaScriptライブラリはリスナをキャッシュしますが、それぞれ独自の方法で行います。

つまり、これは非常に複雑になります。

次の可能な解決策

はすべて推測ですが、あなたが本当に戻ってRubyの土地で、この情報を取得追求したい場合、これはあなたにしようとするために何かを与えます。

まず、JSをページに挿入して結果を得る方法が必要です。これは、Seleniumがこれを行うためのフックを持っているため、watir-webdriverを使用して可能になる可能性があります。 JSを注入して結果をSeleniumの呼び出し元に返す方法については、this pageの最後を参照してください。もう1つの選択肢はPhantomJSで、JS APIを備えたヘッドレスブラウザです。

第2に、一般的なJSライブラリがリスナーをキャッシュして情報を収集する方法を理解するJavaScriptライブラリを見つける必要があります。そのためには、Visual Event 2を試すことができます。

あなたはまだこれらのものを結線する必要があります。これはJSハッカーのビットを必要とします。がんばろう。

+0

あなたはビジュアルイベント2に向かうのは間違いありませんでした。私はこれまで考えていましたが、私が持っていた誤解のために、私は最初にそれを拒否しました。私は今、Visual Event 2からRubyに情報を抽出する方法を見ています。次の[question](http://stackoverflow.com/questions/16577725/extracting-visual-event-2-output-into-script)に示すように、 。うまくいけば、私はすぐに自分自身でそれに答えることができるでしょう! – Seanny123

+0

Visual Event 2のソースコードに干渉してSelenium-Webdriverを注入することで、JavaScriptイベントに関連付けられた要素を識別し、そこから情報を取得することができました。マークを正しい方向に向けてくれてありがとう。 – Seanny123

+0

おめでとうございます!それがうれしかった。 –

関連する問題