WebRat + Selenium WebDriver: дождитесь завершения ajax - PullRequest
5 голосов
/ 03 февраля 2010

Мы используем Webrat с Selenium2.0 или WebDriver в нашем приложении.

WebDriver очень хорошо справляется с перезагрузкой страницы и не запускает следующие шаги, если браузер перезагружает всю страницу. Проблема в том, что этот механизм не работает с Ajax-запросами. WebDriver не выполняет никаких операций в режиме ожидания после нажатия кнопки click () или change ().

Кто-нибудь может подсказать, как заставить вебдрайвер бездействовать до конца всех запросов ajax на странице?

Ответы [ 3 ]

3 голосов
/ 09 сентября 2010

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

@browser.click "#my_button_id"

это будет похоже на то, что предложено AutomatedTester выше:

class Browser
  def click(locator)
    wait_for_element(locator, :timeout => PAGE_EVENT_TIMEOUT)
    @selenium.click(locator)
  end

  def wait_for_element(locator, options)
    timeout = options[:timeout] || PAGE_LOAD_TIMEOUT
    selenium_locator = locator.clone
    expression = <<EOF 
      var element;
      try {
        element = selenium.browserbot.findElement('#{selenium_locator}');
      } catch(e) {
        element = null;
      };
      element != null;
EOF
    begin
      selenium.wait_for_condition(expression, timeout)
    rescue ::Selenium::SeleniumException
      raise "Couldn't find element with locator '#{locator}' on the page: #{$!}.\nThe locator passed to selenium was '#{selenium_locator}'"
    end
  end
end

Оболочка также делала другие вещи, например, позволяла выполнять поиск по кнопке / метке ввода и т. Д. (Таким образом, обертка существовала не только из-за проблем с синхронизацией, это была лишь одна из вещей, которую мы туда поместили) 1007 *

1 голос
/ 03 февраля 2010

Извините, мой Рубин, но вам нужно попытаться найти объект, и если его там нет, просто подождите, пока он вернется.Код, приведенный ниже, должен делать цикл ожидания каждую секунду в течение минуты, пытаясь определить, может ли драйвер найти элемент с идентификатором idOfElement, а затем, если он не может, должен выдать ошибку

assert !60.times{ break if (driver.find_element(:id, "idOfElement) rescue false); sleep 1 }
0 голосов
/ 17 августа 2010

Отдельное mtd (обертка) для проверки элемента с ожиданием должно помочь.

...