2012-05-16 65 views
0

我正在創建一個基於QUnit的自動化測試框架,如果需要太長時間(超時),我希望能夠殺死一個測試。現在,我目前的實現非常簡單:在測試開始時,我設置了一個計時器並等待。如果測試尚未完成,我將其標記爲失敗並重新加載測試正在運行。在iframe中中斷JS

如果它正在等待AJAX​​調用或者異步測試再也不會返回,那麼這很有用。但是,setTimeout函數將始終在當前執行線程之後運行,所以如果測試進入無限循環,或者在標準執行中花費太長時間,它不會真正停止它,而是坐在並等待輪到它不中斷它。 是否有任何方法可以取消子代(即在同一個域中)中的代碼執行,即使它陷入循環?

回答

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> 

每個頁面在不同的線程運行,因此它應該爲你工作,但有些事情將禁售整個瀏覽器系統(無限循環/無限遞歸),您必須讓涉及的任務管理器重新啓動瀏覽器,但它應該涵蓋大部分情況。

+0

「*每個頁面運行在不同的線程*」 - 這取決於瀏覽器。 – Bergi

+0

這是我目前所擁有的,但無限循環/長代碼執行的情況是我想要能夠更好地處理的情況。此外,就不同的頁面運行不同的'線程',這可能是瀏覽器的具體情況,我想獨立於瀏覽器。另外,瀏覽器會將不同的頁面計算爲不同的頁面,還是在同一個「線程」中運行它們? – Ktash

+0

你真的很想和那個伴侶爭鬥 - 即使是瀏覽器也有問題 - 讓我來玩一玩吧。 –