如何使用Java版Selenium在Firefox中获取网络及端点信息
火狐(GeckoDriver)获取网络日志的实现方案
问题根因
Chrome的goog:loggingPrefs属于Chrome内核专属的能力配置,GeckoDriver不支持该参数,直接复用Chrome逻辑会导致参数解析失败,抛出你遇到的JSON异常。
实现步骤
- 优先使用Selenium 4.x版本,该版本内置对Firefox DevTools的原生支持,比Selenium 3.x的旧实现兼容性更好,注意确保Selenium版本、GeckoDriver版本、Firefox浏览器版本三者匹配
- 参考如下代码完成配置和日志采集:
import org.openqa.selenium.firefox.FirefoxOptions; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.devtools.DevTools; // 注意引入的DevTools API版本要和你使用的Firefox内核版本对应,示例为v123,可根据自己的浏览器版本调整 import org.openqa.selenium.devtools.v123.network.Network; import java.util.Optional; // 1. 配置Firefox启动参数 FirefoxOptions options = new FirefoxOptions(); // 开启网络、性能日志采集开关 options.addPreference("devtools.performance.enabled", true); options.addPreference("devtools.netmonitor.enabled", true); // 2. 初始化驱动和DevTools会话 FirefoxDriver driver = new FirefoxDriver(options); DevTools devTools = driver.getDevTools(); devTools.createSession(); // 3. 启用Network域监听 devTools.send(Network.enable(Optional.empty(), Optional.empty(), Optional.empty())); // 4. 监听所有请求事件,获取请求端点、方法、请求头、请求体等信息 devTools.addListener(Network.requestWillBeSent(), request -> { String endpointUrl = request.getRequest().getUrl(); String requestMethod = request.getRequest().getMethod(); // 可自行扩展逻辑存储、过滤需要的请求信息 System.out.println("请求地址:" + endpointUrl + " | 请求方法:" + requestMethod); }); // 5. 监听所有响应事件,获取响应状态、响应头、响应体等信息 devTools.addListener(Network.responseReceived(), response -> { String endpointUrl = response.getResponse().getUrl(); int responseStatus = response.getResponse().getStatus(); System.out.println("响应地址:" + endpointUrl + " | 响应状态:" + responseStatus); // 如需获取响应体可调用如下方法 // String responseBody = devTools.send(Network.getResponseBody(response.getRequestId())).getBody(); });
注意事项
- 启动驱动后要先开启DevTools监听再访问目标页面,避免请求遗漏
- 如果使用Selenium 3.x版本,需要额外配置
marionette相关参数并通过解析火狐的性能日志文件获取信息,稳定性较差,建议优先升级Selenium版本
内容的提问来源于stack exchange,提问作者user15415647
相关产品推荐
相关产品推荐

