Сопрягатели Capybara RSpec ждут элементов? - PullRequest
0 голосов
/ 09 апреля 2019

При написании тестового фреймворка / тестов с использованием Capybara + RSpec я натолкнулся на это предложение для тестирования элемента, НЕ существующего:

expect(page).to have_no_button('Save')   # OK
expect(page).not_to have_button('Save')  # Bad

Я был смущен, почему, пока я не увидел, было сказано:

Использовать версии must have_no_ * с сопоставителями RSpec, так как should_not have_ * не ожидает тайм-аут от водителя.

Это правда? Если нет ... разве не имеет смысла с точки зрения объектной модели страницы иметь метод для проверки и возврата, если существует <element> (я обычно использую .visible?), таким образом вы можете использовать rspec matcher для выполнения expect(page_object).to be_method_visible или expect(page_object).not_to be_method_visible?

В отличие от необходимости писать 2 отдельных метода в объектах вашей страницы (если это не правда, что not_to не будет ждать)

Для примера моих методов утверждения в моей объектной модели страницы, вот что я делаю для проверки «ссылки выхода из системы»

def logged_in?
    logout_text.visible?
end

private
def logout_text
    find 'a', text: 'Log Out'
end

А потом в спецификации я бы сказал: expect(page_object).to be_logged_in

Так что я бы использовал нечто подобное для других элементов.

1 Ответ

1 голос
/ 09 апреля 2019

Я не знаю, где вы натолкнулись на это предложение (может быть, оно действительно очень старое), но для любой "недавней" версии Capybara (по крайней мере, в последние 4 года) при использовании средств сравнения, предоставленных Capybara, это не правильно.

Предполагая, что have_button и have_no_button являются сопоставлениями, предоставленными Capybara (не встроенными в RSpecs have_xxx => has_xxx? сопоставителями, вызывающими метод has_button?, который вы определили для объекта вашей страницы), в двух приведенных вами примерах

expect(page).to have_no_button('Save')
expect(page).not_to have_button('Save')

будет вести себя одинаково. Они оба проверят наличие кнопки и вернутся, если она не существует, или вызовут исключение, если прошло Capybara.default_max_wait_time секунд, и кнопка все еще видна на странице.

...