Dúvida em comando wait no selenium webdriver

854 views
Skip to first unread message

Tarso Roberto Oliveira da Rosa

unread,
Dec 27, 2016, 12:42:35 PM12/27/16
to Selenium Brasil
Pessoal, alguém pode ajudar?

Estou automatizando um teste para batida de ponto onde após logar no sistema, eu seleciono a data inicial e a data final para pesquisa.

Eu havia colocado o comando "Wait" antes de cada elemento e o teste rodava normalmente.

Comentei os comandos "Wait" e adicionei o comando "driver.manage().timeouts().implicitlyWait(3000, TimeUnit.MILLISECONDS);"

Ocorre que agora, ele clica no calendário e seleciona a data inicial da pesquisa, mas quando deveria clicar no calendário para selecionar a data final, ocorre o erro abaixo:

org.openqa.selenium.WebDriverException: unknown error: Element is not clickable at point (450, 398). Other element would receive the click: <a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$calendario','6181')" style="color:Black" title="03 de dezembro">...</a>

Elias Nogueira

unread,
Dec 27, 2016, 1:22:34 PM12/27/16
to Tarso Roberto Oliveira da Rosa, selenium-brasil
Eu recomendo tu manter as tuas esperar explícitas.
Deixar agora a espera implícita pode causar varios efeitos colaterais como esta acontecendo agora e ela não é mais recomendada...

Se tu ainda quiser mante-la a solução é tu colocar a espera explícita somente para o calendário.


Abraço!

--
Visite em https://groups.google.com/d/forum/selenium-brasil
---
Você recebeu essa mensagem porque está inscrito no grupo "Selenium Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para selenium-brasil+unsubscribe@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/selenium-brasil.
Para mais opções, acesse https://groups.google.com/d/optout.

Tarso Roberto Oliveira da Rosa

unread,
Dec 27, 2016, 1:29:19 PM12/27/16
to Selenium Brasil, tarsoro...@gmail.com
Elias, hoje meu código está assim, com um wait antes de cada elemento, pois se tirar ele não encontra.
Desta forma seria correto?


synchronized (this){
this.wait (2000);
}
WebElement periodoini = driver.findElement(By.name("ctl00$ContentPlaceHolder1$imbCalendarioIni")); //Seleciona o calendário inicial
periodoini.click(); 
synchronized (this){ 
this.wait (2000);
}
WebElement dataini = driver.findElement(By.cssSelector("#ctl00_ContentPlaceHolder1_calendario > tbody > tr:nth-child(3) > td:nth-child(5) > a"));
dataini.click(); 
synchronized (this){ 
this.wait (2000);
}
WebElement periodofim = driver.findElement(By.name("ctl00$ContentPlaceHolder1$imbCalendarioFim"));
periodofim.click();
synchronized (this){ 
this.wait (2000);
}

WebElement datafim = driver.findElement(By.cssSelector("#ctl00_ContentPlaceHolder1_calendario > tbody > tr:nth-child(7) > td:nth-child(7) > a"));
datafim.click();
synchronized (this){ 
this.wait (2000);
}

WebElement atualizar = driver.findElement(By.className("PaginasPanelBotaoTexto"));
atualizar.click();
synchronized (this){ 
this.wait (2000);
}
WebElement ajustaponto = driver.findElement(By.cssSelector("#ctl00_ContentPlaceHolder1_dgvGrade > tbody > tr:nth-child(30) > td:nth-child(1) > a"));
ajustaponto.click();

synchronized (this){
this.wait(2000);
}
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para selenium-bras...@googlegroups.com.

Elias Nogueira

unread,
Dec 27, 2016, 2:00:16 PM12/27/16
to Tarso Roberto Oliveira da Rosa, Selenium Brasil
Oi Tarso,
É a primeira vez que eu vejo alguém usando esperas desta forma...

O this.wait() que tu estás usando não é do Selenium mas sim do Java, logo presumo que tu queira usar o do Selenium, correto?
Todo objeto em Java tem um método chamado wait que dispara um tempo de parada da thread (pausa). Se a tua classe ou alguma classe herdada não for uma extensão da classe Thread não vai funcionar....

A minha recomendação é tu usar uma espera explícita.
Exemplo:

WebDriverWait wait = new WebDriverWait(driver, 10);
By calendarioIni = By.name("ctl00$ContentPlaceHolder1$imbCalendarioIni"));

wait.until(ExpectedConditions.presenceOfElementLocatedBy(calendarioIni));
driver.findElement(calendarioIni).click();


Uma vez que tu já tenha criado o objeto wait do WebDriverWait, pode usá-lo para esperar qualquer elemento.



Abraço!


--
Elias Nogueira


Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para selenium-brasil+unsubscribe@googlegroups.com.

Tarso Roberto Oliveira da Rosa

unread,
Dec 28, 2016, 7:18:47 AM12/28/16
to Selenium Brasil, tarsoro...@gmail.com
Oi Elias, segui tuas orientações e alterei o código.
Ficou bem mais limpo, mas o problema voltou a ocorrer. 
Ele acessa o calendarioIni e seleciona o dia, mas da erro ao tentar acessar o calendarioFim.

Elias Nogueira

unread,
Dec 28, 2016, 9:32:18 AM12/28/16
to Tarso Roberto Oliveira da Rosa, Selenium Brasil
Oi Tarso,
A primeira alteração que tu precisa fazer é trocar o presenceOfAllElementsLocated by por presenceOfElementLocatedBy
Tu estás usando a localização por todos os elementos... mas na verdade tu só precisas localizar um.

Como o erro é sobre o elementNotClickable tu podes usar a seguinte espera: elementToBeClickable
Isso vai fazer com que a espera aguarde até o elemento ser clicável.
Tu podes mandar a espera pela presença do elemento, e depois aplicar esta nova.


Abraço!



--
Elias Nogueira


Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para selenium-brasil+unsubscribe@googlegroups.com.

Tarso Roberto Oliveira da Rosa

unread,
Dec 28, 2016, 10:23:18 AM12/28/16
to Selenium Brasil, tarsoro...@gmail.com
Oi Elias, desculpe estar tomando teu tempo, mas não resolveu. Não sei se fiz as alterações corretas.

Meu código esta assim agora:

WebDriverWait wait = new WebDriverWait(driver, 10);
By calendarioIni = By.cssSelector("#ctl00_ContentPlaceHolder1_imbCalendarioIni");
wait.until(ExpectedConditions.presenceOfElementLocated(calendarioIni));
driver.findElement(calendarioIni).click();
By dataIni = By.cssSelector("#ctl00_ContentPlaceHolder1_calendario > tbody > tr:nth-child(3) > td:nth-child(5) > a");
wait.until(ExpectedConditions.presenceOfElementLocated(dataIni));
         driver.findElement(dataIni).click();
By calendarioFim = By.cssSelector("#ctl00_ContentPlaceHolder1_imbCalendarioFim");
wait.until(ExpectedConditions.elementToBeClickable(calendarioFim));
---->>>> driver.findElement(calendarioFim).click();
By dataFim = By.cssSelector("#ctl00_ContentPlaceHolder1_calendario > tbody > tr:nth-child(7) > td:nth-child(7) > a");
wait.until(ExpectedConditions.presenceOfElementLocated(dataFim));
driver.findElement(dataFim).click();



O erro ocorre na terceira linha do terceiro bloco.

org.openqa.selenium.WebDriverException: unknown error: Element is not clickable at point (450, 398). Other element would receive the click: <a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$calendario','6181')" style="color:Black" title="03 de dezembro">...</a>


Elias Nogueira

unread,
Dec 28, 2016, 10:29:11 AM12/28/16
to Tarso Roberto Oliveira da Rosa, Selenium Brasil
Opra... capaz...
Tenta adicionar antes do elementToBeClickable o presenceOfElement

By calendarioFim = By.cssSelector("#ctl00_ContentPlaceHolder1_imbCalendarioFim");
wait.until(ExpectedConditions.presenceOfElementLocated(calendarioFim));
wait.until(ExpectedConditions.elementToBeClickable(calendarioFim));
driver.findElement(calendarioFim).click();


Como ultima saída, se o código acima não funcionar, tenta trocar o presenceOfElementLocated por visibilityOfElementLocated (o primeiro espera pela injeção de um elemento no HTML, o outro espera o elemento ficar visível se ele já existe no HTML e está apenas invisível)


Abraço!


--
Elias Nogueira


Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para selenium-brasil+unsubscribe@googlegroups.com.

Tarso Roberto Oliveira da Rosa

unread,
Dec 28, 2016, 11:30:07 AM12/28/16
to Selenium Brasil, tarsoro...@gmail.com
Fiz os ajustes e não resolveu.
Estou estranhando pois o primeiro calendário abre e seleciona o dia.

WebDriverWait wait = new WebDriverWait(driver, 10);
By calendarioIni = By.cssSelector("#ctl00_ContentPlaceHolder1_imbCalendarioIni");
wait.until(ExpectedConditions.presenceOfElementLocated(calendarioIni));
driver.findElement(calendarioIni).click();
By dataIni = By.cssSelector("#ctl00_ContentPlaceHolder1_calendario > tbody > tr:nth-child(3) > td:nth-child(5) > a");
wait.until(ExpectedConditions.presenceOfElementLocated(dataIni));
driver.findElement(dataIni).click();
//By calendarioFim = By.cssSelector("#ctl00_ContentPlaceHolder1_imbCalendarioFim");
//wait.until(ExpectedConditions.elementToBeClickable(calendarioFim));
//driver.findElement(calendarioFim).click();

By calendarioFim = By.cssSelector("#ctl00_ContentPlaceHolder1_imbCalendarioFim");
wait.until(ExpectedConditions.visibilityOfElementLocated(calendarioFim));
wait.until(ExpectedConditions.elementToBeClickable(calendarioFim));
driver.findElement(calendarioFim).click();
By dataFim = By.cssSelector("#ctl00_ContentPlaceHolder1_calendario > tbody > tr:nth-child(7) > td:nth-child(7) > a");
wait.until(ExpectedConditions.presenceOfElementLocated(dataFim));
driver.findElement(dataFim).click();

Colocando o código abaixo antes do terceiro bloco também funciona.

synchronized (this){
this.wait (2000);
}

Está é a tela que estou testando:

Elias Nogueira

unread,
Dec 28, 2016, 4:39:37 PM12/28/16
to Tarso Roberto Oliveira da Rosa, Selenium Brasil
Oi Tarso,
Olha, eu colocaria aquele wait que funciona só neste ponto então para funcionar o teu script e, com tempo, continuaria pesquisando uma solução.


Abraço!


--
Elias Nogueira


Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para selenium-brasil+unsubscribe@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages