2017-01-19 3 views
14

Ich lerne immer noch und als Antwort auf eine meiner Fragen: here, wurde mir gesagt, dass es fällig sein könnte, weil das fragliche Element nicht in Sicht ist.Scrollen zu Element mit Webdriver?

Ich sah die Dokumentation durch und SO, hier war die relevanteste Antwort: here

Sie können die „org.openqa.selenium.interactions.Actions“ Klasse verwenden, um ein Element zu bewegen:

WebElement element = driver.findElement(By.id("my-id")); 
Actions actions = new Actions(driver); 
actions.moveToElement(element); 
## actions.click(); 
actions.perform(); 

Wenn ich versuche, das obige zu verwenden, um zu dem Element zu scrollen: Es sagt WebElement nicht definiert.

Ich denke, das ist, weil ich das relevante Modul nicht importiert habe. Kann jemand darauf hinweisen, was ich importieren soll?

Bearbeiten: Wie von Alecxe hingewiesen, war dies Java-Code.

Aber in der Zwischenzeit direkt nach dem Versuch, es für einige Zeit herauszufinden. Ich habe die Importmethode für WebElement herausgefunden:

from selenium.webdriver.remote.webelement import WebElement 

Könnte jemandem wie mir helfen.

Die, wie es ist auch eine gute Lektion, IMO:

gingen an: Documentation Die

class selenium.webdriver.remote.webelement.WebElement(parent, id_, w3c=False) 

in die Befehlsform oben erwähnt getrennt werden müssen.

Antwort

28

Sie versuchen, Java-Code mit Python auszuführen. In Python/Selen sind die org.openqa.selenium.interactions.Actions in ActionChains class wider:

from selenium.webdriver.common.action_chains import ActionChains 

element = driver.find_element_by_id("my-id") 

actions = ActionChains(driver) 
actions.move_to_element(element).perform() 

Alternativ können Sie "blättern in den Blick" über scrollIntoView() auch:

driver.execute_script("arguments[0].scrollIntoView();", element) 

Wenn Sie in den Unterschieden Interesse:

+0

Ah ... da war ich für 3 Stunden probiert jede Methode, die ich auf SO und die Dokumentation gefunden. Ich habe die erste Lösung versucht, muss es aber irgendwie durcheinander gebracht haben. Ich werde ScrollIntoView Vs moveToElement lesen. Nur eine kurze Frage, ich brauche die gleichen Schritte, die ich 100 Mal machen muss, ich denke daran, eine "for" -Schleife zu verwenden. Wäre das ein guter Ansatz? – Sid

+0

@Sid schwer zu sagen. In bestimmten Fällen können Sie die Aktionen einfach in einer Schleife verketten und dann nach der Schleife ausführen, aber alles hängt von einem Anwendungsfall ab.Sehen Sie, ob es sinnvoll ist, ein separates SO-Thema dafür zu erstellen, wenn Hilfe benötigt wird. Vielen Dank. – alecxe

12

Es ist keine direkte Antwort auf Frage (es ist nicht etwa Actions), aber es können Sie auch leicht auf die gewünschte Element blättern:

element = driver.find_element_by_id('some_id') 
element.location_once_scrolled_into_view 

Dies ist eigentlich die Absicht, Sie Koordinaten zurückzukehren (x, y) des Elements auf Seite, aber scrollen Sie auch nach unten nach Zielelement

+0

Dank @Andersson Ich habe versucht, den Weg zu finden, da Sie darauf hingewiesen haben, dass dies das Problem auf der anderen Frage sein könnte. :) – Sid

+1

zuerst habe ich '() 'hinter, und Fehler' 'dict' Objekt ist nicht aufrufbar ', ich überprüfte den Elementtyp ist' WebElement'. Dann entfernte ich '()' und arbeitete. Ist das nicht eine Methode? Ich meine, warum kein '()' brauchen? –

+0

@LeiYang, weil location_once_scrolled_into_view eine Python [Eigenschaft] ist (https://stackoverflow.com/questions/17330160/how-does-the-property-decorator-work). Eigenschaften nimmt keine Argumente (außer Objekt-Instanz -self) und sollte ohne Klammern aufgerufen werden – Andersson

Verwandte Themen