记录aardio同步等待异步处理结果

 起因,要实现同步从chrome获取cookies,然后去做一些事情。来回折腾了selenium,chrome本地cookie文件,cdp方式来获取cookie。(PS:selenium拿不到readonly cookie,本地cookie文件拿不到会话cookie,cpd通过network.getCookies获取不到readonly,通过拦截Network.requestWillBeSent然后获取一些信息)。
巧合的是chrome升级到115版本,对应的webdriver还没更新。本地方式cookie用不了,最终只能选择cdp方式获取。而cdp是websocket通讯,走的异步消息循环。由于没有理解透消息循环、窗口线程、线程之间的原理,浪费了大量时间在这个点上。
这里用win.pumpMessage() 等待消息处理,用一个全局标识作为标记,标记变更后::PostThreadMessage()主动发起一个消息,用来触发全局标记的判断,从而结束pumpMessage,通过这种方式实现伪同步。

                    var cr = chrome.remote(params);             
                    console.log(cr.remoteDebuggingPort);                    
                    
                    // 创建cdp
                    var ws = web.socket.chrome();
                    var isOk;
                    // 这里ws操作全异步。
                    ws.on("Network.requestWillBeSent",function(param){
                        ...
                                    
                                        isOk = true;
                                        console.log(111);
                                        ::PostThreadMessage(thread.getId(),1234,0,0);
                                    
                            ...             
                    })
                    // 链接第一个能用的页面
                    ws.connectFirstDebuggingPage(cr.remoteDebuggingPort);
                    // 等待链接完成
                    ws.waitForConnected();                      
                    // 激活cdp网络相关操作
                    ws.Network.enable(maxTotalBufferSize = 10240;); 
                            // 打开网页
                            ws.Page.navigate(url = domain;);
                            do{
                                win.pumpMessage();
                            }while(!isOk)
                    
                    console.log("2222");
                    console.log(inet.getCookie(domain)); 
                    

另外一个例子

io.open()
io.print("正在监视按键,按ESC键退出!")

//导入HOOK库
import  key.hook
import com;
//创建录制钩子
hk = key.hook();

//录制回调函数
hk.proc=function(msg,vkcode,scancode){
    var kn = key.getName( vkcode );
   
    if( ( vkcode == key.VK.ESCAPE) && ( msg == 0x100/*_WM_KEYDOWN*/ ) ){
        ::PostThreadMessage(thread.getId(),1234,0,0)
        win.quitMessage();
    }   
}


//录制需要消消息循环
import win;
win.loopMessage(
    function(msg){
        if(msg.message==1234){
            var ie=com.CreateObject("InternetExplorer.Application.1")
            ie.visible=true;
       }
    }
)

//一定要关闭钩子
hk.close();

execute("pause") //按任意键继续
io.close();//关闭控制台
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容