发布于 2026-01-06 0 阅读
0

创建通过 AWS Lambda 运行 Selenium 的 API;创建 Selenium Lambda 层;创建 ChromeDriver Lambda 层;创建 Lambda 函数

创建一个通过 AWS Lambda 运行 Selenium 的 API

创建 Selenium Lambda 层

 创建 ChromeDriver Lambda 层

 创建 Lambda 函数

作为一名自动化测试工程师,我的工作就是实现所有流程的自动化。当我在终端运行测试脚本时,我意识到只有我自己才能执行这些脚本。如果其他人也想运行呢?比如开发人员、项目经理等等。克隆我的代码库、安装库文件、再运行脚本,这将会是一项繁琐的工作。因此,我决定或许可以将测试脚本存储在无服务器服务器上,并通过 API 请求使其可访问。

我尝试了各种 AWS 资源,例如创建自己的 Lambda 函数、研究 API 网关和 CodePipeline 的功能等等。经过多次尝试,我终于成功运行了我的脚本。然后,我研究了如何通过 API 访问我的 Lambda 函数。

这将提高生产效率并节省时间。由于自动化测试无需人工干预,工程师可以将精力集中在关键工作上。这就像一个便携式测试设备,任何人都可以操作。凭借快速的测试执行速度,开发人员可以立即获得测试报告,因此一旦出现故障,他们就能迅速做出反应。自动化测试将使程序更新更加便捷。因此,自动化测试能够提高团队响应速度,改善用户体验,并提升客户满意度。

概述

  1. 创建两个 Lambda 层,分别包含 Selenium 和 ChromeDriver 库。
  2. 将创建的 Lambda 层添加到 Lambda 函数的 serverless.yml 文件中,然后部署

创建 Selenium Lambda 层

将库文件放入图层中python/lib/python3.6/site-packages/,以便将其包含在图层中。

下载 Selenium 到 layer 目录



pip3.6 install -t selenium/python/lib/python3.6/site-packages selenium==3.8.0
cd selenium
zip -r python.zip python/


Enter fullscreen mode Exit fullscreen mode

完成后,创建 Lambda 层,然后上传 zip 文件

1. 转到 AWS 控制台 Lambda/层
2. 单击“创建层”
3. 在层配置中输入以下内容



Name: selenium
Description: Selenium layer
Upload zip file created: python.zip
Compatible runtimes: Python 3.6


Enter fullscreen mode Exit fullscreen mode

硒层

4. 点击“创建”

注意:您可以使用任何您喜欢的版本,只需在上传软件包时选择兼容的运行时即可。

 创建 ChromeDriver Lambda 层

下载 Chrome 驱动程序



mkdir -p chromedriver
cd chromedriver
curl -SL https://chromedriver.storage.googleapis.com/2.37/chromedriver_linux64.zip > chromedriver.zip
unzip chromedriver.zip
rm chromedriver.zip


Enter fullscreen mode Exit fullscreen mode

下载 Chrome 二进制文件



curl -SL https://github.com/adieuadieu/serverless-chrome/releases/download/v1.0.0-41/stable-headless-chromium-amazonlinux-2017-03.zip > headless-chromium.zip
unzip headless-chromium.zip
rm headless-chromium.zip


Enter fullscreen mode Exit fullscreen mode

压缩驱动程序和二进制文件



ls
chromedriver headless-chromium
zip -r chromedriver.zip chromedriver headless-chromium


Enter fullscreen mode Exit fullscreen mode

完成后,创建 Lambda 层,然后上传 zip 文件

1. 转到 AWS 控制台 Lambda/层
2. 单击“创建层”
3. 在层配置中输入以下内容



Name: chromedriver
Description: chrome driver and binary layer
Upload zip file created: chromedriver.zip
Compatible runtimes: Python 3.6


Enter fullscreen mode Exit fullscreen mode

铬层

4. 点击“创建”

 创建 Lambda 函数

为了确保您的函数代码能够访问层中包含的库,Lambda 运行时会在“/opt”目录中包含路径。

 文件结构


 shell
── /lambda/            # lambda function
  ├── /handler.py      # source code of lambda function 
  └── /serverless.yaml # serverless config


Enter fullscreen mode Exit fullscreen mode

 代码

复制以下代码/lambda/handler.py



from selenium import webdriver
from selenium.webdriver.chrome.options import Options

def main(event, context):
    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')

    driver = webdriver.Chrome('/opt/chromedriver',chrome_options=options)
    driver.get('https://www.google.com/')

    driver.close();
    driver.quit();

    response = {
        "statusCode": 200,
        "body": "Selenium Headless Chrome Initialized"
    }

    return response


Enter fullscreen mode Exit fullscreen mode

将以下代码复制到/lambda/serverless.yaml.



service: selenium-lambda

provider:
  name: aws
  runtime: python3.6
  region: ap-southeast-2
  timeout: 900

functions:
  main:
    memorySize: 1000
    handler: handler.main
    events:
      - http:
          path: test
          method: get

    layers:
      - arn:aws:lambda:ap-southeast-2:{}:layer:chromedriver:2
      - arn:aws:lambda:ap-southeast-2:{}:layer:selenium:2

resources:
  Resources:
    ApiGatewayRestApi:
      Properties:
        BinaryMediaTypes:
          - "*/*"


Enter fullscreen mode Exit fullscreen mode

 部署 Lambda 函数

前往/lambda 目录



$ sls deploy


Enter fullscreen mode Exit fullscreen mode

 输出



Serverless: Stack update finished...
Service Information
service: selenium-lambda
stage: dev
region: ap-southeast-2
stack: selenium-lambda-dev
api keys:
  None
endpoints:
  GET - https://{name}.execute-api.ap-southeast-2.amazonaws.com/dev/test
functions:
  main: selenium-lambda-dev-main


Enter fullscreen mode Exit fullscreen mode

输出

访问 API 时,您应该会收到与下方相同的响应。



{
"statusCode": 200,
"body": "Selenium Headless Chrome Initialized"
}


Enter fullscreen mode Exit fullscreen mode

此部署会自动创建 CloudFormation 堆栈和 S3 存储桶。

CloudFormation堆栈

S3

弃用说明:

由于 python3.6 已被弃用,您可以尝试使用与 3.9 兼容的 ff 包。请注意,如果这超过了 lambda 函数 zip 文件的大小,您可以尝试使用 docker 镜像或上传到 s3 来代替。



$ python3.9 -m pip install -t python/lib/python3.9/site-packages selenium==4.5.0
$ cd selenium
$ zip -r python.zip python/


Enter fullscreen mode Exit fullscreen mode

名称:selenium
描述:Selenium 层
上传创建的 zip 文件:python.zip
兼容运行时:Python 3.9



$ mkdir -p chromedriver
$ cd chromedriver
$ curl -SL https://chromedriver.storage.googleapis.com/107.0.5304.62/chromedriver_linux64.zip > chromedriver.zip
$ unzip chromedriver.zip
$ rm chromedriver.zip


Enter fullscreen mode Exit fullscreen mode


$ curl -SL https://github.com/adieuadieu/serverless-chrome/releases/download/v1.0.0-57/stable-headless-chromium-amazonlinux-2.zip > headless-chromium.zip
$ unzip headless-chromium.zip
$ rm headless-chromium.zip


Enter fullscreen mode Exit fullscreen mode

新版本发布参考:
chromedriver 发布
https://chromedriver.chromium.org/downloads

serverless-chrome 发布
https://github.com/adieuadieu/serverless-chrome/releases

请查看 Achim 关于如何使用 dockerimage 运行 3.9 版本的评论
:https://dev.to/achimgrolimund/comment/22d99

Jaira Encio LinkedIn

文章来源:https://dev.to/awscommunity-asean/creating-an-api-that-runs-selenium-via-aws-lambda-3ck3