页面加载与元素等待超时设置等操作
Selenium 稳定性的 核心专题:80% 的"偶发失败"都来自等待问题。本页提供三种等待机制的实时演示,可手动设置秒数对比效果。
三层超时配置:
driver.set_page_load_timeout(30) → 页面 load 事件最多等 30s,超时抛 TimeoutExceptiondriver.set_script_timeout(10) → JS 脚本执行最多等 10sdriver.implicitly_wait(5) → 全局生效,所有 find_element 最多等 5s三种等待对比(面试必问):
time.sleep(t) → 强制睡 t 秒,不管元素出没出现,不推荐(不稳定且慢)implicitly_wait(t) → 全局隐式等待,元素出现立即返回。陷阱:和显式混用时会"加长"显式超时WebDriverWait(driver, t).until(EC.presence_of(...)) → 显式等待,每个场景单独设超时 + 轮询条件implicitly_wait / set_page_load_timeout / WebDriverWait.until / expected_conditions
# 快速参考 from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver.set_page_load_timeout(15) element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "target")) )
driver.implicitly_wait(10) 全局设置,验证 find_element 在元素延迟出现时会自动等待最多 10 秒set_page_load_timeout(15) 限制 get() 整体加载时长,超时抛出 TimeoutExceptionWebDriverWait(driver, 10).until(EC.presence_of_element_located(...)) 等待异步元素出现;拓展使用 element_to_be_clickable 等待按钮可点击
操作步骤:
① 启动后立即设置 driver.implicitly_wait(10) 隐式等待;
② 设置 driver.set_page_load_timeout(15) 页面加载超时;
③ 打开本练习页,用 driver.execute_script() 触发异步加载,再用 WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "async_target"))) 显式等待;
④ 验证超时行为(可选)。
#async_target)
⚠️ 隐式等待和显式等待不要混用,可能导致不可预期的等待时长。
# 练习 9 参考答案 import os from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome() # ① 隐式等待(显式等待场景下通常不设置,这里仅演示) driver.implicitly_wait(10) # ② 页面加载超时 driver.set_page_load_timeout(15) # ③ 打开本练习页面(async_target 元素在这个页面里) # 把下面路径换成你本机 browser_op_practice.html 的绝对路径 practice_html = "file:///" + os.path.abspath("./browser_op_practice.html").replace("\\", "/") driver.get(practice_html) # ④ 用 JS 触发异步加载(3 秒后才把 #async_target 插入 DOM) driver.execute_script(""" setTimeout(function(){ var d = document.createElement('div'); d.id = 'async_target'; d.textContent = '异步元素已加载'; d.style.cssText = 'padding:12px;background:#8b5cf6;color:white;border-radius:8px;font-weight:600;'; document.body.appendChild(d); }, 3000); """) # ⑤ 显式等待:等待 #async_target 出现(WebDriverWait 推荐方式) try: element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "async_target")) ) print("✅ 显式等待成功:#async_target 已出现") except Exception as e: print("❌ 显式等待超时:" + str(e)) # (可选)等待元素可见 + 可点击 try: visible_el = WebDriverWait(driver, 5).until( EC.visibility_of_element_located((By.ID, "async_target")) ) assert visible_el.is_displayed(), "元素不可见" print("✅ visibility_of_element_located 通过") except Exception as e: print("❌ 可见性等待超时:" + str(e)) driver.quit() print("✅ 练习 9 所有断言通过!")