Как посчитать активные тайм-ауты JavaScript? - PullRequest
5 голосов
/ 18 августа 2011

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

Я начал с ожидания, что переменная dojo inFlight будет равна 0, это говорит о том, что весь ajax завершен. Это не всегда работает, потому что, кажется, потом что-то делает по тайм-ауту.

Я также неоднократно пытался найти элемент, но это не слишком приятно, поскольку, возможно, позже будет какой-то javascript, который каким-то образом будет использовать это поле.

Таким образом, в основном я хочу, чтобы метод (по крайней мере в Firefox) запрашивал JavaScript, ожидающий запуска на setTimeout (или setInterval), который я мог бы даже справиться с способом обернуть встроенный вызов через собственную функцию, чтобы отслеживать это.

Любые мысли или предложения приветствуются!

Ответы [ 2 ]

5 голосов
/ 19 августа 2011

Каждая функция в JavaScript может быть заменена.Рассмотрим что-то вроде этого:

window.originalSetTimeout = window.setTimeout;

window.setTimeout = function(func, delay, params) {
    window.timeoutCounter++;
    window.originalSetTimeout(window.timeoutCallback, delay, [func, params]);
}

window.timeoutCallback = function(funcAndParams) {
    window.timeoutCounter--;
    func = funcAndParams[0];
    params = funcAndParams[1];
    func(params);
}

Тогда:

selenium.waitForCondition("window.timeoutCounter == 0");
1 голос
/ 18 августа 2011

Каждый раз, когда вы звоните setTimeout из setInterval - возвращается идентификатор таймера.

  1. Сохранить этот таймер в массиве
  2. Внутри функции, которую вы вызываете по таймауту, вытолкните этот таймер из массива. Потому что мы должны удалить этот идентификатор из массива, как только закончится таймер.
  3. В любое время, когда вы хотите проверить, нет. активных таймеров, просто запросите длину этого массива.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...