2017-10-11 1 views
1

Je rencontre des difficultés pour obtenir un élément dynamique à partir d'un site Web, je reçois des informations de mon utilisateur qui est ensuite utilisé comme entrée dans un site Web, le nom de l'élément que je veux obtenir après les changements basés sur l'entrée que j'ai eu plus tôt. Par conséquent, la classe que je veux trouver a deux noms possibles, soit label label-succès ou label label-danger. En ce moment, c'est le code:Élément de recherche Python Selenium par xpath avec l'opérateur OU

for elem in browser.find_elements_by_xpath('.//span[@class = "label label success"]'): 
    print elem.text 

Mais chaque fois que je reçois l'entrée de l'utilisateur qui modifie le nom de la classe à l'étiquette étiquette danger que je reçois ci-dessous erreur

StaleElementReferenceException: Message: { "errorMessag « Element ne existe pas dans le cache}

ma question est: est-il possible de faire quelque chose comme:

find_elements_by_xpath[@class = "label label-success" OR @class = "label label-danger"] 

si oui comment? Ou existe-t-il une autre solution simple à ce problème? Merci

+0

Quelle est l'erreur que vous obtenez? ce que vous suggérez est possible –

+0

raise exception_class (message, écran, stacktrace) StaleElementReferenceException: Message: {"errorMessage": "L'élément n'existe pas dans le cache" – Dantuzzo

+0

votre deuxième xpath est valide, l'erreur que vous obtenez n'a rien à voir avec xpath, j'ai signalé la solution pour l'erreur dans les réponses –

Répondre

0

Vous pouvez essayer de les séparer en deux listes: "label label-success" et "label label-danger", puis les réitérer différemment. Ou comme ce

for elem in itertools.chain(browser.find_elements_by_xpath('.//span[@class = "label label-success"]'), browser.find_elements_by_xpath('.//span[@class = "label label-danger"]')): 
print elem.text 
+0

Cela a effectivement fonctionné pour mon problème, merci beaucoup – Dantuzzo

0

La raison pour laquelle vous obtenez StaleElementReferenceException est ci-dessous.

Vous créez une liste d'éléments WebElements et essayez d'itérer à travers cela. Cependant au moment où vous avez recueilli la liste des WebElement (ci-dessous le code)

browser.find_elements_by_xpath('.//span[@class = "label label success"]'): 

Et en essayant à une action sur elle (ci-dessous le code)

print elem.text 

Quelque chose est en train de changer sur la page. (il peut ne pas être visible) et donc webdriver vous dit que cet élément est périmé.

Le code suivant permet de résoudre le problème.

total_elements = len(browser.find_elements_by_xpath('.//span[@class = "label label success"]')) 
for index in range(total_elements): 
    print browser.find_elements_by_xpath('.//span[@class = "label label success"]')[index].text 
1

Sinon, vous devriez être en mesure d'utiliser le XPath opérateur OR |, par exemple:

find_elements_by_xpath('.//span[@class = "label label success"|@class = "label label-danger"]')