使用Selenium C#脚本时hello.myfonts.net加载超时问题求助
我之前碰到过好几个类似的场景,都是WebDriver的浏览器沙盒/默认配置和手动浏览环境差异导致的,给你整理几个靠谱的解决办法:
解决方案
1. 直接拦截目标域名的请求(最推荐)
这个myfonts的链接看起来是个统计/计数类请求,完全不影响页面核心功能,直接拦截它就能彻底解决卡加载的问题。
Chrome驱动实现
用Chrome的DevTools协议来拦截特定域名的请求,C#代码示例:
var options = new ChromeOptions(); var driver = new ChromeDriver(options); var devTools = driver.CreateDevToolsSession(); await devTools.Network.Enable(new EnableCommandSettings()); // 拦截hello.myfonts.net下的所有请求 await devTools.Network.SetBlockedUrls(new SetBlockedUrlsCommandSettings { Urls = new List<string> { "*://hello.myfonts.net/*" } }); // 正常导航到被测页面 driver.Navigate().GoToUrl("你的被测页面URL");
Firefox驱动实现
可以通过设置Firefox偏好来实现拦截,简单直接:
var options = new FirefoxOptions(); // 开启请求拦截,并将目标域名加入黑名单 options.SetPreference("network.http.blocking.enabled", true); options.SetPreference("network.http.blocking.blacklist", "hello.myfonts.net"); var driver = new FirefoxDriver(options); driver.Navigate().GoToUrl("你的被测页面URL");
2. 调整页面加载策略
默认的页面加载策略是normal,会等待所有资源加载完成才继续执行脚本。改成eager或none,让脚本在DOM结构加载完成后就继续,不用等这个卡住的资源。
C#代码示例(Chrome/Firefox通用逻辑):
var options = new ChromeOptions(); // Eager:等待DOM加载完成就继续;None:完全不等待页面加载,需手动控制等待逻辑 options.PageLoadStrategy = PageLoadStrategy.Eager; var driver = new ChromeDriver(options); driver.Navigate().GoToUrl("你的被测页面URL"); // 之后手动等待核心业务元素加载完成即可 new WebDriverWait(driver, TimeSpan.FromSeconds(10)).Until(d => d.FindElement(By.Id("核心元素ID")).Displayed);
3. 让WebDriver复用浏览器缓存
手动浏览时浏览器有缓存加持,而WebDriver默认每次启动都是干净的临时环境。可以配置让它使用持久化的用户数据目录,重复请求就会走缓存,避免卡加载。
Chrome示例:
var options = new ChromeOptions(); // 指定一个本地目录作为用户数据目录(提前创建好) options.AddArgument(@"user-data-dir=C:\SeleniumChromeProfile"); var driver = new ChromeDriver(options); driver.Navigate().GoToUrl("你的被测页面URL");
4. 注入JS提前阻止请求
在页面开始加载前,注入JavaScript来阻止目标链接的加载:
var driver = new ChromeDriver(); // 先注入拦截脚本 driver.ExecuteScript(@" window.addEventListener('beforeload', function(e) { var url = e.target.src || e.target.href; if (url && url.includes('hello.myfonts.net')) { e.preventDefault(); e.stopPropagation(); } }, true); "); // 再导航到被测页面 driver.Navigate().GoToUrl("你的被测页面URL");
补充说明
手动浏览正常的核心原因是:日常浏览器有缓存、可能装了广告拦截插件,或者网络节点已经缓存了这个资源;而WebDriver启动的是“纯净”的浏览器实例,没有这些配置,所以会卡在这个非核心请求上。
内容的提问来源于stack exchange,提问作者faisalk
相关产品推荐
相关产品推荐

