J'utilise RSpec2 et Capybara pour les tests d'acceptation.
Je voudrais affirmer que le lien est désactivé ou non à Capybara. Comment puis-je faire ceci?
ruby-on-rails
rspec
capybara
Kriysna
la source
la source
Une autre solution simple consiste à accéder à l'attribut HTML que vous recherchez avec
[]
:find('#my_element')['class'] # => "highlighted clearfix some_other_css_class" find('a#my_element')['href'] # => "http://example.com # or in general, find any attribute, even if it does not exist find('a#my_element')['no_such_attribute'] # => ""
Notez que
Capybara
cela essaiera automatiquement d'attendre la fin des requêtes asynchrones, mais cela peut ne pas fonctionner dans certains cas:Voici une solution de contournement si vous rencontrez des problèmes avec les assertions sur les éléments qui sont mis à jour de manière asynchrone:
la source
find('a#my_element[href]')
, serait-il possible de récupérer la valeur de cet attribut? Essayer avec des expressions commefind('a#my_element[href]').value
mais ne semble pas fonctionner :(find('a#my_element[href]').text
oufind('a#my_element[href]').native
. Faites-moi savoir si l'un ou l'autre donne les résultats que vous attendez.C'était un peu compliqué de trouver le bon xpath, voici le bon, en
utilisant capybara 0.4.1.1
# <a href="https://stackoverflow.com/clowns?ordered_by=clumsyness" class="weep">View Clowns</a> page.should have_xpath("//a[@class='weep'][@href='/clowns?ordered_by=clumsyness']", :text => "View Clowns")
Si vous n'avez qu'un lien sans classe, utilisez
page.should have_link('View Clowns', :href => '/clowns?ordered_by=clumsyness')
Quelque chose comme ça ne fonctionnera malheureusement pas:
page.should have_link('This will not work!', :href => '/clowns?ordered_by=clumsyness', :class => "weep")
L'option de classe sera ignorée.
la source
Je recommande d'utiliser
have_link
etfind_link(name)[:disabled]
dans deux assertions distinctes. Bien que l'exécution de la deuxième assertion seule soit plus simple, cela rend les messages d'erreur concernant les liens manquants plus jolis, ce qui facilite la lecture des résultats de votre test.expect(page).to have_link "Example" expect(find_link("Example")[:disabled]).to be false
Notez que
"Example"
peut être changé en nom ou id du lien.la source
page.should have_link('It will work this way!', {:href => '/clowns?ordered_by=clumsyness', :class => "smile"})
have_link attend un hachage d'options qui est vide si vous n'en fournissez aucune. Vous pouvez spécifier tous les attributs que le lien devrait avoir - assurez-vous simplement de passer toutes les options dans UN hachage.
J'espère que cela t'aides
PS: Pour les attributs comme data-method, vous devez passer le nom de l'attribut sous forme de chaîne car le trait d'union brise le symbole.
la source
class:
n'est pas valideDans la mesure du possible, vous devriez essayer d'utiliser les wrappers fournis par Capybara qui fonctionneront de manière plus cohérente entre les pilotes.
Pour le cas particulier de
disabled
, un wrapper a été introduit en 2.1: https://github.com/jnicklas/capybara/blob/fc56557a5463b9d944207f2efa401faa5b49d9ef/History.md#version-210Si vous l'utilisez, vous obtiendrez des résultats raisonnables sur RackTest et Poltergeist:
HTML:
<input type="text" id="disabled-false" ></div> <input type="text" id="disabled-true" disabled></div> <input type="text" id="disabled-js-true" ></div> <input type="text" id="disabled-js-false" disabled></div> <script> document.getElementById('disabled-js-true').disabled = true document.getElementById('disabled-js-false').disabled = false </script>
Tests:
!all(:field, 'disabled-false', disabled: false).empty? or raise all(:field, 'disabled-false', disabled: true ).empty? or raise all(:field, 'disabled-true', disabled: false).empty? or raise !all(:field, 'disabled-true', disabled: true ).empty? or raise all(:field, 'disabled-js-true', disabled: true ).empty? or raise all(:field, 'disabled-js-false', disabled: false).empty? or raise Capybara.current_driver = :poltergeist !all(:field, 'disabled-false', disabled: false).empty? or raise all(:field, 'disabled-false', disabled: true ).empty? or raise all(:field, 'disabled-true', disabled: false).empty? or raise !all(:field, 'disabled-true', disabled: true ).empty? or raise !all(:field, 'disabled-js-true', disabled: true ).empty? or raise !all(:field, 'disabled-js-false', disabled: false).empty? or raise
Notez qu'en utilisant ceci au lieu des sélecteurs CSS, les tests Javascript fonctionneront sans aucune modification si vous commencez à utiliser un pilote compatible Js.
Fichier de test exécutable ici .
la source
bowsersenior , merci pour un indice
Voici un exemple:
let(:action_items) { page.find('div.action_items') } it "action items displayed as buttons" do action_items.all(:css, 'a').each do |ai| expect(ai[:class]).to match(/btn/) end end
la source
En utilisant la syntaxe de Rspec3, je l'ai fait de cette façon:
expect(page).not_to have_selector(:link_or_button, 'Click here')
la source
Vous pouvez simplement utiliser la
page.has_css?
méthodepage.has_css?('.class_name')
cela retournera
true
si l'élément existe.Faites une action basée sur la validation.
page.has_css?('.class_name') do #some code end
la source
Selon la documentation, vous pouvez utiliser la syntaxe d'accesseur [attribut]:
find('#selector')['class'] => "form-control text optional disabled"
Pour les personnes handicapées, vous pouvez également faire ceci:
expect(find('#selector').disabled?).to be(true)
la source