Per aggiungere al corpo di conoscenza esistente qui:
Per i test JS, Capybara deve mantenere sincronizzati due thread (uno per RSpec, uno per Rails) e un secondo processo (il browser). Lo fa attendendo (fino al tempo di attesa massimo configurato) nella maggior parte dei matcher e dei metodi di ricerca dei nodi.
Capybara ha anche metodi che non aspettano, principalmente Node#all
. Usarli è come dire alle tue specifiche che vorresti che fallissero in modo intermittente.
La risposta accettata suggerisce page.first('selector')
. Questo è indesiderabile, almeno per le specifiche JS, perché Node#first
utilizzaNode#all
.
Detto questo, Node#first
vi aspetta se si configura Capybara in questo modo:
# rails_helper.rb
Capybara.wait_on_first_by_default = true
Questa opzione è stata aggiunta in Capybara 2.5.0 ed è falsa per impostazione predefinita.
Come ha detto Andrei, dovresti invece usare
find('selector', match: :first)
o cambia il tuo selettore. Entrambi funzioneranno bene indipendentemente dalla configurazione o dal driver.
Per complicare ulteriormente le cose, nelle vecchie versioni di Capybara (o con un'opzione di configurazione abilitata), #find
ignorerà felicemente l'ambiguità e restituirà semplicemente il primo selettore corrispondente. Anche questo non è eccezionale, poiché rende le tue specifiche meno esplicite, il che immagino sia il motivo per cui non è più il comportamento predefinito. Tralascio le specifiche perché sono già state discusse sopra.
Più risorse: