Olá pessoal, depois de tanto tempo estamos aqui com a segunda parte do artigo sobre Watir. Desculpem-me a demora, quem estava aguardando, mas estou
com muitos projetos profissionais que me impediram de conseguir um tempo para me dedicar ao artigo.
Sem mais desculpas, vamos ao que interessa.
No último artigo, para quem não se lembra, falamos dos conceitos básicos de Watir, que envolveu também alguma coisa sobre Ruby inclusive. Neste artigo então iremos colocar em prática alguns comandos que foram mostrados no primeiro artigo e outros que não foram apresentados e serão apresentados aqui. Basicamente o escopo desse artigo é:
- Vermos exemplo de uso de alguns comandos e dicas;
- Criar funções;
Todos os nossos exemplos serão demonstrados no SciTE que é o editor padrão do Ruby e foi demonstrado no artigo anterior como instalá-lo. Você poderá utilizá-lo ou se preferir pode usar também o bloco de notas, apenas lembre-se de nos dois casos salvar o arquivo com a extensão.rb
Várias palavras dentro dos arquivos estão sem acentos, foi proposital :)
Acredito que um dos comandos mais usados e simples do Watir, é o comando "puts" que serve para escrever na saída padrão alguma mensagem. É muito usada para controle de fluxo, verificações, facilitar a leitura dos logs e saber qual parte do código o script está executando.
Seu uso é bem simples, apenas o comando e a frase que se deseja escrever entre aspas " ".
Abra o editor de sua preferência e escreva simplesmente:
puts "demonstrando o uso do comando puts"
Agora aperte a tecla F5 do seu teclado para rodas o script, você terá uma tela parecida com essa:
Se você reparar bem, no artigo 1, em nosso script de teste eu já havia introduzido o puts, como um ponto de controle, mas é importante ressaltá-lo. Outro fator importante de se lembrar são os comentários, em Ruby eles iniciam com o caractere # (Sharp).
Dica: não esqueçam de sempre escrever comentários em seu código, facilitam em muito a manutenção.
Neste momento é importante de lembrar que estamos programando em Watir que é baseada em Ruby, portanto segue todas as suas convenções, inclusive pode se usar perfeitamente os comandos do Ruby, então vocês que tem contato com alguma linguagem de programação podem estranhar de cara no meu código que não tem ; (ponto e vírgula) no final de comandos e sentenças, não se preocupe pois está correto, é assim mesmo, em Ruby não se usa ; (ponto e vírgula) seus desenvolvedores acreditam que um erro muito comum de programação e esquecer-se de colocar alguns ; , portanto acharam por bem não utiliza-lo. Bem como diversas outras convenções de Ruby que foram pensadas para evitar erros e facilitar a programação, para que o desenvolvedor se preocupe realmente com o que interessa e não perca tempo com esses detalhes.
Voltando ao nosso foco que é o Watir, o resultado do puts será apenas a frase escrita, seja no MS - DOS, ScIte ou outro editor que esteja usando. Vamos então incrementar nosso exemplo para que ele fique mais interessante, escreva agora no seu script o seguinte código:
#------------------------------------------------------#
# teste de automação
# teste simples para exercitar o uso da automatização web
#
# Feito por Raphael Soares
# para demonstrar o uso da linguagem em um artigo no site test experts (www.testexpert.com.br)
#
#-------------------------------------------------------#
#incluindo os pacotes necessários
require 'watir'
include Watir
#trabalhando com o browser
ie = IE.start("http://www.youtube.com/")
#informo a frase " ubuntu" no campo de busca
puts "informo a frase ubuntu no campo de busca"
ie.text_field(:id, "search-term").set "ubuntu"
#escolho Channels no combo ao lado do campo da busca, atenção pois é case sensitive
puts "escolhendo Channels no combo"
ie.select_list(:class, "search-type").set("Channels")
#clicar no botão de busca
puts "clicando no botão de busca"
ie.button(:id, "search-button").click
#vamos inserir um ponto de verificação
#verificar se retornou o resultado que esperavamos
if ie.text.include? "Ubuntu Ultimate"
puts "Busca retornou corretamente o resultado esperado."
else puts "A busca não retornou o resultado esperado."
end
#vamos então informar ao browser para retornar a página anterior
puts "retornando no browser"
ie.back
#informo a frase "Vista vs Ubuntu" no campo de busca
puts "informo a frase Vista vs Ubuntu no campo de busca"
ie.text_field(:id, "search-term").set "Vista vs Ubuntu"
#escolho Videos no combo ao lado do campo da busca, atenção pois é case sensitive
puts "escolhendo Videos no combo"
ie.select_list(:class, "search-type").set("Videos")
#clicar no botão de busca
puts "clicando no botão de busca"
ie.button(:id, "search-button").click
#vamos clicar no link do video para ele reproduzir
puts "clicando para visualizar o video"
ie.link(:text, "Vista vs Ubuntu").click
#vamos expandir clicando em more
puts "expandindo o comentário sobre o video"
ie.link(:text, "more").click
#vamos reduzir os comentários do video clicando em "less"
puts "reduzindo o comentário sobre o video"
ie.link(:text, "less").click
#demonstrando como gardar a referência a um objeto
#armazenaremos o link Next que visualiza a próxima página de comentários
teste = ie.link(:text, "Next")
#vamos agora clicar para visualizar a proxima tela dos comentarios sobre o video, utilizando nossa variavel
puts "Visualizando a segunda pagina de comentarios"
teste.click
#Navegando entre os menus no cabeçalho do site
puts "Clicando no menu Home"
ie.link(:text, "Home").click
puts "Clicando no menu Videos"
ie.link(:text, "Videos").click
puts "Clicando no menu Channels"
ie.link(:text, "Channels").click
puts "Clicando no menu Community"
ie.link(:text, "Community").click
#Visualizar o nosso historico no site
puts "Visualizando nosso histórico no site e verificando se o resultado está correto"
ie.link(:text, "History").click
if ie.text.include? "Vista vs Ubuntu"
puts "Historico retornou corretamente o resultado esperado."
else puts "Historico não retornou o resultado esperado."
end
#fechar o navegador
ie.close
puts "Fim dos testes no youtube"
O Arquivo exemplo1.rb está em anexo para que possa ser baixado por quem não quer digitar o conteúdo. Ele pode ser aberto no ScIte ou seu editor de texto preferido.
Lembrando que o Watir manipula os objetos da tela através de seus atributos e tags HTML, portanto para facilitar este trabalho aconselho a instalação do IE Developer Tollbar (http://www.microsoft.com/downloads/details.aspx?familyid=e59c3964-672d-4511-bb3e-2d5e1db91038&displaylang=en) para Internet Explorer ou a Web Developer (https://addons.mozilla.org/pt-PT/firefox/addon/60) para Firefox. Em nossos exemplos será usado o IE 7.
Rode o código acima e aguarde a manipulação do browser pelo nosso código, após o término, se tudo der certo você terá exibido na tela as mensagens que foram enviadas através do comando puts. Em nosso exemplo temos a seguinte tela após o teste:
Note que esses pontos de controle são importantes para facilitar a leitura e análise dos testes. Em outro artigo falarei de como melhorar estes logs e incrementá-los, por enquanto vamos trabalhar dessa forma mesmo.
Bem, agora temos um código que faz um roteiro de teste completo, entrando em uma página, acessando algumas funcionalidades, manipulando comandos diretos do browser, etc. Tentei usar neste exemplo alguns dos comandos mais usados para um teste web mais simples e inclusive alguns comandos que apresentam uma certa dificuldade por parte de quem está aprendendo, como por exemplo o comando utilizado para selecionar no combo.
Não vou explicar o código detalhado, visto que todos os comandos estão comentados e acredito estar bem intuitivo. Qualquer dúvida sobre alguma linha específica, podem me enviar um e-mail que explico.
Nosso próximo passo é organizar nosso código em funções para que possam ser reusadas. O reuso é uma prática muito recomendada na engenharia de software e é uma ferramenta importante para evitar retrabalho e facilitar a manutenção. Para o nosso exemplo pode não parecer necessário criar funções, mas compreendam que o farei para demonstrar uma possibilidade que você pode aplicar em seus testes.
Vamos então analisar nosso código e vou trabalhar com uma forma de teste que tenta facilitar a forma como os "dados" são inseridos no teste, facilitando a manutenção, reuso e a legibilidade do código. Para isso, vou criar um novo arquivo chamado exemplo2.rb e nele deixarei as configurações dos dados para teste e também as nossas funções, no arquivo exemplo1.rb portanto teremos apenas a manipulação das funções. Note que outra forma de trabalho seria também colocar dados e funções em arquivos separados.
É importante dizer nesse momento que para funcionar da forma como está o código, os arquivos precisam estar no mesmo diretório.
Após a refatoração, temos o arquivo exemplo2.rb com o seguinte conteúdo:
#------------------------------------------------------#
# teste de automação
# teste simples para exercitar o uso da automatização web
#
# Feito por Raphael Soares
# para demonstrar o uso da linguagem em um artigo no site test experts (www.testexpert.com.br)
#
#-------------------------------------------------------#
#incluindo os pacotes necessários
require 'watir'
include Watir
#vamos inserir aqui nossos dados para que fique mais fácil a manutenção, sendo em um lugar separado
@site = 'http://www.youtube.com/'
#dados dos objetos do site, caso mudem fica mais fácil a manutenção estando centralizados aqui
@idCampoPesquisa = "search-term" #id do campo texto da pesquisa
@classCombo = "search-type" #classe do combo
@idBotaoPesquisa = "search-button" #id do botao da Pesquisa
def inicialize
#procede todas as tarefas de inicialização básicas, inicializa o browser e retorna a variável com o container
#trabalhando com o browser
ie = IE.start(@site)
#agiliza a digitação em campos de texto
ie.set_fast_speed()
return ie
end
def pesquisa(ie, frase, combo)
#informo a frase no campo de busca
puts "informo a frase #{frase} no campo de busca"
ie.text_field(:id, @idCampoPesquisa).set frase
#informo o parâmetro recebido no combo
puts "escolhendo #{combo} no combo"
ie.select_list(:class, @classCombo).set(combo)
#acionando o botão de pesquisa
puts "clicando no botão de busca"
ie.button(:id, @idBotaoPesquisa).click
end
#função para verificar um texto na tela
def verifica(ie, texto)
#verificar se retornou o resultado que esperávamos
if ie.text.include? texto
puts "Busca retornou corretamente o resultado esperado."
else puts "A busca não retornou o resultado esperado."
end
end
#função que clica em um determinado link na tela, deve-se informar o que está escrito no link
def clicaLink(ie, link)
puts "clicando no link: #{link}"
ie.link(:text, link).click
end
E nosso arquivo exemplo1.rb foi alterado para o arquivo exemplo1_b.rb com o seguinte conteúdo:
#------------------------------------------------------#
# teste de automação
# teste simples para exercitar o uso da automatização web
#
# Feito por Raphael Soares
# para demonstrar o uso da linguagem em um artigo no site test experts (www.testexpert.com.br)
#
#-------------------------------------------------------#
#incluindo os pacotes necessários
require 'exemplo2'
#trabalhando com o browser
ie = inicialize
#pesquisando, informo a frase e o que quero no combo
pesquisa(ie, "ubuntu", "Channels")
#vamos inserir um ponto de verificação
#verificar se retornou o resultado que esperavamos
verifica(ie, "Ubuntu Ultimate")
#vamos então informar ao browser para retornar a página anterior
puts "retornando no browser"
ie.back
#pesquisando a frase "Vista vs Ubuntu" e videos no combo
pesquisa(ie, "Vista vs Ubuntu", "Videos")
#vamos clicar no link do video para ele reproduzir
clicaLink(ie, "Vista vs Ubuntu")
#vamos expandir clicando em more
puts "expandindo o comentário sobre o video"
clicaLink(ie, "more")
#vamos reduzir os comentários do video clicando em "less"
puts "reduzindo o comentário sobre o video"
clicaLink(ie, "less")
#demonstrando como gardar a referência a um objeto
clicaLink(ie, "Next")
#Navegando entre os menus no cabeçalho do site
clicaLink(ie, "Home")
clicaLink(ie, "Videos")
clicaLink(ie, "Channels")
clicaLink(ie, "Community")
#Visualizar o nosso historico no site
puts "Visualizando nosso histórico no site e verificando se o resultado está correto"
clicaLink(ie, "History")
verifica(ie, "Vista vs Ubuntu")
#fechar o navegador
ie.close
puts "Fim dos testes no youtube"
Perceba que no arquivo antigo eu precisei escrever por exemplo 2 vezes o mesmo código para fazer uma verificação, alterando apenas o texto verificado, neste exemplo o código foi escrito somente uma vez no exemplo2.rb e pode ser usado quantas vezes você quiser utilizando apenas uma frase. O mesmo se aplica as demais funções criadas.
Após rodar o arquivo exemplo1_b.rb temos o seguinte log:
Como podem reparar, tudo saiu conforme o esperado, assim como no primeiro teste, a diferença agora é a forma como estruturamos nossos testes.
Pontos importantes a serem ressaltados:
- Note como nosso código do arquivo exemplo1_b.rb fica muito mais limpo, todas as nossas funções estão agora encapsuladas no arquivo exemplo2.rb, e como os nomes das funções estão intuitivos, percebe-se claramente o que as mesmas fazem.
- Reparem que ao chamar as funções, obrigatoriamente devo informar o container, que no caso é o browser a ser manipulado, isso facilita trabalhar com mais de um browser aberto e atende ao reuso das mesmas funções. Algumas ferramentas de automatização no mercado apresentam dificuldades em trabalhar quando temos mais de uma instância do browser aberto.
- O Watir não depende que o foco da tela esteja no browser, o que lhe permite continuar trabalhando normalmente no computador enquanto o teste é executado, esta também é uma vantagem do Watir quando comparado com outras ferramentas com o mesmo propósito.
- Com as funções prontas e permitindo um reuso, posso incrementar meu teste, ampliar sua cobertura, tentar variações de fluxos diferentes de forma mais fácil, sem precisar repetir um número grande de código.
Pessoal, com esses comandos e dicas fica fácil criar alguns testes de exemplo, espero que tenha ficado claro os meus comentários no código para que possam entender o uso dos comandos e também das dicas de reuso, encapsulamento, etc. Agora fica fácil aplicar os conceitos no seus testes. No próximo artigo vou ensinar como estruturar ainda melhor os testes, pretendo demonstrar outra forma de log dos resultados e também de testes guiados por dados.
Todos os arquivos usados no artigo estão em anexo,
Até a próxima e bons testes a todos.
Raphael Soares
ISTQB Certified Tester
| Anexo | Tamanho |
|---|---|
| exemplo1.zip | 1.17 KB |
| exemplo1_b.zip | 834 bytes |
| exemplo2.zip | 1.01 KB |