2016-07-25 1 views
0

Je crée des tests d'intégration pour l'application de mes rails.Capybara - NameError: constante non initialisée Capybara :: TimeoutError

L'application à laquelle je travaille est un peu lente. Dans mon test, j'exécute une certaine action sur le site (une "sauvegarde" - qui recharge à la fin de la page) et l'action capybara suivante s'exécute avant que la page ne soit rechargée.

Je ne peux pas utiliser "sleep (seconds)" car cela bloque le "rechargement" lui-même.

donc je voulais donner un essai à cette idée github: https://gist.github.com/metaskills/1172519

mais je reçois l'erreur suivante:

NameError: uninitialized constant Capybara::TimeoutError

Quelqu'un peut-il me dire pourquoi je reçois cette erreur et qu'est-ce que cela signifie?

+1

Ce n'est pas une méthode, c'est une constante. Qu'essayez-vous de faire? S'il vous plaît envoyer plus de code – siegy22

+0

@RaVeN merci. J'ai mis à jour la page –

Répondre

0

Lors de votre publication, vous essayez de créer une méthode qui attend la fin des requêtes ajax.

Mais il y a une meilleure façon de le faire:

Vous avez une vue, qui charge un modal (à distance, avec ajax). Vous ne devriez pas faire quelque chose comme la méthode wait_until. Ou même pas avec l'utilisation de while true.

La meilleure façon de le faire, est de définir un élément HTML unique sur la teneur en modaux:

<!-- in your modal view/partial --> 
<span id="modal"></span> 
... modal code 

Lorsque vous utilisez alors Capybara comme ceci:

find("#modal") 

La méthode find attend automatiquement pour toutes les demandes ajax pour finir.

Voir https://www.varvet.com/blog/why-wait_until-was-removed-from-capybara/ pour plus d'entrées.

+0

Merci RaVeN. Mais que faire si j'attends le chargement d'une page identique à la précédente? Le fait est que dans mon script, j'ai un "nouveau" bouton qui recharge simplement une page avec un numéro d'identification associé.Si, si j'utilise "trouver", il trouve l'élément avant de recharger la page (c'est ce qui se passe) –

+0

Ensuite, vous devriez utiliser un objet dom différent pour trouver ce qui est unique sur la page en cours de chargement – siegy22

0

La raison pour laquelle vous obtenez l'erreur est que la classe Capybara::TimeoutError a été supprimée dans Capybara v2, avec la méthode #wait_until. Comme la réponse par @RaVeN indique que vous devriez juste raconterai Capybara d'attendre un contenu ou des éléments sur la page qui fera Capybara attendre qu'il apparaisse automatiquement (tant que vous utilisez un pilote JS capable)

expect(page).to have_content("Some content that appears after the page has loaded") # will wait up to Capybara.default_max_wait_time seconds for the content to appear 

ou si le chemin des changements de page que vous pourriez faire

expect(page).to have_current_path('<the new path you want to wait to load>') 

en aparté - il n'y a aucune raison sleep dans les tests doivent mettre en pause une charge de page depuis les essais, l'application, le navigateur chaque exécution dans des threads/processus distincts en supposant que vous utilisez un pilote JS capable. Si vous n'exécutez pas de pilote compatible JS et que vous utilisez le pilote par défaut rack_test, il est inutile d'attendre/de dormir, car chaque action est synchrone.

+0

Merci Tom. Mais que faire si j'attends le chargement d'une page identique à la précédente? Le fait est que dans mon script, j'ai un "nouveau" bouton qui recharge simplement une page avec un numéro d'identification associé. Si, si j'utilise "trouver", il trouve l'élément avant de recharger la page (c'est ce qui se passe) –

+0

Si la page est vraiment identique alors tout ce que vous pouvez vraiment faire est de dormir pendant quelques secondes, ou ne pas le tester. Est-ce qu'il n'y a vraiment aucune différence entre les pages, aucun indicateur de chargement qui apparaît sur la page (que vous pouvez avoir capybara attendre jusqu'à ce qu'il disparaisse), ou aucune différence dans l'URL? Cela ressemble à une interface utilisateur étrange d'avoir un bouton qui recharge simplement la page sans montrer de progrès de quelque manière, forme ou forme. –

+0

Merci Tom. Oui, il recharge avec une URL différente: le bouton crée une nouvelle ligne mysql, et la page se recharge en affichant le nouvel identifiant en tant qu'URL. Le problème est que "sleep" * fige * la page juste * avant de recharger * la page. Ainsi, lorsque le "sleep" est terminé, la page se recharge correctement mais le * find ("id = ...") * est trop rapide et vérifie la page avant que "reload" ne démarre (et trouve l'objet car déjà présent dans la page). –