118 votes

Vérifier si un élément existe avec Python Selenium

J'ai un problème ; j'utilise le pilote web Selenium (Firefox) pour ouvrir une page web, cliquer sur quelques liens, etc. et ensuite faire une capture d'écran.

Mon script fonctionne correctement à partir de l'interface de gestion, mais lorsqu'il est exécuté via une commande travail cron il ne passe pas le premier test find_element(). J'ai besoin d'ajouter du débogage, ou quelque chose qui m'aide à comprendre pourquoi il échoue.

En fait, je dois cliquer sur une ancre "log in" avant d'accéder à la page de connexion. La construction de l'élément est :

<a class="lnk" rel="nofollow" href="http://stackoverflow.com/login.jsp?destination=/secure/Dash.jspa">log in</a>

J'utilise le trouver_élément Par la méthode LINK_TEXT :

login = driver.find_element(By.LINK_TEXT, "log in").click()

A) Comment vérifier que le lien est bien repris par Python ? Dois-je utiliser un bloc try/catch ?

B) Existe-t-il un moyen plus efficace ou plus fiable de localiser les DOM que par LINK_TEXT ? Par exemple, dans jQuery vous pouvez utiliser un sélecteur plus spécifique, $('a.lnk:contains(log in)').do_something() ;


J'ai résolu le problème principal et ce n'était qu'un problème de doigts. J'appelais le script avec des paramètres incorrects - une simple erreur.

J'aimerais tout de même avoir des indications sur la manière de vérifier si un élément existe. Aussi, un exemple/explication des Waits implicites / explicites au lieu d'utiliser un appel time.sleep() merdique.

175voto

Alex Okrushko Points 1711

Pour a) :

from selenium.common.exceptions import NoSuchElementException
def check_exists_by_xpath(xpath):
    try:
        webdriver.find_element_by_xpath(xpath)
    except NoSuchElementException:
        return False
    return True

Pour b) : De plus, vous pouvez prendre l'expression XPath comme standard dans tous vos scripts et créer des fonctions comme mentionné ci-dessus pour une utilisation universelle.

Je recommande d'utiliser Sélecteurs CSS . Je recommande de ne pas mélanger/utiliser "by id", "by name", etc. et d'utiliser plutôt une approche unique.

114voto

stumpx Points 955

Vous pouvez saisir une liste d'éléments au lieu d'un seul élément. Une liste vide en python est fausse. Exemple :

if driver.find_elements(By.CSS_SELECTOR, '#element'):
    print "Element exists!"

Vous pouvez également utiliser By.ID y By.NAME mais cela ne fait que transformer votre id ou votre nom en sélecteur css de toute façon. Fuente

69voto

Sam Woods Points 921

A) Oui. La manière la plus simple de vérifier si un élément existe est d'appeler simplement find_element à l'intérieur d'un try/catch .

B) Oui, j'essaie toujours d'identifier les éléments sans utiliser leur texte pour deux raisons :

  1. le texte est plus susceptible de changer et ;
  2. si c'est important pour vous, vous ne pourrez pas effectuer vos tests sur des versions localisées.

La solution est soit :

  1. Vous pouvez utiliser XPath pour trouver un élément parent ou ancêtre qui possède un identifiant ou un autre identifiant unique, puis trouver son enfant/descendant qui correspond à ou ;
  2. vous pourriez demander un identifiant ou un nom ou tout autre identifiant unique pour le lien lui-même.

Pour les questions de suivi, l'utilisation de try/catch est le moyen de savoir si un élément existe ou non et de bons exemples d'attente peuvent être trouvés ici : http://seleniumhq.org/docs/04_webdriver_advanced.html

27voto

Super Mario Points 341

Une solution sans try&catch et sans nouvelles importations :

if len(driver.find_elements_by_id('blah')) > 0: # Pay attention: find_element*s*
    driver.find_element_by_id('blah').click # Pay attention: find_element

7voto

vmk Points 107

Le même dans le rôle de Brian mais ajoutez à cela réponse de tstempko :

J'ai essayé et cela fonctionne rapidement :

driver.implicitly_wait(0)

if driver.find_element_by_id("show_reflist"):
    driver.find_element_by_id("show_reflist").find_element_by_tag_name("img").click()

Ensuite, je rétablis ma valeur par défaut :

driver.implicitly_wait(30)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X