Dúvida sobre testes com Selenium

Bom dia pessoal,

Preciso testar alguns cenários no sistema, pesquisei a respeito e vi que o selenium é uma boa solução, instalei o plugin Selenium IDE e comecei a ver o basicão de como se trabalha com ele. Só que a medida que fui pensando no desenrolar deste primeiro teste, comecei a desconfiar que o plugin sozinho não resolve esse primeiro cenário.

Pontos que preciso testar neste primeiro cenário:

  1. preciso cadastrar sempre uma nova pessoa, ou seja, o nome tem que ser diferente a cada nova execução do teste.
  2. O sistema realiza marcações e preciso que cada vez que o teste seja executado, sempre marque no primeiro horário disponível e não no mesmo horário sempre, pois esse horário já estará ocupado pela marcação anterior.
  3. preciso fazer testes com assertivas em ações que funcionam através de ajax.

É possível fazer essas coisas com o Selenium? Já li algo a respeito dizendo que é possível programar os testes com diferentes linguagens, mas ainda não entendi exatamente como começar.

Preciso instalar algo? É possível fazer isso programando sem criar classes? Apenas com scripts?

O sistema foi desenvolvido em Java.

Se alguém puder me dar uma idéia de como começar, ferramentas que devo utilizar e a estrutura inicial que devo criar.

Desde já agradeço.

igortsouza

Antes de eu escrever um punhado de coisas, como é esse sistema? Web? Desk?
O selenium simula um robô digitando na tela, movendo ponteiros do mouse e tudo mais. Se quiser te passo um fonte simples, acessando uma página de login/senha.

jaboot

Obrigado por tentar ajudar. O sistema é Web.
Deixa eu resumir em que estágio me encontro com relação ao conhecimento do Selenium.

Instalei o plugin Selenium IDE no firefox, já gravei uma pequena navegada no sistema e reproduzi a gravação.
A partir do momento que comecei a pensar melhor no teste, vi que não seria possível testá-lo apenas gravando.
Preciso de dados novos em alguns campos a cada vez que o teste for executado, tem ajax mudando partes da tela e eu preciso testar se a modificação foi realizada, eu preciso que o teste sempre faça uma marcação na hora que estiver disponível e nunca na mesma, ou seja, não pode ser totalmente estático.

Não sei se é possível fazer exatamente o que preciso e caso seja, não seio que preciso instalar e como dar o passo inicial sacou?

Se vc quer testes de integração, use Selenium e apenas ignore o resto dessa mensagem.

Talvez vc queira fazer testes unitários. Neste caso, aconselho dar uma pesquisada sobre Jasmine http://pivotal.github.com/jasmine/.

Eu implementei dois projetos que usam Jasmine. São apenas projetos demo, então o teste é besta, mas dá pra dar uma sacada de como integrar testes unitátios em Javascript com maven e Jasmine.
https://github.com/tveronezi/photodb
https://github.com/tveronezi/faceid

Mais informações sobre os projetos aqui: http://buildnplay.blogspot.ca/

Fala tveronezi, obrigado por tentar ajudar.
Os testes que preciso fazer são de integração.

Relax man. O lance é o seguinte, cria uma classe nova e roda ela como Java Application.

Procura os WebElement(s) pelo id do html. Até dá pra achar um botão ou um combo pelo nome ou xpath, mas o id é certeza de encontrar.

[code]import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.Wait;
import org.openqa.selenium.support.ui.WebDriverWait;

import com.google.common.base.Function;

public class TestaLogin {

private static final String URL = "sua url";
private final static String LOGIN = "login";
private final static String SENHA = "senhaSenha";
private static Wait wait;

private static WebDriver driver;

protected void startWebDriver() {
	driver = new FirefoxDriver();
	wait = new WebDriverWait(driver, 120);
}

public static void main(String[] args) {
	TestaLogin p = new TestaLogin();
	p.startWebDriver();
	p.login(LOGIN, SENHA);
}

private void login(String inputLogin, String inputPassword) {
	
	// vai até a URL que você deseja  
	driver.navigate().to(URL);
	
	// cria um WebElement baseado no input que você tem na tela  
	// OBS: se fosse um combo, seria um Select ao invés de WebElement  
	WebElement login = driver.findElement(By.id("txtLogin"));
	login.sendKeys(LOGIN); // digita  
	
	// você pode procurar (By) por id, nome, xpath...  
	// depois você se vira. Dá pra fazer bastante coisa  
	WebElement password = driver.findElement(By.id("txtSenha"));
	password.sendKeys(SENHA); // digita  
	
	// procura pelo link e clica nele  
	WebElement link = driver.findElement(By.id("botaoEntrar"));
	link.click();
}
	
private static Function<WebDriver, WebElement> presenceOfElementLocated(final By locator) {
	return new Function<WebDriver, WebElement>() {
		
		public WebElement apply(WebDriver driver) {
			return driver.findElement(locator);
		}
	};
}

}[/code]

Entendi seu código jaboot, a parte de login e senha por exemplo não é complicado, pois eu vou testar a princípio sempre com o mesmo usário e senha e vou estar preenchendo sempre os mesmos campos.

Após o login, precisarei preencher um campo sempre com um nome diferente. É possível executar o teste uma vez com um nome e depois de algumas horas executá-lo novamente com outro nome, mas sem precisar mudar o nome no script antes de rodar de novo? Algo tipo um arquivo que armazenaria diversos nomes diferentes ou então de outra forma?

O cenário também lida com marcações, se no primeiro teste a marcação for feita as 8:00, no segundo ela terá que ser realizada as 8:30, portanto nesse caso não tem como utilizar esse campo pelo Id e nem pelo name, pois ele sempre vai mudar na próxima execução de teste. Não pode ser um código estático. Tem como programar isso dinamicamênte, algo como uma verificação se o horário está ocupado e usar o primeiro disponível?

Dá sim, o selenium pode chamar outras classes e outros métodos normalmente.
Daí você ajusta a sua lógica com o que você precisa.

jaboot muito obrigado pela ajuda, aos poucos eu to melhorando nisso.

Você sabe como faço um seletor com o WebDriver que pegue o elemento que é irmão de outro elemento? Ou seja, que estejam lado a lado.
Por exemplo, quero pegar um td pelo class mas quero pegar pelo tr de fora e esse usa o id. Tem como fazer isso?