WEBDRIVER Maurcio Linhares mauricio.linhares@gmail.com Quem? Maurcio Linhares Joo Pessoa, terra que o sol nasce primeiro Ruby e Java developer; De Onde? Testes in-browser em Rails A.C. A.C. Antes do Capybara Teste na mo chamando o Selenium RC; Surge o WebRat que funciona quando acha que deve e ainda chamando o Selenium RC; Timeouts, loops eternos, browser que no abre...; Selenium RC Selenium RC Lento; WebServer em Java que de l controla o navegador como um controle remoto (remote control); Se voc est do lado Java, tudo uma maravilha, se no, pois ... Selenium original Selenium original era escrito em JavaScript; Browsers so muito chatos no que JavaScript pode fazer ou no (como se voc no soubesse disso); Lento (engines de JS antigas) e muita coisa ficava de fora; Selenium 2 - WebDriver Escrito utilizando a forma nativa do browser de ser controlado: Plugin no Firefox; Automation tools no IE; Fast! Fast! Fast! API orientada a objetos e simplificada; D.C. Depois do Capybara Como Webrat, mas com WebDriver j integrado e utilizado por padro; Sintaxe praticamente igual a dos testes antigos escritos com Webrat; Est virando a opo padro pra testes in- browser pra apps Rails com Cucumber; DEMO Montando a fbrica de objetos Dado /^que (?:o|os|a|as) seguint(?:e|es) (.+) exist(?:e|em):$/ do |nome, table| table.hashes.each do |hash| Factory( nome.singularize, hash ) end end Preenchendo um formulrio de login # language: pt Funcionalidade: Fazer login do usurio Como usurio do sistema Eu quero me autenticar no mesmo Para poder acessar meu carrinho de compras Cenrio: Fazer login Dado que o seguinte usuario existe: | nome | email | senha | senha_confirmation | | Jos da Silva | jose@silva.com| 123456 | 123456 | E que estou na pgina de login Quando preencho "email" com "jose@silva.com" E preencho "senha" com "123456" E pressiono "Enviar" Ento devo ver "Seja bem vindo a nossa loja, Jos da Silva" E devo estar na listagem de produtos features/support/paths.rb def path_to(page_name) case page_name when /pgina inicial/ '/' when 'listagem de produtos' produtos_path when 'pgina do carrinho' itens_path else raise_path_error( page_name ) end end Cadastrando um usurio # language: pt Funcionalidade: Cadastrar um usurio no sistema Como usurio do sistema Eu quero ser capaz de criar uma conta no mesmo Para poder me identificar e fazer meus pedidos Cenrio: Cadastro com sucesso Dado que estou na pgina de cadastro de usurio Quando preencho "usuario[nome]" com "Marcos Silva" E preencho "usuario[email]" com "marcos.silva@email.com" E preencho "usuario[senha]" com "123456" E preencho "usuario[senha_confirmation]" com "123456" E marco "usuario[termos_e_condicoes]" E pressiono "Enviar" Ento devo ver "Dados recebidos com sucesso" E devo estar na listagem de produtos Testando chamadas Ajax # language: pt @javascript Funcionalidade: Adicionar e remover itens do carrinho Como usurio do sistema Eu quero adicionar e remover itens ao carrinho Para ser capaz efetuar compras Contexto: Dado que os seguintes produtos existem: | nome | preco | | Agile Estimating and Planning | 30.00 | | Lean Software Development | 25.00 | @javascript Capybara usa tags do Cucumber para marcar se a sua funcionalidade precisa ser testada com JavaScript ou no; No necessrio ter os arquivos em pastas separadas nem implementar steps de forma diferente; Voc deve instalar a gem database_cleaner para que o banco de dados seja limpo; O prprio Capybara inicia um servidor e abre o navegador pra fazer o servio; Adicionando itens ao carrinho Cenrio: Adicionar item ao carrinho Dado que estou na listagem de produtos Quando adiciono "5" itens do produto "Lean Software Development" ao carrinho Ento devo ver "Lean Software Development - 5" Step especfico Quando /^adiciono "([^\"]*)" itens do produto "([^\"]*)" ao carrinho$/ do |quantidade, nome| produto = Produto.find_by_nome( nome ) Quando "preencho \"quantidade\" com \"#{quantidade}\" em \"#produto_#{produto.id}\"" Quando "pressiono \"Adicionar\" em \"#produto_#{produto.id}\" end Removendo itens do carrinho Cenrio: Remover itens do carrinho Dado que estou na listagem de produtos E adiciono "5" itens do produto "Lean Software Development" ao carrinho E adiciono "5" itens do produto "Agile Estimating and Planning" ao carrinho Quando vou pra pgina do carrinho E removo o produto "Agile Estimating and Planning" do carrinho Entao devo ver "Lean Software Development Mas no devo ver "Agile Estimating and Planning" Step especfico Quando /^removo o produto "([^"]*)" do carrinho$/ do |nome| produto = Produto.find_by_nome( nome ) Quando "clico em \"Remover produto\" em \"#produto_#{produto.id}\" end Usando Chrome como navegador padro Capybara::Driver::Selenium.class_eval do def self.driver unless @driver @driver = Selenium::WebDriver.for :chrome at_exit do @driver.quit end end @driver end end Referncias Cucumber - http://wiki.github.com/aslakhellesoy/cucumber/ Capybara http://github.com/jnicklas/capybara Projeto de Exemplo - http://github.com/mauricio/linuxfi-loja @mauriciojr