segunda-feira, 12 de setembro de 2011

[Selenium Webdriver] Utilizando Rich-Faces: Modal Panel

Vou compartilhar uma solução bem simples que descobri para tratar Modal Panels com o Selenium. Na verdade a solução é bem fácil mas como eu quebrei a cabeça com até chegar nesse ponto, acho interessante repassar pois outros podem utilizar esse mesmo tempo para descobrir e compartilhar outras soluções. Descobri conversando com outros profissionais da área tais como Elias Nogueira e uns colegas da Índia e Singapura, através de fóruns e listas de discussão sobre Selenium e Java e outros.

Para este caso, é importante levar em consideração três etapas importantes:
- O próprio Selenium IDE já gera essa linha de código, mas é interessante entender o motivo pelo qual ele insere o mesmo:
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
Esse trecho de código é utilizado para o Selenium "esperar" o browser durante 20 segundos (ou quantos segundos o usuário desejar) enquanto o elemento desejado não aparece na tela. Então, só depois desses 20 segundos o elemento ficaria disponível.

- Pode-se mapear o Modal Panel e utilizá-lo como referência para procurar o objeto daquela tela, como por exemplo:
WebElement modalPanel = driver.findElement(By.id("idDoElemento"));
WebElement dsArquivo = modalPanel.findElement(By.xpath("xpathDoElemento"));

- Ou, caso a solução acima não atenda, sugiro acessar diretamente a URL (mapeando esta através de um Firebug da vida) e acessar o arquivo diretamente. Como por exemplo:
// Preencher URL
driver.get("http://URL.com.br/sistema");

// Mapear campos da tela
WebElement login = driver.findElement(By.id("username"));
WebElement password = driver.findElement(By.id("password"));
WebElement submit = driver.findElement(By.cssSelector("input.formSubmit"));

// Preencher usuário//senha e clicar em Enter
login.sendKeys("teste");
password.sendKeys("teste");
submit.click();

// Navega até a tela Cria Minuta de Documento
driver.findElement(By.linkText("linkDaTela")).click();
driver.findElement(By.xpath("xPathDoLink1")).click();
driver.findElement(By.xpath("xPathDoLink2")).click();

// Tela do modal panel
// Acessar diretamente a URL do modal panel
driver.get("http://URL.com.br/sistema/modalpanel&blablabla?=usuario=testeblabla");

WebElement campo1 = driver.findElement(By.xpath("xpathDoCampo1"));

String textoTeste = "teste123";
campo1.sendKeys(textoTeste);

Espero ter ajudado!

2 comentários:

Maira Stella da Silva disse...

Muito bom! Obrigada por compartilhar essa solução! Com certeza vai ajudar muitos testadores!

Luiz Gustavo S. Vieira disse...

Obrigado Maira!
Alguns me perguntaram em que momento inserir o código no script:
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);

Idealmente depois que instanciar o driver, por exemplo:
WebDriver driver = new FirefoxDriver();

Sendo assim, isso fará com que esse comando seja válido para todas as ações do driver. Ou seja, para o script inteiro.

 

My site is worth$4,271.36Your website value?