Selenio - Sincronizzazione

Per sincronizzare tra l'esecuzione dello script e l'applicazione, è necessario attendere dopo aver eseguito le azioni appropriate. Vediamo i modi per ottenere lo stesso.

Discussione, sonno

Thread.Sleep è un'attesa statica e non è un buon modo da usare negli script poiché è sleep senza condizioni.

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

Attese esplicite

Un '"attesa esplicita" attende che si verifichi una determinata condizione prima di procedere ulteriormente. Viene utilizzato principalmente quando vogliamo fare clic o agire su un oggetto una volta che è visibile.

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

Attesa implicita

L'attesa implicita viene utilizzata nei casi in cui WebDriver non è in grado di individuare immediatamente un oggetto a causa della sua indisponibilità. Il WebDriver attenderà un tempo di attesa implicito specificato e non tenterà di trovare nuovamente l'elemento durante il periodo di tempo specificato.

Una volta superato il limite di tempo specificato, il webDriver proverà a cercare l'elemento ancora una volta per l'ultima volta. In caso di successo, procede con l'esecuzione; in caso di fallimento, genera un'eccezione.

È una sorta di attesa globale, il che significa che l'attesa è applicabile per l'intero driver. Quindi, l'hardcoding di questa attesa per periodi di tempo più lunghi ostacolerà il tempo di esecuzione.

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

Aspetta fluente

Un'istanza di FluentWait definisce la quantità massima di tempo di attesa per il verificarsi di una condizione, nonché la frequenza con cui verificare l'esistenza della condizione dell'oggetto.

Supponiamo che avremo 60 secondi affinché un elemento sia disponibile sulla pagina, ma controlleremo la sua disponibilità una volta ogni 10 secondi.

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"));
   }
});