selenium.chrome怎么写扩展拦截或转发请求?

 Selenium WebDriver 是一组开源 API,用于自动测试 Web 应用程序,利用它可以通过代码来控制chrome浏览器!

有时候我们需要mock接口的返回,或者拦截和转发请求,今天就来实现这个功能。

代码已开源: https://github.com/yuzd/OpenQA.Selenium.Chrome.Fiddler

nuget

OpenQA.Selenium.Chrome.Fiddler

开始coding

我们新创建一个功能:OpenQA.Selenium.Chrome.Fiddler

一个chrome扩展 最起码有2个文件

·manifest.json

· background.js

稍微解释一下:

manifest.json 是来描述chrome扩展的

{"version": "1.0.0","manifest_version": 2,"name": "Chrome Fiddler","permissions": ["proxy","tabs","unlimitedStorage","storage","<all_urls>","webRequest","webRequestBlocking"],"background": {"scripts": ["background.js"]},"minimum_chrome_version":"22.0.0"}

background.js 是逻辑处理模块

因为拦截api 或者 转发 需要用的chrome的api

chrome.webRequest.onBeforeRequest.addListener(function(details) {//逻辑处理},{ urls: ['<all_urls>']},['blocking', 'extraHeaders', 'requestBody']);

这个api的函数 接收的details参数:

  ·details.url 是api的接口

  函数的返回

  · {cancel:true} 拦截请求

  · {redirectUrl:''} 转发到指定url

  写selenium.chrome插件

  新建一个netstand工程,然后引用

  · Selenium.WebDriver

/// <summary>/// Add Fiddler extention/// </summary>/// <param name="options">Chrome options</param>/// <param name="fiddlerOption">Proxy host</param>public static void AddFiddler(this ChromeOptions options, FiddlerOption fiddlerOption){var backgroundProxyJs = ReplaceTemplates(background_js, fiddlerOption);if (!Directory.Exists("Plugins"))Directory.CreateDirectory("Plugins");var guid = Guid.NewGuid().ToString();var manifestPath = $"Plugins/manifest_{guid}.json";var backgroundPath = $"Plugins/background_{guid}.js";var archiveFilePath = $"Plugins/proxy_auth_plugin_{guid}.zip";File.WriteAllText(manifestPath, manifest_json);File.WriteAllText(backgroundPath, backgroundProxyJs);using (var zip = ZipFile.Open(archiveFilePath, ZipArchiveMode.Create)){zip.CreateEntryFromFile(manifestPath, "manifest.json");zip.CreateEntryFromFile(backgroundPath, "background.js");}File.Delete(manifestPath);File.Delete(backgroundPath);options.AddExtension(archiveFilePath);}private static string ReplaceTemplates(string str, FiddlerOption fiddlerOption){if (fiddlerOption.OnBeforeRequestOptions != null){var beforeConfigs = Newtonsoft.Json.JsonConvert.SerializeObject(fiddlerOption.OnBeforeRequestOptions);str = str.Replace("{before_configs}", beforeConfigs);}return str;}

上面的代码主要是创建一个chrome扩展zip包

  然后再selenium.chrome启动的时候传进去这个zip包的地址

  使用方法

var driverBinary = @"D:\soft\chrome\chrome2\Chrome-bin\";ChromeOptions options = new ChromeOptions{BinaryLocation = Path.Combine(driverBinary, "chrome.exe")};Environment.SetEnvironmentVariable("webdriver.chrome.driver", driverBinary);options.AddArgument("--disable-blink-features=AutomationControlled");options.AddArguments("--disable-infobars");List<string> ls = new List<string> { "enable-automation" };options.AddExcludedArguments(ls);#region Fillderoptions.AddFiddler(new FiddlerOption{OnBeforeRequestOptions = new List<FiddlerOnBeforeRequestOptions>{// 配置转发new FiddlerOnBeforeRequestOptions{Match = "https://www.cnblogs.com/yudongdong/ajax/GetPostStat",//正则RedirectUrl = "http://localhost:5000/GetPostStat",//如果匹配成功则将requestBody转发到这个url中去Cancel = false//如果配置了cancel=true那么转发将无效,true的意思是直接拦截这次的请求,不去发送了},// 配置拦截new FiddlerOnBeforeRequestOptions{Match = "https://www.cnblogs.com/yudongdong/ajax/blogStats",Cancel = true//true的意思是直接拦截这次的请求,不去发送了},}});#endregionvar chrome = new ChromeDriver(driverBinary, options);

实现效果 

因此我建立了一个软件测试开发自学团,正在学习测试的小伙伴可以通过点击下面的小卡片 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/5266.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML语法

文章目录 前言HTML 文件基本结构常见标签标签种类特殊符号图片链接a链接 双标签链接 列表表格 &#xff1a;表单多行文本域: 前言 HTML是有标签组成的 <body>hello</body>大部分标签成对出现. 为开始标签, 为结束标签. 少数标签只有开始标签, 称为 “单标签”. 开…

Helm 安装prometheus-stack 使用local pv持久化存储数据

目录 背景&#xff1a; 环境准备&#xff1a; 1. 磁盘准备 2. 磁盘分区格式化 local storage部署 1. 节点打标签 2. 创建local pv storageClass和prometheus-pv Prometheus-stack部署 1. 下载helm chart包 2. values.yaml 参数解释 3. 部署prometheus-stack 4. 查看…

Baichuan-13B:130亿参数的开源语言模型,引领中文和英文benchmark

Baichuan-13B: 一个强大的开源大规模语言模型 标题&#xff1a;Baichuan-13B&#xff1a;130亿参数的开源语言模型&#xff0c;引领中文和英文benchmark Baichuan-13B是由百川智能开发的一个开源大规模语言模型项目&#xff0c;包含了130亿参数。该模型在中文和英文的权威ben…

mybatis学习笔记之核心配置文件详解

文章目录 核心配置文件内容多环境事务管理器对数据源的剖析JNDIPOOLED和UNPOOLED的区别配置具体的数据库连接池参数 propertiesproperties和mapper标签的url属性 核心配置文件内容 <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE configura…

【广州华锐互动】VR地铁消防逃生路线演练系统

随着城市轨道交通的不断发展&#xff0c;事故应急演练的重要性也越来越受到重视。而VR技术的应用&#xff0c;为地铁消防逃生路线演练带来了许多亮点&#xff0c;包括以下几个方面&#xff1a; 首先&#xff0c;VR技术可以提供高度真实的模拟场景。在传统的事故应急演练中&…

常见的计算机网络协议

1 协议分类 1.1 网络层协议 IP 、 ICMP、IGMP、IS-IS、IPsec、 ARP、 RARP、RIP、VRRP等 1.2 传输层协议 TCP、 UDP、TLS、SSL、OSPF 等 1.3 应用层协议 DHCP 、DNS 、FTP、 HTTP、POP3、 SNMP 、SSH 、TELNET 、 BGP 、GLBP、HSRP等 2 协议详解 2.1 IP协议 IP指网际互…

vue监听dom元素的宽高变化和自定义指令监听dom元素的宽高变化

vue监听dom元素的宽高变化和自定义指令监听dom元素的宽高变化 1.监听dom元素的宽高变化 你可以使用Vue的指令v-on和v-bind来动态监听div的宽度。 首先&#xff0c;在Vue实例中声明一个data属性&#xff0c;用来存储div的宽度值。例如&#xff1a; data() {return {divWidth…

ipad可以使用其他品牌的手写笔吗?平价ipad手写笔推荐

我是一个拥有多年数码经验的爱好者&#xff0c;我知道一些关于电容笔的知识。我认为&#xff0c;苹果原装的电容笔与普通的电容笔最大的不同之处&#xff0c;就是其所带来的压感不同。由于“重力压感”的特殊性&#xff0c;我们能很快地把色彩填充到画面中。除此之外&#xff0…

亿发软件:数字化大中型制造企业生产管理应用,实现智慧工厂信息化

随着信息技术与制造业的深度协调&#xff0c;作为企业发展的趋势&#xff0c;大中型制造企业需要拥抱信息化建设。通过运用信息技术和数字化运营&#xff0c;大中型制造企业的生产、设计、经营、管理、后续服务等都实现自动化、智能化。大中型制造企业信息化建设解决方案&#…

uniapp中axios封装和环境配置

axios版本 最好锁定版本&#xff0c;避免bug axios-miniprogram-adapter这个依赖主要是适配小程序网络请求的适配器&#xff0c;为了解决uniapp 适配axios请求&#xff0c;避免报adapter is not a function错误 cnpm i axios0.26.0 axios-miniprogram-adapter 配置adapter函…

Cadence PCB 仿真Model Integrity专题

&#x1f3e1;《总目录》   &#x1f3e1;《宝典目录》 目录 1&#xff0c;内容概述2&#xff0c;内容目录 1&#xff0c;内容概述 本专题详细介绍Cadence的仿真建模工具 Model Integrity。 2&#xff0c;内容目录 Cadence PCB仿真 Model Integrity 功能详述与启动方法图文教…

bean的生命周期

生命周期&#xff1a;从生到死的过程。那么对于bean来说就是从创建到销毁的过程。 普通的Java对象的创建由我们new创建&#xff0c;然后在不用的时候&#xff0c;java回收机制会自动回收。那么bean呢&#xff1f; bean是spring中的对象&#xff0c;和普通对象不一样的就是bea…

基于Python+ResNet50算法实现一个图像识别系统案

题解 | #完全平方数的草料# class Solution {public: /** * 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可 * 新东方南昌学校招聘编程竞赛教练 工作职责&#xff1a;1、教学工作&#xff1a;为学员提供编程Python&#xf…

springboot-防止sql注入,xss攻击,cros恶意访问

1.sql注入 sql注入: 把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串&#xff0c;最终达到欺骗服务器执行恶意的SQL命令 解决方法&#xff1a; 1)无论是直接使用数据库还是使用如mybatis组件&#xff0c;使用sql的预编译&#xff0c;不要用拼接字符串。 2)后…

Unity游戏源码分享-Unity手游火柴忍者游戏StickmanDojo

Unity游戏源码分享-Unity手游火柴忍者游戏StickmanDojo 项目地址&#xff1a;https://download.csdn.net/download/Highning0007/88050234

蒲公英打包环境搭建碰到问题

一&#xff1a;证书那边选择手动&#xff0c;不要自动&#xff0c;——》debug配置dev证书&#xff0c;release配置ad-hoc证书 二&#xff1a;证书有时候不生效&#xff0c;删除重新下载。~/Library/MobileDevice/Provisioning Profiles 三&#xff1a;更新测试手机时&#…

Mysql索引与事务

目录 一、索引 1、概念 2、作用 3、副作用 二、事务 1、概念 2、ACID特点 原子性 一致性 隔离性 持久性 一、索引 1、概念 索引是一个排序的列表&#xff0c;在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址&#xff08;类似于C语言的链表通过指针…

OpenCv色彩空间

目录 一、RGB 二、图像处理入门 三、色彩空间的转换 一、RGB 在表示图像时&#xff0c;有多种不同的颜色模型&#xff0c;但最常见的是红、绿、蓝(RGB) 模型RGB 模型是一种加法颜色模型&#xff0c;其中原色 (在RGB模型中&#xff0c;原色是红色 R、绿色 G 和蓝色 B)混合在…

设计模式之享元模式

写在前面 本文看下一种结构型设计模式&#xff0c;享元模式。 1&#xff1a;介绍 1.1&#xff1a;什么时候使用享元模式 当程序需要大量的重复对象&#xff0c;并且这些大量的重复对象只有部分属性不相同&#xff0c;其他都是相同的时候&#xff0c;就可以考虑使用享元设计…

PMP-项目风险管理学习要点

文章目录 前言PMP-项目风险管理学习要点1. 风险的含义2. 风险敞口3. 单个项目风险 VS 整个项目风险4. 变异性风险5. 模糊性风险6. 项目风险的分类6.1. 已知风险与未知风险6.2. 内部风险与外部风险6.3. 商业风险与可保险风险7. 影响相关方的风险态度的因素8. 识别风险的几种方式…