Python Selenium项目遇TimeoutException报错求助
排查Selenium无头模式下TimeoutException的常见原因及修复方案
先看你代码里的明显问题
你先调用了driver.find_elements(By.XPATH, "//div[@class = 'item-summary']"),紧接着又用WebDriverWait等待单个元素,这两步完全重复——find_elements会立即执行,若元素未加载完成只会返回空列表,完全没必要提前执行,直接用等待逻辑即可。
无头模式的坑(最可能触发超时的原因)
无头Chrome默认窗口尺寸极小,很多页面会因窗口过小切换到移动端布局,导致你用的XPATH定位不到目标元素;另外无头模式容易被网站识别为爬虫,限制资源加载。解决办法:
- 强制设置正常窗口大小
- 添加模拟普通浏览器的参数
等待条件的优化选择
你用的EC.presence_of_element_located仅判断元素在DOM中存在,但元素可能还处于隐藏、未渲染完成状态,这种情况换成EC.visibility_of_element_located更靠谱,它会等元素可见后再返回结果。
其他排查方向
- ChromeDriver版本不匹配:确保ChromeDriver版本和本地安装的Chrome浏览器版本完全一致,版本不兼容会引发各种奇怪的超时问题。
- XPATH准确性:关闭无头模式,手动打开页面,用浏览器开发者工具检查目标元素的XPATH是否准确,有没有class拼写错误、页面结构变化的情况。
- 页面动态加载:如果目标元素是AJAX异步加载的,可能需要延长等待时间,或者先等待页面加载完成的标志(比如加载动画消失)。
修改后的代码示例
from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By options = Options() options.headless = True # 添加无头模式必要参数 options.add_argument("--window-size=1920,1080") # 设置正常窗口大小 options.add_argument("--disable-gpu") options.add_argument("--no-sandbox") options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36") service_ = Service(executable_path='C:/Users/Downloads/chromedriver_win32/chromedriver.exe') driver = webdriver.Chrome(service=service_, options=options) wait = WebDriverWait(driver, 30) driver.get(url_2) # 等待元素可见,而非仅存在于DOM manga_1 = wait.until(EC.visibility_of_element_located((By.XPATH, "//div[@class='item-summary']")))
快速排查步骤
- 临时注释掉
options.headless = True,手动运行代码,确认页面是否能正常加载、目标元素是否存在。 - 在
driver.get(url_2)后添加print(driver.page_source),打印页面源码,搜索item-summary是否存在,验证页面是否真的加载了目标内容。
内容的提问来源于stack exchange,提问作者Soumya Das
相关产品推荐
相关产品推荐

