You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Selenium判断UI端所有请求已完成?

用Selenium结合CDP监控指定URL请求完成状态

CDP(Chrome DevTools Protocol)完全可以实现基于URL的请求响应监控,用来替代硬编码等待。核心思路是通过监听网络请求的生命周期事件,跟踪目标URL的请求是否全部完成。

实现步骤

  • 启用CDP的Network域,开启网络监控
  • 维护一个集合,记录正在进行的目标请求ID
  • 监听Network.requestWillBeSent事件,将匹配目标URL的请求ID加入集合
  • 监听Network.responseReceived或Network.loadingFailed事件,将对应请求ID从集合移除
  • 执行UI操作后,等待集合为空,即所有目标请求都已处理完毕

代码示例(Python)

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.chrome.options import Options

def wait_for_target_requests(driver, target_url_pattern, timeout=30):
    # 初始化请求跟踪集合
    pending_requests = set()

    def on_request_will_be_sent(params):
        request_url = params["request"]["url"]
        # 匹配目标URL,这里用包含匹配,可根据需求改成精确匹配
        if target_url_pattern in request_url:
            pending_requests.add(params["requestId"])

    def on_response_received(params):
        request_id = params["requestId"]
        if request_id in pending_requests:
            pending_requests.remove(request_id)

    def on_loading_failed(params):
        request_id = params["requestId"]
        if request_id in pending_requests:
            pending_requests.remove(request_id)

    # 启用CDP网络监控
    driver.execute_cdp_cmd("Network.enable", {})
    # 添加事件监听
    driver.add_cdp_listener("Network.requestWillBeSent", on_request_will_be_sent)
    driver.add_cdp_listener("Network.responseReceived", on_response_received)
    driver.add_cdp_listener("Network.loadingFailed", on_loading_failed)

    # 等待所有目标请求完成
    try:
        WebDriverWait(driver, timeout).until(lambda d: len(pending_requests) == 0)
    finally:
        # 清理监听和网络监控
        driver.remove_cdp_listener("Network.requestWillBeSent", on_request_will_be_sent)
        driver.remove_cdp_listener("Network.responseReceived", on_response_received)
        driver.remove_cdp_listener("Network.loadingFailed", on_loading_failed)
        driver.execute_cdp_cmd("Network.disable", {})

# 示例用法
if __name__ == "__main__":
    chrome_options = Options()
    chrome_options.add_argument("--headless=new")  # 可选,无头模式
    driver = webdriver.Chrome(options=chrome_options)

    driver.get("你的测试页面URL")

    # 执行UI操作,比如点击按钮触发请求
    driver.find_element("id", "trigger-button").click()

    # 等待所有包含"/api/data"的请求完成
    wait_for_target_requests(driver, "/api/data")

    # 执行后续操作
    print("所有目标请求已完成,开始后续操作")

    driver.quit()

注意事项

  • URL匹配规则可根据需求调整:比如精确匹配request_url == target_url,或者用正则表达式匹配更复杂的场景
  • 要处理请求失败的情况,避免集合中残留请求ID导致无限等待
  • 如果页面有持续的轮询请求,需要额外过滤掉这类不需要等待的请求
  • 不同浏览器的CDP支持略有差异,Chrome/Edge兼容性最好

内容的提问来源于stack exchange,提问作者Karcel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 16:22:36