Sélénium - Synchronisation

Pour synchroniser entre l'exécution du script et l'application, nous devons attendre après avoir effectué les actions appropriées. Examinons les moyens d’y parvenir.

Thread.Sleep

Thread.Sleep est une attente statique et ce n'est pas un bon moyen à utiliser dans les scripts car il est en veille sans condition.

Thread.Sleep(1000); //Will wait for 1 second.

Attentes explicites

Une «attente explicite» attend qu'une certaine condition se produise avant de continuer. Il est principalement utilisé lorsque l'on veut cliquer ou agir sur un objet une fois qu'il est visible.

WebDriver driver = new FirefoxDriver();
driver.get("Enter an URL"S);
WebElement DynamicElement = 
   (new WebDriverWait(driver, 10)).until(ExpectedConditions.presenceOfElementLocated(By.id("DynamicElement")));

Attente implicite

L'attente implicite est utilisée dans les cas où le WebDriver ne peut pas localiser immédiatement un objet en raison de son indisponibilité. Le WebDriver attendra un temps d'attente implicite spécifié et il n'essayera pas de retrouver l'élément pendant la période spécifiée.

Une fois que le délai spécifié est dépassé, le WebDriver essaiera de rechercher à nouveau l'élément une dernière fois. En cas de succès, il procède à l'exécution; en cas d'échec, il lance une exception.

C'est une sorte d'attente globale qui signifie que l'attente est applicable à l'ensemble du pilote. Par conséquent, coder en dur cette attente pendant des périodes plus longues entravera le temps d'exécution.

WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("Enter an URL");
WebElement DynamicElement = driver.findElement(By.id("DynamicElement"));

Attente fluide

Une instance FluentWait définit la durée maximale d'attente pour qu'une condition se produise, ainsi que la fréquence à laquelle vérifier l'existence de la condition d'objet.

Disons que nous mettrons 60 secondes pour qu'un élément soit disponible sur la page, mais nous vérifierons sa disponibilité une fois toutes les 10 secondes.

Wait wait = 
   new FluentWait(driver).withTimeout(60, SECONDS).pollingEvery(10, SECONDS).ignoring(NoSuchElementException.class);
   
   WebElement dynamicelement = wait.until(new Function<webdriver,webElement>() {
   
   public WebElement apply(WebDriver driver) {
      return driver.findElement(By.id("dynamicelement"));
   }
});