Selenium结合Tor代理火狐点击Show more按钮报TimeoutException如何解决
问题根因
你的报错触发在等待cookie同意按钮可见的代码行,Tor网络延迟普遍较高,再加上你观察到的弹窗半透明加载异常,按钮12秒内没有达到完全可见的状态,WebDriverWait超时直接抛出异常。另外你提供的代码还有2处隐含问题:
- 缺少必要的模块导入:
time、By、expected_conditions都没有导入,运行时也会触发报错 - Show more点击逻辑没有处理元素过期问题:首次点击后页面刷新,之前获取的元素引用会失效,后续操作容易触发
StaleElementReferenceException
修复方案
1. 补充缺少的导入项
在自动点击代码最顶部加入以下导入:
import time from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC
2. 优化cookie弹窗处理逻辑
不强制等待按钮可见,改为判断元素存在后用JS点击,绕过可见性限制,就算弹窗半透明也能正常触发点击:
# 处理cookie弹窗,最多等5秒,找不到就跳过 try: cookie_btn = WebDriverWait(driver, 5).until( EC.presence_of_element_located((By.CSS_SELECTOR, "button#onetrust-accept-btn-handler")) ) # 用JS点击绕过可见性要求 driver.execute_script("arguments[0].click();", cookie_btn) time.sleep(1) except: # 弹窗没加载出来直接跳过,不阻塞后续逻辑 pass
3. 重写Show more点击逻辑
每次循环都重新获取最新的按钮元素,用显示等待代替固定等待,提升稳定性:
while True: try: # 等待Show more按钮加载出来 show_more = WebDriverWait(driver, 8).until( EC.element_to_be_clickable((By.CSS_SELECTOR, 'a.event__more.event__more--static')) ) # 滚动到按钮位置 driver.execute_script("arguments[0].scrollIntoView();", show_more) time.sleep(0.5) # JS点击,避免被遮罩阻挡 driver.execute_script("arguments[0].click();", show_more) # 等待新内容加载完成 time.sleep(3) except: # 找不到按钮就退出循环 break
可选优化
如果Tor网络延迟波动大,可以把WebDriverWait的超时时间从12秒调整到15-20秒,进一步降低超时概率。
内容的提问来源于stack exchange,提问作者Erling Olsen
相关产品推荐
相关产品推荐

