在AWS Lambda的Docker容器中运行Java Selenium遇Chrome/Chromedriver问题
AWS Lambda Docker容器运行Java Selenium Chrome项目失败问题
我需要在AWS Lambda无服务器环境的Docker容器中运行以下Java Selenium代码:
System.setProperty("webdriver.chrome.driver", "/usr/bin/chromedriver"); ChromeOptions options = new ChromeOptions(); //... optionsSetupHere WebDriver driver = new ChromeDriver(options); driver.manage().window().maximize(); driver.get("https://www.wikipedia.org"); driver.quit(); return "done";
但无论如何调整配置,始终会遇到以下两类错误之一:
错误类型1
[1669291624.447][SEVERE]: bind() failed: Cannot assign requested address (99) Could not start a new session. Response code 500. Message: unknown error: Chrome failed to start: crashed. (unknown error: DevToolsActivePort file doesn't exist) (The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
错误类型2
[1669276586.713][SEVERE]: CreatePlatformSocket() failed: Address family not supported by protocol (97) ChromeDriver was started successfully. [1669276589.300][SEVERE]: CreatePlatformSocket() failed: Address family not supported by protocol (97) Could not start a new session. Response code 500. Message: unknown error: unable to discover open window in chrome
我已尝试过所有常见的Chromedriver启动参数,但均未解决问题:
options.addArguments("--headless"); options.addArguments("--start-maximized"); options.addArguments("--no-sandbox"); options.addArguments("--test-type"); options.addArguments("--ignore-certificate-errors"); options.addArguments("--disable-popup-blocking"); options.addArguments("--disable-default-apps"); options.addArguments("--disable-extensions-file-access-check"); options.addArguments("--incognito"); options.addArguments("--disable-infobars"); options.addArguments("--disable-gpu"); options.addArguments("--disable-dev-shm-usage"); options.addArguments("--disable-notifications"); options.addArguments("--window-size=1980,1080"); options.addArguments("--single-process"); options.addArguments("--disable-extensions"); options.addArguments("--allow-running-insecure-content"); options.addArguments("--disable-web-security"); options.addArguments("--user-agent=\"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36\"");
环境配置
- Selenium版本:4.6.0
- Chromedriver版本:107.0.5304.62
- Chrome版本:107.0.5304.87-1
- JDK版本:8
Dockerfile内容
使用markhobson/maven-chrome:jdk-8作为基础镜像,添加Lambda运行时模拟器,完整Dockerfile如下:
FROM --platform=linux/amd64 markhobson/maven-chrome:jdk-8 as base FROM base as build WORKDIR /src ADD pom.xml . RUN mvn dependency:go-offline dependency:copy-dependencies ADD . . RUN mvn package # Create final image FROM base WORKDIR /function COPY --from=build /src/target/dependency/*.jar ./ COPY --from=build /src/target/*.jar ./ # Lambda env config ENTRYPOINT [ "/usr/local/openjdk-8/bin/java", "-cp", "./*", "com.amazonaws.services.lambda.runtime.api.client.AWSLambda" ] CMD [ "example.App::sayHello" ]
补充尝试
- 使用headless chromium替代Chrome时可正常运行,但业务需求必须切换到Chrome
- 尝试将Chrome和Chromedriver移动到
/tmp目录,无任何改善 - 基于
umihico/docker-selenium-lambda镜像安装Java并替换处理程序后,仍出现相同错误(该仓库中的Python脚本可正常执行) - 使用AWS Lambda Java官方Docker基础镜像时,无法通过yum安装Chrome;手动按照
umihico/docker-selenium-lambda的方式解压Chrome二进制文件后,出现“无法找到指定路径下的Chrome二进制文件”错误
内容的提问来源于stack exchange,提问作者marcino8252
相关产品推荐
相关产品推荐

