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