自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(133)
  • 收藏
  • 关注

原创 【日常学习】10-15 学习re

正则会从data-value中的value开始匹配 —— 只要这个字符片段连续存在,不管前后是什么;正则之所以 “不分value和data-value”,是因为它没有 HTML 语义理解能力,只认字符模式;你真正需要的是 “给正则加边界约束”(如\b或\w)),让它只匹配 “前面没有字母 / 符号” 的value,也就是独立的value属性,从而排除data-value中的无关片段。简单说:不是正则 “不能从value看起”,而是它 “看得太随意”,需要我们给它 “划边界”,让它只看 “对的。

2025-10-15 15:41:24 919

原创 【日常学习】10-14 Locator类

_init__是Locator# 方式1:直接传 by(定位方式)和 value(定位路径)else:# 方式2:传 location 字符串(如 "xpath=//button[text()='确定']")# 解析 location 字符串,拆分定位方式和路径loc_type = location.split('=', 1)[0].strip() # 提取定位方式(如 "xpath")self.__by = by_Dict[loc_type] # 映射为框架/底层工具的 By 类型。

2025-10-14 10:11:02 638

原创 【日常学习】10.13 查找元素

的本质是 “元素引用与实际 DOM 元素不同步不依赖 “旧引用”,通过 “重新查找” 或 “等待新元素” 确保操作时引用有效。这是自动化测试中处理动态页面的必备技巧。三、python参数弱类型@retry()这个函数为什可以写jump_page == "xsc" jump_page不是一个布尔类型的参数吗在 Python 中,函数参数的 “类型” 是动态的(弱类型)—— 虽然jump_page的默认值是布尔类型True,但调用函数时可以传入任意类型的值(包括字符串)。这就是为什么代码中可以写。

2025-10-13 11:15:39 860

原创 【日常学习】UI自动化自定义异常类

return exception # 已是自定义异常,直接返回# 把 Python 内置异常(如 ValueError、TimeoutError)转成自定义格式作用框架中可能抛出 Python 内置异常(如KeyError),此方法将其统一转为格式,保证异常处理逻辑一致。# 收集断言失败的上下文(如哪个方法的断言错了)context_info = UIAutoBaseException.get_caller_context("AssertionError", '数据比对异常')

2025-09-26 15:34:48 964

原创 【日常学习】9-25 Locator对象和魔法方法

用于控制对象在print()str()repr()时的输出格式,核心是方便调试和用户理解。魔法方法作用触发场景用户友好的字符串:用于print(obj)或str(obj),侧重 “给用户看”。print(obj)str(obj)调试友好的字符串:用于repr(obj)或交互式解释器,侧重 “给开发者看”。repr(obj)、控制台直接输对象名自定义格式化输出:用于或 f-string。# 用户看:简洁描述。

2025-09-25 14:20:51 907

原创 【日常学习】表头组件(下)- 输入验证和字段值的操作

验证 “表单字段的实际值” 是否与 “预期值(expect)” 一致。校验表单字段值:根据expect(预期值)的类型(普通值 / 字典),分别执行 “单字段校验” 或 “多字段关联校验”,判断实际值是否符合预期,不一致则抛出断言失败。

2025-09-22 10:49:29 898

原创 【日常学习】表头组件(上)-输入调用全流程

input_comp = value # 直接复用传入的Input实例input_comp.ctrl = ctrl # 为实例绑定前面获取的控件实例# 若“最后一个控件不按回车”开关开启,且当前是最后一个字段场景部分表单的 “最后一个字段” 输入后按回车会触发表单提交(而非保存输入),需关闭 “回车确认” 功能。目的:控制最后一个字段的输入行为,避免误触发表单提交。

2025-09-19 15:37:07 682

原创 【数据结构基础习题】-1- 数据结构基本操作

int *data;// 存储数据的数组int front;// 队头指针int rear;// 队尾指针// 数组容量int size;// 队列中元素个数。

2025-09-07 21:51:48 1267

原创 【日常学习8】2025-9-3 学习控件Day2

输入控件分为:输入控件基类,输入控件类,具体输入定位器,像xxxLoc这个控件就是具体输入控件inputctrl,是定位器通过xpath得来的具体框元素。而OnlyInput这个控件就是输入控件类,不需要传入具体inputctrl定位,由父类获取具体文本框/文本域,别的类型交给radio checkbox控件类。radio里面有具体的定位器,类方法里根据不同的情况选择不同的定位器,比如:是一个,主要用于管理系统中各类消息项(如通知、提醒等)的启用或停用状态,支持批量操作和状态校验。

2025-09-02 17:29:22 841

原创 【日常学习】2025-9-2 学习控件Day1

定位规则1:默认的“添加附件”控件定位方式(通过XPATH找元素)By.XPATH, # 定位方式:用XPATH路径'.//input[@type="checkbox"]/parent::span', # 具体路径:找类型为checkbox的input标签的父级span元素wait=10 # 最多等10秒,直到元素出现# 定位规则2:子控件的定位方式(可能用于页面上有多个附件选项的场景,比如“发票”“合同”两个附件类型)By.XPATH,

2025-09-02 15:07:42 1044

原创 【日常学习】2025 8-29 认识输入控件设计模式

枚举类(InputTypeExpectType)的核心作用是“用常量替代硬编码字符串”,避免拼写错误,同时让代码更易读、易维护。直接输入 = None # 普通文本输入(如 input 标签的键盘输入)扫码输入 = "扫码输入" # 扫码枪输入(如商品条码扫描)商品条码输入 = "商品条码输入" # 专门针对商品条码的输入参照输入 = "参照输入" # 从参照列表选择(如下拉框选择客户)参照新增 = "参照新增" # 从参照列表新增选项(如新增客户后选择)

2025-09-01 10:43:58 806

原创 【日常学习】2025-8-27 测开框架设计模式探索04

chromedriver是浏览器驱动程序,selenium代码发送的自动化指令通过它翻译成浏览器能识别的底层命令,浏览器执行。反之,浏览器的执行结果也需要通过浏览器内核反馈给代码这个原生的类的实例化就是driver驱动实例化:1)发送请求: 把调用的方法封装成符合Webdriver协议的请求发给浏览器内核2)接受结果: 反之也能反馈浏览器操作结果给代码,是浏览器内核和代码之间的桥梁。

2025-08-27 17:27:58 973

原创 【日常学习】2025-8-26 上下文工厂 异常本质

定义自定义异常(继承自 Exception)pass # 暂时不需要额外逻辑必须继承Exception或其子类(如ValueError),不能直接继承(它包含等系统级异常,通常不建议捕获)。实际使用中,异常需要携带错误详情(比如 “哪里错了”),可以通过__init__"""自定义异常:表示年龄输入错误"""# 用实例属性存储错误信息self.message = msg # 后续可以通过 e.message 获取错误详情# 定义异常# 函数中触发异常。

2025-08-27 11:26:53 746

原创 【日常学习】2025-8-25 测开框架设计模式摸索02

重写__new__的核心是在实例创建前介入控制单例模式:控制实例的 “唯一性”;继承不可变类型:控制实例的 “初始值”;特殊处理:在实例创建前执行校验、日志等前置逻辑。这些场景都依赖__new__作为 “实例创建入口” 的特性,而__init__仅负责实例创建后的初始化,无法替代__new__的作用。七、类是如何被元类创造的元类的__new__是 “类的创造者”,而普通类的__new__是 “实例的创造者”。

2025-08-25 11:07:44 707

原创 【数据结构】-4-顺序表(上)

顺序表本质是基于数组实现的线性表,核心需要三个要素:存储数据的容器、记录元素个数的变量和默认容量。// 存储数据的数组,是顺序表的底层容器// 记录有效元素的个数,也是下一个可插入位置的索引// 默认容量,当不指定容量时使用// ... 后续方法实现elem数组作为底层存储容器,利用其连续内存的特性usedSize既表示元素个数,也作为下一个元素的插入位置提供默认初始容量super(msg);继承,属于运行时异常(无需强制try-catch,但建议主动处理)。

2025-08-24 22:57:43 931

原创 【数据结构】-5- 顺序表 (下)

ArrayList底层用数组实现,但它作为 “集合” 提供的是更高层次的抽象功能(动态管理)。而toArray()的作用是在需要时 “降级” 到数组层面,利用数组的特性(工具类支持、固定长度、具体类型)来满足特定场景需求。简单说:集合是 “包装好的数组”,方便日常使用;toArray()是 “拆包装” 的工具,让我们在需要时能直接操作里面的 “数组内核”。三、toArray()在 Java 集合框架中,toArray()是 Collection接口(所有集合类的顶层接口,如ArrayList。

2025-08-24 21:50:54 754

原创 【日常学习】2025-8-22 类属性和实例属性+小白学调试

类中定义的类型提示:通过告诉开发者,这个属性预期是list类型(提高代码可读性和 IDE 提示能力);默认初始值:当实例未显式设置该属性时,默认值为None(明确属性的初始状态)。子类完全可以重写父类的属性,这是面向对象中 “继承 + 定制” 的核心用法。在你的框架中,这种机制让不同类型的元素(按钮、输入框等)能在共享父类基础功能的同时,拥有自己的专属配置,既减少重复代码,又保证了灵活性。四、调试有学问!调试是理解代码流程最直接有效的方法,尤其是对于复杂框架。

2025-08-22 16:24:48 985

原创 【日常学习】2025-8-20 框架中控件子类实例化设计

作为所有元素类的基类,主要提供基础属性定义和实例初始化逻辑# 元素定位器(比如By.XPATH、By.ID)cache = False # 是否缓存元素page_container_loc = Locator(...) # 页面容器定位器(通用元素)page_title_loc = Locator(...) # 页面标题定位器(通用元素)instance。

2025-08-22 10:15:53 819

原创 【日常学习】2025-8-21 了解些测试名词

接口测试验证 “后端逻辑的正确性”(数据处理、业务规则),是产品的 “里子”,保证功能的核心逻辑不出错;UI 测试验证 “前端交互的正确性与体验”(用户操作流程、界面状态、视觉效果),是产品的 “面子”,保证用户能正常、顺畅地使用这些功能。没有接口测试,后端逻辑可能漏洞百出;没有 UI 测试,即使后端逻辑完美,用户也可能因为界面问题无法使用。二者结合,才能从 “功能可用” 和 “用户能用” 两个维度全面保障产品质量。三、环境在软件开发和运维中,不同 “环境” 本质上是。

2025-08-21 15:27:09 744

原创 【日常学习】2025-8-21 质量保证体系

二、什么是全链路一、测开的质量保证体系1. 需求与设计阶段:预防 “源头性质量问题”:需求管理工具(Jira/Confluence)、思维导图(梳理测试点)、用例管理平台(TestRail / 自研平台)。2. 开发阶段:拦截 “代码级质量问题”:CI 工具(Jenkins/GitLab CI)、单元测试框架(JUnit/pytest)、静态扫描工具(SonarQube)、契约测试工具(Pact)。3. 测试阶段:系统化验证 “功能与非功能质量”

2025-08-21 14:29:18 970

原创 【日常学习】 2025-8-19 测开框架设计模式摸索01

已知父对象实例被激活,他的各种属性是各种控件的实例化对象,为什么要这样做呢?父类对象.属性=控件类实例化(instance,self传父类)因为控件自己是静态的没有驱动的,让他们成为父对象的属性,就可以通过属性.方法(self)去传递父对象的驱动,就可以跑了.而且可以管理上下文,访问父页面状态.这种 “控件类负责控件能力,页面类负责流程组合” 的设计,让框架的扩展成本极低,符合 “开放 - 封闭原则”(对扩展开放,对修改关闭)。五、抽象类不会被 Python 识别为抽象类(因为元类不是。

2025-08-20 10:51:17 622

原创 [日常学习] -2025-8-18- 页面元类和装饰器工厂

简单说,所有用自动带上element(元素实例)和parent(父级对象)两个基础属性,统一管理元素关系。除了最基础的类,其他子类的普通方法(比如 “查询”“点击”)都会被装饰,自动记录操作步骤。这样做的目的是让所有页面类保持统一的基础结构,同时自动添加测试步骤记录功能,减少重复代码,让框架更规范。二、搞清楚这个元类里面的装饰器装饰器本质是 “一个包装其他函数的函数”,作用是在不修改原函数代码的情况下,给函数添加额外功能(比如日志、计时、权限校验等)。

2025-08-19 10:00:05 731

原创 【JavaSE】-10- 接口语法进阶

利用Comparable接口,让Student类自身具备 “按年龄排序” 的能力。通过触发排序,底层会调用Student的compareTo方法。若需切换排序规则(如按姓名),可通过传入Comparator实现(体现了 “比较器的灵活性”)。三、实战:自定义冒泡排序这段代码的核心是利用Comparable接口实现 “通用排序”四、浅拷贝和深拷贝bubbleSort方法不关心具体排序的对象类型,只要对象实现了Comparable,就能通过compareTo比较并排序。

2025-08-18 10:02:40 760

原创 【JAVASE】-9- 接口语法基础

接口是一种引用数据类型,使用interface// 接口内容接口通过 “多实现” 的特性,让 Java 类能在不违反 “单继承” 规则的前提下,灵活组合多种行为,从而弥补了单继承无法实现 “多行为复用” 的缺陷,间接解决了 “多继承” 场景下的需求。六、接口继承接口,类实现接口。

2025-08-17 20:59:19 1019

原创 【数据结构】-3- 泛型的使用

Person// 泛型数组,存储栈元素// 当前栈中元素数量// 默认初始容量// ...:声明泛型类,T是类型参数,表示栈中元素的类型elements:泛型数组,用于实际存储元素(核心是使用泛型数组实现动态存储)size:记录当前栈中元素的数量(也表示下一个元素的插入位置):默认初始容量(当不指定容量时使用)泛型数组创建:通过反射实现,解决了new T[]无法直接使用的问题类型安全:通过Class<T>类型令牌和泛型参数T,确保栈只能存储指定类型的元素动态扩容 / 缩容:通过。

2025-08-17 11:44:24 873

原创 【数据结构】-2- 泛型

编译器校验构造参数的类型是否与泛型声明一致,是因为这属于静态类型声明的范畴,能在编译期快速排除明显的类型不匹配错误。而构造方法内部如何使用参数(逻辑是否正确)是运行时行为,编译器无法干预。这种 “只看声明,不看逻辑” 的设计,是静态类型语言平衡编译效率和类型安全的必然选择 —— 既保证了基本的类型安全,又避免了编译期过度分析代码逻辑导致的效率低下。三、Java 泛型在编译时和运行时保障类型安全的互补机制编译器自动插入(String)转换,是为了。

2025-08-16 21:44:26 883

原创 【web自动化】-2- 浏览器的操作和元素交互

让复杂 Python 对象(如列表嵌套字典)能以 “通用、安全、跨场景” 的方式持久化到文件,并在需要时可靠还原。虽然多了 “转 JSON 写文件 → 读文件转 Python 对象” 的步骤,但解决了 “Python 对象无法直接写文件” 和 “跨语言 / 跨场景复用” 的关键问题。

2025-08-15 17:27:24 689

原创 【web自动化】-8-EXCEL数据驱动

钩子函数能识别 “测试用例名称行” 和 “Excel 有明确的格式约定:用 “标记列” 的值(如namemark)区分特殊行。钩子函数内有判断逻辑:在执行每一行时,先检查 “标记列”,若匹配特殊行的约定,就执行对应的配置逻辑(记录名称、加载 Fixture),而非页面操作。这种 “约定 + 逻辑判断” 的方式,让 Excel 既能配置测试元信息(名称、Fixture),又能编写具体步骤,实现了 “无代码化” 的测试用例管理。示例代码中确实没有直接写if name或if mark的判断逻辑,这是因为。

2025-08-15 16:05:16 1168

原创 【web自动化】-9- 自定义钩子函数

上层框架能识别中的被pytest自动扫描,其中的函数会被自动注册;函数名与框架预先定义的 “钩子规范” 完全匹配;框架在特定阶段(如测试用例执行时)通过pytest的钩子管理器主动调用该钩子。这种机制让你无需手动关联 “钩子定义” 和 “钩子实现”,只需遵循命名规范,pytest会自动完成识别和调用。二、钩子函数调用的多播机制pytest原生框架pytset_collect_file钩子# 调用所有注册的pytest_xlsx_run_step钩子(包括conftest.py中的实现)

2025-08-15 15:36:29 887

原创 【web自动化】-1- 前端基础及selenium原理和环境安装

web 自动化测试是指使用自动化测试的工具或者框架,通过编写脚本模拟用户在 web 页面上进行任意操作特点: web 自动化测试是一种比较高效,准确,可重复性的测试方法,降低成本,提高效率,并且缩短测试周期,包括后期的维护。

2025-08-14 11:59:46 805

原创 【unittest】了解unittest框架

unittest是 “规范严谨的老派选手”,适合简单场景、依赖管理严格或团队习惯类继承风格的项目。pytest是 “灵活强大的现代工具”,适合追求效率、复杂测试场景或需要丰富插件的项目。实际开发中,pytest因灵活性和生态优势,逐渐成为更受欢迎的选择,但两者都能满足基本测试需求,关键是结合团队习惯和项目特点选择。

2025-08-14 10:29:38 1146

原创 【日常学习】2025-8-13

必须使用。

2025-08-13 17:15:27 665

原创 【接口自动化】-12- 多环境 日志以及框架的完善

这套优化方案的核心是 **“把‘写死的基础路径’从代码 / 用例中抽离,集中到配置文件(pytest.ini),再通过工具函数动态读取”**,解决了多环境、多模块下基础路径管理的痛点,是接口自动化测试框架 “解耦、可维护” 的关键设计。二、日志这段总结提炼了接口自动化的核心设计思想与技术关键通过 “YAML + 反射” 实现 “零代码封装”,降低使用门槛。依靠 “接口关联、断言、数据驱动” 保障测试的 “流程连贯性、结果有效性、场景覆盖度”。采用 “三层架构” 让框架 “易维护、易扩展”。

2025-08-13 11:53:21 1061

原创 【接口自动化】-11-接口加密签名 全局设置封装

这段代码的核心流程是:加载公钥 → 数据转为字节 → RSA加密 → Base64编码 → 返回字符串作用是将敏感数据(如密码)通过 RSA 加密,转换为可传输的字符串,确保接口传输过程中的安全性。替换public.pem路径,使用自己的公钥文件。在接口测试用例中调用该函数,加密需要保护的参数。结合私钥解密代码(通常在服务器端),验证加密是否正确。

2025-08-12 23:20:12 1083

原创 【接口自动化】-10- 流程用例和DDT数据驱动

用例类型YAML 结构核心关键字执行特点单接口用例[{}](一个字典的列表)无执行一次,测试单个接口数据驱动用例parametrize: [[表头],[数据]]执行多次,测试同一接口多场景流程用例(多个字典的列表)上下文(context)按顺序执行,测试接口流程feature: 论坛模块story: 登陆接口title: 验证phpwind登陆接口成功返回request:data:username: $ddt{username} # 动态替换的参数。

2025-08-12 14:39:18 953

原创 【接口自动化】-9- 框架的异常捕获调优 Allure报告

feature: "微信接口" # 对应 allure.featurestory: "Token 管理" # 对应 allure.storytitle: "获取 AccessToken" # 对应 allure.titleparams:核心关联YAML 中的featurestorytitle字段,通过解析后,被方法注入报告。这段代码的核心是“为 Allure 报告动态注入元数据”,让测试报告从 “代码级日志” 升级为 “业务级结构化报告”。通过 YAML 定义featurestorytitle。

2025-08-12 09:24:32 883

原创 【接口自动化】-8- 断言封装

用例定义:在 YAML 里写清楚 “怎么请求、提取什么、断言什么”。用例执行:框架解析 YAML,发送请求,拿到响应。断言执行:断言工具根据规则,自动对比 “预期值” 和 “实际响应值”,不通过则抛出异常。二、数据库操作封装(连接 + 执行 SQL)db_equalsvalidate:db_equals:断言数据库新增用户: ["SELECT email FROM user WHERE name='test'", json.email]

2025-08-11 16:36:47 762

原创 【接口自动化】-7- 热加载和日志封装

解决模板替换缺陷:保留字符串类型,支持二次处理(加密、随机数 )。零代码扩展:测试人员只需改 YAML,就能调用 Python 函数实现复杂逻辑。流程更灵活:从 “固定变量替换” 升级为 “动态函数调用”,适配更多接口场景(如加密接口、随机数接口 )。核心就是“在 YAML 里写 Python 函数调用,通过动态反射执行函数,替换字符串”,实现了 “用 YAML 控制 Python 逻辑” 的黑魔法 ✨三、热加载代码实现的详细解析。

2025-08-11 10:53:08 912

原创 【接口自动化】-6- 接口关联的变量使用

选择${变量名}兼容主流工具(Postman/JMeter )的语法习惯。正则匹配简单,模板引擎容易实现。解耦变量定义和使用,让框架更灵活、更易扩展。这也是为什么很多自动化测试框架(如 Robot Framework、HttpRunner )都采用类似的${变量名}语法 —— 本质是一套经过验证的 “最佳实践”。三、为什么要先转Yaml再转字典。

2025-08-10 14:27:11 801

原创 【接口自动化】-5- 接口关联处理

深拷贝响应:确保原始响应数据不被修改,避免影响其他逻辑。动态提取来源:通过attr_name(如jsontext)灵活选择提取数据的来源(响应 JSON、响应文本等 )。多提取方式支持:同时兼容 jsonpath(适合 JSON 响应 )和正则(适合文本响应 )。结果持久化:提取的变量写入 YAML,供后续接口通过read_yaml使用,实现接口关联。四、重点解释:反射动态性:根据 YAML 里的attr_name,动态决定从响应对象的哪个属性提取数据,无需写死判断。扩展性:新增提取来源(如。

2025-08-10 12:21:13 610

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除