我正在使用Selenium来测试使用Dojo的Web应用程序,它使用java脚本来显示某些元素。在尝试操作页面之前,我想等到所有元素都被显示,但是我遇到了麻烦。
我已经开始等待dojo inFlight变量为0,这表示所有ajax都已完成。这并不总是有效,因为它似乎在事后超时做了一些事情。
我也尝试过反复寻找元素,但这不太好,因为稍后会有一些javascript会以某种方式使用这个字段。
所以基本上我想要一个方法(至少在firefox中)查询等待在setTimeout(或setInterval)上运行的javascript我甚至可以通过我自己的函数来处理内置调用的方式跟踪这个。
赞赏任何想法或建议!
答案 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。
答案 2 :(得分:0)
另一种方法可能是这样
const timeoutIndexThen = setTimeout(() => {});
// Some code that might call timeouts...
const timeoutIndexNow = setTimeout(() => {});
const countOfTimeoutsFiredSinceThen = timeoutIndexNow - timeoutIndexThen - 1;
它基于这样一个事实,每次超时将在每次调用时返回一个大于1的数字。
所以我们创建一些虚拟超时只是为了在某个时候获得该数字。
然后,过一会儿我们再次调用它,然后得到一个新号码。这些数字之间的区别是两次调用间隔的时间。
这的缺点是您必须实际创建超时。好处是您不必修改原始功能。