如何计算活动的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】:每当您调用 setTimeout
或 setInterval
时,都会返回一个计时器 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的按钮单击事件