AWS Lambda中运行Python Selenium遇AttributeError错误求助
解决AWS Lambda容器中Selenium脚本的AttributeError问题
错误原因
你遇到的AttributeError: 'NoneType' object has no attribute 'split',根源是webdriver-manager在容器环境中无法检测到你手动安装的Chrome浏览器版本。
你的Dockerfile已经预先下载了固定版本的Chrome(122.0.6261.111)和对应chromedriver,但webdriver-manager默认会从系统默认路径查找Chrome并获取版本号,而容器中Chrome安装在/opt/chrome,不在其检测范围内,导致determined_browser_version返回None,进而触发split操作的错误。
解决方案
既然你已经手动同步了Chrome和chromedriver的版本,完全不需要依赖webdriver-manager管理驱动,直接指定本地的Chrome二进制文件和chromedriver路径即可:
1. 修改WebDriver初始化代码
更新models/core/web_driver.py,移除ChromeDriverManager的使用,直接指定本地路径:
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC class WebDriver: def __init__(self, url, delay) -> None: chrome_options = webdriver.ChromeOptions() chrome_options.add_argument("--headless=new") # 指定容器中Chrome的二进制文件路径 chrome_options.binary_location = "/opt/chrome/chrome" # 指定预下载的chromedriver路径 service = Service(executable_path="/opt/chromedriver-linux64/chromedriver") self.chrome = webdriver.Chrome(service=service, options=chrome_options) self.chrome.get(url) self.wait = WebDriverWait(self.chrome, delay) def load_elements(self, main_filter): return self.wait.until( EC.presence_of_all_elements_located((By.CLASS_NAME, main_filter)) ) def quit(self): self.chrome.quit()
2. 可选:移除不必要的依赖
由于不再需要webdriver-manager,可以从requirements.txt中删除该行:
bs4==0.0.2 dynamodb-json==1.3 kink==0.7.0 pynamodb==6.0.0 selenium==4.18.1 # 移除下面这行 # webdriver-manager==4.0.1
验证逻辑
- 本地环境正常是因为
webdriver-manager能找到系统默认安装的Chrome版本; - 容器中修改后,脚本直接使用你预下载的对应版本Chrome和chromedriver,跳过版本检测步骤,彻底解决错误。
内容的提问来源于stack exchange,提问作者Mervin Hemaraju
相关产品推荐
相关产品推荐

