web-dev-qa-db-fra.com

Trouver un terrain handicapé avec Capybara

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.

17
Pascal Lindelauf

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!

2
Pascal Lindelauf

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.

31
Shuhei Kagawa

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 )

10
Andreas Lyngstad

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

0
rmaspero