web-dev-qa-db-fra.com

Comment écrire une assertion Capybara qui vérifie la présence d'un bouton et son état activé ou désactivé?

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
29
Andy Davis

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 .

60
J3RN
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.)

14
gregates

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

2
Thomas

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

https://github.com/jnicklas/capybara/blob/2a51b817b355f6c1a5e95a471a87f1a492562e55/spec/basic_node_spec.rb#L108

2
Piotr Kędziak

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
0
Jon Kern