2015-02-12 13 views
9

Wie bekomme ich Selenium WebDriver zu einem bestimmten Element zu scrollen, um es auf dem Bildschirm zu bekommen. Ich habe viele verschiedene Möglichkeiten ausprobiert, aber ich hatte kein Glück. Funktioniert das nicht in den C# -Bindungen?Wie scrolle ich mit Selenium WebDriver zu Element mit C#

Ich kann es zu einem bestimmten Ort springen ex ((IJavaScriptExecutor)Driver).ExecuteScript("window.scrollTo(0, document.body.scrollHeight - 150)"); Aber ich möchte in der Lage, es an verschiedene Elemente zu senden, ohne die genaue Position jedes Mal geben.

public IWebElement Example { get { return Driver.FindElement(By.Id("123456")); } }

Ex 1) ((IJavaScriptExecutor)Driver).ExecuteScript("arguments[0].scrollIntoView(true);", Example);

Ex 2) ((IJavaScriptExecutor)Driver).ExecuteScript("window.scrollBy(Example.Location.X", "Example.Location.Y - 100)");

Wenn ich es sehen, es abspringen die Seite nicht auf das Element, und die Ausnahme entspricht dem Element-Bildschirm wird ausgeschaltet .

Update: Ich habe eine Bool ex = Example.Exists(); Danach und überprüft die Ergebnisse. Es existiert (es ist wahr). Es wird nicht angezeigt (weil es immer noch außerhalb des Bildschirms ist, da es nicht in das Element verschoben wurde) Es ist nicht ausgewählt ??????

Jemand sieht Erfolg By.ClassName. Weiß jemand, ob es ein Problem mit dem By.Id in den C# Bindungen gibt?

+0

Vielleicht können Sie versuchen, "Pfeil nach unten" Keypressen zu simulieren, bis die Ausnahme verschwindet. Ich weiß, das läuft gegen die Wand, bis die Wand bricht, aber wenn du willst, dass es irgendwie funktioniert, könnte es eine Lösung sein ?! – krizz

+0

Sie können mit einer Sache ausprobieren, ExpectedConditions.visibilityOfElement-Methode verwenden und es als eine Bedingung der while-Schleife und in Schleife die Ansicht von einigen sagen sagen, 100, 100 Koordinaten. –

+0

Bevor das Javascript aufgerufen wird, sind Sie sicher, dass WebDriver Ihr Element gefunden hat? – Jordan

Antwort

21

Sein etwas älter Frage, aber ich glaube, dass es eine bessere Lösung ist als oben vorgeschlagen. Hier

ist ursprüngliche Antwort: https://stackoverflow.com/a/26461431/1221512

Sie sollten Aktionen Klasse verwenden, um durchführen, um Element zu scrollen.

+1

Das funktionierte gut für mich, danke. Ich habe Action nie wirklich beachtet, aber sie sind in letzter Zeit ein paar Mal aufgetaucht. Ich sollte wirklich mehr über sie lernen. – Joel

6

Dies funktioniert für mich:

var elem = driver.FindElement(By.ClassName("something")); 
      ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].scrollIntoView(true);", elem); 
+0

By.ClassName wäre nicht eindeutig genug für das, was ich suche. Ich habe das oben genannte versucht und es funktioniert nicht By.Id für mich. Stellen Sie vor, dass das Problem By.Id ist? Wird das Offscreen-Bild für By.ClassName, aber nicht für By.ID angezeigt? – merrua

+0

By.ClassName ist nur ein Beispiel für das Finden eines Elements.Sie können verwenden, was Sie wollen/brauchen, um das Element zu finden. Die wirkliche Magie hier ist, zu dem Element zu blättern, das in der JavaScript scrollIntoView() -Methode passiert. Wenn Sie Schwierigkeiten haben, ein Element zu finden, versuchen Sie es hier. – user3734429

+1

Ich habe gerade die vorgeschlagene Lösung getestet und es funktioniert. Wie user3734429 sagte, sind Sie nicht verpflichtet, nach Klassennamen zu filtern, alles, was Sie brauchen, ist WebElement (es liegt an Ihnen, wie Sie es bekommen, die Auswahl nach Klassen ist nur eine Möglichkeit). – DRAX

9

für mich Dies funktioniert in Chrome, IE8 & IE11:

public void ScrollTo(int xPosition = 0, int yPosition = 0) 
{ 
    var js = String.Format("window.scrollTo({0}, {1})", xPosition, yPosition); 
    JavaScriptExecutor.ExecuteScript(js); 
} 

public IWebElement ScrollToView(By selector) 
{ 
    var element = WebDriver.FindElement(selector); 
    ScrollToView(element); 
    return element; 
} 

public void ScrollToView(IWebElement element) 
{ 
    if (element.Location.Y > 200) 
    { 
     ScrollTo(0, element.Location.Y - 100); // Make sure element is in the view but below the top navigation pane 
    } 

} 
+1

Alter, du bist der Beste! –

+0

100+ für diese Antwort! Danke Mann – Umar

Verwandte Themen