Pepino, Capivara 2.0 e Capivara :: Ambíguo

Esta noite eu atualizei as gemas de um projeto privado depois de executar todos os meus testes para garantir que a atualização da gema não quebrasse meu código.

Na lista de gem atualizada havia a nova versão da gem Capybara ( https://github.com/jnicklas/capybara ).

Executar novamente meus testes gerou muitas vezes o seguinte erro:

Ambiguous match, found 2 elements matching field "Password" (Capybara::Ambiguous)

Dar uma olhada no Guia de atualização do Capybara 2.0 escrito por Jo Liss ( http://techblog.fundinggates.com/blog/2012/08/capybara-2-0-upgrade-guide/ ) me faz entender o que está errado:

Capivara agora é estrita na combinação dos elementos. Se quiser preencher um campo “Senha” e um campo “Confirmação de senha”, você terá este erro, pois a palavra Senha pode ser encontrada duas vezes.

A solução fornecida no guia de atualização não é boa para mim, porque então o cenário Cucumber é menos legível, pois devemos usar o campo id.

Para corrigir isso, basta atualizar o arquivo web_steps.rb e alterar a etapa para preencher os campos como os seguintes:

When /^(?:|I )fill in "([^"]*)" with "([^"]*)"$/ do |field, value|
# First try with a label
xpath
= "//label[normalize-space(translate(.,'*',''))='#{field}' or @for='#{field}']/.."
if page.all(xpath).empty?
# Then try with a input field
xpath
= "//input[@type='text' and (@id='#{field}' or @name='#{field}')]/.."
end

within
(xpath) do
fill_in
(field, with: value)
end
end

Veja uma versão completa desta essência que criei .