Ich versuche, das Verhalten des Selenium-Klickbefehls (über user-extensions.js) anzupassen, indem Aufrufe von doClick (locator) abgefangen werden. Grundsätzlich muss ich Click-Aktionen verzögern, wenn der "Busy Indicator" unserer Anwendung angezeigt wird.
(Jetzt lautet die Standardantwort für diese Art von Sache, für diese Situationen ein waitFor in das Skript einzufügen. In der Tat haben wir derzeit in unseren Scripts zig Millionen davon. Ich versuche, diese zu eliminieren.)
Das Seitenelement zu erkennen ist der triviale Teil. Der schwierige Teil besteht darin, das Skript tatsächlich warten zu lassen. Mein viel versprechender, aber erfolgloser Versuch sieht so aus:
%Vor%Die doWaitForCondition wird vor jedem Klick aufgerufen, aber nicht wartet, wenn die Bedingung als false ausgewertet wird. nativeClick wird immer sofort aufgerufen, und daher wird keine Verzögerung eingeführt. Ich vermute, dass die doWaitForCondition-Funktion nicht wirklich per se wartet, sondern die Bedingungen dafür in der Befehlsausführungsschleife festlegt. Und in diesem Fall ist der Click-Befehl bereits im Spiel, und ich versuche, einen Befehl innerhalb eines Befehls auszuführen.
Kann jemand etwas Licht in die Frage bringen, wie Selenium die Ausführung befiehlt und wartet, um zu arbeiten oder Vorschläge zu machen, wie dies geschehen könnte?
Ich habe das endlich gelöst. Und mit einem Ansatz, der viel besser ist, als zu versuchen, die Klickverarbeitung in ihren verschiedenen Formen abzufangen. Mein Ziel ist es, die Ausführung des Skriptbefehls zu verzögern, wenn unsere Anwendung "beschäftigt" ist.
Nach Abschluss gibt jeder selen-Befehl ein ActionResult
-Objekt zurück, (siehe ActionHandler.prototype.execute
) . Das Attribut terminationCondition
für dieses Objekt ist eine Funktion, die bestimmt, wann es für Selen in Ordnung ist, mit dem nächsten Befehl fortzufahren, ( TestLoop.prototype.continueTestWhenConditionIsTrue
) . Grundsätzlich führt Selen die Bedingungsfunktion wiederholt aus, bis es wahr ist. Das Ergebnisobjekt ist ziemlich trivial:
Ich möchte die Ausführung jederzeit verzögern myAppIsBusy()
gibt wahr zurück. Natürlich müssen auch alle Standardverzögerungen beibehalten werden, wie das Warten auf Seitenladevorgänge und das explizite Warten auf Bedingungen als Skript. Die Lösung besteht darin, das Selenergebnisobjekt in meiner user-extensions.js wie folgt neu zu definieren:
Das Tolle ist, dass dies auf einem so niedrigen Level ist, dass es sowohl für die IDE als auch für RC funktioniert.
Beachten Sie, dass dies die Befehlstypen Accessor oder Assert, die unterschiedliche Ergebnisobjekte zurückgeben, nicht beeinflusst. Aber das sollte in Ordnung sein, da diese Befehle den Status der Anwendung nicht beeinflussen.
Nun, ein Blick auf die Java-Treiber com.thoughtworks.selenium.Wait
-Klasse zeigt dies:
Ich bin nicht zu tief in Selen, aber ich achte darauf, dass jede waitXXX-Methode darauf hinweist.
Selenium arbeitet also mit Thread.sleep()
. Während dies nicht wie eine ideale Lösung aussieht, zeigt es zumindest, dass Sie es nicht schlimmer machen können, indem Sie Thread.sleep () selbst benutzen, falls notwendig. ; -)
Tags und Links javascript extensibility internals selenium-ide