web自动化测试入门篇05——元素定位的配置管理

😏作者简介:博主是一位测试管理者,同时也是一名对外企业兼职讲师。
📡主页地址:【Austin_zhai】
🙆目的与景愿:旨在于能帮助更多的测试行业人员提升软硬技能,分享行业相关最新信息。
💎声明:博主日常工作较为繁忙,文章会不定期更新,各类行业或职场问题欢迎大家私信,有空必回。
阅读目录
- 1. 目的
- 2. 管理方法
- 3. 配置方法
- 4. 方法实现
- 5. 使用注意点
1. 目的
web自动化测试作为软件自动化测试领域中绕不过去的一个“香饽饽”,通常都会作为广大测试从业者的首选学习对象,相较于C/S架构的自动化来说,B/S有着其无法忽视的诸多优势,从行业发展趋、研发模式特点、测试工具支持,其整体的完整生态已经远远超过了C/S架构方面的测试价值。
接下来我们在上一次的基础之上,对已经初具雏形的自动化代码进行补充和优化,利用python的特性来对定位元素的管理方法进行设计并讲解其中的思路与注意点。
2. 管理方法
一般来说,界面元素的信息管理方法比较常见的有配置文件、持久化、专项平台和工具等。如何取舍大家也是众说纷纭,但既然我们使用了python这门语言,那么就要好好利用其优势,将管理的成本(人力、耗时等)降到最低。相较于一般文本,我们可以使用ini格式的配置文件来对已知晓具体信息的元素进行统一的管理,将业务代码与界面元素进行有效分离,减少后期因需求变动而发生的大量维护工作。
通过以上所说的方法,我们可以将大部分常用的元素信息录入进配置文件,即使后期产品或项目发生了变更,我们也可以灵活应对。举个例子,如果产品或项目发生了逻辑与功能的变更,那么我们只修改业务代码即可;若是发生了UI变更,我们也只需要修改对应的配置文件。这样的低耦合自动化框架才可以有效的提升日常的测试团队工作效率。
另外,鉴于大部分团队内会有多名测开角色的存在,在定义配置文件之初,也应该有效的开展团队内的讨论,将配置文件的一些总要因素(编写与命名规范、存放路径等)进行充分的认知统一与整合。以防在后期使用时出现元素名不同而无法找到等等诸如此类的低级错误。
3. 配置方法
接下来我们先来看下一般的配置文件内都需要写哪些内容,下图展示的是登录页面的相关元素定位信息,这里还是给大家说一下,如果系统的规模不是太大的话建议还是把所有的元素信息放在一个配置文件内进行管理,不宜进行多路径多文件的分散处理。
文件的格式基本就是ini的配置格式,内容由多个section构成(方括号内),每个section内可以存在多个配置项,每一条配置项由配置项名称、定位方法、定位值组成。配置项名称不用多解释,在代码中会直接使用到,可以简单的理解为类似变量名,后面的id则是定位方法,这里不拘泥于id,如果要使用其他的定位方式,改成对应的方法即可,具体的定位方法可以参看前一篇中的get_element方法。当中的冒号则只是方便后期在业务代码中进行取值的分割,不强制使用冒号,其他符号均可。最后的是定位值,也就是开发同学在开发界面中各类元素的对应属性的属性值,这里要注意的是,值必须和你前面指定的方法相对应,千万不能搞错。

这里举个简单的例子,比如LoginPageElement类中有一个get_element的方法,那我们将原有的业务代码内元素转化为配置文件的方法为:
log_pg_ele = LoginPageElement('chrome')
log_pg_ele.get_element('id', 'transaction_log_treaty')

是不是很简单,因为在原有的get_element方法内,我们已经定义了相关的定位方法与定位值这两个参数,所以根据配置文件的配置项组成方式可以进行无缝转换,无须再进行额外的操作。
4. 方法实现
有了对应的配置文件,我们就可以使用python来设计实现相关的配置解析与元素调用方法。这里我们先将对应的ini文件创建在各自项目指定的目录中,再啰嗦一次,如果是团队公用,文件名与存放路径需要统一。
假设我的配置文件名为FundManSys.ini,存放在项目的conf文件夹下。我们在使用python解析配置文件之前,需要先安装对应的功能模块。这里我们使用configparser这个库,它可以读取解析我们一般的ini类配置文件。
无论是python interpreter亦或是pip install都可以,安装完成之后我们开始进行整体的功能设计与实现。
首先,我们先将读取配置文件的功能进行实现。这里我创建了一个类,但没有写出来,我们直接展示其内的方法,名字什么的大家可以自由发挥, 构造函数中将需要指定的节点名称带入,如果不指定名称,则带入特定值。第二段代码通过调用方法ConfigParser来读取解析配置文件,read()内填写配置文件的路径与文件名,这里设置了变量,最后将整个对象返回出来。
def __init__(self, section=None):if section:self.section = sectionelse:self.section = 'business_log_v2'def load_ini(self):cf = configparser.ConfigParser()cf.read(ini_file)return cf
那么取得对象之后我们如何调用里面的信息呢,接下来就需要对其内进行进一步的处理实现。这里使用了链式写法,不这么写的话也可以在构造函数中的定义一个变量来接收load_ini方法中返回的对象。section和key两个参数也不用多说了吧,分别对应的已经很明显了。
def get_data(self, key):data = self.load_ini().get(self.section, key)return data
基本的配置文件解析功能就设计封装好了,是不是很简单?那么我们拿到想要数据之后如何实际结合至现有的元素操作代码中去呢,紧接着我们就可以开始将业务代码与实际配置功能进行对接了。
我们把之前设计的get_element方法进行优化,添加取得数据并处理的操作。
这里实例化的load_ini因为没有指定节点名,就会默认使用business_log_v2节点名。这里已经将原来的方法参数进行变更,可以看到变更后的参数变少了,原有的by与ele两个参数也被配置项中的定位方法与定位值所替代,这也就是我们要达到的目的。具体变化大家可以对比前一篇中的get_element方法。
def get_element(self, key):element = Noneload_ini = EleConfiguration()data = load_ini.get_data(key)by, ele = data.split(':')try:if by == 'id':element = self.driver.find_element(By.ID, ele)elif by == 'name':element = self.driver.find_element(By.NAME, ele)elif by == 'css':element = self.driver.find_element(By.CSS_SELECTOR, ele)elif by == 'class':element = self.driver.find_element(By.CLASS_NAME, ele)else:element = self.driver.find_element(By.XPATH, ele)except:session.add(ele_err_msg)session.commit()return element
至此我们的整体配置管理设计已经完成,真实的使用过程中我们只需要根据自己的实际场景进行页面业务逻辑的代码编写即可,无论是何种界面业务操作都可以直接实例化并调用get_element方法来进行元素定位了,并且由于真实元素信息与业务代码分开的关系,整体的可读性与维护性也是大大提升。
5. 使用注意点
1.python2与3的版本内configparser模块的名字不同,有大小写之分,需要注意,2是ConfigParser,3是configparser;
2.配置项内的键值对如果连接符号使用冒号,注意中英文状态,以免出现使用中文冒号而意外报错的情况出现;
3.配置文件中不要设置过多的section名,过多的名称容易让配置文件的内容过于混乱,不予与维护;
4.与其说注意更不如说是规范,配置文件内的各类名称尽量都使用英文来定义,和编写代码的命名意义差不多,拼音不应该出现在此类的配置文件内。
相关文章:
web自动化测试入门篇05——元素定位的配置管理
😏作者简介:博主是一位测试管理者,同时也是一名对外企业兼职讲师。 📡主页地址:【Austin_zhai】 🙆目的与景愿:旨在于能帮助更多的测试行业人员提升软硬技能,分享行业相关最新信息。…...
C语言预处理
文章目录 目录 文章目录 前言 一、程序编译的过程 二、编译阶段 1.预处理(*.i) 2.编译(*.s) 3.汇编(*.o) 4.链接 总结 前言 提示:使用vs code(gcc编译器)与vs2022来演示c语言的预处理 提示:以下是本篇文章正文内容,下面…...
git报错大全,你将要踩的坑我都帮你踩了系列
使用git push -u origin master报下面的错: 使用git push -u origin master报下面的错: Updates were rejected because the remote contains work that you do not have locally,This is usually caused by another repository pushing to …...
LabVIEW中使用.NET方法时出现错误1316
LabVIEW中使用.NET方法时出现错误1316为什么不能调用带有泛型参数的方法?LabVIEW不支持哪些.NET功能?为什么会收到以下错误:发生此错误的原因是正在调用LabVIEW中不支持的.NET功能。有关解决方法,请参阅“其他信息”部分。可以在下…...
HTTP2.0 相比 HTTP1.0、HTTP1.1 有哪些重大改进?值得升级更换吗?
目录 HTTP1.0 HTTP1.1 HTTP2.0 主要特性对比 HTTP发展历史 HTTP2解决的问题 HTTP1.0 HTTP1.1 HTTP2.0...
九、Linux文件 - fopen函数和fclose函数讲解
目录 1.fopen函数 2.fclose函数 3.fopen函数和fclose实战 1.fopen函数 fopen fwrite fread fclose ...属于标准C库 include <stdio.h> standard io lib open close write read 属于Linux系统调用 可移植型:fopen > open(open函数只在嵌入…...
轨迹预测算法vectorNet调研报告
前言 传统的行为预测方法是规则的,基于道路结构的约束生成多个行为假设。最近,很多基于学习的预测方法被提出。他们提出了对于不同行为假设的进行概率解释的好处,但是需要重构一个新的表示来编码地图和轨迹信息。有趣的是,虽然高精…...
基于STM32设计的避障寻迹小车
一、前言 1.1 项目背景 根据美国玩具协会在一项研究中,过去几年全球玩具销售增长与GDP的世界平均水平大致相同。但全球玩具市场的内部结构已经占据了巨大的位置变化:传统玩具的市场份额正在下降,高科技电子玩具正在蓬勃发展。全球玩具市场的…...
【视觉检测】使用opencv编写一个图片缺陷检测流程
1. 导入必要的库,如OpenCV,NumPy等。 2. 使用OpenCV读取图像,并将其转换为灰度图像。 3. 使用OpenCV的Canny边缘检测算法检测图像中的边缘。 4. 使用OpenCV的Hough变换算法检测图像中的线条。 5. 使用OpenCV的模板匹配算法检测图像中的缺…...
3.Dockerfile 定制镜像
3. Dockerfile 定制镜像 从上一节的docker commit的学习中,我们可以了解到,镜像的定制实际上就是定制每一层所添加的配置、文件等信息,但是命令毕竟只是命令,每次定制都得去重复执行这个命令,而且还不够直观ÿ…...
Web基础与HTTP协议
Web基础与HTTP协议一、Web基础与HTTP概述1、域名概念二、域名服务与域名注册1、域名定义2、域名服务三、网页访问(http、https)1、网页概述2、网页的基本标签四、Web1、Web概述2、Web1.0 Web2.0五、HTTP协议概述1、HTTP协议简介2、HTTP协议请求总结一、W…...
【化学试剂】endo-BCN-PEG4-Pomalidomide,(1R,8S,9S)-双环[6.1.0]壬-四聚乙二醇-泊马度胺纯度95%+
一、基础产品数据(Basic Product Data):CAS号:N/A中文名:(1R,8S,9S)-双环[6.1.0]壬-四聚乙二醇-泊马度胺英文名:endo-BCN-PEG4-Pomalidomide二、详细产品数据(Detailed Product Data)…...
全板电镀与图形电镀,到底有什么区别?
衔接上文,继续为朋友们分享普通单双面板的生产工艺流程。 如图,第四道主流程为电镀。 电镀的目的为: 适当地加厚孔内与板面的铜厚,使孔金属化,从而实现层间互连。 至于其子流程,可以说是非常简单&#x…...
Zabbix 构建监控告警平台(二)--
Apache监控示例(图形监控)模板TemplateZabbix Items 1.Apache监控示例(图形监控) 1.1创建主机组 在“配置”->“主机群组”->“创建主机群组” 填入组名“webserver_test” 创建完成之后可以在“配置”->"主机群组&…...
开学季,关于校园防诈骗宣传,如何组织一场微信线上答题考试
开学季,关于校园防诈骗宣传,如何组织一场微信线上答题考试如何组织一场微信线上答题考试在线考试是一种非常节约成本的考试方式,考生通过微信扫码即可参加培训考试,不受时间、空间的限制,近几年越来越受企事业单位以及…...
蓝牙单点技术实现路径介绍
本文主要介绍蓝牙设备与手机一对一相连的 蓝牙单点 技术。 准备工作 系统要求:蓝牙使用需要安卓 4.3 以及以上版本,智能生活 App SDK 从安卓 4.4 开始支持。Manifest 权限: <uses-permission android:name"android.permission.ACCE…...
Ubuntu22.04 用 `hwclock` 或 `timedatectl` 来设置RTC硬件时钟为本地时区
Ubuntu22.04用 hwclock 或 timedatectl 来设置硬件时区为本地时区 可以用hwclock命令 sudo hwclock --localtime --systohc👆效果等同👇 , --localtime的简写是-l ; --systohc的简写是-w sudo hwclock -l -w也可以用timedatectl命令 👆效果…...
Node=>Express路由 学习2
1.概念 Express路由指的是客户端的请求与服务器处理函数之间的映射关系 Express路由由三部分组成 请求类型 请求URL地址 处理函数 app.METHOD ( PATH , HANDLER )根据定义的先后顺序进行匹配 请求类型和请求的URl同时匹配成功才会调用相应的处理函数 简单用法 2.模块化路由 为了…...
Android 面试三部曲——你做到了几点?
今天的干货来点轻松一点的,这次的分享是《面试需要哪些准备?》,主要分为三个部分: 面试前。面试中。面试后。 面试前 1、『工作经验中的职位要层层递进:初、中、高、资深级』🍒 2.投简历 你的简历必须要…...
windeployqt实现一键打包
每次发布QT程序前,都必须要在命令行环境下运行windeployqt 工具进行打包,加载相关的lib文件,才能正常运行。但是在命令行模式下,每次都要手动输入windeployqt的目录,和应用程序的位置目录,效率非常低,见下图: 那QT有没有什么好用的工具可以避免这个问题呢,认真找了一下…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
