WebRat+Selenium WebDriver: дождитесь завершения ajax

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

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

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


person Bogdan Gusiev    schedule 03.02.2010    source источник


Ответы (3)


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

@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

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

person zcrar70    schedule 09.09.2010

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

assert !60.times{ break if (driver.find_element(:id, "idOfElement) rescue false); sleep 1 }
person AutomatedTester    schedule 03.02.2010
comment
Да, это сработает, но вы должны указать, чего вы ждете в каждом Ajax-запросе. Я считаю, что должен быть лучший способ. - person Bogdan Gusiev; 03.02.2010

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

person Community    schedule 17.08.2010