Para adicionar ao corpo de conhecimento existente aqui:
Para os testes de JS, Capybara deve manter dois threads (um para RSpec, um para Rails) e um segundo processo (o navegador) em sincronia. Ele faz isso aguardando (até o tempo de espera máximo configurado) na maioria dos comparadores e métodos de localização de nós.
Capivara também tem métodos que não esperam, principalmente Node#all
. Usá-los é como dizer às suas especificações que você gostaria que falhassem intermitentemente.
A resposta aceita sugere page.first('selector')
. Isso é indesejável, pelo menos para especificações JS, porque Node#first
usaNode#all
.
Dito isso, Node#first
vou esperar se você configurar Capivara assim:
# rails_helper.rb
Capybara.wait_on_first_by_default = true
Esta opção foi adicionada no Capybara 2.5.0 e é falsa por padrão.
Como Andrei mencionou, você deve usar
find('selector', match: :first)
ou mude seu seletor. Ambos funcionarão bem, independentemente da configuração ou driver.
Para complicar ainda mais as coisas, em versões antigas do Capybara (ou com uma opção de configuração habilitada), #find
felizmente ignorará a ambigüidade e apenas retornará o primeiro seletor correspondente. Isso também não é ótimo, pois torna suas especificações menos explícitas, o que imagino ser o motivo pelo qual não é mais o comportamento padrão. Vou omitir os detalhes porque já foram discutidos acima.
Mais recursos: