Selenium - Sincronização

Para sincronizar entre a execução do script e o aplicativo, precisamos esperar após realizar as ações apropriadas. Vejamos as maneiras de conseguir o mesmo.

Thread.Sleep

Thread.Sleep é uma espera estática e não é uma boa maneira de usá-la em scripts, pois é uma espera sem condições.

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

Esperas explícitas

Uma 'espera explícita' espera que uma determinada condição ocorra antes de prosseguir. É usado principalmente quando desejamos clicar ou agir sobre um objeto quando ele estiver visível.

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

Espera Implícita

A espera implícita é usada nos casos em que o WebDriver não consegue localizar um objeto imediatamente devido à sua indisponibilidade. O WebDriver aguardará por um tempo de espera implícito especificado e não tentará encontrar o elemento novamente durante o período de tempo especificado.

Assim que o limite de tempo especificado for ultrapassado, o webDriver tentará pesquisar o elemento mais uma vez pela última vez. Após o sucesso, ele prossegue com a execução; em caso de falha, ele lança exceção.

É uma espécie de espera global, o que significa que a espera é aplicável a todo o driver. Portanto, codificar esta espera por períodos de tempo mais longos dificultará o tempo de execução.

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

Espera Fluente

Uma instância FluentWait define a quantidade máxima de tempo de espera para que uma condição ocorra, bem como a frequência com a qual verificar a existência da condição do objeto.

Digamos que teremos 60 segundos para que um elemento esteja disponível na página, mas verificaremos sua disponibilidade uma vez a cada 10 segundos.

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