Огурец: жди ajax: успех - PullRequest
       6

Огурец: жди ajax: успех

17 голосов
/ 02 сентября 2011

У меня есть следующие типичные шаги огурца в проекте Rails 3.1:

...
When I follow "Remove from cart"
Then I should see "Test Product removed from cart"

Сложность в том, что кнопка «Удалить из корзины» является удаленным вызовом ajax:, который возвращает «Тестовый продукт удален из корзины» элементу #cart_notice через:

$('#cart_notice').append("<%= @product.name %> removed from cart");

Функция отлично работает в браузере, но не находит текст «Тестовый продукт удален из корзины» в огурце. Я предполагаю, что это потому, что Cucumber ищет текст, прежде чем AJAX вернет его?

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

Ответы [ 4 ]

16 голосов
/ 02 сентября 2011

Чтобы добавить к тому, что сказал Декстер, вы можете написать шаг, который выполняет JS в браузере, который ожидает завершения запросов ajax. В jQuery я использую этот шаг:

When /^I wait for the ajax request to finish$/ do
  start_time = Time.now
  page.evaluate_script('jQuery.isReady&&jQuery.active==0').class.should_not eql(String) until page.evaluate_script('jQuery.isReady&&jQuery.active==0') or (start_time + 5.seconds) < Time.now do
    sleep 1
  end
end

Затем вы можете включить шаг по мере необходимости или после каждого шага JavaScript:

AfterStep('@javascript') do
  begin
    When 'I wait for the ajax request to finish'
  rescue
  end
end

У меня были проблемы с автоматической синхронизацией, и это помогло решить проблему.

0 голосов
/ 27 марта 2018

Старый вопрос, но драгоценность Шпревальда должна помочь https://github.com/makandra/spreewald

Вы можете использовать терпеливый метод из камня Шпревальда, например:

Then /^I should see "([^\"]*)" in the HTML$/ do |text|
  patiently do
    page.body.should include(text)
  end
end

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

(взято из https://makandracards.com/makandra/12139-waiting-for-page-loads-and-ajax-requests-to-finish-with-capybara)

0 голосов
/ 23 июля 2012

Полагаю, wait_until должен сделать эту работу. Он выдаст команду capybara проверить что-либо до истины в течение некоторого времени.

0 голосов
/ 02 сентября 2011

Полагаю, вы используете огурец с капибарой. В этом случае капибара имеет функцию resynchronize. "Capybara can block and wait for Ajax requests to finish after you’ve interacted with the page." - from capybara documentation

Вы можете включить его в features/support/env.rb

Capybara.register_driver :selenium do |app|
  Capybara::Driver::Selenium.new(app, :browser => browser.to_sym, :resynchronize => true) 
end

Но я видел, что это вызывает проблемы с тайм-аутом. Поэтому, если это не сработает, я бы рекомендовал ввести шаг ожидания вручную, прежде чем утверждать результаты запроса ajax.

...
When I follow "Remove from cart"
And I wait for 5 seconds
Then I should see "Test Product removed from cart"

Вы можете определить шаг ожидания в step_definitions/web_steps.rb как

When /^I wait for (\d+) seconds?$/ do |secs|
  sleep secs.to_i
end
...