296 votes

Attendre le chargement de la page en Selenium

Comment faites-vous attendre Selenium 2.0 pour charger la page?

8 votes

À mes yeux, seule la réponse de Paul semble correcte, la plupart des réponses les mieux votées parlent d'attendre un élément particulier.

152voto

Imran Points 391

Vous pouvez également vérifier si la page est chargée en utilisant le code suivant

IWait wait = new OpenQA.Selenium.Support.UI.WebDriverWait(driver, TimeSpan.FromSeconds(30.00));

 wait.Until(driver1 => ((IJavaScriptExecutor)driver).ExecuteScript("return document.readyState").Equals("complete"));

37 votes

Vous penseriez que quelque chose comme ça serait intégré. Attendre le chargement des pages est assez courant sur le web.

24 votes

Est-ce que cela fonctionne vraiment tout le temps? Peut-être que je manque quelque chose dans votre code mais vous attendez que le DOM soit prêt. Mais gardez à l'esprit que si votre code s'exécute trop rapidement, la page précédente pourrait ne pas être déchargée et il renverra true même si vous êtes toujours sur l'ancienne page. Ce que vous devez faire est d'attendre que la page actuelle se décharge, puis appeler votre code ci-dessus. Une façon de détecter le déchargement de la page est d'obtenir un élément web sur la page actuelle et d'attendre qu'il devienne obsolète. obeythetestinggoat.com/…

8 votes

FYI - Même ainsi, ce qui précède ne garantit pas que la page est complète - simplement que le dom est prêt. Un élément dojo/jquery peut toujours être en train de construire dynamiquement des éléments sur la page, donc vous pourriez avoir besoin d'attendre d'abord les éléments dynamiques avant d'interagir avec eux.

100voto

Artem Points 983

Utilisez la classe WebDriverWait

Voir aussi ici

Vous pouvez vous attendre à afficher un élément, quelque chose comme en C#:

WebDriver _driver = new WebDriver();
WebDriverWait _wait = new WebDriverWait(_driver, new TimeSpan(0, 1, 0));

_wait.Until(d => d.FindElement(By.Id("Id_Your_UIElement")));

0 votes

Cela a très bien fonctionné. C'est une très belle manière moderne de résoudre le problème.

0 votes

Qu'est-ce que ce TimeSpan signifie, devrions-nous créer une méthode comme TimeSpan ou est-ce une méthode intégrée?

3 votes

@EmmanuelAngelo.R TimeSpan est une structure de données .Net.

43voto

Sam Points 799

Si vous définissez l'attente implicite du pilote, puis appelez la méthode findElement sur un élément que vous vous attendez à trouver sur la page chargée, le WebDriver va interroger cet élément jusqu'à ce qu'il le trouve ou atteigne la valeur de temps d'attente.

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

source: attentes-implicites

6 votes

Il ne servira à rien d'attendre le chargement de la page.

0 votes

Cela signifie qu'il va essayer quelque chose pendant 10 secondes, avant de lever une exception. Ainsi, il ne peut pas garantir un délai de 10 secondes.

1 votes

@xyz - pourquoi est-ce que cela ne va pas aider ?

36voto

Paul Hadfield Points 3650

En général, avec Selenium 2.0, le pilote Web ne devrait rendre le contrôle au code appelant que lorsqu'il a déterminé que la page a été chargée. Sinon, vous pouvez appeler waitforelemement, qui tourne en boucle en appelant findelement jusqu'à ce qu'il soit trouvé ou que le délai d'attente soit dépassé (le délai d'attente peut être défini).

2 votes

En ajoutant à la réponse de Paul. Veuillez également vérifier stackoverflow.com/questions/5858743/….

30 votes

Malheureusement, Selenium 2 n'attend pas dans tous les cas le chargement d'une page. Par exemple, WebElement:click() n'attend pas et cela est explicitement indiqué dans le Javadoc correspondant. Cependant, ils ne disent pas comment je peux vérifier si une nouvelle page est chargée. Si click() provoque le chargement d'une nouvelle page via un événement ou est effectué en envoyant un événement natif (ce qui est courant sur Firefox, IE sur Windows) alors la méthode n'attendra pas que la page soit chargée et l'appelant devrait vérifier qu'une nouvelle page a été chargée.

0 votes

De doc ..et la méthode bloquera jusqu'à ce que le chargement soit complet...

25voto

allenhwkim Points 6012

Implémentation Ruby :

wait = Selenium::WebDriver::Wait.new(:timeout => 10)
wait.until {
    @driver.execute_script("return document.readyState;") == "complete" 
}

20 votes

Equivalence en Python: WebDriverWait(driver, 10).until(lambda d: d.execute_script('return document.readyState') == 'complete')

5 votes

Python utilise le code ci-dessus mais n'oubliez pas cette ligne..| from selenium.webdriver.support.ui import WebDriverWait

0 votes

J'ai eu un problème en cliquant sur un élément lorsque la page n'était pas entièrement chargée. En Python, j'ai essayé time.sleep(30). Ça a fonctionné. Il attendra toujours au maximum 30 secondes cependant. J'ai ensuite essayé le code suivant et c'est plus efficace maintenant, plus rapide. WebDriverWait(driver, 10).until(lambda d: driver.find_element_by_xpath("//div[. = 'Administration']").click())

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