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.