如何使用selenium java获取浏览器网络调用响应?

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

在我的应用程序中,每个步骤都会生成 getImage API 调用,我想在每个步骤中获取该 API 调用的预览。 我尝试了下面的代码,但它给出了启动网站后生成的调用。

public void seleniumTest() throws InterruptedException {
        driver = new ChromeDriver();
        DevTools devTools = driver.getDevTools();
        devTools.createSession();
        devTools.send(Network.enable(Optional.empty(), Optional.empty(), Optional.empty()));
        devTools.addListener(Network.requestWillBeSent(), requestConsumer -> {
            Request request = requestConsumer.getRequest();
            System.out.println(request.getUrl());

        });
        devTools.addListener(Network.responseReceived(), responseConsumer -> {
            Response response = responseConsumer.getResponse();
            System.out.println(response.getStatus() + " " + response.getUrl());
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        });

        driver.get("https://stagedesigner.artifi.net//APIDesigner?personalization=d2Vic2l0ZUlkPTE0NSZ3ZWJBcGlDbGllbnRLZXk9NWFiNjczNzYtNTU1NS00YzMwLWE3ODAtNThiODQyNWE2MmY2JnByb2R1Y3RDb2RlPUFVVE8xJnVzZXJJZD11bmRlZmluZWQ");
    }

https://i.imgur.com/QO1eJk3.png

java selenium-webdriver selenium-chromedriver google-chrome-devtools selenium4
1个回答
0
投票

要捕获网络响应,特别是对于 Selenium 测试中的 getImage 等特定 API 调用,您可以通过 Selenium 的 DevTools 界面使用 Chrome DevTools Protocol (CDP),从而走上正确的道路。但是,在您的方法中需要进行一些调整和注意事项,以确保您在所需的时间捕获网络响应。

您当前的实现为 requestWillBeSent 和 responseReceived 事件设置了侦听器,但您希望捕获应用程序中不同步骤触发的特定 API 调用的响应。这是一种增强的方法:

public void seleniumTest() throws InterruptedException {
    driver = new ChromeDriver();
    DevTools devTools = driver.getDevTools();
    devTools.createSession();
    devTools.send(Network.enable(Optional.empty(), Optional.empty(), Optional.empty()));

    devTools.addListener(Network.responseReceived(), responseConsumer -> {
        Response response = responseConsumer.getResponse();
        // Filter for specific API calls, e.g., getImage
        if (response.getUrl().contains("getImage")) {
            System.out.println("getImage call: " + response.getStatus() + " " + response.getUrl());
            // Optional: Fetch response body here if needed
        }
    });

    driver.get("https://stagedesigner.artifi.net/APIDesigner?...");

    // Perform steps in your application and wait for necessary conditions
    // For example, clicking a button or waiting for an element
    // Ensure you wait for the network calls to complete after each step
}

// Optionally, you can add a method to fetch the response body
private String getResponseBody(String requestId) {
    // Implement fetching of response body using requestId
}
© www.soinside.com 2019 - 2024. All rights reserved.