Chrome 130与Undetected Chromedriver、Python、Selenium超时异常问题
问题:使用SeleniumBase的sbDriver(UC模式)访问BetMGM网站时出现超时异常
更新chromedriver和UC相关组件后,运行代码时触发Timeout异常,报错信息如下:
Traceback (most recent call last): File "C:\Users\admin\OneDrive\PycharmProjects\webscrape\nba.py", line 157, in <module> mgm_data = mgm_scrape(Url, max_list_len) File "C:\Users\admin\OneDrive\PycharmProjects\webscrape\CommonFuns.py", line 407, in mgm_scrape WebDriverWait(driver, timeout).until(EC.presence_of_element_located((By.CLASS_NAME, "participant"))) File "C:\Users\admin\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\support\wait.py", line 105, in until raise TimeoutException(message, screen, stacktrace)
使用普通ChromeDriver时代码可正常运行,环境信息:
- OS:Win11
- selenium:4.16.0
- seleniumbase:4.22.1
- Python:3.9
- 目标地址:https://sports.ks.betmgm.com/en/sports/basketball-7/betting/usa-9
可正常运行的代码(仅初始化部分不同)
service = Service() options = webdriver.ChromeOptions() driver = webdriver.Chrome(service=service, options=options) # mgm only works with normal chrome webdriver # driver = sbDriver(uc_cdp=True, incognito=True) # driver.set_window_size(930, 930) # driver.get('https://nowsecure.nl') # time.sleep(20) # driver.save_screenshot('C:/Users/admin/Desktop/nowsecure.png') mgm_web = Url driver.get(mgm_web) sleep_time = 2.5 + (max_list_len / 40) time.sleep(sleep_time) # time.sleep(4) # ncaabb tourney sleep time to click button # try to click more button twice for long list lengths button_loops = int(max_list_len / 50) if max_list_len > 73: for i in range(button_loops): try: more_button = driver.find_element(By.CSS_SELECTOR, '#main-view > ms-widget-layout > ms-widget-slot > ms-composable-widget > ms-widget-slot > ms-tabbed-grid-widget > div > div') more_button.location_once_scrolled_into_view except NoSuchElementException: print("no mgm button") break else: time.sleep(2) more_button.click() time.sleep(3) # manage stale element errors timeout = sleep_time for i in range(4): try: WebDriverWait(driver, timeout).until(EC.presence_of_element_located((By.CLASS_NAME, "participant"))) mgm_team_name = driver.find_elements(By.CLASS_NAME, "participant") # WebDriverWait(driver, timeout).until(EC.presence_of_element_located((By.XPATH, # '//*[@id="main-view"]/ms-fixture-list/div/div/div/div/ms-grid/div/ms-event-group[1]/ms-six-pack-event[1]/div[2]/a/ms-event-detail/ms-event-name/ms-inline-tooltip/div/div[1]/div/div/div[1]/div'))) # mgm_team_name = driver.find_elements(By.XPATH, # '//*[@id="main-view"]/ms-fixture-list/div/div/div/div/ms-grid/div/ms-event-group[1]/ms-six-pack-event[1]/div[2]/a/ms-event-detail/ms-event-name/ms-inline-tooltip/div/div[1]/div/div/div[1]/div') for j in range(len(mgm_team_name)): mgm_team_name[j] = mgm_team_name[j].text print(mgm_team_name) print('mgm name stale element loops', i) break except (StaleElementReferenceException, NoSuchElementException, TimeoutException): continue
此前正常但现在失效的代码(仅初始化部分)
driver = sbDriver(uc_cdp=True, incognito=True) # driver.set_window_size(930, 930) # driver.get('https://nowsecure.nl') ... # 其余代码与上述正常代码一致
解决方案尝试方向
版本兼容性检查
- 升级SeleniumBase到最新稳定版,或降级Chrome浏览器到更新前的版本,确保UC模式与当前Chrome版本匹配。
调整UC模式启动参数
- 关闭incognito模式测试,部分网站对无痕窗口的反爬检测更严格:
driver = sbDriver(uc_cdp=True, incognito=False) - 改用
uc=True代替uc_cdp=True,不同的UC启动模式绕过检测的效果可能不同:driver = sbDriver(uc=True, incognito=True)
- 关闭incognito模式测试,部分网站对无痕窗口的反爬检测更严格:
优化等待逻辑
- 延长超时时间,将
timeout从sleep_time改为固定的15或20秒,UC模式下页面加载可能更慢:timeout = 20 # 替换原有的timeout = sleep_time - 更换等待条件为
visibility_of_element_located,确保元素可见而非仅存在:WebDriverWait(driver, timeout).until(EC.visibility_of_element_located((By.CLASS_NAME, "participant"))) - 增加页面加载完成等待,在
driver.get(mgm_web)后添加:WebDriverWait(driver, 20).until(lambda d: d.execute_script('return document.readyState') == 'complete')
- 延长超时时间,将
添加反检测CDP命令
在启动driver后注入脚本隐藏webdriver属性:driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", { "source": """ Object.defineProperty(navigator, 'webdriver', { get: () => undefined }) """ })
内容的提问来源于stack exchange,提问作者johnv929
相关产品推荐
相关产品推荐

