Bonne façon d'attendre une seconde page à charger avec le Capybara quand la première a le même champ que la deuxième
Je vais avoir un problème avec un spec que des visites de deux formes avec le même champ ("Email") sur les deux formes. Si je n'ai pas manuellement le sommeil, le Capybara semble être de trouver le champ "Email" de la première visite dans la deuxième partie de l'épreuve.
# visit the first form and fill out a subscription
visit new_front_form_subscription_path(@web_form_1.id)
fill_in "Email", with: "[email protected]"
fill_in "Field 1", with: "my first data"
click_button "Subscribe"
# visit the second form and fill out a subscription
visit new_front_form_subscription_path(@web_form_2.id)
sleep 1
fill_in "Email", with: "[email protected]"
fill_in "Field 2", with: "my second data"
click_button "Subscribe"
Avec le sommeil, il y, la spec passe avec brio. Sans sommeil, la deuxième forme de soumission obtient une erreur de validation -- blâmer un blanc "e-Mail" de la valeur.
Est-il une bonne façon de gérer cela? Je déteste l'introduction de manuel dort dans nos spécifications. Je préfère de loin une façon de dire Capybara d'ignorer sa notion de ce qui est déjà sur la page, ou quelque chose le long de ces lignes.
Merci.
OriginalL'auteur Alex | 2014-01-23
Vous devez vous connecter pour publier un commentaire.
Ici sont un couple de façons à l'aide de laquelle vous pouvez résoudre:
Utiliser un autre localisateur qui n'est présent qu'à la deuxième page pour sélectionner le champ "Email":
Écrire une déclaration qui va attendre une deuxième page à charger au lieu de dormir:
Peut-être que je me trompe, mais ne serait-il pas possible que le
expect
ligne échoue si la deuxième page n'a pas encore chargé?Presque tous les capybara méthodes d'attente automatiquement (y compris rspec de rapprochement) - github.com/jnicklas/...
Cool! M'a incité à la lecture: elabs.se/blog/53-pourquoi-wait_until-a-supprimer-de-capybara
OriginalL'auteur Andrei Botalov
Les réponses ci-dessus sont correctes, mais difficile à mettre en œuvre si vous avez une grande suite de test, parce que vous devez trouver un élément unique sur chaque page. Si vous êtes un diplômé de la Michael Hartl école de rails il y a un moyen facile de résoudre ce problème. Hartl enseigne la définition d'un autre
@title
variable d'instance pour chaque action du contrôleur. C'est alors utilisé dans l'application.html.erb pour définir un html élément de titre pour chaque page.Je n'ai certainement, et il a permis un moyen très facile de corriger toutes mes feuilletée tests qui ont échoué parce que la page n'avait pas chargé correctement. Vous ne pouvez pas trouver la balise de titre, car il n'est pas visible. Donc je l'ai mis en bas de l'application.html.erb, le code suivant;
Cette inserts, si vous êtes en mode test, un div avec du texte du titre, entouré par des crochets. Ensuite, j'ai écrit un assistant, qui va dans rails_helper.rb
Je dispose déjà d'un autre helper pour tester le bon titre, alors je l'ai modifié pour ajouter dans
wait_for_page_load
je.e;Ces simples changements effacé presque toutes mes feuilletée tests.
OriginalL'auteur Obromios
Si vous avez eu recours à Andrey 2) ci-dessus, vous pourriez vouloir vérifier la holdon gem, qui va vous permettre d'écrire un bloc qui peut attendre d'un élément à charge, puis de passer à la
fill_in
méthode une fois que l'élément de charge.e = HoldOn.until(timeout: 60, interval: 5) { s.first(:css, "div#bastard") }
este = find('div#bastard', wait: 60, match: :first)
. Holdon gem est complètement inutile. Mais je préfère ne pas passer:match
param:find('div#bastard', wait: 60)
OriginalL'auteur aceofbassgreg
Généralement, il peut être fait de cette façon. Par exemple pour cliquer sur les boutons qui se trouvent après modale des pop-up (ou une autre page) est chargé, ajouter le bloc suivant à votre fichier de macro.
Ici de la classe .modal est trouvé sur le sur le menu en haut de page.
OriginalL'auteur bir_ham