AWS Lambda中Selenium报“no such element”错误求助
问题分析与解决方案
核心问题根源
- 你使用的Selenium 3.8.0、ChromeDriver 2.37和Headless Chromium v1.0.0-41版本过于陈旧,与Lambda的Amazon Linux 2环境兼容性差,且无法适配现代网站的JavaScript渲染逻辑,这是元素定位失败的主要原因。
- 旧版无头浏览器的默认配置未模拟真实浏览器环境,容易被网站反爬机制识别,导致页面渲染不完整。
具体修复步骤
1. 升级组件版本并重构Lambda Layer
丢弃旧的构建命令,改用适配Amazon Linux 2的最新兼容版本:
# 创建Layer目录结构 mkdir -p selenium/python/lib/python3.9/site-packages # 安装适配Lambda Python 3.9的Selenium 4.x版本 pip3 install -t selenium/python/lib/python3.9/site-packages selenium==4.15.2 # 下载对应Chrome 119的ChromeDriver(适配Amazon Linux 2) curl -SL https://chromedriver.storage.googleapis.com/119.0.6045.105/chromedriver_linux64.zip > chromedriver.zip unzip chromedriver.zip -d selenium/bin/ # 下载对应版本的Headless Chromium(Amazon Linux 2版本) curl -SL https://github.com/adieuadieu/serverless-chrome/releases/download/v1.0.0-119/stable-headless-chromium-amazonlinux-2.zip > headless-chromium.zip unzip headless-chromium.zip -d selenium/bin/ # 打包Layer cd selenium && zip -r selenium-layer.zip .
注意:Lambda运行时建议选择Python 3.9+,与上述命令的版本匹配
2. 优化Selenium启动配置
在Lambda代码中添加无头浏览器的模拟配置,避免反爬拦截,同时用显式等待替代固定sleep:
from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import os def lambda_handler(event, context): chrome_options = Options() chrome_options.add_argument("--headless=new") chrome_options.add_argument("--no-sandbox") chrome_options.add_argument("--disable-dev-shm-usage") chrome_options.add_argument("--window-size=1920x1080") chrome_options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36") # 指定Lambda Layer中的浏览器和驱动路径 chrome_options.binary_location = os.path.join(os.environ['LAMBDA_TASK_ROOT'], 'bin', 'headless-chromium') driver_path = os.path.join(os.environ['LAMBDA_TASK_ROOT'], 'bin', 'chromedriver') driver = webdriver.Chrome(options=chrome_options, executable_path=driver_path) try: driver.get('http://korbit.co.kr/market/research') # 显式等待元素加载,替代固定sleep element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.XPATH, '//*[@id="list"]/div/div[1]/a/h3')) ) print(element.text) return {"status": "success", "text": element.text} finally: driver.quit()
3. 排查页面渲染问题
如果仍失败,添加截图代码确认页面是否完整渲染:
# 在driver.get之后添加 driver.save_screenshot('/tmp/page_screenshot.png') # 可将截图上传至S3查看具体渲染情况
额外注意事项
- Lambda的
/tmp目录是唯一可写路径,所有临时文件(截图、日志)需存放于此。 - 确保Layer打包时包含
bin目录下的chromedriver和headless-chromium,且权限设置为可执行。 - 部分网站(如Notion)可能存在动态加载或弹窗拦截,需额外处理相关交互逻辑。
内容的提问来源于stack exchange,提问作者ddabongcoin
相关产品推荐
相关产品推荐

