您现在的位置是:首页 > 技术教程 正文

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

admin 阅读: 2024-03-14
后台-插件-广告管理-内容页头部广告(手机)

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扩展的

  1. {
  2.    "version": "1.0.0",
  3.    "manifest_version": 2,
  4.    "name": "Chrome Fiddler",
  5.    "permissions": [
  6.    "proxy",
  7.    "tabs",
  8.    "unlimitedStorage",
  9.    "storage",
  10.    "<all_urls>",
  11.    "webRequest",
  12.    "webRequestBlocking"
  13.    ],
  14.    "background": {
  15.    "scripts": ["background.js"]
  16.    },
  17.    "minimum_chrome_version":"22.0.0"
  18.   }

background.js 是逻辑处理模块

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

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

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

  ·details.url 是api的接口

  函数的返回

  · {cancel:true} 拦截请求

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

  写selenium.chrome插件

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

  · Selenium.WebDriver

  1. /// <summary>
  2.   /// Add Fiddler extention
  3.   /// </summary>
  4.   /// <param name="options">Chrome options</param>
  5.   /// <param name="fiddlerOption">Proxy host</param>
  6.   public static void AddFiddler(this ChromeOptions options, FiddlerOption fiddlerOption)
  7.   {
  8.    var backgroundProxyJs = ReplaceTemplates(background_js, fiddlerOption);
  9.    if (!Directory.Exists("Plugins"))
  10.    Directory.CreateDirectory("Plugins");
  11.    var guid = Guid.NewGuid().ToString();
  12.    var manifestPath = $"Plugins/manifest_{guid}.json";
  13.    var backgroundPath = $"Plugins/background_{guid}.js";
  14.    var archiveFilePath = $"Plugins/proxy_auth_plugin_{guid}.zip";
  15.    File.WriteAllText(manifestPath, manifest_json);
  16.    File.WriteAllText(backgroundPath, backgroundProxyJs);
  17.    using (var zip = ZipFile.Open(archiveFilePath, ZipArchiveMode.Create))
  18.    {
  19.    zip.CreateEntryFromFile(manifestPath, "manifest.json");
  20.    zip.CreateEntryFromFile(backgroundPath, "background.js");
  21.    }
  22.    File.Delete(manifestPath);
  23.    File.Delete(backgroundPath);
  24.    options.AddExtension(archiveFilePath);
  25.   }
  26.   private static string ReplaceTemplates(string str, FiddlerOption fiddlerOption)
  27.   {
  28.    if (fiddlerOption.OnBeforeRequestOptions != null)
  29.    {
  30.    var beforeConfigs = Newtonsoft.Json.JsonConvert.SerializeObject(fiddlerOption.OnBeforeRequestOptions);
  31.    str = str.Replace("{before_configs}", beforeConfigs);
  32.    }
  33.    return str;
  34.   }

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

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

  使用方法

  1. var driverBinary = @"D:\soft\chrome\chrome2\Chrome-bin\";
  2.   ChromeOptions options = new ChromeOptions
  3.   {
  4.    BinaryLocation = Path.Combine(driverBinary, "chrome.exe")
  5.   };
  6.   Environment.SetEnvironmentVariable("webdriver.chrome.driver", driverBinary);
  7.   options.AddArgument("--disable-blink-features=AutomationControlled");
  8.   options.AddArguments("--disable-infobars");
  9.   List<string> ls = new List<string> { "enable-automation" };
  10.   options.AddExcludedArguments(ls);
  11.   #region Fillder
  12.   options.AddFiddler(new FiddlerOption
  13.   {
  14.    OnBeforeRequestOptions = new List<FiddlerOnBeforeRequestOptions>
  15.    {
  16.    // 配置转发
  17.    new FiddlerOnBeforeRequestOptions
  18.    {
  19.    Match = "https://www.cnblogs.com/yudongdong/ajax/GetPostStat",//正则
  20.    RedirectUrl = "http://localhost:5000/GetPostStat",//如果匹配成功则将requestBody转发到这个url中去
  21.    Cancel = false//如果配置了cancel=true那么转发将无效,true的意思是直接拦截这次的请求,不去发送了
  22.    },
  23.    // 配置拦截
  24.    new FiddlerOnBeforeRequestOptions
  25.    {
  26.    Match = "https://www.cnblogs.com/yudongdong/ajax/blogStats",
  27.    Cancel = true//true的意思是直接拦截这次的请求,不去发送了
  28.    },
  29.    }
  30.   });
  31.   #endregion
  32.   var chrome = new ChromeDriver(driverBinary, options);

实现效果 

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你! 

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索