web-dev-qa-db-fra.com

Faire défiler l'élément à l'aide de webdriver?

J'apprends encore et en réponse à l'une de mes questions: ici , on m'a dit que c'était peut-être dû parce que l'élément en question n'était pas en vue.

J'ai regardé à travers la documentation et SO, voici la réponse la plus pertinente: ici

Vous pouvez utiliser la classe "org.openqa.Selenium.interactions.Actions" pour passer à un élément:

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

Lorsque j'essaie d'utiliser ce qui précède pour faire défiler jusqu'à l'élément: WebElement n'est pas défini.

Je pense que c'est parce que je n'ai pas importé le module correspondant. Quelqu'un peut-il indiquer ce que je suis censé importer?

Edit: comme le souligne alecxe, il s’agissait du code Java.

Mais entre-temps, juste après avoir essayé de comprendre pendant un certain temps. J'ai découvert la méthode d'importation pour WebElement:

from Selenium.webdriver.remote.webelement import WebElement

Peut aider quelqu'un comme moi.

Le comment est aussi une bonne leçon, IMO:

Je suis allé à: Documentation Le

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

Doit être séparé dans le formulaire de commande mentionné ci-dessus.

44
Sid

Vous essayez d'exécuter Java code avec Python. En Python/Selenium, les org.openqa.Selenium.interactions.Actions sont reflétés dans ActionChains class :

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()

Ou, vous pouvez également "faire défiler la vue" via scrollIntoView() :

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

Si vous êtes intéressé par les différences:

81
alecxe

Ce n'est pas une réponse directe à une question (il ne s'agit pas de Actions), mais cela vous permet également de faire défiler facilement l'élément requis:

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

Ceci a pour but de vous renvoyer les coordonnées (x, y) de l’élément sur la page, mais aussi de faire défiler vers le bas pour cibler l’élément

32
Andersson

En plus de move_to_element() et scrollIntoView() je voulais poser le code suivant qui tente de center l'élément dans la vue:

desired_y = (element.size['height'] / 2) + element.location['y']
window_h = driver.execute_script('return window.innerHeight')
window_y = driver.execute_script('return window.pageYOffset')
current_y = (window_h / 2) + window_y
scroll_y_by = desired_y - current_y

driver.execute_script("window.scrollBy(0, arguments[0]);", scroll_y_by)
0
Neil C. Obremski

Vous pouvez faire défiler jusqu'à l'élément en utilisant JavaScript via la méthode execute_javascript. Par exemple, voici comment je le fais en utilisant SeleniumLibrary sur Robot Framework:

web_element = self.selib.find_element(locator)
self.selib.execute_javascript(
    "ARGUMENTS",
    web_element,
    "JAVASCRIPT",
    'arguments[0].scrollIntoView({behavior: "instant", block: "start", inline: "start"});'
)
0