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.
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:
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
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)
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"});'
)