Diferenca entre visibilityOfElement e presenceOfElement no Selenium WebDriver

Olá pessoal!

Se você não sabe qual a diferença destes dois comandos, este post é para você!
Tome um tempo, fique atendo ao exemplo e tente executa-lo depois.

Sobre esperas

Estes dois métodos são de esperas proveniente da classe ExpectedConditions do Selenium WebDriver.
Algumas pessoas costumam confundir estas duas esperas e não saber como realmente utiliza-las.

Vale lembrar que, para chegar até um destes métodos é necessário declarar uma espera explícita:

WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("id")));
wait.until(ExpectedConditions.presenceOfElementLocated(By.id("id")));

visibilityOfElementLocated

Verifica se o elemento existe e está visível na página e possui um tamanho e largura maior do que zero.
Esta condição irá esperar até encontrar o elemento presente e visível na página.

Caso o elemento esteja presente na página, mas invisível,  a condição de espera irá falhar após o tempo máximo de espera estipulado no new WebDriverWait.

Elementos invisíveis pode ser aplicados de diversas formas:

Exemplo

@Test
public void testeVisibilityOf() {
   // codigo de inicializacao do driver ignorado
        
   WebDriverWait wait = new WebDriverWait(driver, 5);
   driver.get("http://eliasnogueira.com/arquivos_blog/selenium/esperas/");
        
   driver.findElement(By.id("visibility")).click();
   wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("alerta-visivel")));
}

 

presenceOfElementLocated

Verifica se o elemento está presente no DOM (Document Object Model) da página (se ele existe de verdade como algumas das tags de HTML).
Esta condição irá esperar até encontrar um elemento presente na página, mas que pode estar invisível.

Caso o elemento não esteja presente na página a  condição de espera irá falhar após o tempo máximo de espera estipulado no new WebDriverWait.

Geralmente alguns frameworks ou mesmo a abordagem do programador fazem com que os elementos sejam “injetados”, ou seja, ele não existia até o momento, mas depois de alguma ação (um clique, tempo pré-definido, etc…) ele é adicionado dinamicamente na página.

Exemplo

@Test
public void testePresenceOf() {
   // codigo de inicializacao do driver ignorado
        
   WebDriverWait wait = new WebDriverWait(driver, 5);
   driver.get("http://eliasnogueira.com/arquivos_blog/selenium/esperas/");
        
   driver.findElement(By.id("presence")).click();
   wait.until(ExpectedConditions.presenceOfElementLocated(By.id("alerta-presente")));
}

 

Página de exemplo

A página de exemplo http://eliasnogueira.com/arquivos_blog/selenium/esperas/ foi criada para que você visualize as diferenças entre as duas esperas.

O botão visibility, quando clicado, apresenta depois de 5 segundos um elemento já existente dentro do HTML, mas que estava invisível.
Noque que, na imagem abaixo, o elemento div com id=”alerta-visivel” está presente na página, mas não visível.

O botão presence, quando clicado, apresenta um elemento que não existia na página (DOM) depois de 5 segundos.
Note que, na imagem abaixo, não há elementos abaixo do botão presence. Após o clique neste botão o elemento é “injetado” no HTML através da seguinte função que criei com JQuery

$("#presence").after("<div id='alerta-presente' class='alert alert-warning' role='alert'>This is a warning alert—check it out!</div>");

 

Exercício

Depois de você executar os dois exemplos tente trocar a espera do visibility por presence.
O resultado será a execução instantânea do script, pois o elemento estará presente, porém invisível.

 

Qualquer dúvida, postem o seu comentário!
Até mais!

Leave a Reply

Your email address will not be published. Required fields are marked *