Gibt es in Selenium 1.x oder 2.x eine Möglichkeit, das Browserfenster so zu scrollen, dass ein bestimmtes Element, das von einem XPath identifiziert wird, für den Browser sichtbar ist? In Selenium gibt es eine Fokusmethode, die die Ansicht in FireFox jedoch nicht physisch zu scrollen scheint. Hat jemand Vorschläge dazu?
Der Grund, warum ich das brauche, ist, dass ich den Klick eines Elements auf der Seite teste. Leider scheint das Ereignis nur zu funktionieren, wenn das Element sichtbar ist. Ich habe keine Kontrolle über den Code, der beim Klicken auf das Element ausgelöst wird. Daher kann ich weder debuggen noch Änderungen daran vornehmen. Die einfachste Lösung besteht darin, das Element in die Ansicht zu scrollen.
selenium
scroll
automated-tests
Dan auf Nachfrage
quelle
quelle
Antworten:
Ich habe viele Dinge in Bezug auf das Scrollen versucht, aber der folgende Code hat bessere Ergebnisse geliefert.
Dadurch wird gescrollt, bis das Element angezeigt wird:
quelle
position: fixed
auf Ihrer Seite haben und das Element, auf das Selenium klicken möchte, verdeckt. Sehr oft befinden sich diese festen Elemente unten, sodass sie durch die Einstellung ganzscrollIntoView(true)
oben im Ansichtsfenster angezeigt werden.true
,scrollIntoView
wenn sich das Objekt, zu dem Sie scrollen, unter dem befindet, zu dem Sie geradefalse
scrollen , und wenn sich das Objekt, zu dem Sie scrollen, über dem befindet, wo Sie sich gerade befinden. Es fiel mir schwer, das herauszufinden.Mit der
org.openqa.selenium.interactions.Actions
Klasse können Sie zu einem Element wechseln.Java:
Python:
quelle
Vielleicht möchten Sie dies versuchen.
quelle
js.ExecuteScript("arguments[0].scrollIntoView(true);" + "window.scrollBy(0,-100);", e);
für IE und Firefox sowiejs.ExecuteScript("arguments[0].scrollIntoViewIfNeeded(true);", e);
für Chrome. Einfach.((JavascriptExecutor) driver).executeScript("javascript:window.scrollBy(0,250)");
Dies funktionierte in Chrome. Und die einzige Lösung, die tatsächlich für mich funktioniert hat. In der gleichen Situation wie beim ersten Kommentator hatte ich unten ein festes Element, das das Element, auf das ich klicken musste, immer wieder verdeckte.Wenn Sie mit dem Selenium-Webdriver im Firefox-Fenster scrollen möchten, können Sie unter anderem JavaScript im Java-Code verwenden. Der JavaScript-Code zum Scrollen nach unten (zum Ende der Webseite) lautet wie folgt:
quelle
Das Targeting eines Elements und das Senden von Tasten nach unten (oder nach oben / links / rechts) scheint ebenfalls zu funktionieren. Ich weiß, dass dies ein kleiner Hack ist, aber ich bin nicht wirklich begeistert von der Verwendung von JavaScript, um das Bildlaufproblem zu lösen.
Beispielsweise:
quelle
var elem = driver.FindElement(By.Id("element_id")); elem.SendKeys(Keys.PageDown);
Weitere Beispiele finden Sie hier . Alles auf Russisch, aber Java-Code ist interkulturell :)
quelle
In Selenium müssen wir die Hilfe eines JavaScript-Executors verwenden, um zu einem Element zu scrollen oder die Seite zu scrollen:
In der obigen Anweisung
element
ist das genaue Element, wo wir scrollen müssen. Ich habe den obigen Code ausprobiert und er hat bei mir funktioniert.Ich habe einen vollständigen Beitrag und ein Video dazu:
http://learn-automation.com/how-to-scroll-into-view-in-selenium-webdriver/
quelle
Mit diesem Codeausschnitt können Sie scrollen:
C #
Hier hast du es
quelle
Das hat bei mir funktioniert:
quelle
Selen 2 versucht, zum Element zu scrollen und dann darauf zu klicken. Dies liegt daran, dass Selen 2 nicht mit einem Element interagiert, es sei denn, es glaubt, dass es sichtbar ist.
Das Scrollen zum Element erfolgt implizit, sodass Sie nur das Element suchen und dann damit arbeiten müssen.
quelle
WebElement.click()
muss das Element sichtbar sein, um darauf klicken zu können. Es wird nicht in Ihrem Namen gescrollt.Verwenden Sie den Treiber, um Schlüssel wie den Schlüssel pagedownoder zu senden downarrow, um das Element anzuzeigen. Ich weiß, dass es eine zu einfache Lösung ist und möglicherweise nicht in allen Fällen anwendbar ist.
quelle
element
auf der sichtbaren Seite bekannte zu finden und PageDown zu senden, hatelement.SendKeys(Keys.PageDown);
bei mir funktioniert.Nach meiner Erfahrung scrollt Selenium Webdriver beim Klicken nicht automatisch zu einem Element, wenn mehr als ein scrollbarer Abschnitt auf der Seite vorhanden ist (was durchaus üblich ist).
Ich verwende Ruby und für mein AUT musste ich die Klickmethode wie folgt patchen.
Die Methode 'location_once_scrolled_into_view' ist eine vorhandene Methode für die WebElement-Klasse.
Ich schätze, dass Sie Ruby möglicherweise nicht verwenden, aber es sollte Ihnen einige Ideen geben.
quelle
module Capybara :: module Node
, und ich musste anrufen,native.location_once_scrolled_into_view
anstatt nurlocation_once_scrolled_into_view
. Ich habe auch gerettet::Selenium::WebDriver::Error::UnknownError
, was ich in Firefox 44.0.2 oft bekomme. Ich finde diese Lösung jedoch nicht flexibel genug und stelle die<Element>.native.location_once_scrolled_into_view
Anrufe letztendlich selbst in den Abnahmetest, gefolgt von derpage.execute_script('window.scrollByPages(-1)')
erforderlichen Anforderung.Element#scroll_into_view
die an Selen delegiertlocation_once_scrolled_into_view
. Beide unterscheiden sich jedoch nicht vom Standardverhalten von Selen, sodass Überlaufelemente immer noch das blockieren können, worauf wir klicken möchten.Das Ruby-Skript zum Scrollen eines Elements in die Ansicht lautet wie folgt.
quelle
Manchmal hatte ich auch das Problem, mit Selen zu scrollen. Also habe ich javaScriptExecuter verwendet, um dies zu erreichen.
Zum Scrollen nach unten:
Oder auch
Zum Scrollen:
Oder,
quelle
Wenn Sie der Meinung sind, dass andere Antworten zu hackig waren, ist dies auch der Fall, aber es ist keine JavaScript-Injektion erforderlich.
Wenn die Schaltfläche nicht auf dem Bildschirm angezeigt wird, wird sie unterbrochen und zu ihr gescrollt. Versuchen Sie es erneut ... ¯ \ _ (ツ) _ / ¯
quelle
Dies ist eine wiederholte Lösung mit JavaScript, jedoch mit einem zusätzlichen Warten auf Element.
Andernfalls
ElementNotVisibleException
kann es vorkommen, dass eine Aktion für das Element ausgeführt wird.quelle
Ich habe diese Methode zum Scrollen des Elements und zum Klicken verwendet:
quelle
scrollIntoView(false)
funktioniert, aberscrollIntoView(true)
nicht. Beides kann funktionieren , es hängt von Ihrem Szenario ab.quelle
Möglicherweise möchten Sie die Seite Scroll-Webelemente und die Webseite Selenium WebDriver mit Javascript besuchen :
quelle
In den meisten Fällen funktioniert dieser Code beim Scrollen.
quelle
JAVA
Versuchen Sie, zum Element zu scrollen, verwenden Sie die
x y
Position, und verwenden SieJavascriptExecutor
dieses Argument :"window.scrollBy(x, y)"
.Nach dem Import:
Zuerst müssen Sie
x y
das Element lokalisieren.quelle
Ich bin nicht sicher, ob die Frage noch relevant ist, aber nachdem ich auf die scrollIntoView-Dokumentation unter https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView verwiesen habe .
Die einfachste Lösung wäre
Dadurch wird das Element in die Mitte der Seite gescrollt.
quelle
Das Standardverhalten von Selenium ist das Scrollen, sodass das Element oben im Ansichtsfenster kaum sichtbar ist. Außerdem haben nicht alle Browser genau das gleiche Verhalten. Das ist sehr unbefriedigend. Wenn Sie wie ich Videos Ihrer Browsertests aufzeichnen, soll das Element in die Ansicht gescrollt und vertikal zentriert werden .
Hier ist meine Lösung für Java:
Und dann, um zu scrollen, nennen Sie es so:
quelle
So mache ich das mit PHP webDriver for Selenium. Es funktioniert für den eigenständigen Selenium-Server 2.39.0 + https://github.com/Element-34/php-webdriver + Firefox 25.0
Hinweis: Ich verwende eine angepasste Version des Element34 PHP-Webdrivers. Aber es gibt keine Veränderung im Kern. Ich benutze nur mein "Willkommen" anstelle von "Element". Es hat jedoch keinen Einfluss auf den fraglichen Fall. Der Autor des Treibers sagt, "damit fast alle API-Aufrufe eine direkte Transformation dessen darstellen, was im WebDriver-Protokoll selbst definiert ist." Sie sollten also kein Problem mit anderen Programmiersprachen haben.
Ein Klick funktioniert in meinem Setup nicht. Es wird ein Bildlauf anstelle eines Klicks ausgeführt, sodass ich zweimal klicken musste, ohne "location_in_view ()" aufzurufen.
Hinweis: Diese Methode funktioniert für Elemente, die angezeigt werden können, z. B. eine Eingabe vom Typ.
Schauen Sie sich Folgendes an: http://code.google.com/p/selenium/wiki/JsonWireProtocol#/session/:sessionId/element/:id/location
Die Beschreibung für JsonWireProtocol # schlägt die Verwendung von location + moveto vor, da location _in_view eine interne Methode ist.
quelle
Für mich hat es funktioniert, die Browser.MoveMouseToElement-Methode für ein Element am unteren Rand des Browserfensters zu verwenden. Wie durch ein Wunder funktionierte es in Internet Explorer, Firefox und Chrome.
Ich habe dies der JavaScript-Injektionstechnik vorgezogen, nur weil es sich weniger hackig anfühlte.
quelle
Ich habe Tests mit ADF-Komponenten durchgeführt und Sie müssen einen separaten Befehl zum Scrollen haben, wenn das verzögerte Laden verwendet wird. Wenn das Objekt nicht geladen ist und Sie versuchen, es mit Selenium zu finden, löst Selenium eine Ausnahme aus, bei der das Element nicht gefunden wurde.
quelle
Wenn nichts funktioniert, versuchen Sie dies, bevor Sie auf Folgendes klicken:
quelle
In Java können wir mit JavaScript scrollen, wie im folgenden Code:
Sie können der Variablen "elm.scrollTop" einen gewünschten Wert zuweisen.
quelle
Eine Lösung ist:
quelle
Dieser Code funktioniert für mich:
quelle