1.在javascript中,可以用三種方式來模擬多線程。
a)在javascript中用command模式模擬多線程
b)window.setTimeout(code,time)
讓代碼在指定時間后執行一次。
c)setInterval(code,time)
讓代碼按照指定時間間隔來執行。
注意setTimeout與setInterval的區別
2.似乎無法在javascript的單線程執行環境中利用AutoItX來捕捉onload事件中的alert。
背景:selenium中采用了重載window.alert的方式,來截獲所有javascript中的alert。
Window.alert = function (msg) {
This.Alerted.push(msg);
};
這樣,所有的alert消息被悄無聲息地存放在一個隊列中。原本的alert彈出后,如果不點擊OK或者關閉,整個javascript執行線程就一直停止。重載window.alert的方式避免彈出alert窗口,保證了selenium順利地執行。
但是,這種方式無法捕捉body的onload事件中的alert。因為每一次刷新頁面的時候,所有的被重載的方法和事件都會被清空,而我們來不及再一次重載alert方法。
使用Watir的時候,我注意到了她是借助一個名為AutoItX庫來實現這個功能的。于是,設想是否可以通過同樣的方法來捕捉onload事件中的alert方法。
我不詳細介紹AutoItX類庫,簡要說一下她的原理:
var autoit = new ActiveXObject(“AutoItX3.Control”);
autoit.WinWait(title,text,…);//等待標題為title,包含text的窗口出現
開始的設想是使用如下的方法來不斷查詢alert窗口是否彈出:
window.setTimeout(‘fuction check() {autoit.WinExists(title,txt) == 1?return:check()’,100)
但是,卻無法捕捉到alert。原因就是alert彈出后,如果不點擊OK或者關閉,整個javascript執行線程就會停止。所以,調用check函數的計時也停止了。這個問題用模擬多線程是無法解決的。
對于這個問題的一個解決方案