如何使用 Selenium CDP 等待请求完成

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

我想在java中使用CDP(或任何其他方式)在Selenium中动态等待,直到完全满足特定请求。通常,我会使用 FluentWait 等待在页面上看到特定元素,但这些请求对 UI 本身没有直接影响。相反,它们是在用户界面中单击时使用的。问题是,在自动化中,硒通常在找到元素(例如徽标)后继续单击,并且由于这些请求未完全加载,因此由于未完成请求,因此不会在其中显示任何数据。

我想使用 CDP 及其 addListener,但不知道如何正确过滤要等待的请求并为其提供条件等待状态,例如200.对此有什么帮助吗?谢谢你:)

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

我会避免尝试使用 Selenium 4 方法来访问 CDP,因为我已经看到了性能问题。

相反,我建议使用 https://mvnrepository.com/artifact/com.github.kklisura.cdt/cdt-java-client

您最初需要使用实例化 WebDriver 的

getCapabilities
来获取 CDP 端口。有一个名为
"goog:chromeOptions"
的功能,其中有一个名为
"debuggerAddress"
的属性。

https://github.com/kklisura/chrome-devtools-java-client 将解释如何使用此地址连接到 CDP。

有了这个,你应该能够使用

Network
域(https://chromedevtools.github.io/devtools-protocol/tot/Network/)来监听 3 个事件:

  • onRequestWillBeSent
  • 收到响应时
  • 响应失败

每个事件都会提供一个独特的

requestId
,您可以使用它来创建某种机制来跟踪请求的发出和完成时间。

这样的机制可以是一个

Set<String>
,当
Set
为空时,您可以将其视为“所有请求已完成”。

所有这些事件在 Chrome 端都是“即发即忘”,因此不会影响测试中应用程序的感知性能。

如何实现取决于您当前的框架和 AUT。

例如,

onRequestWillBeSent
提供对 URL 的访问,因此您可以根据该 URL 进行过滤并忽略您不关心的请求。

此外,根据您的 AUT,如果在请求仍在进行时发生导航,您可能会遇到“挂起”请求。为了解决这个问题,您还可以从

onFrameNavigated
域订阅
Page
,并使用此事件清除
Set

© www.soinside.com 2019 - 2024. All rights reserved.