Capybara et Rspec: de façon correcte à utiliser dans un délai de() et have_selector ()?
- Je utiliser rspec 2.6.0 et le Capybara 1.1.1 pour les tests d'acceptation.
Avec une vue semblable à la suivante:
<tr >
<td>Team 3 Name</td>
<td>true</td>
<td><a href="/teams/3">Show</a></td>
<td><a href="/teams/3/edit">Edit</a></td>
<td><a href="/teams/3">Deactivate</a></td>
</tr>
<tr >
<td>Team 4 Name</td>
<td>true</td>
<td><a href="/teams/4">Show</a></td>
<td><a href="/teams/4/edit">Edit</a></td>
<td><a href="/teams/4">Deactivate</a></td>
</tr>
Je veux écrire un test d'acceptation qui déclare: "l'Équipe 3 n'a PAS la "Deactivate " lien". J'attends la suite de l'échec:
within('tr', :text => 'Team 3 Name') do |ref|
page.should_not have_selector('a', :text => 'Deactivate')
end
Mais il passe. Afin de tester ce qui se passe, j'ai écrit l'absurde:
lock = false
within('tr', :text => 'Team 3 Name') do |ref|
page.should have_selector('a', :text => 'Deactivate')
page.should_not have_selector('a', :text => 'Deactivate')
lock = true
end
lock.should be_true
Qui passe ainsi.
Je suis en supposant que le champ d'application de la have_selector() appel à l'aide n'est pas limité par l'intérieur() bloquer, mais je ne suis pas sûr pourquoi. Le capybara documentation utilise ce modèle et ne semble pas à mentionner tous les pièges.
Quelle est la bonne façon de l'utiliser à l'intérieur pour limiter la portée de mon choix?
Je vous remercie.
/Salernost
page
est nul, par une étrange coïncidence, ou de les mettre dans un débogueur en ligne en haut de l'essai de sorte que vous pouvez obtenir à une console de sortie et de la valeur de page
, ou ajouté à l'étape And show me the page
de sorte que votre navigateur va vous montrer une copie de la page dans l'état où il est en droit avant l'exécution de ce test? Si oui, qu'est-ce que le framework de test voir réellement?Merci pour votre réponse. Je peux vérifier que la page n'est pas nul, via la sortie de débogage, et encore plus, quand je l'appelle: "met réf.texte" à l'intérieur de l'intérieur() bloc-je obtenir le bon: "l'Équipe 3 Nom du vrai Spectacle Éditer Désactiver". Notez que j'ai singe-corrigés dans un délai de() pour donner le contexte pour que je puisse appeler du texte. J'ai patché dans un délai de() APRÈS j'ai identifié ce comportement étrange si, et à cet effet, n'est pas la cause. 🙂
thread peuvent être d'intérêt.
Merci Mark. J'avais effectivement lu ce document et à sentir que c'est une question un peu différente. Dans le Capybara documentation qui indique clairement que dans() retourne le premier match, tous les matchs, ce qui est bien si vous garantie que :texte => 'Équipe 3 Nom" est le seul ou le premier sur la page. Pour plus de clarté, quand j'imprime le contexte retourné dans un délai de() correctement portées à la <td>, et imprime "l'Équipe 3 Nom du vrai Spectacle Éditer Désactiver". Si je suis capable d'en arriver là, il me semble qu'il n'y a pas de raison pour le have_selector et have_no_selector retourner la valeur true.
OriginalL'auteur salernost | 2012-03-27
Vous devez vous connecter pour publier un commentaire.
Encore en apprentissage Capybara moi-même, mais avez-vous essayé
have_link
au lieu dehave_selector
? Aussi je ne pense pas que vous avez besoin|ref|
. Par exemple:Mise À Jour Le 13 Octobre 2012
Avoir parcouru un peu plus loin avec le Capybara, je vois plusieurs problèmes potentiels ici:
within
peut ignorer en silence letext
champ. Vous remarquerez que les exemples afficher uniquement les CSS ou XPath finders sans arguments supplémentaires.within
n'utiliseztext
, il ne peut pas travailler ici parce que vous êtes pour lui demander de regarder le<tr>
, mais le texte est dans le<td>
.page
sujet vise toujours la totalité de la page, même si vous êtes dans unwithin
bloc. Lewithin
exemples sont pour la plupart sur l'utilisation defill_in
ouclick
. L'exception est l'exemple Méfiez-vous de la XPath //piège.Pour la création d'un
within
bloc, vous pouvez donner à vos lignes de la table des identifiants uniques et rechercher à l'aide de CSS, ou vous pouvez être en mesure d'écrire un XPath spécifique ciblage de la première ligne correspondante.Le problème avec ces derniers est que vous voulez utiliser la
within
sur le<tr>
, mais le texte que vous utilisez pour votre ciblage est à l'intérieur d'un<td>
sous-élément. Ainsi, par exemple, ce XPath doit trouver la cellule du tableau contenant le texteTeam 3 Name
mais alors vous ne travaillezwithin
que la première cellule, et non pas l'ensemble de la ligne.Il existe des moyens de "back up" pour un parent de l'élément à l'aide de XPath, mais je ne sais pas comment faire et j'ai lu que ce n'est pas une bonne pratique. Je pense que votre meilleur pari est de générer uniquement les id de sorte que vos lignes commencent comme ceci:
ensuite les cibler avec une simple
OriginalL'auteur Mark Berry
have_selector
semble ignorer:text
et:content
options. J'ai dû utiliser quelque chose comme ceci à la place:OriginalL'auteur Anton Styagun
Je vous recommande également les Marque Berrys'approche finale, il a mentionné de l'ajout de la carte d'identité pour chacun de vos éléments de la table.
alors la cible avec
Capybara m'a donné des problèmes lors de la sélection par xpath en ce qu'elle ne semble pas fonctionner de façon cohérente, particulièrement avec CI des services.
Je tiens également à noter sur le même répondre à cette section:
Cela peut avoir été le cas dans l'ancienne version, mais la version actuelle de Capybara, appelant
page
à l'intérieur d'unwithin
bloc inspecte seulement la partie de la page ciblée. Ainsi, l'utilisation de la Marque de l'exemple ci-dessus:OriginalL'auteur supremebeing7
La solution est de ne pas utiliser
within
méthode:OriginalL'auteur Philippe Perret