使用Selenium ChromeDriver实现网站自动化登录时的请求无响应问题
使用C# + Selenium ChromeDriver实现网站自动化登录测试,代码如下:
ChromeOptions options = new(); options.AddArgument("--incognito"); options.AddArgument("--start-maximized"); options.AddArgument("--disable-site-isolation-trials"); options.AddArgument("--disable-features=NetworkService,NetworkServiceInProcess"); //options.AddArgument("--allow-cross-origin-auth-prompt"); //options.AddArgument("--allow-reading-third-party-cookies"); //options.AddArgument("--allow-third-party-cookies"); ChromeDriver driver = new("./", options, TimeSpan.FromMinutes(10)); EventFiringWebDriver eventDriver = new(driver); driver.Manage().Timeouts().PageLoad = TimeSpan.FromMinutes(10); driver.Navigate().GoToUrl("https://xxxx.xx.xx"); //WebDriverWait wait = new(driver, TimeSpan.FromSeconds(1));
执行代码后页面成功跳转至目标URL,但输入登录凭证点击登录按钮后无响应,开发者面板显示每次点击都会发送https://xxxx.xx.xx/authprovider/webtoken请求,但无返回结果。
在常规Chrome浏览器、无痕模式、访客模式下测试均正常,正常请求会返回200状态码(来自Service Worker),并包含Bearer Token响应:
{ "access_token": "5a1e5347-49f8-4a3f-becf-da1f43079279", "expires_in": 4404, "message": "SUCESS", "refresh_token": "95f72d9f-694a-4953-8f18-c010500f1a64", "token_type": "bearer" }
1. 移除禁用NetworkService的参数
你当前配置的--disable-features=NetworkService,NetworkServiceInProcess会关闭Chrome的NetworkService组件,而正常请求明确标注来自Service Worker,该参数会导致Service Worker无法正常工作。直接移除这一行:
ChromeOptions options = new(); options.AddArgument("--incognito"); options.AddArgument("--start-maximized"); options.AddArgument("--disable-site-isolation-trials"); // 移除禁用NetworkService的配置 //options.AddArgument("--disable-features=NetworkService,NetworkServiceInProcess");
2. 启用第三方Cookie相关权限
自动化环境下的Chrome默认权限限制比手动操作更严格,取消注释相关参数,确保跨域Cookie和授权提示正常:
options.AddArgument("--allow-cross-origin-auth-prompt"); options.AddArgument("--allow-reading-third-party-cookies"); options.AddArgument("--allow-third-party-cookies");
3. 强制启用Service Worker
添加参数确保Service Worker能正常注册和运行:
options.AddArgument("--enable-service-workers"); options.AddArgument("--no-service-worker-scheme-blacklist");
4. 模拟真实浏览器的User-Agent
部分网站会通过User-Agent检测自动化工具,复制你本地Chrome的真实User-Agent(在浏览器控制台输入navigator.userAgent获取),添加到配置中:
// 替换为你的真实Chrome User-Agent options.AddArgument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36");
5. 等待Service Worker初始化完成
页面加载完成不代表Service Worker已就绪,添加显式等待逻辑:
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); // 先等待登录按钮显示,确保页面DOM加载完成 wait.Until(d => d.FindElement(By.Id("login-btn")).Displayed); // 再等待Service Worker注册完成 bool serviceWorkerReady = (bool)((IJavaScriptExecutor)driver).ExecuteScript(@" return navigator.serviceWorker.controller !== null; "); if (!serviceWorkerReady) { Thread.Sleep(2000); }
6. 检查ChromeDriver与Chrome版本匹配
确保ChromeDriver的主版本号和本地安装的Chrome完全一致,版本不匹配会引发各类兼容性问题,包括网络请求异常。
7. 临时关闭无痕模式测试
自动化的无痕环境和手动操作的无痕环境可能存在差异,暂时移除--incognito参数,测试是否能正常登录:
//options.AddArgument("--incognito");
内容的提问来源于stack exchange,提问作者Snow Arctic

