En utilisant Capybara, j'ai besoin d'affirmer qu'aucun élément de formulaire n'est présent, par exemple, 'Alors je ne devrais pas voir le champ de texte "Nom d'utilisateur"'. Comme find lève une exception si l'élément n'est pas trouvé, c'est le meilleur que j'ai trouvé. Y a-t-il une meilleure façon?
Then /^I should not see the "([^\"]+)" ([^\s]+) field$/ do |name, type|
begin
# Capybara throws an exception if the element is not found
find(:xpath, "//input[@type='#{type}' and @name='#{name}']")
# We get here if we find it, so we want this step to fail
false
rescue Capybara::ElementNotFound
# Return true if there was an element not found exception
true
end
end
Je suis nouveau à Capybara, donc je manque peut-être quelque chose d'évident.
Vous pouvez le faire en utilisant capybaras has_no_selector? combinée à des égaliseurs magiques rspecs. Vous pouvez ensuite l'utiliser de cette manière:
page.should have_no_selector(:xpath, "//input[@type='#{type}' and @name='#{name}']")
Vous pouvez voir plus de détails sur les assertions que vous pouvez effectuer sur la page de documentation de capybara ici dans la section intitulée Requête
Vous pouvez réellement utiliser des méthodes déjà existantes définies par les matchers Capybara.
assert has_no_field?('Username')
De plus, il existe des méthodes supplémentaires disponibles qui peuvent vous aider à trouver différents types d'éléments dans votre page
has_link? , has_no_link?
has_button?, has_no_button?
has_field?, has_no_field?
has_checked_field?, has_no_checked_field?
has_select?, has_no_select?
Et beaucoup plus . . .
Voici ce que j'utilise:
expect(page).to have_no_css('.test')
J'ai essayé la solution suggérée par Derek , cependant, je suis tombé sur de faux négatifs.
C'est
page.should have_no_selector(:xpath, "//input[@type='#{type}' and @name='#{name}']")
passe même quand il devrait échouer pour une raison quelconque.
J'ai réussi avec la syntaxe RSpec de raise_error
expect { find(:xpath, "//input[@type='#{type}' and @name='#{name}']") }.to raise_error
Je pense que c'est plus proche de ce que vous demandez de toute façon. J'ai donc proposé cette réponse.
La meilleure façon de le faire est de trouver l'élément et d'affirmer qu'il n'est pas présent. Non seulement cela crée du code réutilisable, mais l'ensemble du test ne explosera pas s'il ne le trouve pas.
C'est ce que je fais...
définir votre objet
def username
page.find('.username')
end
Interagissez ensuite avec l'objet dans votre fichier de spécifications
username.should be_true
Vous ne devriez vraiment pas vous soucier de savoir si l'élément est ou non sur la page (la plupart du temps). Ce qui vous importe lorsque vous écrivez les tests, c'est de savoir si vous pouvez ou non interagir avec cet élément ... c'est pourquoi je définis d'abord l'objet, puis j'utilise 'nom d'utilisateur' pour interagir avec lui ... voyez combien de code réutilisable vous pouvez générer? Vous pouvez maintenant cliquer, survoler, affirmer que l'élément est présent, remplir le texte de l'élément, etc.
En outre, vous devriez absolument envisager d'utiliser css sur xpath dans la mesure du possible. xpath est plus facile à casser et plus difficile à lire.
J'ai eu le même problème. Mais comme j'utilise Capybara avec Minitest, la solution acceptée n'a pas fonctionné pour moi. J'ai pensé que je devrais l'ajouter, si quelqu'un dans la même situation que moi trouvait cette question.
Il est également possible d'utiliser:
assert page.has_no_xpath?('//input[@type='#{type}' and @name='#{name}'"]')
Dans le fichier spec
expect(@app.some_page_name.is_visible?('search_button')) == true
dans le fichier d'échange
element :search_button, :xpath, "//div[@class='dummy']"
Dans le fichier base_page
def is_visible?(value)
begin
eval(value).visible?
return true
rescue => e
p e.message
return false
end
end