Ausgabe
Ich habe eine Webanwendung zum Testen mit Selenium. Beim Laden der Seite wird viel JavaScript ausgeführt.
Dieser JavaScript-Code ist nicht so gut geschrieben, aber ich kann nichts ändern. findElement()
Es ist also keine Option , darauf zu warten, dass ein Element im DOM mit der Methode erscheint .
Ich möchte eine generische Funktion in Java erstellen, um auf das Laden einer Seite zu warten. Eine mögliche Lösung wäre:
- Führen Sie ein JavaScript-Skript von WebDriver aus und speichern Sie das Ergebnis
document.body.innerHTML
in einer String-Variablenbody
. - Vergleichen Sie die
body
Variable mit der vorherigen Version vonbody
. wenn sie gleich sind, setze einen Zähler inkrementieren,notChangedCount
andernfallsnotChangedCount
auf null gesetzt. - Warten Sie eine Weile (z. B. 50 ms).
- Wenn sich die Seite einige Zeit nicht geändert hat (z. B. 500 ms),
notChangedCount >= 10
verlassen Sie die Schleife, andernfalls kehren Sie zum ersten Schritt zurück.
Halten Sie es für eine gültige Lösung?
Lösung
Wenn jemand tatsächlich eine allgemeine und immer gültige Antwort wüsste, wäre sie schon vor Ewigkeiten überall implementiert worden und würde unser Leben SO viel einfacher machen.
Es gibt viele Dinge, die Sie tun können, aber jedes einzelne von ihnen hat ein Problem:
-
Wie Ashwin Prabhu sagte, wenn Sie das Skript gut kennen, können Sie sein Verhalten beobachten und einige seiner Variablen auf
window
oderdocument
usw. verfolgen. Diese Lösung ist jedoch nicht jedermanns Sache und kann nur von Ihnen und nur auf einer begrenzten Anzahl von verwendet werden Seiten. -
Ihre Lösung, indem Sie den HTML-Code beobachten und ob er seit einiger Zeit geändert wurde oder nicht, ist nicht schlecht (es gibt auch eine Methode , um den ursprünglichen und nicht bearbeiteten HTML-Code direkt von abzurufen
WebDriver
), aber:- Es dauert lange, eine Seite tatsächlich zu bestätigen, und könnte den Test erheblich verlängern.
- Man weiß nie, was das richtige Intervall ist. Das Skript lädt möglicherweise etwas Großes herunter, das länger als 500 ms dauert. Es gibt mehrere Skripte auf der internen Seite unseres Unternehmens, die im IE mehrere Sekunden dauern. Ihr Computer hat möglicherweise vorübergehend wenig Ressourcen – sagen Sie, dass ein Antivirus Ihre CPU voll arbeiten lässt, dann können 500 ms selbst für ein nicht komplexes Skript zu kurz sein.
- Einige Skripte werden nie fertig. Sie rufen sich mit einiger Verzögerung auf (
setTimeout()
) und arbeiten immer wieder und könnten möglicherweise jedes Mal, wenn sie ausgeführt werden, das HTML ändern. Im Ernst, jede “Web 2.0”-Seite tut es. Sogar Stapelüberlauf. Sie könnten die am häufigsten verwendeten Methoden überschreiben und die Skripte, die sie verwenden, als abgeschlossen betrachten, aber … Sie können sich nicht sicher sein. - Was ist, wenn das Skript etwas anderes tut, als den HTML-Code zu ändern? Es könnte Tausende von Dingen tun, nicht nur ein bisschen
innerHTML
Spaß.
-
Es gibt Tools, die Ihnen dabei helfen. Nämlich Progress Listener zusammen mit nsIWebProgressListener und einigen anderen. Die Browserunterstützung dafür ist jedoch schrecklich. Firefox begann, es ab FF4 zu unterstützen (noch in der Entwicklung), IE hat grundlegende Unterstützung in IE9.
Und ich denke, ich könnte bald mit einer anderen fehlerhaften Lösung aufwarten. Tatsache ist, dass es keine eindeutige Antwort darauf gibt, wann man sagen soll, “jetzt ist die Seite fertig”, weil die ewigen Skripte ihre Arbeit erledigen. Wählen Sie diejenige aus, die Ihnen am besten dient, aber hüten Sie sich vor ihren Mängeln.
Beantwortet von – Petr Janeček
Antwort geprüft von – Willingham (FixError Volunteer)