Поиск отключенного поля с 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]")
(украденная форма этот отличный ответ)