Usando Capybara externamente para testes ou automação
Para aqueles que não conhecem, o capybara é uma gem de emulação de browser, de forma parecida com o que o selenium faz. A vantagem fica no binding para ruby, a velocidade que roda (já que o selenium abre um browser), e a ótima DSL.
O capybara usa por padrão o driver :rack_test
, que funciona muito rápido para aplicações Racks ( e portanto Rails ) locais. Porém, este driver não funciona com Javascript ou com aplicações não locais ou que não utilizem Rack (portanto PHP, ASP, páginas na internet, etc).
Mas é bem simples utilizar outro driver que suporte javascript, ou neste caso, urls externas. É possível utilizar tanto webkit quanto poltergeist. Neste exemplo irei usar poltergeist por achar mais simples a instalação e por ter mais funcionalidades. Após ter phantomjs instalado, basta isto para instalar o driver:
gem install capybara
gem install poltergeist
O meu objetivo era descobrir quantas horas totais davam todas as palestras submetidas para a Agile Brazil 2013, somando-se o tempo proposto de cada uma. Segue o script utilizado:
# Configurar Capybara com poltergeist
require 'capybara'
require 'capybara/poltergeist'
include Capybara::DSL
Capybara.current_driver = :poltergeist
# Configurar a url utilizada para os caminhos relativos
Capybara.app_host = 'http://submissoes.agilebrazil.com/'
# Fazer Login no agilebrazil
visit '/'
within '.user' do
fill_in :user_username, with: '<usuario>'
fill_in :user_password, with: '<senha>'
end
click_button 'Log in'
# Armazenar todos os htmls dos projetos submetidos em um array. Utilizei 630 à 926 por já saber o intervalo dos ids dos projetos
projects = []
630.upto(926) do |session_id|
visit "/2013/sessions/#{session_id}"
projects << page.body
end
# Soma o tempo de cada um dos projetos
projects.inject(0) do |sum, project|
sum + project.all(".spaced > li:last-child").first.text.to_i
end
E pronto, total de 247,5 horas ou 14730 minutos! O capybara é uma ótima ferramenta para utilizar em testes, automação, crawlers, spiders, robots, entre outras utilidades. Sua ótima DSL o torna ideal para usar em testes mesmo que não esteja utilizando Ruby ou Rails como framework web.