Python Selenium - Element introuvable?

Fermé
Medestrac - 11 janv. 2023 à 13:27
 Medestrac - 11 janv. 2023 à 17:00

Bonjour,

J'utilise quotidiennement une application web.

Je souhaite automatiser l'activation de certaines options que je dois refaire chaque fois que j'arrive sur la page. J'utilise donc Selenium, mais j'ai régulièrement des erreurs. Voici mon code:

from webdriver_manager.chrome import ChromeDriverManager
from selenium import webdriver

from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By


driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))

driver.implicitly_wait(20)

driver.get("adresse de mon appli")

driver.find_element(By.ID, "identificatorLogin").send_keys("MonIdentifiant")
driver.find_element(By.ID, "passwordLogin").send_keys("MonMotdePasse")
driver.find_element(By.ID, "loginCnx").click()

driver.find_element(By.ID, "addMachines").click()

Quand je lance ça: la page web s'ouvre et arrive sur l'écran d'authentification. L'identifiant et le mot de passe sont automatiquement saisis et validés en cliquant sur "loginCnx".

J'arrive donc sur une seconde page, qui contient un bouton "addMachines" sur lequel je veux cliquer...mais ça ne marche pas systématiquement, j'obtiens régulièrement une erreur:

selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document

J'ai donc décidé de lister mes élements pour voir ce qu'il y a dedans:

Mon code:

ids = driver.find_elements(By.XPATH,'//*[@id]')
print("Taille", len(ids))
for ii in ids:
    # print ii.tag_name
    print(ii.get_attribute('id'))

Son exécution donne également un résultat variable. La taille est toujours 23. Mais le nombre d'éléments affichés avant l'erreur varie: généralement entre 5 et 8:

Taille 23

diagonal-stripe
triangle
sideMenuMachine
addMachineMenuMachineNew
addMachines
hideMachinesMenuButton
Traceback (most recent call last):
...
selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
  (Session info: chrome=108.0.5359.125)
Stacktrace:
Backtrace:
...

Je retrouve bien mon bouton "addMachines".

Je ne comprend pas pourquoi il ne va pas jusqu'au bout de la boucle for pour m'afficher les 23 éléments...et je ne comprends pas pourquoi il ne veut pas cliquer sur "addMachines" (enfin...pas toujours. De temps en temps ça marche...ce qui m'intrigue d'autant plus!)
Windows / Firefox 108.0

3 réponses

jordane45 Messages postés 38270 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 5 novembre 2024 4 695
11 janv. 2023 à 14:26

Bonjour,

Entre le moment où tu cliques sur la connexion et celui où tu veux cliquer sur ton bouton addMachine.. il serait sûrement utile de mettre une temporisation.

Je pense que le temps de chargement de la page peut être plus ou moins long

A voir de ce côté la peut-être ::https://www.selenium.dev/selenium/docs/api/py/webdriver_support/selenium.webdriver.support.wait.html#module-selenium.webdriver.support.wait


0

Je pensais que la commande

driver.implicitly_wait(20)

a justement pour vocation de palier à ces temps de chargement.

0
jordane45 Messages postés 38270 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 5 novembre 2024 4 695
11 janv. 2023 à 16:32

J'ai l'impression que les données sont chargées en ajax sur la page après le login. (du moins c'est l'impression que j'ai )

Je ne sais pas si implicitly_wait suffit dans ce cas

As tu essayé d'augmenter la durée à 30 pour voir si ça améliore le taux de réussite ?

0

Oui...c'est pas mieux.

Je viens de voir quelque chose sur les iFrames, comme quoi il faut naviguer au bon endroit avant de cliquer, mais je n'ai pas encore tout compris. Je verrai ça demain.

0