web-dev-qa-db-fra.com

Assurez-vous qu'aucun élément n'est présent avec Capybara

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.

33
michaeltwofish

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

52
Derek Ekins

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 . . .

25
5_nd_5

Voici ce que j'utilise:

expect(page).to have_no_css('.test')
10
nroose

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.

3
Zack Xu

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.

1
Whitney Imura

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}'"]')

0
Kristiina

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
0
Prashanth Sams