我需要捕获从 Web 应用程序发出的一些特定请求。我们不想使用特定于 CDP 版本的 API - 可以使用特定于版本的 CDP 命令 - org.openqa.selenium.devtools.DevTools#addListener。
所以我们查看了 org.openqa.selenium.devtools.NetworkInterceptor :
webDriver = new Augmenter().augment(webDriver);
devTools = ((HasDevTools) webDriver).getDevTools();
devTools.createSession();
this.interceptor = new NetworkInterceptor(webDriver,
Route.matching(req -> (req.getUri().contains(URL) && req.getMethod().equals(HttpMethod.POST)))
.to(() -> req -> {
System.out.println("Hello redd DDD");
System.out.println("URI : " + req.getUri());
System.out.println(req.getMethod());
return new HttpResponse();
}));
但是我们不想删除响应,事实上我们正在寻找避免修改响应的方法。我们只需要获取请求并对其进行验证即可。
现在发生的事情:由于这些方法需要删除响应,因此网络应用程序状态被损坏并被注销。
是否有其他方法可以“读取发出的特定请求”。非常感谢您的帮助。
P.S:有没有办法在不修改响应的情况下使用 NetworkInterceptor。路由、处理程序和过滤器这三个构造函数都需要发回响应。我正在测试在我们的网络应用程序中发送的事件日志记录请求,并且只需要读取发出的请求。
在 Selenium java 中,您可以使用
Network.requestWillBeSent
访问发出的网络请求
Network.requestWillBeSent()是CDP中的一个事件,当即将发送网络请求时触发。此事件提供有关将要发送的请求的信息,包括请求 URL、标头、方法和请求正文。
完整代码
ChromeOptions options = new ChromeOptions();
options.setExperimentalOption("w3c", true);
ChromeDriver driver = new ChromeDriver(options);
DevTools devTools = driver.getDevTools();
devTools.createSession();
devTools.send(Network.enable(Optional.empty(), Optional.empty(), Optional.empty()));
devTools.addListener(Network.requestWillBeSent(), request -> {
String url = request.getRequest().getUrl();
System.out.println(url);
Headers headers = request.getRequest().getHeaders();
Stream.of(headers).forEach(head -> System.out.println(head.toString()));
String method = request.getRequest().getMethod();
System.out.println(method);
request.getRequest().getPostData();
});
driver.get("https://www.sample.com/");
//DO some actions
devTools.close();
driver.quit();
在 org.openqa.selenium.devtools.NetworkInterceptor 类中,您将找到一个名为 PROCEED_WITH_REQUEST 的静态字段。
此字段可以无缝地继续请求,而无需修改或操作响应。
请看下面的代码片段:
AtomicReference<String> uri = new AtomicReference<>();
AtomicReference<String> method = new AtomicReference<>();
try (NetworkInterceptor interceptor =
new NetworkInterceptor(
driver,
Route.matching(req -> req.getUri().endsWith("somePartialPath"))
.to(() -> req -> {
uri.set(req.getUri());
method.set(req.getMethod().name());
return NetworkInterceptor.PROCEED_WITH_REQUEST;
}))) {
driver.get("https://www.sample.com/");
System.out.println(uri);
System.out.println(method);
}