当前位置: 首页 > article >正文

【Appium 系列】第18节-重试与容错 — 移动端测试的稳定性保障

配套代码utils/retry.py、tests/test_login_api.py说明本节所有代码示例均来自一个真实的移动端自动化测试项目已做模糊化处理。为什么需要重试移动端测试比 Web 测试更容易出现偶发性失败。以下几种情况在本地和 CI 上反复出现网络波动Appium 调用find_element时底层发起的 HTTP 请求超时抛出TimeoutException: An element could not be located on the page using the given search parameters。元素加载慢页面渲染被动画或懒加载阻塞在元素存在前执行了click()触发NoSuchElementException: An element could not be located。键盘弹出延迟send_keys()执行时输入框尚未获得焦点驱动报InvalidElementStateException: Element must be user-editable to sendKeys。动画未结束页面切换动画仍在运行时点击下一个元素抛出ElementClickInterceptedException: Element is not clickable at point (x, y)。这些失败不是代码逻辑 bug而是环境或时序导致的不稳定。重试 2-3 次后绝大部分情况下用例能正常通过。utils/retry.py提供了retry_on_failure装饰器和RetryHelper工具类来解决这类问题。重试装饰器utils/retry.py中的retry_on_failure是一个装饰器直接加在测试函数或页面操作方法上即可启用自动重试。from utils.retry import retry_on_failure class TestLogin: retry_on_failure(max_attempts3, delay2.0) def test_login_with_retry(self, driver): 带重试的登录测试 from pages.login_page import LoginPage login_page LoginPage(driver) login_page.input_phone_email(test_userexample.com) login_page.input_password(test_password) login_page.click_login_button() assert login_page.is_on_home_page()参数说明max_attempts最大尝试次数包括首次执行默认 3。最后一次失败后不再重试直接抛出异常。delay每次重试间隔单位秒默认 1.0。重试前通过time.sleep(delay)等待。exceptions需要捕获并重试的异常类型元组默认(Exception,)即捕获所有异常。可以精确指定只重试特定异常例如exceptions(TimeoutException, NoSuchElementException)。执行流程首次执行函数成功则直接返回结果。捕获到exceptions中指定的异常时记日志并等待delay秒后重试。第 2~N 次重复上述流程。所有max_attempts次均失败后抛出最后一次捕获的异常。# 精确捕获特定异常避免因 AssertionError 误重试 retry_on_failure(max_attempts3, delay2.0, exceptions(TimeoutException, NoSuchElementException)) def test_element_interaction(self, driver): ...RetryHelper 辅助类除了装饰器utils/retry.py还提供了RetryHelper工具类适用于不能或不想用装饰器的场景——比如在页面对象Page Object的某个方法内部对单个操作做重试。retry_operation对任意可调用对象执行重试适合在 Page Object 中精细控制from utils.retry import RetryHelper class LoginPage: def click_login_with_retry(self): 对单次点击操作做重试不波及整个用例 RetryHelper.retry_operation( self.click_login_button, max_attempts3, delay1.0 )签名retry_operation(operation, max_attempts3, delay1.0, exceptions(Exception,), *args, **kwargs)retry_until_success重试直到满足自定义成功条件适合轮询等待某个状态RetryHelper.retry_until_success( self.click_login_button, max_attempts10, delay0.5, success_conditionlambda: self.is_element_displayed(xpath, //*[text首页]) )success_condition是一个可调用对象返回True视为成功。这对于动画未结束、数据尚在加载的场景非常实用——不是单纯等固定时间而是等到条件成立。重试策略选择策略适用场景参数建议固定延迟网络波动、元素加载慢delay2.0指数退避服务端限流、资源竞争延迟递增2s → 4s → 8s快速重试键盘弹出延迟、动画未结束delay0.5指数退避可以在retry_on_failure基础上手动实现def retry_with_backoff(max_attempts3, base_delay1.0): def decorator(func): wraps(func) def wrapper(*args, **kwargs): last_exception None for attempt in range(max_attempts): try: return func(*args, **kwargs) except Exception as e: last_exception e if attempt max_attempts - 1: delay base_delay * (2 ** attempt) logger.warning(f等待{delay}秒后重试: {e}) time.sleep(delay) raise last_exception return wrapper return decorator常见坑与报错以下是在实际项目中踩过的坑每个都附有具体报错信息。坑 1重试覆盖了真正的代码 bugAssertionError: Expected True but got False assert login_page.is_on_home_page()如果你用retry_on_failure(max_attempts5, delay1.0)不加exceptions参数默认捕获Exception连AssertionError也会被兜住重试。测试报告里显示重试后通过但实际是业务逻辑有问题。应通过exceptions参数限定只重试环境类异常让断言失败直接暴露。坑 2重试间隔太短重试等于白试selenium.common.exceptions.TimeoutException: Message: timeout (WARNING: The server did not provide any stacktrace information)页面上一个接口通常需要 1-3 秒返回数据如果重试间隔设成delay0.3页面还没加载完就重试同样会再次超时。推荐至少 1.5-2 秒。坑 3重试次数太多拖慢整个测试集Test session running in 12m 34s ...100 个用例每个重试 3 次 × 2 秒延迟 多出 600 秒10 分钟。如果每个用例都无脑加retry_on_failure测试集时间膨胀严重。只在确实偶发的用例上加重试能通过find_element加WebDriverWait解决的优先用等待。坑 4装饰器忘了加wrapspytest 报告中函数名变成 wrappertests/test_login.py::test_login_with_retry → wrapper # 函数名被覆盖utils/retry.py中已经写了from functools import wraps并在内层函数上加wraps(func)。如果你自己写重试装饰器时漏了这一行func.__name__会变成wrapperpytest 报告中看到的测试名称将是wrapper而非原始函数名导致无法匹配 Allure 报告中的测试用例。坑 5exceptions参数传了错误类型导致异常逃逸retry_on_failure(max_attempts3, exceptions(TimeoutException))元组写法少了逗号(TimeoutException)会被 Python 解析为单个表达式而非元组。正确的写法是(TimeoutException,)。漏掉逗号后重试装饰器不会捕获任何异常偶发失败直接报错退出。坑 6不适合重试的场景强行加重试AttributeError: NoneType object has no attribute click driver None # driver 未初始化driver为None、测试数据错误、配置写错——这些属于一次性失败重试 100 次结果一样。先定位根因不要用重试掩盖配置或数据问题。哪些场景适合用重试元素定位超时页面加载慢网络请求超时网络波动偶发性断言失败动画未结束元素尚未到达预期状态哪些场景不适合用重试逻辑错误代码 bug重试多少次都一样数据错误测试数据不对重试后仍然一样配置错误driver 没初始化、API 地址不对总结重试是应对移动端测试不稳定性的实用手段但需要搭配正确的参数和策略。utils/retry.py提供了装饰器和工具类两套方案——装饰器适合整个测试函数级别RetryHelper适合细粒度控制单次操作。用好exceptions参数避免误吞断言失败控制delay和max_attempts防止测试集膨胀。能通过显式等待WebDriverWaitexpected_conditions解决的问题优先用等待重试作为兜底方案。

相关文章:

【Appium 系列】第18节-重试与容错 — 移动端测试的稳定性保障

配套代码:utils/retry.py、tests/test_login_api.py说明:本节所有代码示例均来自一个真实的移动端自动化测试项目,已做模糊化处理。为什么需要重试移动端测试比 Web 测试更容易出现偶发性失败。以下几种情况在本地和 CI 上反复出现&#xff1…...

小模型爆发出惊人能量!斯坦福开源框架AgentFlow如何实现复杂任务中的可靠工具使用?

本文介绍了斯坦福大学开源的模块化智能体框架AgentFlow,它通过独特的架构设计和训练方法,在工具集成和规划能力上取得了突破性进展。AgentFlow以Qwen-2.5-7B-Instruct为基础,在10个基准测试中表现突出,超越了大50倍的模型和GPT-4o…...

大模型底座的技术路线

主流大模型目前以token为单位处理文本,因其算力效率高、生态成熟。但byte-level/tokenizer-free路线正快速发展,它更端到端、跨语言统一且对噪声文本鲁棒。未来几年,外部接口可能仍用token,内部却将更多采用byte、patch或latent s…...

SenseNova-U1多模态模型深度解析:NEO-unify架构如何颠覆传统

SenseNova-U1多模态模型深度解析:NEO-unify架构如何颠覆传统 副标题: 从视觉编码器到端到端统一,附实战应用指南 一、痛点:为什么多模态模型这么复杂? 很多开发者第一次接触多模态模型时,会被各种架构绕晕:视觉编码器、文本解码器、适配器、投影层… 感觉像在看天书。 …...

大脑规则:为什么你学不进去?10个科学方法提升学习效率

大脑规则:为什么你学不进去?10个科学方法提升学习效率 副标题: 从进化论到认知科学,附实战学习方案 一、痛点:为什么你总是学不进去? 你有没有这样的经历: 坐在书桌前,书翻开了,但脑子一片空白 熬夜学习,第二天效率更低,形成恶性循环 一边看视频一边回消息,结果什…...

神经网络从入门到精通:10个核心概念+8个实战代码,小白也能懂

神经网络从入门到精通:10个核心概念+8个实战代码,小白也能懂 副标题: 从像素到概念的函数映射,附完整训练流程实战 一、痛点:为什么神经网络这么难理解? 很多初学者第一次接触神经网络时,会被各种术语绕晕:神经元、权重、偏置、激活函数、反向传播、梯度下降… 感觉像…...

LangGraph多智能体工作流:从线性执行到网状协作的重构

LangGraph多智能体工作流:从线性执行到网状协作的重构 1. 标题 (Title) 为了精准覆盖核心关键词、吸引不同层次的读者(AI应用开发者、LangChain进阶学习者、多智能体系统架构师),我准备了以下4个差异化标题: 《LangGraph 重塑AI协作:告别LangChain AgentExecutor的“单线…...

Harness的配置漂移检测与自动修复

云原生时代的稳定性利器:Harness配置漂移检测与自动修复全指南 引言 痛点引入 相信每一位DevOps工程师、SRE或者运维负责人都遇到过这样的噩梦: 测试环境验证了3天的功能,上线到生产10分钟就出现503错误,排查了2小时才发现&…...

Qwen模型 LeetCode 2585. 获得分数的方法数 TypeScript实现

哇!TypeScript版本来啦~这道题用TS写起来特别优雅,类型安全又清晰!让我给你展示一个高效又易读的实现!typescript function waysToReachTarget(target: number, types: number[][]): number {const MOD 1000000007;//…...

如何重塑贴吧体验:贴吧Lite带来的极致纯净浏览革新

如何重塑贴吧体验:贴吧Lite带来的极致纯净浏览革新 【免费下载链接】TiebaLite 贴吧 Lite 项目地址: https://gitcode.com/gh_mirrors/tieb/TiebaLite 厌倦了官方贴吧应用的臃肿体验和无处不在的广告干扰?贴吧Lite作为一款革命性的第三方贴吧客户…...

终极指南:如何免费快速上手Method Draw在线SVG编辑器

终极指南:如何免费快速上手Method Draw在线SVG编辑器 【免费下载链接】Method-Draw Method Draw, the SVG Editor for Method of Action 项目地址: https://gitcode.com/gh_mirrors/me/Method-Draw 如果你正在寻找一款简单高效的在线SVG编辑器,那…...

终极指南:无需微软账户离线启用Windows Insider预览计划的完整方案

终极指南:无需微软账户离线启用Windows Insider预览计划的完整方案 【免费下载链接】offlineinsiderenroll OfflineInsiderEnroll - A script to enable access to the Windows Insider Program on machines not signed in with Microsoft Account 项目地址: http…...

《离别的最后》的内容入口:收尾场景如何被记住

从内容传播角度看,《离别的最后》的入口在“最后”这个收束动作。它不是笼统告别,而是写到一段关系、一个阶段或一次转身即将落下尾音的时刻。这首歌不适合被写成普通伤感推荐。更准确的角度,是把它放在收尾场景里:删掉草稿、收起…...

SpringBoot+Vue旅游管理系统源码+论文

代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹 分享万套开题报告任务书答辩PPT模板 作者完整代码目录供你选择: 《SpringBoot网站项目》1800套 《SSM网站项目》1500套 《小程序项目》1600套 《APP项目》1500套 《Python网站项目》…...

书匠策AI深度拆解:2025年毕业论文竟然能这样“无痛通关“?|论文科普必看

各位正在被毕业论文反复折磨的同学们,今天这篇文章,我要用最接地气的方式,给你们拆解一个让我直呼"早该有了"的工具——书匠策AI( 官网直达:www.shujiangce.com)。 先说句大实话:写毕…...

歌词滚动姬:重新定义你的歌词制作体验,让每一句歌词都完美同步

歌词滚动姬:重新定义你的歌词制作体验,让每一句歌词都完美同步 【免费下载链接】lrc-maker 歌词滚动姬|可能是你所能见到的最好用的歌词制作工具 项目地址: https://gitcode.com/gh_mirrors/lr/lrc-maker 还在为制作LRC歌词而烦恼吗&a…...

书匠策AI降重降AIGC实测:论文圈的“消音器“到底有多猛?官网www.shujiangce.com深度拆解

各位还在论文泥潭里挣扎的宝子们,今天这期内容可能会让你少熬三个通宵。 我最近收到最多的私信就是:"博主,我查重42%,AIGC检测28%,导师说再改不过就延毕,怎么办?"说实话,…...

Oracle EBS关联公司段的设计逻辑和设计哲学

从设计逻辑 → 核心原理 → 完整配置事例 → 业务分录实例 → 常见坑的完整说明,全部围绕 “关联公司段(Intercompany Company Segment)” 在 EBS R12 里的设计与实现,不绕弯一、关联公司段的 “设计核心逻辑”1. 本质定义关联公司…...

Oracle EBS的退货处理逻辑

1.1日库存数量1个 价格20元 库存价值1*2020元,采用移动平均成本法2.1日PO1 采购价格 10元 数量3个 入库3个 此时库存价值为 203*1050元 平均价格为 50/412.5元3.1日PO2 采购价格 20元 数量6个 入库6个 此时库存价值为 203020*6170元 平均价格为 170/1017元5.1日PO1 …...

Oracle EBS COA 嵌入 SAP 利润中心段:设计逻辑、哲学、思路、用途、优缺点深度分析

Oracle EBS COA 嵌入 SAP 利润中心段:设计逻辑、哲学、思路、用途、优缺点深度分析先明确核心前提: 你当前场景是集团双系统架构(SAPOracle EBS),或Oracle EBS 承接 SAP 迁移 / 数据映射,计划在 EBS 会计科…...

工业级大模型学习之路023:LangChain零基础入门教程(第六篇):重排序与高级检索策略

一、理论基础:为什么基础向量检索不够好?1.1 基础向量检索的核心痛点第 4 天实现的基础向量检索(也叫单阶段检索)虽然简单易用,但存在三个致命缺陷,导致工业级场景下回答准确率通常只有 60%-70%&#xff1a…...

对比体验使用Taotoken聚合接口与直连原厂API的延迟与稳定性差异

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 对比体验使用Taotoken聚合接口与直连原厂API的延迟与稳定性差异 1. 引言 在集成大模型能力到实际业务时,开发者除了关…...

BepInEx配置管理器完整指南:一键管理所有游戏模组设置

BepInEx配置管理器完整指南:一键管理所有游戏模组设置 【免费下载链接】BepInEx.ConfigurationManager Plugin configuration manager for BepInEx 项目地址: https://gitcode.com/gh_mirrors/be/BepInEx.ConfigurationManager 你是否厌倦了为每个游戏模组单…...

2024三星固件下载完整指南:Bifrost跨平台工具终极解决方案

2024三星固件下载完整指南:Bifrost跨平台工具终极解决方案 【免费下载链接】Bifrost Cross-platform tool for downloading Samsung mobile device firmware. 项目地址: https://gitcode.com/gh_mirrors/sa/Bifrost 还在为三星设备固件下载而烦恼吗&#xff…...

ScriptHookV解决方案:如何安全扩展GTA V游戏功能而不修改原始文件

ScriptHookV解决方案:如何安全扩展GTA V游戏功能而不修改原始文件 【免费下载链接】ScriptHookV An open source hook into GTAV for loading offline mods 项目地址: https://gitcode.com/gh_mirrors/sc/ScriptHookV ScriptHookV是一个专为《侠盗猎车手V》&…...

生产环境最佳实践

生产环境最佳实践 前言 本文将介绍Spring Cloud Alibaba在生产环境中的最佳实践,包括配置优化、监控告警、高可用设计等方面。 一、高可用设计 1.1 服务端高可用 # Nacos集群配置 # 至少3个节点 # 推荐使用外部数据库spring:cloud:nacos:server-addr: nacos-1:8848,…...

Alibaba组件选型与架构设计

Alibaba组件选型与架构设计 前言 本文将总结Spring Cloud Alibaba各组件的特点,并根据不同业务场景提供选型建议和架构设计指导。 一、组件对比与选型 1.1 注册中心对比 特性NacosEurekaConsulCAP模型CP/AP可切换APCP多语言支持HTTP/DNSHTTPHTTP/DNS配置管理原生支持…...

【AI Daily】Arxiv论文研读Top5 | 2026-05-23

📚 每日学习汇总 | 2026-05-23(周6) 📊 今日概览 今日:周6,午读检索分类:cs.AI / q-bio.NC / cs.HC关键词:cognitive science behavioral AI alignment🔥 五篇精读速报 ①…...

手把手教你学 Simulink-- 开关磁阻电机(SRM)的转矩分配函数(TSF)控制仿真

目录 手把手教你学 Simulink-- 开关磁阻电机(SRM)的转矩分配函数(TSF)控制仿真 🔥 前言:为什么选 SRM+TSF? 一、SRM 基础:12/8 极结构与数学模型 1.1 电压方程(第 k 相) 1.2 转矩方程(强非线性) 二、TSF 核心原理:一句话讲透 2.1 四种常用 TSF 公式(含参数…...

生成式人工智能范式的双重异化风险与青年技术人才主体性困境 —— 基于技术伦理、数字殖民与产业社会学的复合分析

生成式人工智能范式的双重异化风险与青年技术人才主体性困境 —— 基于技术伦理、数字殖民与产业社会学的复合分析摘要随着生成式人工智能(Generative AI, GenAI)迭代加速,全球产业竞争逐步从技术性能比拼转向底层范式博弈。当前以西方中心主…...