J'ai une application qui active/désactive les boutons en réponse à des événements de l'interface utilisateur.
Je peux facilement utiliser capybara pour détecter si un bouton existe
should have_button 'save'
mais je n'ai aucune idée de comment vérifier l'état du bouton de sauvegarde. C'est:
Comment puis-je écrire une assertion Capybara qui vérifie la présence d'un bouton et son état activé ou désactivé?
J'ai piraté un chèque pour un bouton désactivé; pour enabled, je suppose que je pourrais vérifier qu’il existe un bouton correspondant et qu’il n’ya pas de bouton désactivé correspondant. Mais ceci, pour le moins, est maladroit.
Cela semble être un contrôle d’assurance-chômage si fondamental, que je suis sûr d’avoir oublié quelque chose, mais je ne peux pas comprendre quoi.
Suivi basé sur la réponse de gregates:
Comme je l'ai mentionné dans le commentaire, le comportement de Capybara dépend du moteur sous-jacent. Nous utilisons webkit et renvoie les résultats "true"/"false". Apparemment, les autres pilotes renvoient true/false. Les gens de Capybara sont conscients du problème (github.com/jnicklas/capybara/issues/705), mais ils pensent (probablement correctement) que ce n’est pas vraiment leur problème à résoudre.
Plutôt que de laisser mes tests dépendre du pilote que j'utilise, j'ai fini par créer un matcher personnalisé:
RSpec::Matchers.define :be_enabled do
match do |actual|
driver_result = actual[:disabled]
# nil, false, or "false" will all satisfy this matcher
(driver_result.nil? || driver_result == false || driver_result == "false").should be_true
end
end
RSpec::Matchers.define :be_disabled do
match do |actual|
driver_result = actual[:disabled]
(driver_result == "disabled" || driver_result == true || driver_result == "true").should be_true
end
end
Ensuite, vous pouvez taper:
user_license_area.find_button('Save').should be_disabled
Il semble que la gestion des éléments désactivés par Capybara ait changé, alors je me suis dit que je ferais une mise à jour.
Pour vérifier si une page a un bouton et est activée, utilisez:
expect(page).to have_button('Save')
Pour vérifier si une page a un bouton et est désactivée, utilisez:
expect(page).to have_button('Save', disabled: true)
Ce format fonctionne avec has_field?
, find_field
, etc.
Vous pouvez en savoir plus sur cette mise à jour à l’adresse http://www.elabs.se/tag/capybara
METTRE À JOUR
L'ancien lien est cassé. C’est le problème de GitHub où la fonctionnalité a été discutée et c’est la documentation malheureusement stérile de la méthode .
find_button('save')[:disabled].should eq "disabled"
Notez qu'une ligne testera effectivement l'existence et l'état désactivé.
Edit: pour enabled, essayez
find_button('save')[:disabled].should_not be
(L’un ou l’autre de ces tests devra peut-être être modifié en fonction de la manière dont vous désactivez/activez le bouton.)
Il y a plusieurs façons de le faire. Je pense que le meilleur moyen est d'utiliser des sélecteurs CSS
expect(page).to have_css("#save:enabled")
Cet exemple suppose que vous avez défini l'identifiant CSS pour qu'il soit enregistré.
Il y a be_disabled chèque
it "allows finding elements and checking if they are disabled" do
expect(string.find('//form/input[@name="bleh"]')).to be_disabled
expect(string.find('//form/input[@name="meh"]')).not_to be_disabled
end
Dans une situation similaire où les actions de l'utilisateur dans l'interface utilisateur (sélection des types de document) déclenchent l'activation des boutons ...
Avec un identifiant sur le contrôle, il devient assez simple de trouver le bouton (quel que soit l'état) et d'affirmer l'état "disabled-ness".
@javascript
Scenario: Package generation not allowed unless a document type is selected
Given I view the "Liberty and 4th Building Renovation" project
When I view the Package Creator
Then both document package generation buttons should be disabled
@javascript
Scenario: Package generation allowed when documents types are selected
Given I view the "Liberty and 4th Building Renovation" project
When I view the Package Creator
And I select any document type
Then both document package generation buttons should be enabled
Et les fonctions de concombre de soutien avec Capybara:
Then(/^both document package generation buttons should be disabled$/) do
expect(find_by_id('generate_pdf')).to be_disabled
expect(find_by_id('generate_Zip')).to be_disabled
end
Then(/^both document package generation buttons should be enabled/) do
expect(find_by_id('generate_pdf')).not_to be_disabled
expect(find_by_id('generate_Zip')).not_to be_disabled
end