You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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')
...  # 其余代码与上述正常代码一致

解决方案尝试方向

  1. 版本兼容性检查

    • 升级SeleniumBase到最新稳定版,或降级Chrome浏览器到更新前的版本,确保UC模式与当前Chrome版本匹配。
  2. 调整UC模式启动参数

    • 关闭incognito模式测试,部分网站对无痕窗口的反爬检测更严格:
      driver = sbDriver(uc_cdp=True, incognito=False)
      
    • 改用uc=True代替uc_cdp=True,不同的UC启动模式绕过检测的效果可能不同:
      driver = sbDriver(uc=True, incognito=True)
      
  3. 优化等待逻辑

    • 延长超时时间,将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')
      
  4. 添加反检测CDP命令
    在启动driver后注入脚本隐藏webdriver属性:

    driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
        "source": """
            Object.defineProperty(navigator, 'webdriver', {
                get: () => undefined
            })
        """
    })
    

内容的提问来源于stack exchange,提问作者johnv929

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 22:40:07