Pour compléter le corpus de connaissances existant ici:
Pour les tests JS, Capybara doit garder deux threads (un pour RSpec, un pour Rails) et un second processus (le navigateur) synchronisés. Pour ce faire, il attend (jusqu'au temps d'attente maximal configuré) dans la plupart des correspondeurs et des méthodes de recherche de nœuds.
Capybara a aussi des méthodes qui n'attendent pas, principalement Node#all
. Les utiliser, c'est comme dire à vos spécifications que vous aimeriez qu'elles échouent par intermittence.
La réponse acceptée suggère page.first('selector')
. Ceci est indésirable, au moins pour les spécifications JS, parce que les Node#first
utilisationsNode#all
.
Cela dit, Node#first
va attendre si vous configurez Capybara comme ceci:
# rails_helper.rb
Capybara.wait_on_first_by_default = true
Cette option a été ajoutée dans Capybara 2.5.0 et est fausse par défaut.
Comme Andrei l'a mentionné, vous devriez plutôt utiliser
find('selector', match: :first)
ou modifiez votre sélecteur. L'un ou l'autre fonctionnera bien indépendamment de la configuration ou du pilote.
Pour compliquer davantage les choses, dans les anciennes versions de Capybara (ou avec une option de configuration activée), #find
ignorera volontiers l'ambiguïté et renverra simplement le premier sélecteur correspondant. Ce n'est pas génial non plus, car cela rend vos spécifications moins explicites, ce qui, j'imagine, n'est plus le comportement par défaut. Je vais laisser de côté les détails car ils ont déjà été discutés ci-dessus.
Plus de ressources: