2013-05-14 4 views
5

Ich benutze Watir und Nokogiri, um Webseiten zu analysieren und mit ihnen zu interagieren. Ich möchte herausfinden, ob ein DOM-Element beim Anklicken ein Skript auslöst. Aus meiner Recherche weiß ich, dass dies mit JavaScript und mit den Chrome-Dev-Tools möglich ist, aber ich würde das gerne mit Ruby erreichen.So finden Sie, ob ein DOM-Element einen Ereignis-Listener mit Ruby hat

Zum Beispiel http://worrydream.com. Wenn ich die angezeigten Bilder inspiziere, sehe ich nur Divs mit CSS-Styling, aber keinen Hinweis darauf, dass es sich um einen Link handelt oder dass es reagiert, wenn ich klicke. Wenn ich jedoch auf bestimmte Elemente klicke, wird eine Animation (oder ein Skript) ausgeführt. Was gibt an, dass das Klicken auf ein Bild ein Ereignis ist?

Update: Ursprünglich, was ich angesichts tat, war mit einer Seite verbunden, um die JavaScript Schaben und dann irgendwie zu bestimmen, ob ein Ereignis ausgelöst werden würde, aber ich werde die Lösung versuchen, von Mark Thomas vorgeschlagen und markiere seine Antwort als richtig, wenn ich es einmal getestet habe.

Antwort

1

Die kurze Antwort? Nichts.

Die lange Antwort:

Um herauszufinden, welche Elemente Skripte auslösen, würden Sie müssen wissen, was Javascript ausgeführt wurde, die Zuhörer zu jedem Element befestigt ist. Und dazu müssen Sie Javascript ausführen können. WATIR und Nokogiri führen Javascript nicht selbst aus. WATIR verwendet einen Browser, der intern JavaScript ausführt. Watir-webdriver verwendet einen Java-basierten Browser-Emulator (Selenium), der auch einen JavaScript-Executor besitzt, der das Javascript der Seite ausführt. Nokogiri führt kein JavaScript aus.

Sie müssten also etwas von Ihrem eigenen Javascript einfügen, um zu "lesen", welche Listener an ein bestimmtes Element angehängt sind. Dies ist nicht einfach, da Sie die JavaScript-Umgebung nicht kontrollieren können. Aber, Auch wenn Sie einen Weg gefunden haben, dies zu tun, stellt sich heraus, dass es keine Standard-Methode von der W3C-DOM-Schnittstelle zur Verfügung gestellt wird, um herauszufinden, welche Ereignis-Listener zu einem bestimmten Element zugeordnet sind. Einzelne JavaScript-Bibliotheken wie JQuery cachen ihre Listener, aber jeder tut es auf seine eigene Weise.

Also mit anderen Worten, das wird sehr kompliziert.

Eine mögliche Lösung

Hier finden Sie alle Vermutung, aber wenn Sie wirklich diese Informationen immer wieder in Ruby Land verfolgen wollte, das gibt Ihnen etwas zu versuchen.

Zuerst benötigen Sie eine Möglichkeit, JS in Ihre Seiten zu injizieren und ein Ergebnis zu erhalten. Dies ist möglicherweise mit Hilfe von watir-webdriver möglich, da Selenium hierfür über Haken verfügt. Das Ende von this page enthält Anweisungen zum Eingeben von JS und zum Zurückgeben eines Ergebnisses an den Aufrufer in Selenium. Eine andere Option ist PhantomJS, die ein kopfloser Browser mit einer JS-API ist.

Zweitens müssen Sie eine JavaScript-Bibliothek finden, die versteht, wie jede der beliebten JS-Bibliotheken ihre Listener zwischenspeichert und die Informationen sammeln kann. Dafür können Sie versuchen Visual Event 2.

Sie müssten diese Dinge immer noch verdrahten, was ein bisschen JS-Hackery erfordern würde. Viel Glück.

+0

Sie hatten Recht, mich zu Visual Event 2 zu leiten. Ich hatte es vorher schon erwogen, aber aufgrund einiger Missverständnisse, die ich hielt, hatte ich es ursprünglich abgelehnt.Ich schaue nun, wie man Informationen aus Visual Event 2 in Ruby extrahiert, wie in der folgenden [Frage] gezeigt (http://stackoverflow.com/questions/16577725/extracting-visual-event-2-output-into-script) . Hoffentlich kann ich es bald selbst beantworten! – Seanny123

+0

Indem ich mich in den Quellcode von Visual Event 2 einmischte und ihn dann mit dem Selenium-Webdriver injizierte, konnte ich ein Element identifizieren, das mit einem JavaScript-Ereignis verknüpft war und Informationen von ihm abrufen. Danke, dass Sie mich in die richtige Richtung weisen. – Seanny123

+0

Herzlichen Glückwunsch! Froh, dass es funktioniert hat. –

Verwandte Themen