使用 AWS Device Farm 浏览器测试特性在 CI 中运行 Selenium 测试:PyTest 实战指南

发布时间:2026/9/27 8:15:11
使用 AWS Device Farm 浏览器测试特性在 CI 中运行 Selenium 测试:PyTest 实战指南 示例工程教程后端【免费下载链接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.项目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples点击查看免费下载导读本文基于 python/example_code/devicefarm/browser_testing 目录下的官方示例讲解如何用 PyTest 与 Selenium 在 AWS Device Farm 的浏览器测试browser testing特性上运行 Web 自动化测试并把它接入 CI 流水线。读完本文你将掌握通过 Device Farm API 获取远程浏览器会话、用资源标签 API 为每次会话自动打标、在测试中断言前抓取屏幕截图以及如何把整个测试套件跑在 AWS 托管的真实浏览器中。示例概览Device Farm 浏览器测试的三大能力AWS Device Farm 是一项移动应用与 Web 测试服务官方仓库对其的定位是Device Farm is an app testing service that enables you to test your iOS, Android and Fire OS apps on real, physical phones and tablets that are hosted by AWS.。其中浏览器测试browser testing特性让开发者可以在 AWS 托管的真实浏览器中运行基于 WebDriver 的测试。仓库中的 browser_testing/README.md 明确说明了本示例要演示的三件事使用 Device Farm API 启动浏览器会话通过create_test_grid_url获取一个仅供 Selenium 客户端使用的远端驱动地址driver hub URL使用 Resource Tagging API 为浏览器会话打标签通过get_test_grid_session找到会话 ARN再用tag_resources为会话标记测试套件名称与 Git 提交号从浏览器会话中抓取截图在每个测试断言之前保存页面截图便于定位失败原因。它的典型定位是作为 CI 系统的一部分用 Selenium 测试 Web 应用。示例有一个硬性约束它必须在 Git 仓库内运行因为输出目录基于最近一次 Git 提交的短哈希生成如果不在仓库内运行哈希会被替换为norepo见下文源码分析。示例的完整实现位于 python/example_code/devicefarm/browser_testing/test_suite.py依赖定义见同目录下的 Pipfile 与 Pipfile.lock。运行前置条件Prerequisites原文档列出了三类前置条件缺一不可一个 Device Farm 浏览器测试项目。项目的创建与管理在 Device Farm 控制台完成创建后可拿到项目的 ARN形如aws:arn:devicefarm:us-west-2:...。具备最小权限的 AWS 编程凭证。按最小权限原则仅需以下三个动作devicefarm:createTestGridUrl—— 创建测试网格TestGrid会话 URLdevicefarm:getTestGridSession—— 按项目 ARN 与会话 ID 查询会话详情用于取会话 ARNresourcetaggingapi:tagResources—— 为会话 ARN 添加资源标签。Pipenv示例用 Pipenv 隔离依赖。所需依赖如下依赖包作用备注boto3AWS SDK for Python调用 Device Farm 与 Resource Tagging API锁文件中版本为1.17.105seleniumWeb 自动化客户端驱动远程浏览器锁文件中版本为3.141.0pytest测试框架组织测试套件与参数化用例锁文件中版本为6.2.4pytest-xdist可选若需要并行跑多个测试锁文件中版本为2.3.0从 Pipfile 可以看到依赖被定义在[packages]段且版本均为通配符*实际锁定版本记录在 Pipfile.lock 中。运行命令两条命令完成启动原文档给出的运行方式非常简洁只有两步安装依赖到 Pipenv 生成的虚拟环境中pipenv install运行测试套件并把 Device Farm 浏览器测试项目的 ARN 通过环境变量PROJECT_ARN传入PROJECT_ARNaws:arn:devicefarm:us-west-2:... pipenv run pytest -s注意-s参数它关闭 pytest 的输出捕获让 Selenium/浏览器相关的实时输出包括测试中的打印与警告直接显示在终端方便 CI 日志排查。原文档特别标注了一句话Note: Not all tests are designed to pass.并非所有测试都被设计为通过。这一点在源码中有所体现——例如test_redirect_titles的用例故意覆盖了预期跳转/不跳转及含特殊字符的页面标题其中部分用例断言失败正是为了演示失败时截图能力详见下文测试用例分析。关于区域与费用原文档同时强调了两点注意事项本代码仅在us-west-2俄勒冈区域有效因为 Device Farm 是唯一部署在该区域的 AWS 服务运行这段代码可能产生 AWS 账户费用因为每次测试都会在 AWS 托管的真实浏览器中消耗会话时长。源码深度剖析test_suite.py 的完整执行链路示例的全部逻辑集中在 test_suite.py被官方 snippet 标记Scenario_BrowserTesting包裹。整个执行流程可以概括为setup_method每个测试前 ├─ boto3.client(devicefarm) ├─ create_test_grid_url(projectArn, expiresInSeconds300) → 驱动 URL ├─ 按 Git 哈希日期创建 results 目录 ├─ DesiredCapabilities.FIREFOXplatformwindows, 最新版 ├─ webdriver.Remote(url, cap) → 建立 Selenium 远程会话 └─ get_test_grid_session → session ARN └─ resourcegroupstaggingapi.tag_resources(打标签) test_xxx参数化用例断言前 save_screenshot teardown_method每个测试后 └─ driver.quit() 结束会话停止计费下面逐段拆解关键实现并给出对应的源码行号。1. 获取 Git 短哈希决定输出目录名get_git_hash()test_suite.py通过git rev-parse --short HEAD拿到当前提交的短哈希作为结果目录的唯一标识。若命令失败即不在 Git 仓库内运行则返回字符串norepo。这也印证了原文档必须在 Git 仓库内运行的约束。2. setup_method启动会话并自动打标签每个测试方法运行前都会执行setup_methodtest_suite.py其内部完成了四件事1校验并创建会话 URLdevicefarm_client boto3.client(devicefarm) project_arn os.environ.get(PROJECT_ARN, None) if project_arn is None: raise ValueError(Must set PROJECT_ARN) testgrid_url_response devicefarm_client.create_test_grid_url( projectArnproject_arn, expiresInSeconds300 )项目 ARN 必须通过环境变量PROJECT_ARN提供未设置直接抛异常。expiresInSeconds300表示该驱动 URL 在 300 秒5 分钟内有效需保证在会话建立前完成连接。2创建按提交与日期命名的结果目录self.screenshot_path os.path.join( ., results, get_git_hash() - (datetime.date.today().isoformat()) ) if not os.path.exists(self.screenshot_path): os.makedirs(self.screenshot_path, exist_okTrue)截图会保存到./results/git短哈希-日期/目录下例如./results/abc1234-2026-09-26/。这样同一提交、同一日期的多次运行共享一个目录便于 CI 中按提交归档测试产物。3配置 Selenium 远端驱动desired_cap DesiredCapabilities.FIREFOX desired_cap[platform] windows desired_cap[BrowserVersion] latest self.driver webdriver.Remote(testgrid_url_response[url], desired_cap)这里直接使用 Selenium 的DesiredCapabilities.FIREFOX模板并指定平台为windows、浏览器版本为latest。webdriver.Remote的端点正是上一步create_test_grid_url返回的url字段——Device Farm 在这里充当了 Selenium Grid 的角色。4查询会话 ARN 并自动打标签testgrid_session_arn_response devicefarm_client.get_test_grid_session( projectArnproject_arn, sessionIdself.driver.session_id ) self.session_arn testgrid_session_arn_response[testGridSession][arn] tag_client boto3.client(resourcegroupstaggingapi) tag_client.tag_resources( ResourceARNList[self.session_arn], Tags{TestSuite: ftestsuite {method.__name__}, GitId: get_git_hash()}, )这段是示例的核心亮点之一Selenium 驱动会话建立后用driver.session_id配合项目 ARN 调用get_test_grid_session反查出会话 ARN随后改用resourcegroupstaggingapi客户端为该 ARN 打上两个标签TestSuite值为testsuite 当前测试方法名例如testsuite test_first_paragraph_textGitId值为当前 Git 短哈希。这样每次测试会话都能在 AWS 侧被追踪到来自哪个测试方法、对应哪个代码提交为 CI 审计和成本归因提供了依据。3. teardown_method优雅结束会话def teardown_method(self, method): self.driver.quit()每个测试结束后立即调用driver.quit()关闭远程浏览器。源码注释写得很直白End the Selenium session so were off the clock.结束 Selenium 会话停止计费。因为 Device Farm 按会话时长计费及时退出是控制成本的关键。两个参数化测试用例如何在断言前抓截图示例套件TestHelloSuite包含两个基于pytest.mark.parametrize的测试全部以英文 Wikipedia 为被测站点。用例一test_first_paragraph_text首段文本比对定义于 test_suite.py共 6 组参数Seattle、Selenium、Amazon Locker、Kootenai Falls、Dorayaki、Robot Face。执行逻辑打开 Wikipedia 主页定位#searchInput搜索框输入查询词并回车用WebDriverWait(self.driver, 5).until(expected_conditions.staleness_of(search_input))等待搜索框元素失效——元素变为 stale 说明页面已跳转完成比固定sleep更健壮用 XPath//div[classmw-parser-output]//p[not(class)]定位文章首段排除带 class 的段落通常是编辑提示或消歧义框在断言之前调用self.save_screenshot(fleadingpara_{query}.png)保存截图assert our_text.startswith(lead)校验首段是否以期望文本开头。由于截图在最终断言之前拍摄即使断言失败也能拿到失败时刻的完整页面状态用于调试。用例二test_redirect_titles跳转标题比对定义于 test_suite.py共 8 组参数覆盖预期跳转如DevOps→DevOps、常见同义词跳转如Jackdaws Love My Big Sphinx Of Quartz→Pangram、特殊字符无法用键盘输入如N//ng language→Nǁng language、以及包含 $% 等被过滤字符如Who the Frick Is Jackson Pollock?等场景。流程与第一个用例类似但断言对象是页面#firstHeading的标题文本截图文件名为redirect_query.png。由于部分参数组合例如特殊字符输入在真实浏览器中并不总是产生预期结果这类用例正是并非所有测试都被设计为通过的直接体现——它们的失败演示了截图归档与断言失败的可观测性。产物组织与 CI 集成建议结合原文档与源码可以从三个角度总结这套示例的工程价值结果可归档所有截图按results/git短哈希-日期/落盘天然适配 CI 中的 artifact 上传逻辑短哈希保证同一分支不同提交的运行互不覆盖。会话可审计TestSuite与GitId标签让每个 Device Farm 会话都能追溯到测试方法与代码提交配合成本报表即可分析哪个提交/哪个测试最耗时。依赖可复现pipenv install依据 Pipfile.lock 生成完全一致的环境锁文件显示selenium锁定在3.141.0、pytest锁定在6.2.4、boto3锁定在1.17.105团队可按此版本基线复现。与仓库中其他 Device Farm 示例的关系本示例隶属于 python/example_code/devicefarm/README.md 所汇总的两个场景之一另一个是 device_testing/run_tests.py上传编译好的 Android/iOS 应用与测试包、启动设备测试并汇总结果。两者互为补充browser_testing面向 Web 应用的 Selenium 自动化测试device_testing面向移动 App 的包上传与真机测试。从代码组织看browser testing 示例采用Pipenv PyTest 每个测试前后自动启停远程会话的结构而 device testing 示例则是一次性上传、启动、轮询结果的长任务模式二者代表了 Device Farm 的两条典型接入路径。Python 总目录 python/README.md 提供了通用的凭证配置默认~/.aws/credentials或AWS_ACCESS_KEY_ID/AWS_SECRET_KEY环境变量与虚拟环境使用说明可作为运行本示例前的环境准备参考。常见问题与排查要点ValueError: Must set PROJECT_ARN未在运行命令前导出PROJECT_ARN环境变量检查项目 ARN 是否复制完整形如aws:arn:devicefarm:us-west-2:123456789012:testgrid-project:...。提示不在 Git 仓库内结果目录名会退化为norepo-日期因为get_git_hash()的subprocess调用失败并被捕获若需要按提交归档请在 Git 仓库内运行。截图目录始终生成setup_method中os.makedirs(..., exist_okTrue)保证目录可复用、不抛异常。费用控制每个测试的setup_method都会新开一个远程浏览器会话teardown_method负责关闭。并行跑测试时安装pytest-xdist会话数量会成倍增加务必评估成本。Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.SPDX-License-Identifier: Apache-2.0赞分享示例工程教程后端【免费下载链接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.项目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples点击查看免费下载相关推荐aws-doc-sdk-examples 中的 AWS Device Farm PythonBoto3代码示例浏览器测试与设备包测试实战aws doc sdk examples 中的 AWS Device Farm PythonBoto3代码示例浏览器测试与设备包测试实战 本指南以 pyt示例工程教程后端Karma 测试运行器实战指南在多个真实浏览器中执行 JavaScript 测试Karma 测试运行器实战指南在多个真实浏览器中执行 JavaScript 测试 本篇技术指南以 Karma 官方 README 为主体结合仓库源码与官方文测试开发工具CoffeeScript 浏览器端测试指南在 Node 与浏览器中运行语言测试套件CoffeeScript 浏览器端测试指南在 Node 与浏览器中运行语言测试套件 CoffeeScript 仓库自带一整套覆盖语法、编译输出与运行时行为的测编程语言编译器上一篇tiptap不可见字符处理5个实用技巧掌握空白字符显示控制下一篇Awesome Sysadmin日志告警规则最佳实践与案例创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考