Selenium BIDI - 读取从网络应用程序发送的特定请求

问题描述 投票:0回答:2

我需要捕获从 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-webdriver request google-chrome-devtools
2个回答
0
投票

在 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();

0
投票

在 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);
    }
© www.soinside.com 2019 - 2024. All rights reserved.