如何计算有效的javascript超时?

时间:2011-08-18 08:16:31

标签: javascript ajax dojo selenium-webdriver

我正在使用Selenium来测试使用Dojo的Web应用程序,它使用java脚本来显示某些元素。在尝试操作页面之前,我想等到所有元素都被显示,但是我遇到了麻烦。

我已经开始等待dojo inFlight变量为0,这表示所有ajax都已完成。这并不总是有效,因为它似乎在事后超时做了一些事情。

我也尝试过反复寻找元素,但这不太好,因为稍后会有一些javascript会以某种方式使用这个字段。

所以基本上我想要一个方法(至少在firefox中)查询等待在setTimeout(或setInterval)上运行的javascript我甚至可以通过我自己的函数来处理内置调用的方式跟踪这个。

赞赏任何想法或建议!

3 个答案:

答案 0 :(得分:5)

可以替换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 :(得分:1)

每当您拨打setTimeout的{​​{1}}时,都会返回计时器ID。

  1. 将该计时器ID保存在数组中
  2. 在您调用超时的函数内部,将该计时器ID从数组中弹出。因为我们必须在计时器结束后立即从数组中删除该ID。
  3. 任何时候你想检查否。有效的计时器,只需查询该数组的长度。

答案 2 :(得分:0)

另一种方法可能是这样

const timeoutIndexThen = setTimeout(() => {});

// Some code that might call timeouts...

const timeoutIndexNow = setTimeout(() => {});

const countOfTimeoutsFiredSinceThen = timeoutIndexNow - timeoutIndexThen - 1;

它基于这样一个事实,每次超时将在每次调用时返回一个大于1的数字。

所以我们创建一些虚拟超时只是为了在某个时候获得该数字。

然后,过一会儿我们再次调用它,然后得到一个新号码。这些数字之间的区别是两次调用间隔的时间。

这的缺点是您必须实际创建超时。好处是您不必修改原始功能。