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 .