aardio

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

2023-08-08  本文已影响0人  LCSan

起因,要实现同步从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)); 
                    
上一篇下一篇

猜你喜欢

热点阅读