Поиск отключенного поля с Capybara

У меня есть поле выбора с меткой:

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

Как вы можете видеть, окно выбора отключено. Когда я пытаюсь найти его с помощью field_labeled("Slide orientation"), он возвращает ошибку:

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!'

Когда окно выбора не отключено, field_labeled("Slide orientation") возвращает элемент выбора только штрафом.

Является ли это ожидаемым поведением? И если да, то как я могу найти отключенный элемент? В моем случае мне нужно его проверить, отключено или нет.

Ответы

Ответ 1

Андреас и этот ответ поставили меня на путь к окончательному решению. Поиск отключенного поля с определенной меткой (вместо идентификатора HTML) может быть достигнуто следующим образом:

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]}")

Проверка того, что это поле отключено, может быть выполнено с помощью одного оператора:

page.should have_css("##{label_field[:for]}[disabled]") 

Он по-прежнему кажется обходным решением вместо лучшего решения Capybara, но он работает!

Ответ 2

Capybara 2.1.0 поддерживает фильтр disabled. Вы можете легко найти в нем отключенные поля.

field_labeled("Slide orientation", disabled: true)

Вам нужно указать его явно, потому что по умолчанию фильтр disabled отключен.

Ответ 3

Это передается, если у него есть отключенный атрибут.

Выполнить с js: true и page.evaluate_script.

it "check slider orientation", js: true do
    disabled = page.evaluate_script("$('#slide_orientation').attr('disabled');")
    disabled.should == 'disabled' 
end

Обновление

или вы можете использовать have_css

page.should have_css("#slide_orientation[disabled]") 

(украденная форма этот отличный ответ)