Capybara должно иметь_контент не ждет достаточно долго - PullRequest
1 голос
/ 18 апреля 2019

Итак, я пишу приемочный тест с использованием капибары.Сценарий состоял в том, чтобы подключить нашу систему рассылки к внешней почтовой службе.

Мы будем перенаправлены на нашу страницу внешней службы для запроса доступа к внешней почтовой службе.И мы будем перенаправлены обратно на нашу системную страницу в случае успеха.

When "I grant authorization" do
  fill_in "username", :with => "myapp"
  fill_in "password", :with => "secret"
  click_button "Allow Access"
end

Then "I should see 'Connection Established'" do
  page.should have_content "Connection Established"
end

And "I should see that I'm connected to Sample External Service" do
  page.should have_content "Connection Established: Sample External Service"
  page.should have_content "Deactivate Sample External Service syncing"
end

Но если я не использую sleep до page.should have_content "Connection Established".Спецификация не удастся.Из того, что я знаю, использование сна не лучшая практика, потому что это замедлит наш тестовый запуск.

Как заставить его ждать, пока он не будет перенаправлен обратно в нашу систему

Ответы [ 4 ]

2 голосов
/ 18 апреля 2019

Существует 3 способа настроить максимальное количество времени, которое методы Capybaras будут ожидать, пока их ожидания окажутся истинными / элементы будут существовать

Capybara.default_max_wait_time = <seconds> - это глобальная настройка, которая должна быть достаточно высокой для большинства вызовов вашего метода

Capybara.using_wait_time(<seconds>) do ... end - Это временно изменяет default_max_wait_time внутри блока, а затем возвращает его к первоначальной настройке, когда закончите. Это имеет смысл, когда у вас есть несколько методов, которые вы хотите вызвать с новым временем ожидания, или вам нужно вызвать вспомогательный метод с временем ожидания, установленным на другое значение.

Опция

:wait - Все методы поиска и ожидания Capybara принимают опцию :wait, которая изменит максимальное время ожидания для вызова этого метода. Это имеет смысл использовать, когда у вас есть конкретный случай, который требует немного больше ожидания, чем обычно

# This will wait up to 10 seconds for the content to exist in the page
page.should have_content "Connection Established: Sample External Service", wait: 10 

Примечание: в будущем при публикации вопросов обычно полезно, если вы предоставите полное точное сообщение об ошибке, которое вы получите как часть вашего вопроса.

0 голосов
/ 09 мая 2019

Вы можете использовать capybara_watcher gem, это элегантный способ ожидания изменения содержания pege. Проверьте это на RubyGems.org

Пример:

wait_until_content_has "Connection Established" do |text|
  page.should have_content text
end

Преимущества использования этого в том, что время ожидания - это фактическое время, которое страница занимает для изменения, и вы можете настроить его на выход после секунды, которую вы выбрали, если страница не изменилась.

0 голосов
/ 18 апреля 2019

Для переходов по страницам я предпочитаю сначала дождаться изменения URL-адреса, а затем дождаться контента на странице. Это дает вам более конкретную ошибку в случае сбоя перенаправления и, естественно, разбивает долгое ожидание на две части. При двух возможностях нажатия default_max_wait_time тайм-аут потенциально удваивается без фактического его изменения. Если этого все еще недостаточно, вы всегда можете передать пользовательский тайм-аут в have_current_path с параметром wait:.

expect(page).to have_current_path("externalservice.com")
expect(page).to have_content("Connection Established")

Может быть page.should эквивалент, но я думаю, что официальное руководство *1009* состоит в том, чтобы перейти к синтаксису expect, поскольку синтаксис should устарел.

0 голосов
/ 18 апреля 2019

Вы можете использовать Capybara.using_wait_time (секунд) , чтобы временно изменить значение Capybara.default_max_wait_time для особых случаев:

Capybara.using_wait_time(10) do 
  page.should have_content "Connection Established"
end
...