web-dev-qa-db-fra.com

Selenium - Comment attendre que la page soit complètement chargée

J'essaie d'automatiser certains cas de test à l'aide de Java et de Selenium WebDriver. J'ai le scénario suivant:

  • Il y a une page nommée 'Produits'. Lorsque je clique sur le lien "Afficher les détails" de la page "Produit", une fenêtre contextuelle (boîte de dialogue modale) contenant les détails de l'élément apparaît.
  • Lorsque je clique sur le bouton 'Fermer' dans la fenêtre contextuelle, la fenêtre contextuelle se ferme et la page se régénère automatiquement (la page est en cours de rechargement, le contenu reste inchangé).
  • Après avoir fermé la fenêtre, je dois cliquer sur le bouton "Ajouter un élément" dans la même page. Mais lorsque WebDriver essaie de trouver le bouton "Ajouter un élément", si la vitesse de la connexion Internet est trop rapide, WebDriver peut rechercher et cliquer sur l'élément.

  • Mais si Internet est lent, WebDriver trouve le bouton avant l'actualisation de la page, mais dès que WebDriver clique dessus, la page s'actualise et StaleElementReferenceException se produit.

  • Même si différentes attentes sont utilisées, toutes les conditions d’attente deviennent vraies (puisque le contenu de la page est identique avant et après le rechargement) avant même que la page ne soit rechargée et que StaleElementReferenceException ne se produise.

Le scénario de test fonctionne correctement si vous utilisez Thread.sleep(3000); avant de cliquer sur le bouton "Ajouter un élément". Existe-t-il une autre solution de contournement à ce problème?

51
stackoverflow

3 réponses que vous pouvez combiner:

1.) Définissez une attente implicite immédiatement après la création de l'instance de pilote Web: driver.manage().timeouts().implicitlyWait(). Cela essaiera d'attendre que la page soit complètement chargée à chaque navigation ou rechargement de page.

2.) Après la navigation dans la page, appelez JavaScript return document.readyState jusqu'à ce que "complete" soit renvoyé. L'instance de pilote Web peut servir d'exécuteur JavaScript. exemple de code:

C #

new WebDriverWait(driver, MyDefaultTimeout).Until(
    d => ((IJavaScriptExecutor) d).ExecuteScript("return document.readyState").Equals("complete"));

Java

new WebDriverWait(firefoxDriver, pageLoadTimeout).until(
          webDriver -> ((JavascriptExecutor) webDriver).executeScript("return document.readyState").equals("complete"));

3.) Après 2.), vérifiez si l'URL correspond au modèle souhaité.

62
Kim Homann

Il semble que vous deviez attendre que la page soit rechargée avant de cliquer sur le bouton "Ajouter". Dans ce cas, vous pouvez attendre que l'élément "Add Item" devienne périmé avant de cliquer sur l'élément rechargé:

WebDriverWait wait = new WebDriverWait(driver, 20);
By addItem = By.xpath("//input[.='Add Item']");

// get the "Add Item" element
WebElement element = wait.until(ExpectedConditions.presenceOfElementLocated(addItem));

//trigger the reaload of the page
driver.findElement(By.id("...")).click();

// wait the element "Add Item" to become stale
wait.until(ExpectedConditions.stalenessOf(element));

// click on "Add Item" once the page is reloaded
wait.until(ExpectedConditions.presenceOfElementLocated(addItem)).click();
13
Florent B.

Vous pouvez le faire de différentes manières avant de cliquer sur ajouter des éléments:

WebDriverWait wait = new WebDriverWait(driver, 40);
wait.until(ExpectedConditions.elementToBeClickable(By.id("urelementid")));// instead of id u can use cssSelector or xpath of ur element.


or

wait.until(ExpectedConditions.visibilityOfElementLocated("urelement"));

vous pouvez aussi attendre comme ça. Si vous voulez attendre l’invisible de l’élément de la page précédente:

wait.until(ExpectedConditions.invisibilityOfElementLocated("urelement"));

voici le lien où vous trouverez toutes les API Selenium WebDriver qui peuvent être utilisées pour attendre et sa documentation.

https://Selenium.googlecode.com/git/docs/api/Java/org/openqa/Selenium/support/ui/ExpectedConditions.html

7
noor