SeleniumWebDriver扩展插件开发

a92e2794836892fdd5706af8eb89f9d4.jpeg

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

有时候我们需要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);

实现效果


272d0eee2a5bb48ae31a9cde1d429755.gif



可能有人问,selenium, webdriver 有太多的特征了,如何绕过风控呢

我的解决办法是修改chromium的源码来改变,感兴趣的可以加我一起探讨!


我是正东,学的越多不知道也越多,关注高效率写代码!

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

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

相关文章

[转]钱岭:别担心“35岁危机”,要成为“老专家”

从清华大学到贝尔实验室&#xff0c;再到中国移动&#xff0c;作为“IT老人”&#xff0c;钱岭的技术人生几乎覆盖了20世纪90年代至今的信息产业革命。2007年开始&#xff0c;钱岭在中国移动经历了基础科研到产品落地&#xff0c;再到团队孵化&#xff1b;也经历了云计算从无到…

【GIS前沿】周成虎院士:GIS的大数据时代展望(PPT分享)

本文源自微信公众号&#xff1a;宋关福GIS笔记。版权归原作者及刊载媒体所有&#xff0c;如有侵权请立即与我们联系,我们将及时处理。更多GIS前言技术&#xff0c;请关注《GIS前言》专栏。 GIS的大数据时代展望

DataV:可视化大屏展示神器实战分享

由于公司年即将发布新的产品&#xff0c;传统意义上的PPT显得不太生动化&#xff0c;所以想采用具体化&#xff0c;可视化的数据大屏进行业务数据的事实展示&#xff0c;第一时间想到了来自于阿里云旗下的DataV&#xff0c;废话不多说&#xff0c;老司机开始发牌照&#xff01;…

数据库性能系列之索引(中)

GOOD NIGHT前言上一篇中&#xff0c;我们已经了解到了索引的基本概念和一些用法。那索引为什么会提升查询的速度&#xff0c;以及索引究竟是怎么工作的呢&#xff1f;也许大家心里还是有一些迷茫&#xff0c;这一切&#xff0c;还要从索引背后的算法说起。GOOD NIGHT概述大家知…

微服务架构的设计原则和核心话题

目录 一、前言 二、微服务架构的设计原则 1.拆分足够微 2.轻量级通信 3.单一职责原则 4.领域驱动原则 三、微服务架构的核心话题 1.服务拆分 2.服务注册与发现 3.负载均衡 4.API网关 5.服务部署与发布 四、总结 一、前言 毫无疑问&#xff0c;微服务架构的设计原…

Golang GOPATH 包

2019独角兽企业重金招聘Python工程师标准>>> Golang GOPATH & 包的定义 & 包的导入 GOPATH 设置 go 命令依赖一个重要的环境变量&#xff1a;$GOPATH 可以在 .zshrc 配置文件中加上一行这样的配置&#xff0c; export GOPATH/Users/flyme/mygo Go从1.1版本到…

PPK大疆无人机应用教程

文章目录 一、新建项目二、导入数据三、解算过程四、结果导出一、新建项目 新建工程,设置项目名称,保存位置,控制等级,坐标系统(坐标系统选择高斯克吕格,中央子午线根据实际数据所在位置进行选择) 二、导入数据 选择大疆数据,找到对应的文件夹 数据有:图片,EVENT.b…

Eclipse Add generated serial version ID报错解决方案

为什么80%的码农都做不了架构师&#xff1f;>>> 问题&#xff1a; The following problem occurred:Could not find class file.Make sure the file is compilable 解决方案&#xff1a; 1、右键项目 -> Java Build Path -> Source 在Sourcd folders on bui…

C# WPF设备监控软件(经典)-上篇

01—前言应老东家也是老同学的需求&#xff0c;开发了此设备监控软件。主要是为了应对测试设备长时间不上传测试数据未能及时发现的问题&#xff0c;测试数据一般在每台设备都有个固定的临时存放目录&#xff0c;测试数据不更新时&#xff0c;此文件夹便不再更新。需求相对比较…

[转]微服务的4个设计原则和19个解决方案

目录 一、微服务架构演进过程 二、微服务架构的好处 三、微服务应用4个设计原则 1.AKF拆分原则 2.前后端分离 3.无状态服务 4.Restful通信风格 四、微服务架构带来的问题 五、微服务平台的19个落地实践 1.企业IT建设的三大基础环境 2.微服务应用平台总体架构 3.微服…

【GlobalMapper精品教程】033:影像地图羽化方式详解

在Globalmapper中,可以很方便的对影响进行多种羽化值设置。 文章目录 1. 不要羽化此图层2. 沿一个或多个边缘羽化3. 羽化到有效数据的多边形覆盖4. 在当前选定的多边形内羽化5. 裁剪到选定的边界,而不是羽化6. 在多边形外部羽化,而不是内部加载配套案例数据包中的data033.ra…

基于WPF重复造轮子,写一款数据库文档管理工具(一)

项目背景公司业务历史悠久且复杂&#xff0c;数据库的表更是多而繁杂&#xff0c;每次基于老业务做功能开发都需要去翻以前的表和业务代码。需要理解旧的表的用途以及包含的字段的含义&#xff0c;表少还好说&#xff0c;但是表一多这就很浪费时间&#xff0c;而且留下来的文档…

[转]GitBook使用教程收藏

GitBook使用教程 最简单的方式就是使用GitBook编辑器&#xff0c;没有什么难度&#xff0c;后面的教程主要针对命令行的方式 PS&#xff1a;GitBook的book页面默认没有download按钮的 需要到设置中打开&#xff0c;打开后再次publish生效 同步GitHub 更新失败&#xff0c;无法…

二 面向对象三大特性

一 继承与派生 一、继承定义 二、继承与抽象的关系 三、继承与重用性 四、派生 五、组合与重用性 六、接口与归一化设计 七、抽象类 八、继承实现的原理 九、子类中调用父类的方法 二 多态与多态性 一、多态 二、多态性 三 封装 一、封装定义 二、特性(property) 三、封装与扩展…

CSS3新属性

边框&#xff1a; border-radius 用于创建圆角 div { border:2px solid; border-radius:25px; -moz-border-radius:25px; /* Old Firefox */ } box-shadow 用于向方框添加阴影 div { box-shadow: 10px 10px 5px #888888; } border-image 使用图片来创建边框 div { border-image…

Android实用笔记——使用Spinner实现下拉列表

2019独角兽企业重金招聘Python工程师标准>>> 1、编辑activity_main.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"mat…

基于.NET 6 的开源访客管理系统

简单介绍一下系统功能系统用于简化访客登记、查询、保存。传统的登记方式&#xff0c;不仅浪费纸张&#xff0c;而且还面临保存的问题&#xff0c;查阅不方便。该系统为了在疫情期间能很好管理访客登记做好风险管控,同时可以整合智能设备做到自动确认并跟踪访客的行动轨迹,该项…

完整的产品管理工作流程

产品经理的工作具体会落实到工作流程中&#xff0c;所以工作流程很大程度上会体现工作层次。很多白领产品经理&#xff0c;多年来在一个低层次的流程中转圈——理需求、画原型、写文档、管项目、验收上线&#xff0c;一个版本上线之后立刻对下一个版本理需求、画原型、写文档、…

java爬虫-简单爬取网页图片

刚刚接触到“爬虫”这个词的时候是在大一&#xff0c;那时候什么都不明白&#xff0c;但知道了百度、谷歌他们的搜索引擎就是个爬虫。 现在大二。再次燃起对爬虫的热爱&#xff0c;查阅资料&#xff0c;知道常用java、python语言编程&#xff0c;这次我选择了java。在网上查找的…

Windows Server 2016-图形化迁移FSMO角色

上章节我们简单介绍了三种不同方式查看FSMO主机角色信息&#xff0c;在开篇之前我们简单回顾一下FSMO五种操作主机角色&#xff1a;林范围操作主机角色有两种&#xff0c;分别是 架构主机角色&#xff08;Schema Master&#xff09;和 域命名主机角色&#xff08;Domain Naming…