Selenium自动化中Windows身份验证弹窗问题
Chrome身份验证弹窗Selenium C#处理方案
1. 用Chrome扩展注入认证头
编写一个极简Chrome扩展,在请求时自动添加Authorization头,绕过系统认证弹窗:
- 新建扩展文件夹,创建
manifest.json:{ "manifest_version": 3, "name": "Auth Inject", "version": "1.0", "permissions": ["webRequest", "webRequestBlocking", "<all_urls>"], "background": { "service_worker": "background.js" } } - 同目录创建
background.js:chrome.webRequest.onBeforeSendHeaders.addListener( details => { const auth = "Basic " + btoa("你的用户名:你的密码"); details.requestHeaders.push({name: "Authorization", value: auth}); return {requestHeaders: details.requestHeaders}; }, {urls: ["https://目标域名.com/*"]}, ["blocking", "requestHeaders"] ); - C#代码中加载该扩展:
ChromeOptions options = new ChromeOptions(); options.AddExtension(@"扩展文件夹的绝对路径"); IWebDriver driver = new ChromeDriver(options); driver.Navigate().GoToUrl("https://目标域名.com");
2. 通过Chrome DevTools Protocol(CDP)注入头
Selenium 4及以上版本支持直接调用CDP接口,导航前注入认证信息:
var driver = new ChromeDriver(); var cdpSession = ((IDevTools)driver).CreateDevToolsSession(); var authHeader = Convert.ToBase64String(Encoding.ASCII.GetBytes("你的用户名:你的密码")); var headers = new Dictionary<string, object> { {"Authorization", $"Basic {authHeader}"} }; cdpSession.Network.SetExtraHTTPHeaders(new Network.SetExtraHTTPHeadersCommandSettings { Headers = headers }); driver.Navigate().GoToUrl("https://目标域名.com");
3. 调用Windows API模拟弹窗输入
如果上述方法无效,直接用C#调用系统API定位弹窗并输入:
using System; using System.Runtime.InteropServices; using System.Threading; public class AuthPopupHandler { [DllImport("user32.dll", SetLastError = true)] private static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll")] private static extern bool SetForegroundWindow(IntPtr hWnd); [DllImport("user32.dll", CharSet = CharSet.Auto)] private static extern void SendKeys(IntPtr hWnd, string keys); public static void FillAuthPopup() { // 弹窗标题根据实际情况修改,比如"Windows Security"或"身份验证" IntPtr popupHandle = FindWindow(null, "Windows Security"); if (popupHandle != IntPtr.Zero) { SetForegroundWindow(popupHandle); Thread.Sleep(500); SendKeys(popupHandle, "你的用户名{TAB}你的密码{ENTER}"); } } } // 脚本中调用: driver.Navigate().GoToUrl("https://目标域名.com"); AuthPopupHandler.FillAuthPopup();
内容的提问来源于stack exchange,提问作者Sahil Bansal
相关产品推荐
相关产品推荐

