selenium 中的 ChromeDevTools,等待响应主体

ChromeDevTools in selenium, waiting for response bodies

我需要处理 ajax 响应,这是访问页面时收到的响应之一。我使用 selenium 开发工具和 java。我创建了一个侦听器,它拦截了一个特定的请求,然后我想处理它带来的响应。但是我需要设置静态等待,否则 selenium 没有时间保存 RequestId。我阅读了 Chrome Dev Tools 文档,但这对我来说是新事物。我想知道是否有一种方法可以让我等待这个调用完成,而不是静态等待。

这是我的代码:

    @Test(groups = "test")
    public void x() throws InterruptedException, JsonProcessingException {
        User user = User.builder();
        ManageAccountStep manageAccountStep = new ManageAccountStep(getDriver());
        DashboardPO dashboardPO = new DashboardPO(getDriver());
        manageAccountStep.login(user);
        DevTools devTools = ((HasDevTools) getDriver()).maybeGetDevTools().orElseThrow();
        devTools.createSessionIfThereIsNotOne();
        devTools.send(Network.enable(Optional.empty(), Optional.empty(), Optional.empty()));
        // end of boilerplate
        final RequestId[] id = new RequestId[1];
        devTools.addListener(Network.responseReceived(), response -> {
            log.info(response.getResponse().getUrl());
            if (response.getResponse().getUrl().contains(DESIRED_URL)){
                id[0] = response.getRequestId();
            }
        });
        dashboardPO
                .clickLink(); // here is when my DESIRED_URL happens 
        Utils.sleep(5000); // Something like Thread.sleep(5000)
        String responseBody = devTools.send(Network.getResponseBody(id[0])).getBody();
        // some operations on responseBody
        devTools.clearListeners();
        devTools.disconnectSession();
    }

如果我不使用 5 秒等待 id 变量永远不会被分配并且我出现空指针异常 requestId is required。在这 5 秒内,log.info 打印所有正在发生的 api 调用,它几乎总能找到我的 id。不过,我想避免静态等待。我正在考虑类似于 jQuery.active()==0 的内容,但我的页面不使用 jQuery。

您可以尝试自定义函数 Explicit Wait。像这样:

public String getResponseBody(WebDriver driver, DevTools devTools) {
    return new WebDriverWait(driver,5)
      .ignoring(NullPointerException.class)
      .until(driver -> 
      devTools.send(Network.getResponseBody(id[0])).getBody());
}

因此,它不会等待全部 5 秒。一旦它得到数据,它就会从 until 方法中出来。还要添加此处出现的任何异常。

已将这些代码行作为单独的方法,因为 devTools 对象是本地定义的。为了在这个匿名内部函数中使用它们,它必须是最终的或实际上是最终的。