2011-08-18 64 views
5

我正在使用Selenium来测试使用Dojo的Web应用程序,并且它使用java脚本来显示某些元素。我想等到所有元素都显示出来后再尝试操作页面,但是我遇到了麻烦。如何计算活动javascript超时?

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

我也尝试过多次寻找元素,但这不是太好,因为也许以后有一些JavaScript会以某种方式使用此字段。所以基本上我想要一个方法(至少在firefox中)查询等待在setTimeout(或setInterval)上运行的JavaScript,我甚至可以通过我自己的函数来处理内置调用的方法跟踪这一点。

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

回答

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

每当您致电setTimeoutsetInterval - 返回一个计时器ID。

  1. 保存在一个数组
  2. ,你对超时调用函数内部的定时器ID,流行的是定时器ID关闭阵列。因为我们必须在计时器结束时立即从阵列中删除该ID。
  3. 任何时候你想检查没有。有效的定时器,只需查询该数组的长度。
+0

您好,感谢您的回复。我们不直接调用setTimeout或setInterval。他们正在被我们的UI开发人员使用的Dojo库调用。我们试图用selenium测试应用程序,所以我们可以在页面中运行javascript,但是我们不能轻易干扰我们测试的代码的工作方式。 也许有一个Firefox插件可以跟踪我们,并以某种方式覆盖内置的超时机制? –