如何让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
相关产品推荐
相关产品推荐

