Selenium如何获取浏览器网络请求中名为history的XHR文件
问题原因说明
你之前执行JS返回的history是浏览器原生window.history对象,用于控制页面前进后退、历史状态管理,和你在网络面板看到的名为history的XHR请求没有任何关联,自然拿不到对应文件内容。
解决方案
方案1:Selenium 4+ 内置DevTools API(优先推荐)
Selenium 4及以上版本内置了Chrome DevTools协议支持,可以直接监听网络请求、捕获响应内容,Java适配代码如下:
import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.devtools.DevTools; import org.openqa.selenium.devtools.v120.network.Network; import org.openqa.selenium.devtools.v120.network.model.Response; import java.util.Optional; // 初始化DevTools DevTools devTools = ((ChromeDriver) driver).getDevTools(); devTools.createSession(); // 启用网络监控 devTools.send(Network.enable(Optional.empty(), Optional.empty(), Optional.empty())); // 添加响应监听器 devTools.addListener(Network.responseReceived(), responseReceived -> { Response response = responseReceived.getResponse(); // 可根据实际请求的URL关键字、资源类型调整筛选规则 if (response.getUrl().contains("history") && response.getMimeType().contains("json")) { // 获取响应体 String responseBody = devTools.send(Network.getResponseBody(responseReceived.getRequestId())).getBody(); System.out.println("history请求的响应内容:" + responseBody); // 此处可直接将responseBody写入本地文件,得到你需要的资源 } }); // 监听器配置完成后,再执行刷新页面、触发请求的操作 driver.navigate().refresh();
注意事项:
- 代码中的
v120是DevTools协议版本,需和你使用的Chrome版本对应,替换为匹配的版本号即可 - 必须在触发
history请求的操作(刷新、点击对应功能按钮)之前启动监听器,否则无法捕获到已完成的请求
方案2:低版本Selenium兼容方案:代理捕获请求
如果你的Selenium版本低于4,无法使用DevTools,可以通过代理工具捕获请求:
- 启动BrowserMob Proxy代理服务
- 配置ChromeDriver启动参数,将浏览器代理指向刚启动的本地代理服务
- 在代理中添加请求拦截规则,筛选出URL匹配的
history请求,直接读取响应内容
方案3:非Selenium方案:直接模拟HTTP请求
XHR本质是标准HTTP请求,你可以直接模拟发送请求获取资源:
- 在浏览器网络面板右键该
history请求,选择「复制为cURL」 - 将cURL转换为Java的OkHttp/HttpClient请求代码
- 从Selenium的
driver.manage().getCookies()导出当前登录态的Cookies,带入请求头保证权限正常,不需要走浏览器也能拿到响应内容
内容的提问来源于stack exchange,提问作者mousekip
相关产品推荐
相关产品推荐

