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 对象是本地定义的。为了在这个匿名内部函数中使用它们,它必须是最终的或实际上是最终的。
我需要处理 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 对象是本地定义的。为了在这个匿名内部函数中使用它们,它必须是最终的或实际上是最终的。