Mettre en place un temps d'arrêt réel pour le chargement de la page dans Selenium WebDriver?
je teste un site avec beaucoup de procurations, et le problème est que certains de ces procurations sont affreusement lent. Par conséquent, mon code est bloqué au chargement des pages de temps en temps.
from selenium import webdriver
browser = webdriver.Firefox()
browser.get("http://example.com/example-page.php")
element = browser.find_element_by_id("someElement")
j'ai essayé beaucoup de choses comme explicit waits
ou implicit waits
et j'ai cherché pendant un certain temps, mais je n'ai pas encore trouvé de solution. Rien ne semble vraiment affecter la ligne de chargement de la page browser.get("http://example.com/example-page.php")
, et c'est pourquoi il est toujours coincé là-bas.
Quelqu'un a un solution pour cette?
mise à Jour 1:
la réponse de JimEvans a résolu mon problème précédent, et ici vous pouvez trouver un patch python pour cette nouvelle fonctionnalité.
Nouveau problème:
browser = webdriver.Firefox()
browser.set_page_load_timeout(30)
browser.get("http://example.com/example-page.php")
element = browser.find_element_by_id("elementA")
element.click() ## assume it's a link to a new page http://example.com/another-example.php
another_element = browser.find_element_by_id("another_element")
Comme vous pouvez le voir browser.set_page_load_timeout(30)
une seule touche browser.get("http://example.com/example-page.php")
ce qui signifie que si cette page se charge pendant plus de 30 secondes, elle va jeter une exception de timeout, mais le problème est qu'elle n'a aucun pouvoir sur le chargement de page tel que element.click()
, bien qu'il ne bloque pas jusqu'à ce que la nouvelle page se charge entièrement, another_element = browser.find_element_by_id("another_element")
est la nouvelle douleur dans le cul, parce que explicit waits
ou implicit waits
attendrait que la page entière se charge avant de commencer à chercher cet élément. Dans certains cas extrêmes, cela prendrait même heures. Que puis-je faire à ce sujet?
2 réponses
Vous pouvez essayer d'utiliser le temps de chargement de la page introduit dans la bibliothèque. L'implémentation n'est pas universelle, mais elle est exposée de façon certaine par les fixations .NET et Java, et a été implémentée dans le pilote Firefox maintenant, et dans le pilote IE dans le 2.22 à venir. En Java, pour régler le délai de chargement de la page à 15 secondes, le code pour le régler ressemblerait à ceci:
driver.manage().timeouts().pageLoadTimeout(15, TimeUnit.SECONDS);
si ce n'est pas exposé dans les fixations du langage Python, je suis sûr que le responsable le ferait avec empressement accepter un correctif qui l'a implémenté.
vous pouvez encore accélérer l'exécution de votre script en attendant la présence (et non pas la visibilité) de l'élément attendu pour 5-8 secondes par exemple, puis en envoyant window.stop () js Script (pour arrêter le chargement d'autres éléments ) sans attendre que la page entière se charge ou qu'elle rattrape l'exception de temporisation pour le chargement de la page après 5-8 secondes puis appeler la fenêtre.arrêt()
parce que si la page n'a pas adopté la technique de chargement paresseux (chargement seulement élément visible et chargement reste de l'élément seulement après scroll) il charge chaque élément avant de retourner la fenêtre.état prêt de sorte qu'il sera plus lent si l'un des éléments prend plus de temps à rendre.