如何在Selenium中无需等待当前请求响应切换driver标签页
Selenium无需等待页面加载完成直接切换标签页实现方案
核心实现逻辑是修改Selenium默认的页面加载策略,无需等待整个页面资源加载完成即可结束driver.get()的阻塞,立刻执行后续的新建标签页、切换操作。
具体实现步骤
1. 修改页面加载策略
Selenium默认的normal加载策略会等待页面所有静态资源、DOM完全加载完成才会结束driver.get()的执行,首先需要调整加载策略:
from selenium import webdriver from selenium.webdriver.chrome.options import Options chrome_options = Options() # 可选两种加载策略,根据你的需求选择: # 方案1:none,只要浏览器发出请求就立刻返回get方法,完全不等待任何加载动作,最节省时间 chrome_options.page_load_strategy = 'none' # 方案2:eager,等待DOM基础结构渲染完成就返回,不用等图片、样式等资源加载,适合需要基础DOM的场景 # chrome_options.page_load_strategy = 'eager' driver = webdriver.Chrome(options=chrome_options)
2. 触发请求后立刻新建切换标签页
# 触发目标页面请求,因为修改了加载策略,这里不会等待10秒加载,执行完立刻走下一步 driver.get("https://test.com") # 保存当前标签页的句柄,后续回来解析数据需要用到 origin_tab = driver.current_window_handle # 新建空白标签页 driver.execute_script("window.open('');") # 定位新标签页的句柄并切换 new_tab = [handle for handle in driver.window_handles if handle != origin_tab][0] driver.switch_to.window(new_tab) # 这里可以直接在新标签页执行其他爬取操作,不会受旧标签页加载的影响 driver.get("https://test.com/other-page")
3. 后续返回旧标签页解析数据
等你需要读取最早触发的页面数据时,再切回旧标签页,通过显式等待定位你需要的元素即可:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By # 切回原始标签页 driver.switch_to.window(origin_tab) # 显式等待你需要的目标元素出现,最多等待15秒,可根据实际情况调整 try: target_element = WebDriverWait(driver, 15).until( EC.presence_of_element_located((By.CSS_SELECTOR, "你需要解析的元素选择器")) ) # 正常解析元素内容即可 print(target_element.text) except Exception as e: print("页面加载超时或元素不存在", e)
注意事项
- 使用
none策略时,刚执行完driver.get()不要直接操作当前页面元素,此时DOM还未渲染,大概率会抛出元素不存在的错误,操作元素前必须加显式等待 - 多标签页操作时一定要提前保存每个标签页的句柄,避免切换时定位错误页面
- 可以根据实际业务需要给显式等待加异常捕获,避免单个页面加载失败卡住整个爬取流程
内容的提问来源于stack exchange,提问作者waheed amir
相关产品推荐
相关产品推荐

