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

Selenium Chrome webdriver本地正常但Heroku部署后超时失败如何解决?

问题解决方案
  • 补充Chrome无头模式在Linux服务器的必要启动参数
    你当前只配置了基础的无头和窗口参数,Heroku容器环境下运行Chrome必须额外添加3个参数:--no-sandbox 关闭沙箱安全机制(容器环境无root权限运行Chrome必须开启)、--disable-dev-shm-usage 禁用/dev/shm临时文件(Heroku分配的共享内存空间极小,不关闭会导致页面渲染崩溃)、--disable-gpu 禁用GPU加速(服务器无图形环境下减少异常)。
  • 优化元素定位与点击逻辑
    你当前使用的全路径XPATH兼容性极差,只要页面DOM结构有细微调整就会定位失败,建议替换为相对XPATH、类名或ID定位;另外服务器环境下WebDriver的原生click经常因为视口、元素遮挡问题触发失败,可改为JS执行点击,兼容性更强。
  • 确认Chrome与Chromedriver版本匹配
    你本地使用的Chromedriver版本为94,需要确认Heroku上安装的Chrome浏览器版本是否同样为94:如果使用的是官方heroku-buildpack-google-chrome构建包,默认会安装最新稳定版,若近期自动升级了版本,和你代码里的v94 Chromedriver不匹配就会出现元素识别异常,你可以锁定构建包的Chrome版本和本地保持一致。

修正后代码示例

def __driver_setup(url):
    driver_path = './chromedriver'
    os.chmod(driver_path, 0o755)
    options = webdriver.ChromeOptions()
    # 原有基础配置
    options.add_argument("--headless")
    options.add_argument("window-size=1920,1080")
    # 新增Heroku环境必要参数
    options.add_argument("--no-sandbox")
    options.add_argument("--disable-dev-shm-usage")
    options.add_argument("--disable-gpu")
    # 可选添加参数:避免被目标网站识别为爬虫
    options.add_argument("--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36")

    driver = webdriver.Chrome(executable_path=driver_path, chrome_options=options)
    driver.get(url)

    delay = 40

    try:
        WebDriverWait(driver, delay).until(EC.presence_of_element_located(
            (By.CLASS_NAME, 'btn-lookup')))
    except TimeoutException:
        print('Timed out on profile list...')

    try:
        # 先定位元素,再用JS点击规避原生点击的兼容问题
        target_btn = WebDriverWait(driver, delay).until(EC.presence_of_element_located((By.XPATH, '//*[@id="blur-container"]//ul/li[1]/a')))
        driver.execute_script("arguments[0].click();", target_btn)
    except TimeoutException:
        print('Timed out on company details button click...')
        return None

    try:
        WebDriverWait(driver, delay).until(EC.presence_of_element_located((By.XPATH, '//*[@id="blur-container"]//div[1]/div[2]/a')))
        return driver.page_source
    except TimeoutException:
        print('Timed out on company details loading...')
        return None

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 03:00:03