97
Automatizando Tarefas com o Watir-Webdriver aka. Minha guerra com o portal da Cielo

Automatizando Tarefas com o Watir-Webdriver - Case

Embed Size (px)

DESCRIPTION

Apresentação de um case de uso da gem watir-webdriver para solucionar um problema com o site da cielo. Apresentado na Trilha Ruby da TDC 2014.

Citation preview

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 CieloUm verdadeiro inferno!

Site da CieloUm verdadeiro inferno!

FrameceptionFrames dentro de frames

Teclado VirtualQue muda a ordem dos números!!!

Código CrípticoJavascript inline, nomes com chaves, ids do tipo

“portlet_13_1_btnEntrar"

Código CrípticoJavascript inline, nomes com chaves, ids do tipo

“portlet_13_1_btnEntrar"

Não funciona no ChromeWhat a shame…

Não funciona no ChromeWhat 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 !

[email protected] @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.firstnews_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.firstnews_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.firstnews_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 !

[email protected] @lucasprim