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

在AWS Lambda中用Chromedriver下载文件至/tmp目录失败求助

问题:AWS Lambda中Chromedriver无法将文件下载到/tmp目录

需求场景

  • 目标:从Verra注册系统的VCS项目搜索页面自动下载文件到AWS Lambda的/tmp目录
  • 操作流程:
    1. 点击页面「Search」按钮
    2. 等待搜索结果加载完成
    3. 点击Excel图标触发文件下载

尝试过的无效下载目录配置

参考过两个相关技术问题的配置代码,均未成功将文件导向/tmp目录:

配置方案1

prefs = {
    "profile.default_content_settings.popups": 0,
    "download.default_directory": r"/tmp",
    "directory_upgrade": True
    }
options.add_experimental_option("prefs", prefs)

配置方案2

options = webdriver.ChromeOptions()
prefs = {"browser.downloads.dir": "//tmp//", "download.default_directory": "//tmp//", "directory_upgrade": True}
options.add_experimental_option("prefs", prefs)

本地正常但Lambda环境无效的完整代码

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.chrome.options import Options 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC
import time
import os
import requests 
import requests.auth
import json
import csv

def lambda_handler(event, context):
    
    # 切换工作目录到/tmp
    os.chdir('/tmp')
    
    # 配置Chrome无头浏览器选项
    options = Options()
    options.binary_location = '/opt/headless-chromium'
    options.add_argument('--headless')
    options.add_argument('--no-sandbox')
    options.add_argument('--single-process')
    options.add_argument('--disable-dev-shm-usage')
        
    # 设置下载目录为/tmp
    prefs = {
    "profile.default_content_settings.popups": 0,
    "download.default_directory": r"/tmp",
    "directory_upgrade": True
    }
    options.add_experimental_option("prefs", prefs)
    
    
    # 启动Chrome驱动
    driver = webdriver.Chrome('/opt/chromedriver',options=options)
    driver.maximize_window()
    driver.get('https://registry.verra.org/app/search/VCS/All%20Projects')


    # 等待页面核心元素加载(最长60秒)
    print("等待网站加载...")
    element1 = WebDriverWait(driver, 60).until(EC.presence_of_element_located((By.XPATH, '/html/body/apx-root/div/div/apx-search-page/div/apx-search-container/div/div[2]/div/div[1]/apx-search-selection-criteria/div/form/div[2]/div/button[1]')))
    print("网站加载完成!")

    # 点击搜索按钮触发结果查询
    search_btn = driver.find_element(By.XPATH, '/html/body/apx-root/div/div/apx-search-page/div/apx-search-container/div/div[2]/div/div[1]/apx-search-selection-criteria/div/form/div[2]/div/button[1]')
    search_btn.click()

    # 等待搜索结果加载(最长100秒,通过分页元素判断加载状态)
    element2 = WebDriverWait(driver, 100).until(EC.presence_of_element_located((By.XPATH, '/html/body/apx-root/div/div/apx-search-page/div/apx-search-container/div/div[2]/div/div[2]/apx-project-search-results/div/div/kendo-grid/kendo-pager/kendo-pager-numeric-buttons/ul/li[1]/a')))
    print("结果加载完成!")

    # 等待下载按钮加载完成(最长100秒)
    element = WebDriverWait(driver, 100).until(EC.presence_of_element_located((By.XPATH, '/html/body/apx-root/div/div/apx-search-page/div/apx-search-container/div/div[2]/div/div[2]/apx-project-search-results/div/apx-search-results-header/div/button[1]')))
    
    # 通过JS执行点击(规避元素不可点击的问题)
    driver.execute_script("arguments[0].click();", element)
    
    # 等待文件下载完成(固定等待60秒)
    time.sleep(60)
    
    
    # 检查/tmp目录下的文件列表
    file_list = os.listdir('/tmp')
    print("目录文件列表:", file_list)

    return {
        "statusCode": 200,
        "body": "Selenium无头Chrome已初始化"
    }

版本兼容性怀疑

代码仅在Python 3.7运行时环境下部分有效,各组件版本信息:

  • Selenium版本:3.8.0(Python 3.7环境)
  • Chromedriver版本:2.37(仅Python 3.9运行时可正常启动,切换到Python 3.7则无法运行)
  • Headless Chrome版本:对应serverless-chrome v1.0.0-41的Amazon Linux 2017-03版本包

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 08:15:31