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

如何让Selenium Python脚本等待资源加载完成?

Selenium Python UI测试页面加载等待问题解决方案

问题场景

我用Selenium Python编写UI测试用例时遇到页面加载等待问题:

  • 调用login()后主页加载耗时,但脚本不会等待直接执行后续代码
  • 调用open_list_page()后,未等ListPage加载完成就执行open_create_list_page(),导致脚本失败
  • 已尝试driver.implicitly_wait(30)和driver.set_page_load_timeout(20),均无效

相关代码如下:

test_list.py

def test_create_list(self):
   login() #登录后主页加载需要时间,该方法位于conftest.py文件中
   list_page = ListPage(self.driver).open_list_page()
   builder_page = list_page.open_create_list_page()

list_page.py(POM)

def open_list_page(self):
    self.driver.get("some url")
    return ListPage(self.driver)

create_list_page.py

def open_create_list_page(self):
    self.ele.click() #点击后跳转到另一页面
    return BuilderPage(self.driver)

解决方法

1. 显式等待(优先推荐)

针对页面的关键标志性元素做等待,确保元素加载完成后再执行后续操作,这是应对异步加载页面最可靠的方式。

示例1:在测试用例中添加关键元素等待

修改test_create_list方法,在关键步骤后等待页面核心元素:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

def test_create_list(self):
   login()
   # 等待主页标志性元素加载完成(比如主页导航栏)
   WebDriverWait(self.driver, 30).until(
       EC.presence_of_element_located((By.ID, "main-nav-bar"))
   )
   list_page = ListPage(self.driver).open_list_page()
   # 等待ListPage的核心元素加载
   WebDriverWait(self.driver, 30).until(
       EC.visibility_of_element_located((By.CSS_SELECTOR, ".list-container"))
   )
   builder_page = list_page.open_create_list_page()

示例2:把等待逻辑封装到POM页面类中

更符合POM设计原则,将页面加载的等待逻辑内嵌到对应页面方法里:
修改list_page.py:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

def open_list_page(self):
    self.driver.get("some url")
    # 等待ListPage页面核心元素加载(比如列表标题)
    WebDriverWait(self.driver, 30).until(
        EC.visibility_of_element_located((By.XPATH, "//h1[text()='我的列表']"))
    )
    return ListPage(self.driver)

修改create_list_page.py:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

def open_create_list_page(self):
    self.ele.click()
    # 等待BuilderPage的核心元素加载(比如构建表单)
    WebDriverWait(self.driver, 30).until(
        EC.presence_of_element_located((By.ID, "list-builder-form"))
    )
    return BuilderPage(self.driver)

2. 等待页面document ready状态

通过执行JavaScript判断页面的document是否处于ready状态,适合传统多页应用:

def wait_for_page_ready(driver, timeout=30):
    WebDriverWait(driver, timeout).until(
        lambda d: d.execute_script('return document.readyState') == 'complete'
    )

# 使用示例:在login()后调用
login()
wait_for_page_ready(self.driver)

3. 结合隐式等待和显式等待

隐式等待是全局元素查找超时设置,适合常规场景,但遇到异步加载页面时,必须配合显式等待针对关键元素做精准等待,不要单独依赖隐式等待。

为什么之前的方法无效?

  • driver.implicitly_wait():仅设置元素查找的超时时间,不会等待页面整体加载完成,尤其是异步渲染的内容
  • driver.set_page_load_timeout():只等待浏览器的load事件触发,但很多单页应用(SPA)的内容是通过AJAX异步加载的,load事件完成后内容还未渲染,因此该设置无效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 09:57:42