如何计算活动的javascript超时?

Posted

技术标签:

【中文标题】如何计算活动的javascript超时?【英文标题】:How to count active javascript timeouts? 【发布时间】:2011-08-18 08:16:31 【问题描述】:

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

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

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

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

任何想法或建议表示赞赏!

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

每当您调用 setTimeoutsetInterval 时,都会返回一个计时器 ID。

    将该计时器 ID 保存在一个数组中 在您调用超时的函数中,将该定时器 ID 从数组中弹出。因为我们必须在计时器结束后立即从数组中删除该 id。 您想随时查看号码。活动计时器,只需查询该数组的长度。

【讨论】:

您好,感谢您的回复。我们没有直接调用 setTimeout 或 setInterval。它们被我们的 UI 开发人员使用的 Dojo 库调用。我们正在尝试使用 selenium 测试应用程序,因此我们可以访问在页面中运行 javascript,但我们不能轻易干扰我们正在测试的代码的工作方式。也许有一个 firefox 插件可以为我们跟踪这个并以某种方式覆盖内置的超时机制?【参考方案3】:

另一种方法可能是这样的

const timeoutIndexThen = setTimeout(() => );

// Some code that might call timeouts...

const timeoutIndexNow = setTimeout(() => );

const countOfTimeoutsFiredSinceThen = timeoutIndexNow - timeoutIndexThen - 1;

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

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

然后,过了一会儿,我们再次拨打它,我们得到一个新号码。这些数字之间的差异在于它们之间调用了多少次interval。

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

【讨论】:

以上是关于如何计算活动的javascript超时?的主要内容,如果未能解决你的问题,请参考以下文章

AWS Elastic Beanstalk Worker 在长时间计算期间不活动后超时

如何在.aspx文件上使用Javascript检查超时值后调用.ascx的按钮单击事件

Java中多个客户端的超时

当用户在页面 javascript 或 php 中不活动 3 分钟时自动注销

如何使用java 8超时调用另一个函数内的泛型函数?

如何处理会话超时异常(使用 MVP 地点和活动)?