Wenn ein Element mit Selen nicht sichtbar ist und man versucht, damit zu interagieren, wird Selen das Element normalerweise zuerst implizit in die Ansicht scrollen. Das ist großartig, außer dass es nervt, dass es normalerweise das Element gerade genug in Sicht bringt. Was ich meine ist, dass, wenn sich das Element unterhalb des Fensters befindet, es nur soweit herunterscrollen wird, bis das Element gerade an die Kante des Fensters angrenzt.
Normalerweise ist das in Ordnung, aber wenn Sie auf einer Website mit angrenzenden Grenzen arbeiten, führt dies zu zahlreichen dieser Fehlerarten
%Vor%Weil normalerweise der Rand der Webseite darüber ist, aber versuchen wird, auf das Element trotzdem zu klicken. Behandelt das sowieso? vielleicht, um Elemente automatisch in die Mitte des Bildschirms zu verschieben, wenn sie nicht sichtbar sind? Ich denke entlang der Linien Affen-Patching über Ruby.
Dies sollte funktionieren, um ein Element in die Mitte der Ansicht zu scrollen:
%Vor%Ja, es ist möglich, den Browser automatisch so zu scrollen, dass jedes Element, mit dem wir interagieren, im Fenster zentriert wird. Ich habe ein Arbeitsbeispiel unten, geschrieben und getestet in Ruby mit selen-webdriver-2.41.0 und Firefox 28.
Vollständige Offenlegung: Sie müssen möglicherweise Teile Ihres Codes etwas bearbeiten, damit dies ordnungsgemäß funktioniert. Erklärungen folgen.
%Vor%Empfohlene Verwendung:
Aktivieren Sie die automatische Zentrierung beim Start von Codesegmenten, in denen Elemente normalerweise nicht angezeigt werden, und deaktivieren Sie sie anschließend.
HINWEIS: Dieser Code scheint nicht mit verketteten Aktionen zu funktionieren. Beispiel:
%Vor% Der Scrollfix scheint die click
-Position nicht zu aktualisieren. Im obigen Beispiel würde es auf die Vor-Scroll-Position des Elements klicken und einen Fehlklick erzeugen.
Warum move_to
?
Ich habe move_to
gewählt, weil die meisten Maus-basierten Aktionen davon Gebrauch machen, und Selenium's existierendes "scroll to view" Verhalten tritt während dieses Schrittes auf. Dieser spezielle Patch sollte nicht für Maus-Interaktionen funktionieren, die move_to
nicht auf irgendeiner Ebene aufrufen, noch erwarte ich, dass er mit irgendwelchen Tastatur-Interaktionen funktioniert, aber ein ähnlicher Ansatz sollte theoretisch funktionieren, wenn Sie das Recht übernehmen Funktionen.
Warum sleep
?
Ich bin mir nicht sicher, warum ein Befehl sleep
nach dem Scrollen über executeScript
benötigt wird. Mit meinem speziellen Setup kann ich den Befehl sleep
entfernen und er funktioniert weiterhin. Ähnliche Beispiele von andere Entwickler über das Netzwerk enthalten sleep
-Befehle mit Verzögerungen von 0,1 bis 3 Sekunden. Als wilde Vermutung würde ich sagen, dass dies aus Kompatibilitätsgründen getan wird.
Was ist, wenn ich keinen Affen-Patch machen möchte?
Die ideale Lösung wäre, wie Sie vorgeschlagen haben, Selens "Scroll in View" Verhalten zu ändern, aber ich glaube, dass dieses Verhalten durch Code außerhalb des Selen-Webdriver-Edelsteins gesteuert wird. Ich habe den Code bis zum Bridge
verfolgt, bevor die Spur kalt wurde.
Für die Affe-Patch-Average funktioniert die scroll_to_center
-Methode als eigenständige Methode mit einigen Substitutionen, wobei driver
Ihre Selenium::WebDriver::Driver
-Instanz ist:
driver.manage.window.position
anstelle von
%Code%
@bridge.getWindowPosition
anstelle von
%Code%
driver.manage.window.size
anstelle von
%Code%
Sie können hier eine explizite Scroll-Aktion über Javascript verwenden. In diesem Fall würden Sie das Element finden (dieser Teil funktioniert bereits, wenn ich Ihre Frage richtig verstanden habe), dann das Fenster zu einer bestimmten Position scrollen und dann mit dem Element interagieren.
In Java wäre das:
%Vor%Sie können ein gezieltes Scrollen mit der ClientRect.top-Eigenschaft des Elements ausführen. Sie können sich das zweite Beispiel in diesem Beitrag ansehen Ссылка
Tags und Links ruby selenium-webdriver watir-webdriver