J'essaie d'automatiser certains cas de test à l'aide de Java et de Selenium WebDriver. J'ai le scénario suivant:
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.
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?
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é.
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();
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.