如何给selenium.chrome写扩展拦截或转发请求
Selenium.WebDriver
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 Fillder
options.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的意思是直接拦截这次的请求,不去发送了
        },
    }
});
#endregion
var chrome = new ChromeDriver(driverBinary, options);
实现效果
如何给selenium.chrome写扩展拦截或转发请求的更多相关文章
- 哇塞,原来自己写 Google Chrome 浏览器扩展(插件)这么容易!
		
1. 首先新建一个记事本,命名为 manifest.json,这是写 Google Chrome 浏览器扩展必须的文件 { "manifest_version": 2, " ...
 - 黄聪:360浏览器、chrome开发扩展插件教程(1)开发Chrome Extenstion其实很简单
		
转载:http://www.cnblogs.com/walkingp/archive/2011/03/31/2001628.html Chrome的更新速度可以说前无古人,现在我每天开机的第一件事就是 ...
 - python爬虫——selenium+chrome使用代理
		
先看下本文中的知识点: python selenium库安装 chrome webdirver的下载安装 selenium+chrome使用代理 进阶学习 搭建开发环境: selenium库 chro ...
 - selenium+chrome options
		
selenium+chrome options 环境:selenium chrome 1. selenium + chrome参数配置 1.1. 启动 from selenium im ...
 - Selenium Chrome浏览器的启动以及proxy设置
		
Selenium Chrome浏览器的启动以及proxy设置 虽然WebDriver对Firefox的支持最好,之前写的脚本也都在Firefox浏览器运行,但最近项目做了整合,发现新整合的功能不太 ...
 - chrome浏览器扩展的事件处理
		
关于chrome扩展开发的栗子已经有很多了,问问度娘基本能满足你的欲望, 我想说的是扩展和页面间的数据传递问题. 我们知道写扩展有个必须的文件就是“manifest.json”, 这个里面定义了一个和 ...
 - 芝麻HTTP:设置Selenium+Chrome代理
		
微博登录限制了错误次数···加上Cookie大批账号被封需要从Cookie池中 剔除被封的账号··· 需要使用代理··· 无赖百度了大半天都是特么的啥玩意儿???结果换成了 Google手到擒来 分分 ...
 - 芝麻HTTP:爬虫之设置Selenium+Chrome代理
		
微博登录限制了错误次数···加上Cookie大批账号被封需要从Cookie池中 剔除被封的账号··· 需要使用代理··· 无赖百度了大半天都是特么的啥玩意儿???结果换成了 Google手到擒来 分分 ...
 - 小白学爬虫-设置Selenium+Chrome代理
		
微博登录限制了错误次数···加上Cookie大批账号被封需要从Cookie池中 剔除被封的账号··· 需要使用代理··· 无赖百度了大半天都是特么的啥玩意儿???结果换成了 Google手到擒来 分分 ...
 
随机推荐
- [笔记] 后缀自动机 (SAM)
			
实现 void ins(int c){ int np = ++dcnt, p = lst; lst = np; t[np].len = t[p].len + 1, t[np].eps = 1; whi ...
 - 干货 | Nginx负载均衡原理及配置实例
			
一个执着于技术的公众号 Nginx系列导读 给小白的 Nginx 10分钟入门指南 Nginx编译安装及常用命令 完全卸载nginx的详细步骤 Nginx 配置文件详解 理解正向代理与反向代理的区别 ...
 - this-4
			
ES6函数里的this指的是定义这个函数时外层代码的this,可以理解为:1.ES6箭头函数没有自己的this:2.ES6箭头函数的this是外层代码(定义时,非执行时,也就是词法作用域)this的引 ...
 - resultMap,日志,分页
			
问题:属性名和字段名不一致 解决方法 起别名 select id, username, password as pwd from db4.user resultMap结果集映射 id username ...
 - Web安全学习笔记 SQL注入下
			
Web安全学习笔记 SQL注入下 繁枝插云欣 --ICML8 SQL注入小技巧 CheatSheet 预编译 参考文章 一点心得 一.SQL注入小技巧 1. 宽字节注入 一般程序员用gbk编码做开发的 ...
 - data:image字符转byte[]
			
var data = "data:image/bmp;base64,Qk3aHwAAAAAAADYAAAAoAAAAZAAAABsAAAABABgAAAAAAKQfAAAAAQAAAAEAA ...
 - 一文学会Java的交互式编程环境jshell
			
什么是交互式编程环境?重点词交互,在这样的编程环境中,你每输入一行代码,环境都会给你一个反馈,这就是交互式的编程环境.这种编程环境并不太适合工程化的复杂性需求,但在一些快速验证.简单计算之类的场景下还 ...
 - Linux下MySQL表名区分大小写
			
问题:MySQL一个数据库的表名统一小写,在Windows上安装的MySQL没有问题,但是把数据库部署到Linux上,应用启动的时候报表不存在错误. 解决:修改my.cnf lower_case_ta ...
 - 139_Power BI之某制造企业HR相关数据年度复盘
			
博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 最近在忙一个关于制造企业HR年度数据复盘分析:数据已脱敏. 先来看看效果. 1.视频效果 [video widt ...
 - jQuery基础入门+购物车案例详解
			
jQuery是一个快速.简洁的JavaScript代码库(或JavaScript框架).jQuery设计的宗旨是"write Less,Do More",即倡导写更少的代码,做更多 ...