Python, le Sélénium : "Élément est plus attaché à la DOM'
Je suis grattant un site web, www.lipperleaders.com. Je veux extraire les fonds de détail de Singapour. J'ai mis en œuvre avec succès déroulante de sélection et extrait le contenu de la première page apparaissant après la présentation des options. Mais quand j'essaie d'aller vers les pages suivantes (en rendant le code cliquez sur le bouton suivant), j'obtiens l'erreur 'Element is no longer attached to the DOM'
.
Mon code est d'environ 100 lignes, mais je peux donner une idée générale de l'écoulement de l'exécution de mon code:
... # creating driver object and all the imports
def main():
...
result = find_elements_by_tag_name('span')
...
driver.find_element_by_id("ctl00_ContentPlaceHolder1_ucDataPager_btnNext").click()
main()
main()
Ce code fonctionne très bien pour la 1ère page, mais quand main()
est appelée de nouveau après avoir cliqué sur le bouton suivant. Avant cette méthode récursive, j'ai aussi essayé de mettre cela à l'intérieur d'une boucle, puis la même erreur.
Et si j'écris le même code comme:
# some code
result = find_elements_by_tag_name('span')
driver.find_element_by_id("ctl00_ContentPlaceHolder1_ucDataPager_btnNext").click()
# some code
driver.find_element_by_id("ctl00_ContentPlaceHolder1_ucDataPager_btnNext").click()
.
.
Ce code fonctionne très bien sans aucune erreur à la prochaine page se charge et exécute le code écrit par la suite. Mais je ne peux pas écrire la même driver.find_element_by_id().click()
de 500 pages, de même je vais avoir à répéter le reste du code associé à chaque page. C'est pourquoi je suis en train de boucle ou de la récursivité, mais sa ne fonctionne pas pour moi.
S'il vous plaît laissez-moi savoir quel est le problème avec mon approche.
OriginalL'auteur Vipul | 2014-05-26
Vous devez vous connecter pour publier un commentaire.
Le problème est que l'élément est détaché par un peu de javascript. Donc, vous devriez faire le pilote d'attente pour l'élément: Cela se fait par la mise en
implicitly_wait
, voir:de
http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp#implicit-waits
'Element not found in the cache - perhaps the page has changed since it was looked up'
Vous devez à la recherche de l'élément dans chaque étape de l'itération de la boucle. ainsi, dans chaque itération, vous faites quelque chose comme
next_button = driver.find_element_by_id('btnNextId') next_btn.click()
oui, c'est exactement ce que je fais après chaque itération en cliquant sur le bouton suivant pour passer à la prochaine page, mais ensuite, c'est montrer
Element not found in the cache..
. J'ai vidé le cache de firefox puis il a rampé 5-6 pages, puis de nouveau donné cette erreur.Hmm c'est vraiment étrange... Alors vous voudrez peut-être commencer votre pilote avec cache pas que d'ici: code.google.com/p/selenium/issues/detail?id=40
Le lien donné par ProfHase85 a été très utile, voir ici: github.com/seleniumhq/selenium-google-code-issue-archive/issues/... démarrer le pilote sans cache
OriginalL'auteur ProfHase85
Il semble que ce soit une rassis élément exception, généralement, il se produit lorsque vous essayez de trouver des.
Which gets loaded every time but you found it earlier
, donc c'est un rassis.Je vous suggère d'utiliser certains méthode personnalisée pour éviter cela, l'Un de la solution la plus simple:
OriginalL'auteur Priyanshu Shekhar