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);

实现效果

image

如何给selenium.chrome写扩展拦截或转发请求的更多相关文章

  1. 哇塞,原来自己写 Google Chrome 浏览器扩展(插件)这么容易!

    1. 首先新建一个记事本,命名为 manifest.json,这是写 Google Chrome 浏览器扩展必须的文件 { "manifest_version": 2, " ...

  2. 黄聪:360浏览器、chrome开发扩展插件教程(1)开发Chrome Extenstion其实很简单

    转载:http://www.cnblogs.com/walkingp/archive/2011/03/31/2001628.html Chrome的更新速度可以说前无古人,现在我每天开机的第一件事就是 ...

  3. python爬虫——selenium+chrome使用代理

    先看下本文中的知识点: python selenium库安装 chrome webdirver的下载安装 selenium+chrome使用代理 进阶学习 搭建开发环境: selenium库 chro ...

  4. selenium+chrome options

    selenium+chrome options 环境:selenium chrome 1.      selenium + chrome参数配置 1.1.    启动 from selenium im ...

  5. Selenium Chrome浏览器的启动以及proxy设置

    Selenium Chrome浏览器的启动以及proxy设置   虽然WebDriver对Firefox的支持最好,之前写的脚本也都在Firefox浏览器运行,但最近项目做了整合,发现新整合的功能不太 ...

  6. chrome浏览器扩展的事件处理

    关于chrome扩展开发的栗子已经有很多了,问问度娘基本能满足你的欲望, 我想说的是扩展和页面间的数据传递问题. 我们知道写扩展有个必须的文件就是“manifest.json”, 这个里面定义了一个和 ...

  7. 芝麻HTTP:设置Selenium+Chrome代理

    微博登录限制了错误次数···加上Cookie大批账号被封需要从Cookie池中 剔除被封的账号··· 需要使用代理··· 无赖百度了大半天都是特么的啥玩意儿???结果换成了 Google手到擒来 分分 ...

  8. 芝麻HTTP:爬虫之设置Selenium+Chrome代理

    微博登录限制了错误次数···加上Cookie大批账号被封需要从Cookie池中 剔除被封的账号··· 需要使用代理··· 无赖百度了大半天都是特么的啥玩意儿???结果换成了 Google手到擒来 分分 ...

  9. 小白学爬虫-设置Selenium+Chrome代理

    微博登录限制了错误次数···加上Cookie大批账号被封需要从Cookie池中 剔除被封的账号··· 需要使用代理··· 无赖百度了大半天都是特么的啥玩意儿???结果换成了 Google手到擒来 分分 ...

随机推荐

  1. java基础4.20

    1.是否可以从一个static方法内部发出对非static方法的调用? 不可以.因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时 ...

  2. 网络排查工具MTR介绍

    开源Linux 回复"读书",挑选书籍资料~ 常用的 ping,tracert,nslookup 一般用来判断主机的网络连通性,其实 Linux 下有一个更好用的网络连通性判断工具 ...

  3. Linux系统句柄优化

    Linux系统句柄介绍 文件句柄,会随着进程数增加而增加.其实Linux是有文件句柄限制的,而且Linux默认一般都是1024.在生产环境中很容易到达这个值,因此这里就会成为系统的瓶颈. 在Linux ...

  4. WPF 制作雷达扫描图

    实现一个雷达扫描图. 源代码在TK_King/雷达 (gitee.com),自行下载就好了 制作思路 绘制圆形(或者称之轮) 绘制分割线 绘制扫描范围 添加扫描点 具体实现 首先我们使用自定义的控件. ...

  5. kNN-准备数据

    在上一小节,我们大概了解了kNN算法的基本原理,现在我们要进行数据的处理 本小节所用数据集来自[机器学习实战]:Machine Learning in Action (manning.com) 下载数 ...

  6. SpringBoot进阶教程(七十四)整合ELK

    在上一篇文章<SpringBoot进阶教程(七十三)整合elasticsearch >,已经详细介绍了关于elasticsearch的安装与使用,现在主要来看看关于ELK的定义.安装及使用 ...

  7. Dockerfile 使用 SSH

    如果在书写 Dockerfile 时,有些命令需要使用到 SSH 连接,比如从私有仓库下载文件等,那么我们应该怎么做呢? Dockerfile 使用 SSH Dockerfile 文件配置 为了使得 ...

  8. 广义SAM

    参考 还有首先你要会SAM吧~ 用途 相比与单串SAM,广义自动机能存储的是多个字符串. 有两种写法,第一种是离线利用trie树结构,第二种是在线伪广义SAM 离线+Trie 首先构建出trie树. ...

  9. 使用git提交和拉取gitee的代码

    使用git提交和拉取gitee的代码 1. 安装Git(自行摸索) 2. 在gitee新建仓库 名称和路径自己写 这两个二选一足矣 默认分支master就行 复制这个链接,待会要用 3. 新建项目目录 ...

  10. Halodoc使用 Apache Hudi 构建 Lakehouse的关键经验

    Halodoc 数据工程已经从传统的数据平台 1.0 发展到使用 LakeHouse 架构的现代数据平台 2.0 的改造.在我们之前的博客中,我们提到了我们如何在 Halodoc 实施 Lakehou ...