如何在C#中使用Selenium发起无缓存的API请求?
解决Selenium发起API请求时的缓存问题
由于依赖双因素认证登录,你选择用Selenium导航API URL获取数据,但浏览器缓存导致无法同步最新数据,以下是几种可行的无缓存请求方案:
方案1:配置浏览器禁用缓存
直接在FirefoxOptions中设置禁用缓存的偏好,让浏览器默认不缓存请求:
var options = new FirefoxOptions(); // 禁用浏览器各类型缓存 options.SetPreference("browser.cache.disk.enable", false); options.SetPreference("browser.cache.memory.enable", false); options.SetPreference("browser.cache.offline.enable", false); options.SetPreference("network.http.use-cache", false); var driver = new FirefoxDriver(options); string url = "https://www.example.com"; Login(driver, url + "/login"); // 完成双因素认证登录 string getId = "1001"; string apiPath = url + "/api/get/" + getId; while (true) { driver.Navigate().GoToUrl(apiPath); DecodeData(driver.PageSource); // 解析响应数据 Thread.Sleep(1000); }
方案2:给API URL添加随机参数
每次请求时在URL末尾追加随机生成的查询参数(如时间戳、随机数),让浏览器认为是全新请求,绕过缓存:
var options = new FirefoxOptions(); var driver = new FirefoxDriver(options); string url = "https://www.example.com"; Login(driver, url + "/login"); string getId = "1001"; string apiBasePath = url + "/api/get/" + getId; while (true) { // 添加UTC时间戳作为随机参数 string apiPath = $"{apiBasePath}?t={DateTime.UtcNow.Ticks}"; driver.Navigate().GoToUrl(apiPath); DecodeData(driver.PageSource); Thread.Sleep(1000); }
方案3:用DevTools直接发送带缓存控制的请求(推荐)
利用Selenium的DevTools API直接发送HTTP请求,设置Cache-Control: no-cache头,无需导航到URL,更高效且能精准控制缓存:
var options = new FirefoxOptions(); var driver = new FirefoxDriver(options); string url = "https://www.example.com"; Login(driver, url + "/login"); // 初始化DevTools会话 var devTools = driver.CreateDevToolsSession(); await devTools.Network.EnableAsync(); string getId = "1001"; string apiPath = url + "/api/get/" + getId; while (true) { // 构造带缓存控制头的请求 var request = new Network.RequestWillBeSentPayload { Url = apiPath, Headers = new Dictionary<string, string> { {"Cache-Control", "no-cache"} } }; // 发送请求并获取响应体 var response = await devTools.Network.GetResponseBodyAsync(new Network.GetResponseBodyCommandSettings { RequestId = request.RequestId }); DecodeData(response.Body); Thread.Sleep(1000); }
注意:方案3需要确保你的Selenium版本支持DevTools API,且Firefox浏览器与驱动版本匹配。
内容的提问来源于stack exchange,提问作者Sharpeye
相关产品推荐
相关产品推荐

