SlideShare a Scribd company logo
1 of 97
Download to read offline
Automatizando Tarefas
com o Watir-Webdriver
aka. Minha guerra com o portal da Cielo
Lucas Prim
Administrador
Meio Engenheiro
Developer for fun and
profit há 14 anos.
Professor Boiada
Co-Founder e CTO do
Kimitachi
Meu objetivo aqui: 

Falar rapidamente de um problema que
resolvemos usando a ferramenta watir-
webdriver em 4 partes.
Parte I: O Inimigo
Cielo
"Responsável pelo credenciamento de estabelecimentos comerciais, e pela
captura, transmissão, processamento e liquidação financeira das
transações realizadas com cartões de crédito e débito"
Imagens:
http://www.x-jetpacks.com/wp-content/uploads/death-star.png
http://kldsuportville.com.br/index/wp-content/uploads/2013/12/cartao.png
Cielo
"Responsável pelo credenciamento de estabelecimentos comerciais, e pela
captura, transmissão, processamento e liquidação financeira das
transações realizadas com cartões de crédito e débito"
Imagens:
http://www.x-jetpacks.com/wp-content/uploads/death-star.png
http://kldsuportville.com.br/index/wp-content/uploads/2013/12/cartao.png
Site da Cielo
Um verdadeiro inferno!
Site da Cielo
Um verdadeiro inferno!
Frameception
Frames dentro de frames
Teclado Virtual
Que muda a ordem dos números!!!
Código Críptico
Javascript inline, nomes com chaves, ids do tipo
“portlet_13_1_btnEntrar"
Código Críptico
Javascript inline, nomes com chaves, ids do tipo
“portlet_13_1_btnEntrar"
Não funciona no Chrome
What a shame…
Não funciona no Chrome
What a shame…
Está sujeito a coisas bizarras
(Isso aconteceu enquanto eu montava a apresentação)
O melhor de tudo!
Erros randômicos durante o processamento!!!
O melhor de tudo!
Erros randômicos durante o processamento!!!
Parte II: A Missão
“Eu preciso das
informações da Cielo
todas em Excel!"
Precisávamos construir
um screen scraper que:
Entrasse na cielo
Entrasse na cielo
Passasse pelos processos de
login (incluindo o teclado virtual
que muda a posição dos números)
Passasse pelos processos de
login (incluindo o teclado virtual
que muda a posição dos números)
Gerasse o relatório de
vendas do dia
Gerasse o relatório de
vendas do dia
Entrasse em cada um
dos grupamentos loucos
que a cielo faz
Entrasse em cada um
dos grupamentos loucos
que a cielo faz
Fizesse um “chupa-
cabra” nos dados
Fizesse um “chupa-
cabra” nos dados
Exportasse os dados
para excel
Exportasse os dados
para excel
Repetisse o processo
todos os dias
Repetisse o processo
todos os dias
Parte III: Planejamento
Três alternativas:
1. Mechanize
2. Selenium
3. Watir
3. Watir
3. Watir
Na verdade eu usei o Watir
Webdriver (O Watir usa ele para
fazer testes automatizados)
Roda no Firefox, IE,
Chrome e Safari.
É ridículo de instalar
Tem uma DSL muito
foda bacana
Sério, saca só essa
DSL:
b = Watir::Browser.new!
b.goto ‘http://www.cielo.com.br'
b = Watir::Browser.new!
b.goto ‘http://www.cielo.com.br'!
form = b.form id: ‘consulta-
estabelecimento'
b = Watir::Browser.new!
b.goto ‘http://www.cielo.com.br'!
form = b.form id: ‘consulta-
estabelecimento’!
inputs = form.inputs(type: ‘text')
b = Watir::Browser.new!
b.goto ‘http://www.cielo.com.br'!
form = b.form id: ‘consulta-
estabelecimento’!
inputs = form.inputs(type: ‘text’)!
inputs.first.set(‘aww yeah!’)
aww yeah!
b = Watir::Browser.new!
b.goto ‘http://www.cielo.com.br'!
form = b.form id: ‘consulta-
estabelecimento’!
inputs = form.inputs(type: ‘text’)!
inputs.first.set(‘aww yeah!’)!
inputs.last.set(‘mah oee!’)!
mah oee!
aww yeah!
b = Watir::Browser.new!
b.goto ‘http://www.cielo.com.br'!
form = b.form id: ‘consulta-
estabelecimento’!
inputs = form.inputs(type: ‘text’)!
inputs.first.set(‘aww yeah!’)!
inputs.last.set(‘mah oee!’)!
form.input(type: ‘submit’).click!
mah oee!
aww yeah!
b = Watir::Browser.new!
b.goto ‘http://www.cielo.com.br'!
form = b.form id: ‘consulta-
estabelecimento’!
inputs = form.inputs(type: ‘text’)!
inputs.first.set(‘aww yeah!’)!
inputs.last.set(‘mah oee!’)!
form.input(type: ‘submit’).click!
E tem muito mais:!
• Executa javascript lindamente (me salvou do teclado
virtual)
• Acessa frameceptions facilmente
• Faz drag and drop
• Suporta chamadas ajax com “Wait until present” ou
“Wait While Present”
• Tem comandos do tipo “tables”, “as”, “lis”, “uls”,
enfim, o negócio vai muito naturalmente!
• Read the docs: http://rubydoc.info/gems/watir-
webdriver/frames
Parte IV: Execução
Fizemos um design
básico:
Fizemos um design
básico:
Page!
• Realiza as interações
com as diferentes
páginas (cada page
object sabe da sua
página)
Fizemos um design
básico:
Page!
• Realiza as interações
com as diferentes
páginas (cada page
object sabe da sua
página)
Parser!
• Extrai e limpa os
valores extraídos das
páginas,
transformando-os em
objetos nativos
(Hashes e Arrays na
maioria)
Fizemos um design
básico:
Page!
• Realiza as interações
com as diferentes
páginas (cada page
object sabe da sua
página)
Parser!
• Extrai e limpa os
valores extraídos das
páginas,
transformando-os em
objetos nativos
(Hashes e Arrays na
maioria)
Exporter!
• Recebe os dados em
objetos nativos e
exporta para excel
Task
Fizemos um design
básico:
Page!
• Realiza as interações
com as diferentes
páginas (cada page
object sabe da sua
página)
Parser!
• Extrai e limpa os
valores extraídos das
páginas,
transformando-os em
objetos nativos
(Hashes e Arrays na
maioria)
Exporter!
• Recebe os dados em
objetos nativos e
exporta para excel
Implementamos e
botamos para rodar e…
Implementamos e
botamos para rodar e…
Implementamos e
botamos para rodar e…
Esquecemos das coisas
bizarras do site da
cielo…
Criamos mais um
objeto no nosso design:
Criamos mais um
objeto no nosso design:
NavigationStack!
• Ordena e executa a navegação
programada na task.
• Em caso de erro na execução, volta
os passos necessários
(browser.back) e tenta novamente
até o fluxo programado funcionar!
Adicionamos mais um
ingrediente com o
Headless
E pronto!
O sistema rodou por um tempo até
nosso CFO descobrir um serviço
da cielo chamado EDI que exporta
os dados sozinho :)
Mas ficou a lição: Serviço
de corno na web se
resolve facilmente com o…
Watir-Webdriver
Obrigado!
Lucas Prim!
CTO & Co-Founder @ Kimitachi
!
lucas.prim@gmail.com
@lucasprim
Parece que sobrou
tempo…
Chega a ser divertido
brincar com o watir!
Vamos fazer um hacker news
fetcher, que notifica no growl
quando o post tiver > 200 points.
require 'watir-webdriver'
require 'watir-webdriver'
browser = Watir::Browser.new(‘chrome')
require 'watir-webdriver'
browser = Watir::Browser.new(‘chrome')
browser.goto('http://news.ycombinator.com')
require 'watir-webdriver'
browser = Watir::Browser.new(‘chrome')
browser.goto('http://news.ycombinator.com')
main_table = browser.tables.first
require 'watir-webdriver'
browser = Watir::Browser.new(‘chrome')
browser.goto('http://news.ycombinator.com')
main_table = browser.tables.first
news_list_section = main_table.trs[3]
news_table = news_list_section.tables.first
require 'watir-webdriver'
browser = Watir::Browser.new(‘chrome')
browser.goto('http://news.ycombinator.com')
main_table = browser.tables.first
news_list_section = main_table.trs[3]
news_table = news_list_section.tables.first
news = news_table.trs.map do |item|
content = item.text.split("n")
content[1]
end.compact
require 'watir-webdriver'
browser = Watir::Browser.new(‘chrome')
browser.goto('http://news.ycombinator.com')
main_table = browser.tables.first
news_list_section = main_table.trs[3]
news_table = news_list_section.tables.first
news = news_table.trs.map do |item|
content = item.text.split("n")
content[1]
end.compact
browser.close
Have Fun :D
Obrigado!
Lucas Prim!
CTO & Co-Founder @ Kimitachi
!
lucas.prim@gmail.com
@lucasprim

More Related Content

Similar to Automatizando Tarefas com o Watir-Webdriver - Case

Congresso TI 2015: Introducao ao Phonegap (Cordova)
Congresso TI 2015: Introducao ao Phonegap (Cordova)Congresso TI 2015: Introducao ao Phonegap (Cordova)
Congresso TI 2015: Introducao ao Phonegap (Cordova)Loiane Groner
 
pepinos do cliente no código de testes da aplicação com OSS
pepinos do cliente no código de testes da aplicação com OSSpepinos do cliente no código de testes da aplicação com OSS
pepinos do cliente no código de testes da aplicação com OSSRodrigo Urubatan
 
HTML 5, CSS 3 e o futuro da Web
HTML 5, CSS 3 e o futuro da WebHTML 5, CSS 3 e o futuro da Web
HTML 5, CSS 3 e o futuro da WebDiego Pessoa
 
Hibernate efetivo (IA-2014 / Disturbing the Mind)
Hibernate efetivo (IA-2014 / Disturbing the Mind)Hibernate efetivo (IA-2014 / Disturbing the Mind)
Hibernate efetivo (IA-2014 / Disturbing the Mind)Rafael Ponte
 
Visão Geral De Desenvolvimento Web Sre 2012
Visão Geral De Desenvolvimento Web   Sre 2012Visão Geral De Desenvolvimento Web   Sre 2012
Visão Geral De Desenvolvimento Web Sre 2012Carlos Casalicchio
 
Desenvolvendo aplicacoes mobile_com_html_css_
Desenvolvendo aplicacoes mobile_com_html_css_Desenvolvendo aplicacoes mobile_com_html_css_
Desenvolvendo aplicacoes mobile_com_html_css_Rodrigo Urubatan
 
Desenvolvimento Web Parte I
Desenvolvimento Web Parte IDesenvolvimento Web Parte I
Desenvolvimento Web Parte Iigorpimentel
 
Novo Cinto de Utilidades do Desenvolvedor JavaScript, WebAPIs e Open Web
Novo Cinto de Utilidades do Desenvolvedor JavaScript, WebAPIs e Open WebNovo Cinto de Utilidades do Desenvolvedor JavaScript, WebAPIs e Open Web
Novo Cinto de Utilidades do Desenvolvedor JavaScript, WebAPIs e Open WebLeonardo Balter
 
Capturando a web com Scrapy
Capturando a web com ScrapyCapturando a web com Scrapy
Capturando a web com ScrapyGabriel Freitas
 
Backbone.js nas trincheiras
Backbone.js nas trincheirasBackbone.js nas trincheiras
Backbone.js nas trincheirasLambda 3
 
Guião demotécnica
Guião demotécnicaGuião demotécnica
Guião demotécnicaSilvio Dias
 
Guiao demotecnica
Guiao demotecnicaGuiao demotecnica
Guiao demotecnicaSilvio Dias
 
Testes In Browser Em Rails Com Capybara E Webdriver
Testes In Browser Em Rails Com Capybara E WebdriverTestes In Browser Em Rails Com Capybara E Webdriver
Testes In Browser Em Rails Com Capybara E WebdriverMaurício Linhares
 
TDC2011: Java EE 6 & Azure
TDC2011: Java EE 6 & AzureTDC2011: Java EE 6 & Azure
TDC2011: Java EE 6 & AzureDr. Spock
 
Criação de Ambientes de Realidade Virtual usando A-Frame
Criação de Ambientes  de Realidade Virtual  usando A-FrameCriação de Ambientes  de Realidade Virtual  usando A-Frame
Criação de Ambientes de Realidade Virtual usando A-FrameJorge Cardoso
 
Semcomp - USP São Carlos - Desenvolvendo um aplicativo iOS com Swift
Semcomp - USP São Carlos - Desenvolvendo um aplicativo iOS com SwiftSemcomp - USP São Carlos - Desenvolvendo um aplicativo iOS com Swift
Semcomp - USP São Carlos - Desenvolvendo um aplicativo iOS com SwiftJuliana Chahoud
 
DevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webappsDevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webappsSuissa
 

Similar to Automatizando Tarefas com o Watir-Webdriver - Case (20)

Congresso TI 2015: Introducao ao Phonegap (Cordova)
Congresso TI 2015: Introducao ao Phonegap (Cordova)Congresso TI 2015: Introducao ao Phonegap (Cordova)
Congresso TI 2015: Introducao ao Phonegap (Cordova)
 
pepinos do cliente no código de testes da aplicação com OSS
pepinos do cliente no código de testes da aplicação com OSSpepinos do cliente no código de testes da aplicação com OSS
pepinos do cliente no código de testes da aplicação com OSS
 
HTML 5, CSS 3 e o futuro da Web
HTML 5, CSS 3 e o futuro da WebHTML 5, CSS 3 e o futuro da Web
HTML 5, CSS 3 e o futuro da Web
 
Hibernate efetivo (IA-2014 / Disturbing the Mind)
Hibernate efetivo (IA-2014 / Disturbing the Mind)Hibernate efetivo (IA-2014 / Disturbing the Mind)
Hibernate efetivo (IA-2014 / Disturbing the Mind)
 
Visão Geral De Desenvolvimento Web Sre 2012
Visão Geral De Desenvolvimento Web   Sre 2012Visão Geral De Desenvolvimento Web   Sre 2012
Visão Geral De Desenvolvimento Web Sre 2012
 
Desenvolvendo aplicacoes mobile_com_html_css_
Desenvolvendo aplicacoes mobile_com_html_css_Desenvolvendo aplicacoes mobile_com_html_css_
Desenvolvendo aplicacoes mobile_com_html_css_
 
Html5
Html5Html5
Html5
 
Desenvolvimento Web Parte I
Desenvolvimento Web Parte IDesenvolvimento Web Parte I
Desenvolvimento Web Parte I
 
Novo Cinto de Utilidades do Desenvolvedor JavaScript, WebAPIs e Open Web
Novo Cinto de Utilidades do Desenvolvedor JavaScript, WebAPIs e Open WebNovo Cinto de Utilidades do Desenvolvedor JavaScript, WebAPIs e Open Web
Novo Cinto de Utilidades do Desenvolvedor JavaScript, WebAPIs e Open Web
 
Capturando a web com Scrapy
Capturando a web com ScrapyCapturando a web com Scrapy
Capturando a web com Scrapy
 
Web 3.0
Web 3.0Web 3.0
Web 3.0
 
Backbone.js nas trincheiras
Backbone.js nas trincheirasBackbone.js nas trincheiras
Backbone.js nas trincheiras
 
Guião demotécnica
Guião demotécnicaGuião demotécnica
Guião demotécnica
 
Guiao demotecnica
Guiao demotecnicaGuiao demotecnica
Guiao demotecnica
 
Testes In Browser Em Rails Com Capybara E Webdriver
Testes In Browser Em Rails Com Capybara E WebdriverTestes In Browser Em Rails Com Capybara E Webdriver
Testes In Browser Em Rails Com Capybara E Webdriver
 
TDC2011: Java EE 6 & Azure
TDC2011: Java EE 6 & AzureTDC2011: Java EE 6 & Azure
TDC2011: Java EE 6 & Azure
 
Conhecendo mundo Node.js
Conhecendo mundo Node.jsConhecendo mundo Node.js
Conhecendo mundo Node.js
 
Criação de Ambientes de Realidade Virtual usando A-Frame
Criação de Ambientes  de Realidade Virtual  usando A-FrameCriação de Ambientes  de Realidade Virtual  usando A-Frame
Criação de Ambientes de Realidade Virtual usando A-Frame
 
Semcomp - USP São Carlos - Desenvolvendo um aplicativo iOS com Swift
Semcomp - USP São Carlos - Desenvolvendo um aplicativo iOS com SwiftSemcomp - USP São Carlos - Desenvolvendo um aplicativo iOS com Swift
Semcomp - USP São Carlos - Desenvolvendo um aplicativo iOS com Swift
 
DevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webappsDevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webapps
 

Automatizando Tarefas com o Watir-Webdriver - Case