Dúvidas com Automação - Selenium Web

Bom dia a todos,

Gostaria de saber se alguém aqui já usou o Selenium Remote control (Selenium + Java).

Tenho uma página que tem um elemento DTree (em JavaScript). Como faço para clicar em UM elemento específico dessa árvore?

Imaginando que temos o seguinte:

 [code]

   Clientes
      |___ Cliente1
      |___ Cliente2
 [/code]

 [code]
    d = new dTree('d');
    d.add(0,-1,'Cliente1);
    d.add(1,0,'Cliente2','#');
 [/code]

Como posso, por exemplo, clicar em “Cliente1”? Será que funcionaria usar “selenium.click(“link=Cliente1”);” ou então click ( ‘dom=document.getElementById( “11” ).parentNode.firstChild.firstChild’ ), uma vez que ao que me parece, apesar dos filhos não terem “id”, a dTree em si tem ( d = new dTree(‘d’); ). O “id” dela é “d”, correto?

Estou começando a usar Selenium e no meu comptuador aqui ainda não está instalado, então por enquanto estou apenas pensando em como fazer isso, pois meu ambiente aqui no trabalho não está pronto. Por enquanto estou apenas olhando os problema se pensando em como resolver.

Desde já, agradeço a ajuda de vocês!

Olá.

Amigo, prefiro usar o Selenium IDE via Firefox e depois exporto o teste para Java. Ficar testando os “seletores” via código dá muito mais trabalho.
Pelo Selenium IDE no FF você vai testando as diversas formas de se chegar a determinado elemento muito rápidamente, com alguns cliques.

Abraços.

1 curtida

[jyoshiriro], tudo bem?

Como é que eu posso fazer isso? Melhorando a pergunta, o Selenium IDE me dá algum tipo de String que eu posso usar quendo for programar? Porque o intuito seria usar programação mesmo, sabe? Então de qualquer modo, eu vou precisar usar uma lingnuagem (no caso, escolhi Java, mas não tenho certeza ainda se será a única).

Então o problema é saber como representar, na forma de alguma String que eu possa usar como seletor, os clique que vou precisar para “andar” por essa árvore. Tenho certeza de que eu poderia usar o IDE para fazer o teste, mas é que o IDE não será o foco aqui. Ele pode pelo menos me dar alguma ideia de como montar uma String para o que preciso, seria essa sua ideia?

Obrigado pela ajuda, aguardo tua resposta!

Ah, acho que entendi o que você disse.

Quando usamos o IDE, podemos exportar o testes para um “.java”, tinha me esquecido disso. Foi isso que você quis dizer, certo?

Só mais uma coisa, quando tenho uma página e tenho que clicar em algum lugar. Ao clicar, um pop-up ou algum menu javascript aparece, clicamos nesse menu/pop-up. Isso pode ser feito através do webdriver (usando Java)? Quer dizer, essa mudança de foco, em que interagimos com um pop-up ou algum menu suspenso, é possível ser feita com o Selenium?

Pessoal, a solução é a que o amigo falou anteriormente.

O IDE dá a possibilidade de selecionar os elementos com alguns cliques de mouse. Daí, só precisamos ver o código gerado para saber a melhor forma de se conseguir um seletor para qualquer elemento. Podemos até mesmo escolher, ainda na IDE, como queremos o seletor, se por ID, nome, etc.

Depois é só ver como fica em forma de código e seguir em frente!

Pergunta que vale 10 pontos:

Seu TreeView e feito em Applets?

[quote=gpmdf2]Bom dia a todos,

Gostaria de saber se alguém aqui já usou o Selenium Remote control (Selenium + Java).

Tenho uma página que tem um elemento DTree (em JavaScript). Como faço para clicar em UM elemento específico dessa árvore?

Imaginando que temos o seguinte:

 [code]

   Clientes
      |___ Cliente1
      |___ Cliente2
 [/code]

 [code]
    d = new dTree('d');
    d.add(0,-1,'Cliente1);
    d.add(1,0,'Cliente2','#');
 [/code]

Como posso, por exemplo, clicar em “Cliente1”? Será que funcionaria usar “selenium.click(“link=Cliente1”);” ou então click ( ‘dom=document.getElementById( “11” ).parentNode.firstChild.firstChild’ ), uma vez que ao que me parece, apesar dos filhos não terem “id”, a dTree em si tem ( d = new dTree(‘d’); ). O “id” dela é “d”, correto?

Estou começando a usar Selenium e no meu comptuador aqui ainda não está instalado, então por enquanto estou apenas pensando em como fazer isso, pois meu ambiente aqui no trabalho não está pronto. Por enquanto estou apenas olhando os problema se pensando em como resolver.

Desde já, agradeço a ajuda de vocês!

[/quote]

O Selenium possui um metodo chamado runScript, algo assim, que serve para executar JavaScript, logo, voce poderia ter no seu Firefox o plugin Firebug dai conseguiria visualizar o evento que e invocado ao clicar no elemento da tela.

[quote=jyoshiriro]Olá.

Amigo, prefiro usar o Selenium IDE via Firefox e depois exporto o teste para Java. Ficar testando os “seletores” via código dá muito mais trabalho.
Pelo Selenium IDE no FF você vai testando as diversas formas de se chegar a determinado elemento muito rápidamente, com alguns cliques.

Abraços.[/quote]

Sim, no entanto, a versao IDE do Selenium e muito limitada, um exemplo que e voce nao consegue ter e a possibilidade incrivel de usar massa de dados… Depois que se vicia em olhar os elementos da tela, sejam eles por id, name, xpath, css etc, se acostuma e se tem a visao das diversas formas de encontrar o elemento DOM e testa-lo…

[quote=gpmdf2]Ah, acho que entendi o que você disse.

Quando usamos o IDE, podemos exportar o testes para um “.java”, tinha me esquecido disso. Foi isso que você quis dizer, certo?

Só mais uma coisa, quando tenho uma página e tenho que clicar em algum lugar. Ao clicar, um pop-up ou algum menu javascript aparece, clicamos nesse menu/pop-up. Isso pode ser feito através do webdriver (usando Java)? Quer dizer, essa mudança de foco, em que interagimos com um pop-up ou algum menu suspenso, é possível ser feita com o Selenium?

[/quote]

Sim, voce poder utilizar a sintaxe abaixo para pop-up:

[code]public static void nomeMetodo(WebDriver driver, final String variavelNomeTituloJanela){
try{
Boolean isJanelaEncontrada = new WebDriverWait(driver, 60000)
.until(new ExpectedCondition() {
@Override
public Boolean apply(WebDriver driver) {
Set janelas = driver.getWindowHandles();
String nomeJanela = janela.trim();

							if (janela.trim().startsWith("title=")){
								nomeJanela = janela.trim().replace("title=", "");
							}
							
							for (String nomeHandle : janelas) {
								WebDriver popup = driver.switchTo().window(
										nomeHandle);
								
								if (popup.getTitle().trim()
										.equals(nomeJanela)) {
									return true;
								}
							}
		
							return false;
						}
					});

				if (isJanelaEncontrada){
					driver.switchTo().window(janela);
				}
			}catch (SeleniumException se){
				throw new NomeExceptionAoDarFocoAUmaJanela("Não foi possível trocar janela.", se);
			}
		}

[/code]

Oi, andredecotia tudo bem? Muito legal sua ajuda.

Fiquei meio confuso com o modo que você usa as variáveis no teu código, pois passa “variavelNomeTituloJanela”, mas nunca usa, “janela” não está definida como uma variável, etc.

Mas acho que entendi sua ideia. Consegui mexer com os popups, obrigado.

Eu queria saber mais uma coisa… Vi que o WebDriver + JUnit pode criar uma suíte de testes, a suíte é uma classe sem código algum (não tem nada de código escrito), mas apenas lista os testes que eu quero que rode, na forma de annotations. Sendo assim, a única coisa que eu tenho que escrever na suíte são as anotações, que indicam que testes eu quero rodar. Quando a suíte roda, ele faz todos os testes, m após o outro.

–Até aí tudo certo…

Dúvida >>> Mas e SE eu tiver, por exemplo, 10 testes numa suíte E quiser que eles rodem em PARALELO. Isto é, ao invés da suíte rodar um teste após o outro, quero que rode todos de uma vez. Tenho como fazer isso???

Eu consegui andar pela treeview. Não fui que fiz a tree, estou mexendo num software e vi que poderia andar pela árvore usando o locator “link”.

[quote=gpmdf2]Oi, [cite]andredecotia[/cite] tudo bem? Muito legal sua ajuda.

Fiquei meio confuso com o modo que você usa as variáveis no teu código, pois passa “variavelNomeTituloJanela”, mas nunca usa, “janela” não está definida como uma variável, etc.

Mas acho que entendi sua ideia. Consegui mexer com os popups, obrigado.

Eu queria saber mais uma coisa… Vi que o WebDriver + JUnit pode criar uma suíte de testes, a suíte é uma classe sem código algum (não tem nada de código escrito), mas apenas lista os testes que eu quero que rode, na forma de annotations. Sendo assim, a única coisa que eu tenho que escrever na suíte são as anotações, que indicam que testes eu quero rodar. Quando a suíte roda, ele faz todos os testes, m após o outro.

–Até aí tudo certo…

Dúvida >>> Mas e SE eu tiver, por exemplo, 10 testes numa suíte E quiser que eles rodem em PARALELO. Isto é, ao invés da suíte rodar um teste após o outro, quero que rode todos de uma vez. Tenho como fazer isso???

Eu consegui andar pela treeview. Não fui que fiz a tree, estou mexendo num software e vi que poderia andar pela árvore usando o locator “link”.[/quote]

Os nomes são fictícios, não quis colocar pude colocar o código real por questões de confidencialidade, logo, pensei em nomes rápidos sem muito critério…

Tem sim como paralelizar os testes automáticos, isto pode ser feito a partir da ferramenta Selenium Grid.

Seu TreeView não tem nada de Applets Java, correto?

Oi,

Não tem nada a ver com applets não, mas por quê? Applets dão problema na hora de testar? Fica difícil testá-los? Veja, o Grid é para máquinas remotas, um ambiente distribuído, correto? Na verdade eu não queria isso. O que eu quero é mais ou menos o seguinte:

   MinhaSuite
       TestClass1.class
       TestClass2.class
       TestClass3.class
       ...
       TestClassN.class

Tenho uma suíte com vários testes. Se eu mandar essa suíte rodar, ela vai rodar um teste após o outro, já que a construção de uma suíte funciona com annotations, onde listamos que testes (na forma de classes, que representam os testes - TestClass1.class, TestClass2.class, etc.) que queremos rodar.

Se eu quiser, na mesma máquina (não tenho máquinas distribuídas) rodar esses testes em paralelo, o que faço? Melhorando a pergunta, tenho minha suíte com 10 testes. Eu quero rodar na minha máquina esses testes em paralelo, ao invés de um a um. Quero rodar ESSA suíte em paralelo, NESSA máquina. Seria como pegar cada teste e mandar um Thread rodálos, para que todos sejam rodados em paralelo.

Por exemplo, ao invés de rodar TestClass1.class, depois TestClass1.class, depois TestClass1.class e assim por diante, rodar todos em paralelo, como se fossem em threads. Espero que eu tenha sido claro.

Obrigado pela ajuda!

Opa,

Surgiu mais uma dúvida… Eu tenho uma árvore em Javascript

d = new dTree('d');
d.add(0,-1,'Menu principal');
d.add(1,0,'elemento1','#');
d.add(2,1,'Elemento2','#');

Eu tenho como listar os elementos que existem nessa árvore? Não estou conseguindo fazer isso. Fica a dúvida anterior mais essa aí… Seria possível?

[quote=gpmdf2]Opa,

Surgiu mais uma dúvida… Eu tenho uma árvore em Javascript

d = new dTree('d');
d.add(0,-1,'Menu principal');
d.add(1,0,'elemento1','#');
d.add(2,1,'Elemento2','#');

Eu tenho como listar os elementos que existem nessa árvore? Não estou conseguindo fazer isso. Fica a dúvida anterior mais essa aí… Seria possível? [/quote]

Qual é o modelo de trabalho com Selenium que vocês estão adotando? Todos os testadores são programadores? São apenas programadores? Vocês trabalham com conceitos de Data Driven, Plano de Teste, Suítes de Teste e Massa de Dados? Utilizariam em testes de regressão apenas?

Conte um pouco mais de como é sua arquitetura para conseguir te dar mais dicas…

[quote=gpmdf2]Oi,

Não tem nada a ver com applets não, mas por quê? Applets dão problema na hora de testar? Fica difícil testá-los? Veja, o Grid é para máquinas remotas, um ambiente distribuído, correto? Na verdade eu não queria isso. O que eu quero é mais ou menos o seguinte:

   MinhaSuite
       TestClass1.class
       TestClass2.class
       TestClass3.class
       ...
       TestClassN.class

Tenho uma suíte com vários testes. Se eu mandar essa suíte rodar, ela vai rodar um teste após o outro, já que a construção de uma suíte funciona com annotations, onde listamos que testes (na forma de classes, que representam os testes - TestClass1.class, TestClass2.class, etc.) que queremos rodar.

Se eu quiser, na mesma máquina (não tenho máquinas distribuídas) rodar esses testes em paralelo, o que faço? Melhorando a pergunta, tenho minha suíte com 10 testes. Eu quero rodar na minha máquina esses testes em paralelo, ao invés de um a um. Quero rodar ESSA suíte em paralelo, NESSA máquina. Seria como pegar cada teste e mandar um Thread rodálos, para que todos sejam rodados em paralelo.

Por exemplo, ao invés de rodar TestClass1.class, depois TestClass1.class, depois TestClass1.class e assim por diante, rodar todos em paralelo, como se fossem em threads. Espero que eu tenha sido claro.

Obrigado pela ajuda! [/quote]

Porque Selenium e Java Applets ainda não integram nativamente…

Lembro também que com o Selenium Grid podia-se ter os testes paralelos em uma máquina… Não apenas distribui-los em máquinas diferentes (ambientes diferentes ex: Windows e IE9 vs Linux e Firefox 15)
Fonte: http://www.infoq.com/news/2007/09/selenium-grid-parallel-testing

André, estou procurando onde baixar essa API (Grid), onde posso encontrá-la? Você sabe?

Ela é a GridGain? Pois foi a única coisa que achei e que mai se aproxima, até estranhei essa dificuldade em achar esse JUnit…

E quanto à interação com o javascript? VocÊ já fez algo a respeito?

[quote=gpmdf2]André, estou procurando onde baixar essa API (Grid), onde posso encontrá-la? Você sabe?

Ela é a GridGain? Pois foi a única coisa que achei e que mai se aproxima, até estranhei essa dificuldade em achar esse JUnit…

E quanto à interação com o javascript? VocÊ já fez algo a respeito?

[/quote]

Acredito que este link irá te ajudar: http://code.google.com/p/selenium/downloads/detail?name=selenium-server-standalone-2.25.0.jar&can=2&q=

[quote=gpmdf2]Opa,

Surgiu mais uma dúvida… Eu tenho uma árvore em Javascript

d = new dTree('d');
d.add(0,-1,'Menu principal');
d.add(1,0,'elemento1','#');
d.add(2,1,'Elemento2','#');

Eu tenho como listar os elementos que existem nessa árvore? Não estou conseguindo fazer isso. Fica a dúvida anterior mais essa aí… Seria possível? [/quote]

Por favor, poste o renderizado do lado do cliente (navegador)… Isto é, o código HTML gerado…

andredecotia,

Trabalhamos com massa de dados, os parâmetros não hard-coded, então também usamos data-driven e planos e suítes de testes, em todos os lugares são usados (pelo menos eu não vejo como não se usar coisas assim).

Mas a arquitetura tem algo a ver com as perguntas que eu fiz? Fiquei meio confuso… Tentei usar o SeleniumGrid, mas fiquei meio confuso no uso. Você o usa? Tem algum tutorial?

O que seria o DOM? Um modo de acessar os elementos? o Xpath é um exemplo de DOM? Porque a IDE pode usar o xpath tranquilamente, não é?