dojo 如何计算活动javascript超时?

fv2wmkja  于 2022-12-08  发布在  Dojo
关注(0)|答案(3)|浏览(195)

我正在使用Selenium来测试一个使用Dojo的Web应用程序,它使用java脚本来显示某些元素。我想等到所有元素都显示出来后再尝试操作页面,但是我遇到了麻烦。
我已经开始等待dojo inFlight变量为0,这表示所有 AJAX 已经完成。这并不总是工作,因为它似乎在超时后做一些事情。
我也尝试过反复查找元素,但这并不太好,因为也许以后会有一些javascript以某种方式使用这个字段。
所以基本上我想要一个方法(至少在firefox中)来查询等待在setTimeout(或setInterval)上运行的javascript,我甚至可以通过我自己的一个函数来科普 Package 内置调用的方法,只是为了跟踪这一点。
如有任何想法或建议,敬请谅解!

lyr7nygr

lyr7nygr1#

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");
ej83mcc0

ej83mcc02#

无论何时调用setIntervalsetTimeout--都会返回一个计时器ID。
1.将该计时器ID保存在数组中
1.在超时时调用的函数中,把计时器id从数组中取出,因为计时器一结束,我们就必须把id从数组中移除。
1.任何时候你想检查活动计时器的数量,只需查询该数组的长度。

deikduxw

deikduxw3#

另一种方法可能是这样的

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

// Some code that might call timeouts...

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

const countOfTimeoutsFiredSinceThen = timeoutIndexNow - timeoutIndexThen - 1;

它基于这样一个事实,即每次超时都将返回一个比每次调用大1的数字。
因此,我们创建一些虚拟超时,只是为了在某个时间点获得这个数字。
然后,过了一段时间,我们再次调用它,我们得到一个新的数字。这些数字之间的差异是有多少次间隔被调用之间。
这样做的缺点是你必须创建超时,优点是你不必修改原始函数。

相关问题