Neste desafio não tivemos tanto colaboradores quanto o desafio anterior, não sei que foi por causa da complexidade do desafio, mas agradeço a todos que participaram!

Neste desafio não tivemos tanto colaboradores quanto o desafio anterior, não sei que foi por causa da complexidade do desafio, mas agradeço a todos que participaram!

Resposta padrão!

Aqui segue a resposta padrão com o Selenium IDE.
Alguns fizeram a automação do desafio utilizando o comando pause, que não é recomendado porque este comando só ira esperar a requisição por um tempo determinado, mas como se trata de uma requisição ajax não conseguimos confirmar qual o tempo que ela leva.

O mais recomendado é usar pontos de espera (comandos waitFor... com o Selenium. E vejam que quase sempre teremos que usar comandos assim. Se vocês notaram o funcionamento é bem simples: você clica sobre o registro e ele abre uma caixa de texto para editá-lo, bem como os botões de Salvar e Cancelar.
Isso ocorre para os três campos. Sempre que mandamos salvar uma mensagem Salvando... é apresentada e, quando ele termina de salvar o registro alterado aparece na tela.

O que podemos notar sobre a requisição Ajax aqui? Quem será que nos dá subsídios para fazer a espera?
Resposta: o texto Salvando.... Note que é ele que nos dá o feedback do envio da requisição Ajax e depois, quando a requisição estiver completa (tenha voltado) texto some!

Logo temos que colocar um comando que faça com que o script espera até que a requisição esteja completa (sumir o texto Salvando...
O comando mais apropriado para isso, neste caso é o waitForTextNotPresent. Este comando irá fazer uma espera até o momento de não haver determinado texto na tela, no nosso caso o texto Salvando...

Se você não colocar esse ponto de espera o script irá executar, mas você pode notar que sempre uma das requisições Ajax falha, ficando sempre com o texto Salvando...

Essa foi a solução que eu queria que vocês chegassem. Outros colaboradores chegaram a soluções muito parecidas, e já vamos visualizá-las mais abaixo.

Download do script (clique com o botão direito e selecione 'Salvar como...')

Vídeo Explicativo

Soluções de outros colaboradores

O código abaixo foi escrito em Java utilizando o JUnit como suporte ao assertEquals
Os imports foram ignorados. Visualize o código completo neste link (clique com o botão direito e selecione 'Salvar como...')

			  		String nome = "Elias Nogueira";
					String email = "elias.nogueira@gmail.com";
					String telefone = "11 91234 5678";
					WebDriverWait wait = new WebDriverWait(driver, 10);
					
					driver.get("http://eliasnogueira.com/arquivos_blog/selenium/desafio/2desafio/");
					
					// alterando o nome
					WebElement nomeDisplay = driver.findElement(By.id("name_rg_display_section"));
					nomeDisplay.click();
					WebElement elementoPessoa = driver.findElement(By.id("nome_pessoa"));
					elementoPessoa.clear();
					elementoPessoa.sendKeys(nome);

					driver.findElement(By.cssSelector("#name_hv_editing_section > input[value='Salvar']")).click();
					wait.until(ExpectedConditions.visibilityOf(nomeDisplay));
					
					
					// alterando o e-mail
					WebElement emailDisplay = driver.findElement(By.id("email_rg_display_section"));
					emailDisplay.click();
					WebElement elementoEmail = driver.findElement(By.id("email_value"));
					elementoEmail.clear();
					elementoEmail.sendKeys(email);
					
					driver.findElement(By.cssSelector("#email_hv_editing_section > input[value='Salvar']")).click();
					wait.until(ExpectedConditions.visibilityOf(emailDisplay));
					
					// alterando o telefone
					WebElement telefoneDisplay = driver.findElement(By.id("phone_rg_display_section"));
					telefoneDisplay.click();
					WebElement elementoTelefone = driver.findElement(By.id("phone_value"));
					elementoTelefone.clear();
					elementoTelefone.sendKeys(telefone);
					
					driver.findElement(By.cssSelector("#phone_hv_editing_section > input[value='Salvar']")).click();
					wait.until(ExpectedConditions.visibilityOf(telefoneDisplay));
					
					// validacoes
					assertEquals(nome, driver.findElement(By.id("name_rg_display_section")).getText());
					assertEquals("Email: " + email, driver.findElement(By.id("email_rg_display_section")).getText());
					assertEquals("Telefone: " + telefone, driver.findElement(By.id("phone_rg_display_section")).getText());
			  	
De inicio o Márcio usou o comando storeValue para não sempre utilizar o valor que ele inseriu para os campos.
A espera que o Márcio fez foi através do próprio nome que ele informou dentro da caixa de texto.

waitForText | name_rg_display_section | ${nomePessoa}

Isso é totalmente possível e também está certo, uma vez que a apresentação da informação inserida na tela também é base para saber que a requisição Ajax foi finalizada.

Neste caso o Márcio utilizou o comando waitForText que espera que um determinado texto em algum elemento seja apresentado, no caso o elemento é o name_rg_display_section (caixa de texto para inserir o nome) e o texto esperado o nome que ele inseriu que está parametrizado.
Muito obrigado Márcio pela tua colaboração!

Download do script (clique com o botão direito e selecione 'Salvar como...')
desafio2
open /arquivos_blog/selenium/desafio/edicao.php
click name_rg_display_section
type nome_pessoa Marcio Acorci
storeValue nome_pessoa nomePessoa
click //input[@value='Salvar']
waitForText name_rg_display_section ${nomePessoa}
click email_rg_display_section
type email_value acorci@gmail.com
storeValue email_value emailValue
click //input[@value='Salvar' and @type='button' and @onclick="document.getElementById('email_hv_editing_section').style.display='none';document.getElementById('email_hv_saving_section').style.display='';var req = 'edicaoAjaxUpdate.php?part=email&val=' + document.getElementById('email_value').value;sndReq(req);"]
waitForText email_rg_display_section Email: ${emailValue}
click phone_rg_display_section
type phone_value 51 99888899
storeValue phone_value phoneValue
click //input[@value='Salvar' and @type='button' and @onclick="document.getElementById('phone_hv_editing_section').style.display='none';document.getElementById('phone_hv_saving_section').style.display='';var req = 'edicaoAjaxUpdate.php?part=phone&val=' + document.getElementById('phone_value').value;sndReq(req);"]
waitForText phone_rg_display_section Telefone: ${phoneValue}
assertText name_rg_display_section ${nomePessoa}
assertText email_rg_display_section Email: ${emailValue}
assertText phone_rg_display_section Telefone: ${phoneValue}

© eliasnogueira.com