ruby - tutorial - ¿Cómo usar sincronizar en Capibara exactamente?
rails 5 rspec (2)
Si el uso de wait_until es bastante claro (he usado los métodos de este tipo al crear pruebas a través de los métodos nativos de Webdriver), pero no el nuevo método de sincronización (lo siento :). He leído el tema sobre por qué wait_until está en desuso, he leído el artículo sobre eso, he leído los documentos con la descripción del método y también he leído el código donde también está presente la descripción. Pero no encontré ningún ejemplo o tutorial sobre cómo usar exactamente este método.
Alguien, por favor, proporcione algunos casos donde yo (y tal vez alguien más) pude ver y aprender a usar este método
Por ejemplo, el caso
expect(actual).to equal(expected)
¿Dónde debería "poner" el método de sincronización para obtener una excepción negativa solo después de que se haya pasado el tiempo de espera?
UPD: para aquellos interesados, miren estos enlaces:
http://www.elabs.se/blog/53-why-wait_until-was-removed-from-capybara
https://github.com/jnicklas/capybara/blob/master/lib/capybara/node/base.rb#L44
Vea este método de ayuda que podría ayudarlo. Encontrado en https://gist.github.com/10c41024510ee9f235e0
# spec/support/capybara_helpers.rb
module CapybaraHelpers
def wait_for_whizboo
start = Time.now
while true
break if [check for whizboo here, e.g. with page.evaluate_script]
if Time.now > start + 5.seconds
fail "Whizboo didn''t happen."
end
sleep 0.1
end
end
end
RSpec.configure do |config|
config.include CapybaraHelpers, type: :request
end
Acabo de encontrar un caso en el que necesitaba usar #synchronize. Tengo un método de ayuda que busca un elemento en la página y si existe, hace clic en él y devuelve un texto que se actualiza en la página (a través de JavaScript). Hay casos en los que, entre encontrar el elemento y hacer clic en él, podría desaparecer (y posiblemente volver a aparecer) debido a otro código JavaScript y podría generar una excepción Selenium :: WebDriver :: Error :: StaleElementReferenceError. Así que uso sincronizar así:
page.document.synchronize do
element = first(''#whatever'')
if element
element.click
find(''#foo'').text
else
nil
end
end