Как написать выражение Capybara, которое проверяет наличие кнопки и ее включенное или отключенное состояние?
У меня есть приложение, которое включает/отключает кнопки в ответ на события, которые происходят в пользовательском интерфейсе.
Я могу легко использовать capybara, чтобы определить, существует ли кнопка
should have_button 'save'
но я не знаю, как проверить состояние кнопки сохранения. То есть:
Как написать выражение Capybara, которое проверяет наличие кнопки и в ее включенном или отключенном состоянии?
Я взломал чек для отключенной кнопки; для включенного, я полагаю, что я мог проверить, что есть соответствующая кнопка, и что нет соответствующей кнопки отключения. Но это, мягко говоря, неуклюже.
Это похоже на такой фундаментальный контроль пользовательского интерфейса, что я уверен, что что-то пропустил, но я не могу понять, что.
Следите за ответами на gregates:
Как я упоминал в комментарии, поведение Capybara зависит от базового драйвера. Мы используем webkit, и он возвращает "истинные" / "ложные" строковые результаты. По-видимому, другие драйверы возвращают true/false. Люди в Capybara знают о проблеме (github.com/jnicklas/capybara/issues/705), но они чувствуют (возможно, правильно), что на самом деле их проблема не решена.
Вместо того, чтобы мои тесты зависели от используемого драйвера, я закончил создание пользовательского совпадения:
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
Затем вы можете ввести:
user_license_area.find_button('Save').should be_disabled
Ответы
Ответ 1
Похоже, что обработка отключенных элементов Capybara изменилась, поэтому я решил, что дам обновление.
Чтобы проверить, имеет ли страница кнопка и включена ли она, используйте:
expect(page).to have_button('Save')
Чтобы проверить, имеет ли страница кнопка и отключена, используйте:
expect(page).to have_button('Save', disabled: true)
Этот формат работает с has_field?
, find_field
и т.д.
Подробнее об этом обновлении вы можете узнать в http://www.elabs.se/tag/capybara
UPDATE
Старая ссылка сломана. Это проблема GitHub, где обсуждалась функция и это, к сожалению, бесплодная документация для метода.
Ответ 2
find_button('save')[:disabled].should eq "disabled"
Обратите внимание, что одна строка будет эффективно тестировать как состояние существования, так и отключенное.
Изменить: для включенного, попробуйте
find_button('save')[:disabled].should_not be
(Любой из этих тестов, возможно, нуждается в настройке в зависимости от того, как вы отключите/активируете кнопку.)
Ответ 3
Есть много способов сделать это. Я думаю, что лучший способ - просто использовать селектора css
expect(page).to have_css("#save:enabled")
В этом примере указано, что вы установили id css для сохранения.
Ответ 4
Существует проверка be_disabled
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
Ответ 5
Из аналогичной ситуации, когда пользовательские действия в пользовательском интерфейсе (выбор типов документов) запускают кнопки для активации...
С идентификатором элемента управления становится довольно просто найти кнопку (независимо от состояния) и утвердить состояние "отключено".
@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
И поддерживающие огурцы выполняют шаги с 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