Selenium.WebDriver.DevTools.Network的一个小Demo[C#]
写这篇的初衷
鼓捣C#的时候,想用Selenium.WebDriver.DevTools.Network,但是找了好久也没有找到关于Selenium4的DevTools里Network的用法,头快抓烂了. 于是乎到Github里鼓捣鼓捣源码,没想到还真鼓捣出来一点东西,所以赶快记录一下.
环境
Win10 + VS2019 + Chrome87(同版本driver) + Selenium.WebDriver4.0.0-alpha07
上菜
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using OpenQA.Selenium.DevTools.V87; // 2021.1.4 author by mu yao namespace DevToolsDemo { public class Demo { // 构造方法按需设置 public Demo() { } private List<Dictionary<string, string>> _responses = new List<Dictionary<string, string>>(); // 线程锁 private object obj_lock = new object(); /// <summary> /// 主要使用逻辑, 异步方法 /// </summary> /// <returns></returns> public async Task RunAsync() { // 初始化一个驱动, 本例中未设置 options 参数 var dr = new OpenQA.Selenium.Chrome.ChromeDriver(); // 初始化 session var session = dr.CreateDevToolsSession(); // 初始化 domains var domains = session.GetVersionSpecificDomains<DevToolsSessionDomains>(); // 设置 Network 为 Enable await domains.Network.Enable(new OpenQA.Selenium.DevTools.V87.Network.EnableCommandSettings()); // 订阅 接收 Response 事件 domains.Network.ResponseReceived += Network_ResponseReceived; // 打开目标网站 dr.Url = "http://www.***.com"; // 设置 获取 Response body 的参数 var cmd = new OpenQA.Selenium.DevTools.V87.Network.GetResponseBodyCommandSettings(); // 获取 RequestId 加入参数中 cmd.RequestId = GetRequestId(); // rlt 是最后获得的 Response body var rlt = domains.Network.GetResponseBody(cmd).GetAwaiter().GetResult(); // 输出得到的结果 Console.WriteLine(rlt.Body); // 设置 Network 为不可用 await domains.Network.Disable(); // 关闭驱动 dr.Quit(); } /// <summary> /// 获取 RequestId /// </summary> /// <returns></returns> private string GetRequestId() { string rlt = ""; List<Dictionary<string, string>> box; // responses List 要加锁 lock (obj_lock) { box = _responses.ToList(); } foreach (var u in box) { // 结合需求设置 if (u["url"] != null)// <筛选的条件> { rlt = u["requestId"]; break; } else { continue; } } return rlt; } /// <summary> /// 接收 Response 事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Network_ResponseReceived(object sender, OpenQA.Selenium.DevTools.V87.Network.ResponseReceivedEventArgs e) { var dic = new Dictionary<string, string>(); // e 中是接收到的 Response 信息, 本例中只需求 requestId 和 url dic.Add("requestId", e.RequestId); dic.Add("url", e.Response.Url); // responses List 要加锁 lock (obj_lock) { _responses.Add(dic); } } } }
下一篇:
springboot拦截器的使用与配置