Para agregar al cuerpo de conocimiento existente aquí:
Para las pruebas de JS, Capybara tiene que mantener dos hilos (uno para RSpec, otro para Rails) y un segundo proceso (el navegador) sincronizados. Lo hace esperando (hasta el tiempo de espera máximo configurado) en la mayoría de los métodos de búsqueda de nodos y comparadores.
Carpincho también tiene métodos que no esperan, principalmente Node#all
. Usarlos es como decirle a sus especificaciones que le gustaría que fallaran de forma intermitente.
La respuesta aceptada sugiere page.first('selector')
. Esto no es deseable, al menos para las especificaciones de JS, porque Node#first
usesNode#all
.
Dicho esto, Node#first
se espera si configura capibara, así:
# rails_helper.rb
Capybara.wait_on_first_by_default = true
Esta opción se agregó en Capybara 2.5.0 y es falsa por defecto.
Como mencionó Andrei, deberías usar
find('selector', match: :first)
o cambia tu selector. Cualquiera funcionará bien independientemente de la configuración o el controlador.
Para complicar aún más las cosas, en versiones antiguas de Capybara (o con una opción de configuración habilitada), #find
felizmente ignorará la ambigüedad y simplemente devolverá el primer selector coincidente. Esto tampoco es genial, ya que hace que sus especificaciones sean menos explícitas, lo que imagino que es la razón por la que ya no es el comportamiento predeterminado. Dejaré de lado los detalles porque ya se han discutido anteriormente.
Más recursos: