0

J'ai écrit un script en python en utilisant sélenium pour obtenir des informations spécifiques à partir d'une page web. Comme la page Web est confidentielle, je ne peux pas révéler l'adresse du site. Quoi qu'il en soit, je m'attendais à ce que mon grattoir existant cliquera sur chaque lien sur 20 liens d'une page Web et atteindra la page désirée il recueillera l'information et reviendra à la page précédente et répète la même chose jusqu'à ce que tous les 20 liens soient épuisés. Cependant, le grattoir clique sur un lien, va à la page désirée analyser l'information mais au lieu de revenir à la page principale pour répéter l'opération, il casse. Il semble que quelque chose ne va pas avec mon processus de bouclage. Voici quelques lignes de mon script qui peuvent vous donner une idée de me fournir une solution de contournement.Comment empêcher mon script de se casser après la première boucle?

for link in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".section-result"))): ##Supposed to loop through all the links 
    link.click() ##clicking each link 

    name = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".section-info-text")))[2] ##this is where the document i want to parse from. The browser gets here when a click is executed 
    print(name.text) #after parsing the docs the code breaks instead of getting back to main page 

Veuillez faire défiler vers la droite pour voir la description minimale attachée à chaque ligne. Merci.

C'est l'erreur que je vais avoir:

line 194, in check_response 
    raise exception_class(message, screen, stacktrace) 
selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document 

Répondre

-1

Si le code ne va pas revenir à la page principale, vous devrez peut-être exécuter une commande qui retourne à la page précédente (principale) , comme un bouton de retour de quelque sorte. Je ne suis pas un expert en sélénium, mais j'ai utilisé Protractor (wrapper javascript pour le sélénium) et j'ai vu des problèmes comme ça.

+0

Merci de jGraves votre réponse. Avant de poster ma question j'ai essayé avec driver.back() 'cette commande dans la position appropriée mais pas de chance. Toujours le même. – SIM

+1

@Topto: Vous devez retrouver les éléments lorsque vous êtes de retour sur la page après l'exécution de driver.back() '. Vous pouvez regarder ma dernière réponse pour référence à https://stackoverflow.com/a/46707691/975114 – Amit

+0

Merci Amit. Je suppose que cet indice pourrait faire l'affaire. Je vous le ferai savoir. – SIM

0

Le problème est essentiellement ceci:

  1. Vous obtenez tous les liens que WebElements itérer sur
  2. Vous commencez votre boucle
  3. Vous cliquez sur le premier lien qui vous amène à une nouvelle page, ce qui Cette liste de WebElements doit être périmée
  4. Vous essayez de continuer à utiliser les WebElements obsolètes, même s'ils ne sont plus connectés à rien.

Qu'est-ce que vous pouvez faire à la place:

code pseudo

linkCount = getCountOfLinks(); 

for x in range(0, linkCount-1): 
    #Get all the links again fresh, and pick the next one each iteration 
    link = getAllTheLinks[x]; 

    link.click(); 

    #the rest of your stuff 
    name = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".section-info-text")))[2] 
print(name.text)