J'ai une boite de sélection avec une étiquette:
<label for="slide_orientation">Slide orientation</label>
<select disabled="" class="property" id="slide_orientation" name="slide_orientation">
<option value="horizontal">Horizontal</option>
<option value="vertical" selected="selected">Vertical</option>
</select>
Comme vous pouvez le constater, la case de sélection est désactivée. Lorsque j'essaie de le trouver avec field_labeled("Slide orientation")
, une erreur est renvoyée:
Capybara::ElementNotFound: Unable to find field "Slide orientation"
from /Users/Pascal/.rvm/gems/Ruby-1.9.3-p392/gems/capybara-2.0.2/lib/capybara/result.rb:22:in `find!'
Lorsque la zone de sélection n'est pas désactivée, field_labeled("Slide orientation")
renvoie correctement l'élément sélectionné.
Est-ce comportement attendu? Et si oui, comment pourrais-je trouver un élément handicapé? Dans mon cas, j'ai besoin de tester si c'est désactivé ou non.
Andreas et cette réponse m'ont mis sur la piste de la solution finale. La recherche d'un champ désactivé avec une certaine étiquette (au lieu d'un identifiant HTML) peut être réalisée de la manière suivante:
label_field = all("label").detect { |l| (l.text =~ /#{label}/i).present? }
raise Exception.new("Couldn't find field '#{label}'") if label_field.nil?
the_actual_field = first("##{label_field[:for]}")
Vérifier si ce champ est désactivé peut être fait avec une seule déclaration:
page.should have_css("##{label_field[:for]}[disabled]")
Cela ressemble toujours à une solution de contournement au lieu de la meilleure solution de type Capybara, mais cela fonctionne!
Capybara 2.1.0 prend en charge le filtre disabled
. Vous pouvez facilement trouver des champs désactivés avec elle.
field_labeled("Slide orientation", disabled: true)
Vous devez le spécifier explicitement car le filtre disabled
est désactivé par défaut.
Celui-ci passe s'il possède l'attribut disabled.
Exécuter avec js: true
et page.evaluate_script
.
it "check slider orientation", js: true do
disabled = page.evaluate_script("$('#slide_orientation').attr('disabled');")
disabled.should == 'disabled'
end
Mise à jour
ou vous pouvez utiliser have_css
page.should have_css("#slide_orientation[disabled]")
(forme volée cette excellente réponse )
Puisque les réponses à cette question sont anciennes et que les choses ont un peu évolué depuis lors, voici unUPDATE.
Si vous voulez juste vérifier si un champ est désactivé, vous pouvez maintenant faire:
expect(page).to have_field 'Slide orientation', disabled: true
Selon ce RP: https://github.com/teamcapybara/capybara/issues/982