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

实现效果 

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

9k字长文理解Transformer: Attention Is All You Need

作者&#xff1a;猛码Memmat 目录 Abstract1 Introduction2 Background3 Model Architecture3.1 Encoder and Decoder Stacks3.2 Attention3.2.1 Scaled Dot-Product Attention3.2.2 Multi-Head Attention3.2.3 Applications of Attention in our Model 3.3 Position-wise Feed…

C++基础(6)——类和对象(运算符重载)

前言 本文主要介绍了C中运算符重载的基本知识。 4.5.1&#xff1a;加号运算符重载&#xff08;成员函数和全局函数都可实现&#xff09; 运算符重载&#xff1a;对已有的运算符重新进行定义&#xff0c;赋予其另一种功能&#xff0c;以适应不同的数据类型 1&#xff1a;成员…

防火墙日志记录和监控在网络安全中的重要性

防火墙监视进出网络的流量&#xff0c;并保护部署网络的网络免受恶意流量的侵害。它是一个网络安全系统&#xff0c;根据一些预定义的规则监控传入和传出的流量。它以日志的形式记录有关如何管理流量的信息。日志数据包含流量的源和目标 IP 地址、端口号、协议等。为了有效地保…

Git系列:运用Git创建空白分支进行项目相关文档管理

文章目录 起因一、为什么会选择Git分支二、Git分支的简单介绍和好处三、本次的具体操作1.$git checkout --orphan XXX2.删除当前分支里的内容3.提交新的分支 总结 起因 项目管理过程中没有做好相关文档管理&#xff0c;比如需求&#xff0c;开发&#xff0c;测试等文档&#x…

科技云报道:大模型时代,AI基础软件机会何在?

科技云报道原创。 大模型时代&#xff0c;离不开算力&#xff0c;算法、数据的喂养。如果将视角放至整个产业链上&#xff0c;算法背后&#xff0c;还有一个关键要素值得被关注&#xff0c;那就是AI基础软件。 算法是实现AI功能的关键&#xff0c;而基础软件则为算法提供运行…

React项目引入Arco Design,以及Arco Design Pro 架构

创建项目 创建 react-arco 项目 pnpm create vite my-vue-app --template react安装 arco-design/web-react 安装 react 版的 arco-design 基础使用 添加一个按钮&#xff0c;App.tsx import "./App.css"; import { Button } from "arco-design/web-react…

CH2023、Adobe Character Animator 2023(动画角色制作软件)下载教程、安装教程

最后附下载地址 Adobe CH简介&#xff1a; Adobe Character Animator是一款基于动画制作的软件&#xff0c;它可以将手绘的角色通过摄像头或麦克风捕捉到的实时动作转化为动画效果。该软件结合了人工智能和动画技术&#xff0c;可以快速创建高质量的角色动画&#xff0c;并且…

2023年的深度学习入门指南(17) - 深度学习的硬件加速技术

2023年的深度学习入门指南(17) - 深度学习的硬件加速技术 有了前面的知识之后&#xff0c;想必大家对于算力需求的理解已经越来越深刻了。 除了使用CPU&#xff0c;GPU这样的通用器件之外&#xff0c;采用专用的硬件来进行加速是一个大家都能想到的选择。 其中的代表器件就是…

杂记 | 使用Docker和Nginx为网站添加HTTPS访问功能

文章目录 01 准备工作1.1 HTTPS介绍1.2 准备工作 02 编写nginx.conf03 使用docker启动nginx 01 准备工作 1.1 HTTPS介绍 HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;是一种通过加密通信保护网站数据传输的协议。它是 HTTP 协议的安全版本&#xff0c;通…

1.4 掌握Scala运算符

一、运算符等价于方法 &#xff08;一&#xff09;运算符即方法 op运算符与.op方法调用是等价的&#xff0c;op表示运算符&#xff1a;、-、*、/…… 演示x y与x.(y)的等价 &#xff08;二&#xff09;方法即运算符 1、单参方法 str.indexOf(‘a’) 与 str indexOf ‘a’…

stable-diffusion-webui的介绍与使用——Controlnet1.1

源码地址&#xff1a;https://github.com/lllyasviel/ControlNet | 最新版本 controlnet-v1.1 论文地址&#xff1a;2302.Adding Conditional Control to Text-to-Image Diffusion Models 扩展UI地址&#xff08;需先安装sd-webui&#xff09;&#xff1a;https://github.com/M…

【gcc, cmake, eigen, opencv,ubuntu】四.opencv安装和使用,获取opencv matiax 的指针

文章目录 ubuntu系统安装opencv1.下载opencv和opencv_contrib2.安装指导3.Linux 下 fatal error: opencv2/opencv.hpp: 没有那个文件或目录4.g 和cmake 编译使用opencv的程序5.opencv,eigen速度比较6.opencv常用类型符号7.获取opencv matiax 的指针 ubuntu系统安装opencv 1.下…

设计模式大全

使用设计模式的目的&#xff1a; 程序猿在编码的过程中面临着来自耦合性、内聚性、可维护性、可扩展性、重用性、灵活性等多方面的挑战。设计模式是为了让程序具有更好的&#xff1a; 1&#xff09;重用性&#xff0c;即相同功能的代码编写一次即可&#xff0c;不用重复编写 …

史上最全Hadoop面试题:尼恩大数据面试宝典专题1

说在前面&#xff1a; 《尼恩 大数据 面试宝典》 是 《尼恩Java面试宝典》 姊妹篇。 这里特别说明一下&#xff1a;《尼恩Java面试宝典》41个专题 PDF &#xff08;请在文末获取&#xff09;自发布以来&#xff0c; 已经收集了 好几千题&#xff0c; 足足4000多页&#xff0c…

haproxy

haproxy haproxy一&#xff1a;常见的Web集群调度器1.软件2.硬件3.LVS &#xff0c;Nginx &#xff0c;Haproxy 的区别&#xff1a; 二&#xff1a;Haproxy应用分析1.HAProxy的主要特性有&#xff1a;2.HAProxy负载均衡策略非常多&#xff0c;常见的有如下8种&#xff1a; 三&a…

【深度学习】YOLOv8训练过程,YOLOv8实战教程,目标检测任务SOTA,关键点回归

文章目录 可用资源资源安装模型训练&#xff08;检测&#xff09;模型pridict模型导出 可用资源 https://github.com/ultralytics/ultralytics 官方教程&#xff1a;https://docs.ultralytics.com/modes/train/ 资源安装 更建议下载代码后使用 下面指令安装&#xff0c;这样…

C高级 day37

1、编写一个名为myfirstshell.sh的脚本&#xff0c;它包括以下内容。 1、包含一段注释&#xff0c;列出您的姓名、脚本的名称和编写这个脚本的目的 2、和当前用户说“hello 用户名” 3、显示您的机器名 hostname 4、显示上一级目录中的所有文件的列表 5、显示变量PATH和HOME的值…

uniapp实现应用wgt资源热更新

APP更新一般有两种形式 1、整包更新&#xff0c;通过hbuliderx提供的在线云打包就属于整包更新&#xff0c;属于全量更新&#xff0c;缺点就是打包时间长、要重新走市场审核。费时 2、wgt资源包热更新&#xff0c;通过hbuliderx打wgt包 &#xff0c;速度快&#xff0c;能在应用…

28.vite

目录 1 一些概念 1.1 单页面应用程序SPA 1.2 vite 2 初始化vite项目 3 项目中的文件 1 一些概念 1.1 单页面应用程序SPA 单页面应用程序是只有一个页面的前端&#xff0c;切换页面通过前端路由来切换 特点如下 实现了前后端分离&#xff0c;后端仅出接口&#…

域名解析详解

域名解析 记录类型&#xff1a; 提示&#xff1a; 将域名指向云服务器&#xff0c;选择 A&#xff1b; 将域名指向另一个域名&#xff0c;选择 CNAME&#xff1b; 建立邮箱选择 MX&#xff0c;根据邮箱服务商提供的 MX 记录填写。 记录类型解释A用来指定域名的 IPv4 地址&…