我正在创建一个基于QUnit的自动化测试框架,如果测试需要太长时间(将时间用完),我希望能够终止测试。现在,我当前的实现非常简单:在测试开始时,我设置了一个计时器并等待。如果测试尚未完成,我将其标记为失败并重新加载运行测试的<iframe>
。
如果它正在等待AJAX调用,或者异步测试永远不会回来,那么它的效果很好。但是,setTimeout
函数将始终在当前执行线程之后运行,因此如果测试进入无限循环,或者只是在标准执行中花费太长时间,它将不会真正停止它,而只是坐着等待转弯而不打断它。 有没有办法取消子<iframe>
(在同一个域中)的代码执行,即使它被卡在循环中?
答案 0 :(得分:0)
在父窗口中定义你的计时器 - 当IFrame加载时,让它在父窗口中启动计时器 - 当计时器用完时,让父窗口重新加载IFrame。
在您的父页面
<script>
function startTimer(duration) {
setTimeout("timedOut()",duration);
}
function timedOut() {
// handle time out
}
</script>
<iframe id=myFrame></iframe>
在你的IFrame中
<script>
parent.startTimer(duration);
</script>
每个页面都在不同的线程上运行,因此应该为你工作,但有些事情会锁定整个浏览器系统(无限循环/无限递归),你必须让任务管理员参与重新启动浏览器,但它应该涵盖大部分案例。