创建一个通过 AWS Lambda 运行 Selenium 的 API
创建 Selenium Lambda 层
创建 ChromeDriver Lambda 层
创建 Lambda 函数
作为一名自动化测试工程师,我的工作就是实现所有流程的自动化。当我在终端运行测试脚本时,我意识到只有我自己才能执行这些脚本。如果其他人也想运行呢?比如开发人员、项目经理等等。克隆我的代码库、安装库文件、再运行脚本,这将会是一项繁琐的工作。因此,我决定或许可以将测试脚本存储在无服务器服务器上,并通过 API 请求使其可访问。
我尝试了各种 AWS 资源,例如创建自己的 Lambda 函数、研究 API 网关和 CodePipeline 的功能等等。经过多次尝试,我终于成功运行了我的脚本。然后,我研究了如何通过 API 访问我的 Lambda 函数。
这将提高生产效率并节省时间。由于自动化测试无需人工干预,工程师可以将精力集中在关键工作上。这就像一个便携式测试设备,任何人都可以操作。凭借快速的测试执行速度,开发人员可以立即获得测试报告,因此一旦出现故障,他们就能迅速做出反应。自动化测试将使程序更新更加便捷。因此,自动化测试能够提高团队响应速度,改善用户体验,并提升客户满意度。
概述
- 创建两个 Lambda 层,分别包含 Selenium 和 ChromeDriver 库。
- 将创建的 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/
完成后,创建 Lambda 层,然后上传 zip 文件
1. 转到 AWS 控制台 Lambda/层
2. 单击“创建层”
3. 在层配置中输入以下内容
Name: selenium
Description: Selenium layer
Upload zip file created: python.zip
Compatible runtimes: Python 3.6
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
下载 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
压缩驱动程序和二进制文件
$ ls
chromedriver headless-chromium
$ zip -r chromedriver.zip chromedriver headless-chromium
完成后,创建 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
4. 点击“创建”
创建 Lambda 函数
为了确保您的函数代码能够访问层中包含的库,Lambda 运行时会在“/opt”目录中包含路径。
文件结构
shell
── /lambda/ # lambda function
├── /handler.py # source code of lambda function
└── /serverless.yaml # serverless config
代码
复制以下代码/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
将以下代码复制到/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:
- "*/*"
部署 Lambda 函数
前往/lambda 目录
$ sls deploy
输出
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
访问 API 时,您应该会收到与下方相同的响应。
{
"statusCode": 200,
"body": "Selenium Headless Chrome Initialized"
}
此部署会自动创建 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/
名称: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
$ 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
新版本发布参考:
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




