在AWS Lambda中用Chromedriver下载文件至/tmp目录失败求助
问题:AWS Lambda中Chromedriver无法将文件下载到/tmp目录
需求场景
- 目标:从Verra注册系统的VCS项目搜索页面自动下载文件到AWS Lambda的/tmp目录
- 操作流程:
- 点击页面「Search」按钮
- 等待搜索结果加载完成
- 点击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
相关产品推荐
相关产品推荐

