起因,要实现同步从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));
网友评论