Selenium.WebDriver.DevTools.Network的一个小Demo[C#]

写这篇的初衷

鼓捣C#的时候,想用Selenium.WebDriver.DevTools.Network,但是找了好久也没有找到关于Selenium4的DevTools里Network的用法,头快抓烂了.
于是乎到Github里鼓捣鼓捣源码selenium,没想到还真鼓捣出来一点东西,所以赶快记录一下.

环境

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);
            }
        }
    }
}
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值