Selenium WebDriver - Elemento carregado na mesma página

1,361 views
Skip to first unread message

Lucas Ribeiro

unread,
Oct 2, 2014, 2:48:24 PM10/2/14
to seleniu...@googlegroups.com
Boa Tarde Pessoal.
Comecei a estudar selenium a pouco tempo e estou fazendo alguns scrips em algumas páginas com diferentes elementos para praticar.
Porém desde ontem estou tentando clicar no elemento cursoMTM do script abaixo e não sei porque não clica. O mais interessante é que eu debuguei o script daí deu certo. Porém como não entendo tanto assim dos códigos debuguei somente o meu script, não entrei dentro da API para ver o que ele faz.
Procurei bastante na Web e descobri a classe Actions e seu funcionamento que achei bem interessante mais não foi o suficiente.
Se alguem puder me dar uma força agradeço.

PS: Descosiderem os comentários, coloquei para mostrar para uma pessoa aqui de onde trabalho.

package IterasysIDE;


import static org.junit.Assert.assertEquals;

import java.io.File;
import java.util.concurrent.TimeUnit;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.interactions.Actions;

public class CodesFromSeleniumIDE {

//Cria uma instancia do WebDriver. A classe que vai comandar o navegador.
private WebDriver driver;
private String baseUrl;

//Este método monta o ambiente. Ele é sempre executado antes de cada Test Case
@Before
public void setUp() throws Exception {
//Aponta para o motorista do IE
File fileIEDriver = new File("C:\\Users\\saolurib\\Development\\IEDriverServer.exe");
System.setProperty("webdriver.ie.driver", fileIEDriver.getAbsolutePath());

//Aponta para o motorista do Google Chrome
File fileChromeDriver = new File("C:\\Users\\saolurib\\Development\\chromedriver.exe");
System.setProperty("webdriver.chrome.driver", fileChromeDriver.getAbsolutePath());

//Passa para o driver qual o navegador a ser utilizado
driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
//Maximiza o navegador
driver.manage().window().maximize();

//Definição da URL base do site a ser testado
}

//Esse método o responsável por destruir o ambiente de teste.
//Será sempre executado após o fim de um Test Case independente do resultado.
@After
public void tearDown() throws Exception {
driver.quit();
}

//Este método representa um Test Case.
@Test
public void testLucas() throws Exception {
//Carrega a página passada como parametro
driver.get(baseUrl);
//Cria um objeto que representa um elemento na página. Neste caso recebe o elemento pelo XPath dele. 
WebElement linkMicrosoft = driver.findElement(By.xpath("//*[@id=\"filters\"]/li[11]/a"));
linkMicrosoft.click();
Thread.sleep(3000);

WebElement cursoMTM = driver.findElement(By.xpath("/html/body/div[3]/div/div[2]/div[2]/div/section/ul/li[2]/a/span[2]"));
//Cria um objeto para executar ações secundárias (Ex MouseOver)
Actions actionOne = new Actions(driver);
actionOne.moveToElement(cursoMTM);
actionOne.build();
actionOne.perform();
Thread.sleep(3000);
cursoMTM.click();
Thread.sleep(3000);
//Faz um assert do titulo da página.
assertEquals("Iterasys :: Curso Microsoft Test Manager :: MTM", driver.getTitle());
}
}


Elias Nogueira

unread,
Oct 2, 2014, 3:28:45 PM10/2/14
to Lucas Ribeiro, selenium-brasil
O que na verdade tu precisa é uma espera.
Depois que tu clica no link Microsoft note que a box do curso de teste manager demora poucos segundos para aparecer (não é instantâneo).

Adicione uma espera implícita ou explicita e vai funcionar :)
http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp#explicit-and-implicit-waits

--
Elias Nogueira


--
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-bras...@googlegroups.com.
Acesse esse grupo em http://groups.google.com/group/selenium-brasil.
Para mais opções, acesse https://groups.google.com/d/optout.

Lucas Ribeiro

unread,
Oct 2, 2014, 3:42:01 PM10/2/14
to Elias Nogueira, selenium-brasil
Obrigado Elias!

Vou estudar esse tópico em casa e assim que possível retorno o resultado para vocês.

Obrigado novamente!


Atenciosamente,
Lucas Ribeiro

Stefan Teixeira

unread,
Oct 2, 2014, 6:49:41 PM10/2/14
to Lucas Ribeiro, selenium-brasil

Lucas, escrevi um post bem completo sobre os tipos de esperas no Selenium WebDriver. Você pode conferir aqui: http://stefanteixeira.com.br/2014/04/29/entendendo-os-tipos-de-esperas-no-selenium-webdriver/

Espero que ajude. Abs!

Andre Damasceno Dias

unread,
Oct 3, 2014, 6:30:07 AM10/3/14
to Lucas Ribeiro, Elias Nogueira, selenium-brasil
Resgatei uma mensagem antiga na qual algumas pessoas me ajudaram quando eu estava tendo esse problema, uma delas foi o próprio Elias, os dois primeiros links são os mesmos que ele mandou

A implicita é um modo geral de esperar por "qualquer coisa".
http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp#implicit-waits

A explicita pode ser feita de duas formas, ou por uma Expected Condition ou pela escrita explicita (subescrever o método apply do wait).
http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp#explicit-waits

Geralmente a espera implicita é a mais fácil, pois é só colocar um linha no inicio do teu script. Porém deixa o script mais lento na inicialização do browser.
A recomendação é que tu use a espera explicita por uma ExpectedCondition, e caso não exista uma para o seu caso, escreva uma.

ExpectedConditions
http://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/support/ui/ExpectedConditions.html

 
Andre Damasceno Dias
Especialista em Qualidade e Testes de Software, MBA
Celular: (21) 98758-0608
http://twitter.com/andreddias
Play the game, test the game

Andre Damasceno Dias

unread,
Oct 3, 2014, 6:40:56 AM10/3/14
to Lucas Ribeiro, Elias Nogueira, selenium-brasil
O link que o Stefan Teixeira passou tá bem legal, parabéns pelo site :)

 
Andre Damasceno Dias
Especialista em Qualidade e Testes de Software, MBA
Celular: (21) 98758-0608
http://twitter.com/andreddias
Play the game, test the game

Lucas Ribeiro

unread,
Oct 6, 2014, 4:02:06 PM10/6/14
to seleniu...@googlegroups.com
Fala pessoal, voltei!

Obrigado pelos links enviados. 
Dei uma boa olhada em todos e procurei bastante na web sobre esse assunto de esperas implicitas e explicitas.

Porém no fundo, o erro no meu script estava sendo a maneira como eu estava usando a classe Actions.

Eu vi em quase todos os lugares que eu pesquisei que usam sempre a instancia_criada.comando_qualquer().build().perform();

Depois que eu resolvi isso, debugando funcionava, mais executando da maneira normal não fucionava. Daí sim vi que falta um tempo para o evento hover sobre o link do curso MTM na página ser ativado corretamente.

Porém, nesse caso só consegui resolver com o "Thread.sleep(timeout);".

Estou ainda tentando descobrir ond estou errando em usar a espera explicita, de maneira correta, como indicou nosso amigo Elias Nogueira.

De qualquer forma segue o script atual funcionando.

Muito Obrigado a todos!

package suite_cases;


import static org.junit.Assert.assertEquals;

import java.util.concurrent.TimeUnit;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.interactions.Actions;

public class IterasysWebPage {

private WebDriver driver;
private String baseUrl;

@Before
public void setUp() throws Exception {
driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);
driver.manage().timeouts().setScriptTimeout(60, TimeUnit.SECONDS);
driver.manage().window().maximize();

}

@After
public void tearDown() throws Exception {
driver.close();
driver.quit();
}

@Test
public void testMTMLink() throws InterruptedException {
driver.get(baseUrl);

WebElement linkMicrosoft = driver.findElement(By.xpath("//*[@id=\"filters\"]/li[11]/a"));
Actions act = new Actions(driver);
act.moveToElement(linkMicrosoft).build().perform();
act.click(linkMicrosoft).build().perform();
WebElement cursoMTM = driver.findElement(By.xpath("//*[@id=\"thumbs\"]/li[2]"));
Actions act1 = new Actions(driver);
act1.moveToElement(cursoMTM).build().perform();
Thread.sleep(5000);
act1.click(cursoMTM).build().perform();

Lucas Ribeiro

unread,
Oct 6, 2014, 4:06:11 PM10/6/14
to seleniu...@googlegroups.com
Ah, já ia me esquecendo!

Respondendo ao amigo Andre Damasceno Dias que perguntou sobre a sequencia dos métodos:
Até onde eu sei de Java Andre, a sequencia em que os métodos se aprensentam não é importante, mais nesse caso, sim as anotation antes de cada método.
No caso como estou usando o jUnit 4, temos as anotations @Before, @After, @Test.
Quando eu executo o teste o jUnit reconhece esses métodos digamos "anotados" e executa sempre o que tem @Before primeiro, depois o que tem @Test e então o método com @After.

Espero ter ajudado também!

Andre

unread,
Oct 6, 2014, 8:39:00 PM10/6/14
to Lucas Ribeiro, seleniu...@googlegroups.com
Ajudou sim, não sabia dessa :)

André Dias
021987580608 (Claro)

De: Lucas Ribeiro
Enviada em: ‎06/‎10/‎2014 17:06
Para: seleniu...@googlegroups.com
Assunto: [Selenium Brasil] Re: Selenium WebDriver - Elemento carregado na mesma página

Reply all
Reply to author
Forward
0 new messages