UI自动化测试实战

Python接口自动化测试零基础入门到精通(2025最新版)

一、设计背景

随着IT行业的发展,产品愈渐复杂,web端业务及流程更加繁琐,目前UI测试仅是针对单一页面,操作量大。为了满足多页面功能及流程的需求及节省工时,设计了这款UI 自动化测试程序。旨在提供接口,集成到蜗牛自动化测试框架,方便用例的设计。

整个程序是基于 selenium 设计的。程序对 selenium 提供的接口进行了二次封装以满足日常的用例设计,二次封装后的接口解决了元素加载,元素定位解析等问题,可以让用例设计变得更加简捷。

之所以采用 Selenium 的模式。原因一,对于用户来说这是一个开源框架,很想窥探一二; 原因二,Selenium 可无缝接入。这是一个用于Web应用程序测试的工具,支持多平台、多浏览器、多语言去实现自动化测试,Selenium2将浏览器原生的API封装成WebDriver API,可以直接操作浏览器页面里的元素,甚至操作浏览器本身(截屏,窗口大小,启动,关闭之类的),所以就像真正的用户在操作一样。

目前支持:Mac、Windows操作系统,chrome、Firefox、IE浏览器。

二、工作原理

  • 在蜗牛管理后台添加测试用例。
  • 蜗牛管理后台测试用例执行调用任务执行接口,传送任务id及测试数据的JSON格式字符串给程序。
  • 程序根据获取数据,解析并处理。
  • 启动浏览器后,selenium-webdriver会将目标浏览器绑定到特定的端口,启动后的浏览器则作为webdriver的server。
  • 客户端(也就是测试脚本),借助ComandExecutor发送HTTP请求给server端(通信协议:The WebDriver Wire Protocol,在HTTP request的body中,会以WebDriver Wire协议规定的JSON格式的字符串来告诉Selenium,我们希望浏览器接下来做什么事情)。
  • Server端需要依赖原生的浏览器组件,转化Web Service的命令为浏览器native的调用来完成操作。
  • 最后将处理结果及任务id通过JSON字符串的格式返回给蜗牛,通过蜗牛的管理后台可查看每条用例执行结果。

三、框架介绍

3.1 工程结构

按照实际的业务流程调用对应接口来实现 WEB-UI 自动化测试用例。case 层可调用 service 层和 pageObject 层的接口,pageObject 是对每一个页面元素的一个封装,service 是对一个常用的业务模块功能的封装。比如一个查询企业信息的测试用例,需要依赖登入,这个业务功能就可以直接调用 service 中的接口。企业查询的创建就可以调用 pageObject 中的接口,然后按照查询的业务流程,在测试用例中把这些接口串起来就形成了一个 UI 自动化测试用例,详细细节接下去会举例说明。

如企业查询。查询之前,需要登入管理后台,登入操作已封装到业务层,直接调用 service 层的接口,不需要在意这个步骤的细节;登入之后要指定一个路径,找到对应的空间,直接调用 model 层的接口,不需要在意这个步骤的细节;接着是创建查询,创建查询的所有定位方法也封装到业务层,这就是个企业查询的实现,也是用例设计中最主要的环节。

整个工程基于 selenium,采用 pageObject 模式搭建。下面对工程中的几个重要模块做介绍。

3.1.1 driver — 接口层

对 web 页面所有元素的操作都是在driver定义接口并实现的。driver 对 selenium 提供的接口做了二次封装,对外提供封装后的接口。pageObject 实现了一些公共方法,比如给输入框赋值等,目前 pageObject封装的方法不多,大多功能都可以通过 selenium 实现。driver 层对开源工具接口做了二次封装,想要驱动一个浏览器还有一个必不可少的工具 —— 浏览器驱动,这个驱动放在 Referenced Libraries 里,驱动的版本必须与被测浏览器版本相匹配。

3.1.2 model — 数据模型

创建数据模型为了实现测试数据和测试用例分离而采取的一种方法,具体的测试数据初始化。可以对一个业务流程中需要测试数据的元素在一个 model 中定义出来,方便管理和代码阅读。

3.1.3 pageObject — 业务层

pageObject 模式,采用接口形式封装每一个页面需要用到的元素,实现封装只要做两步:

  • 确定元素的定位方式;
  • 调用 driver 中对应的操作接口。

driver 的接口实现包含了一定的容错能力,但并不是全面的,部分页面或者组件具有独特性,单纯调用 driver 的接口并不能保证测试用例的稳定性,此时就需要在 pageObject 的接口实现中加入一些容错算法,确保用例稳定性。

3.1.4 service — 提供业务功能

一个业务流程很多时候依赖其他业务模块功能,为了方便设计一个测试用例,也为了避免重复造轮子,service 层就提供了一些常用的业务功能,比如登入、企业查询等。依赖方只需要在 service 层调用即可。

3.2 功能优化

对selenium 做二次封装的同时也对接口做了优化,框架的初衷是使UI 用例的设计尽可能的易设计、易读、易维护。

3.2.1 接口优化

直接调用 selenium 的接口经常会遇到些令人头疼的问题,比如网络问题使页面 loading 太慢,需要操作的元素还没展示出来,这种情况就会经常报元素找不到的 error,导致用例执行失败,但实际上这种报错并不是一个 bug,其测试结果是无效的。为了减少误报率 driver 层接口设计了等待元素加载的功能,使用的关键方法:cf.searchForElementVisibleXpath(TestStartQuitwd.wd, "//*[text()='运营平台登录']", id, 200, 100L)。参考代码:

在 click、input 等操作接口中加入循环查找的判断可最大限度的等待一个元素的加载从而提高测试用例的稳定性。

3.2.2 元素定位统一入口

接触过 UI 自动化用例设计的测试人员会比较清楚,想通过 selenium 操作一个元素,其中必不可少的就是对元素定位的描述,通俗的讲就是要通知接口在当前页面操作哪个位置上的元素。定位一个元素的方法很多,常用的有 id,name,css,xpath 等,对应不同的定位方法selenium 在处理上也给出了不同接口,这从维护角度上来考虑显然不是最好的。最好的做法就是用例设计者只管元素定位和操作事件的调用,而事件在实现上走了哪种渠道最好是无感知,无需维护的。对此框架封装了一个方法供 driver 调用,主要功能就是解析描述元素的字符串自动判断是 id、css 还是 xpath。

3.3 元素定位

UI自动化用例其实可以分成两部分:定位元素;调用接口操作该元素。其中定位一个元素的方法很多,常用的有 id,name,css,xpath。实际设计中选择哪种定位方法一般会在维护角度上考虑的会多一些,因为现在的服务器性能配置等都很优秀,所以跑一个WEB-UI用例可以不用考虑性能问题。从维护成本上考虑会优先选择 id、name,其次 css,最后用 xpath。

我们不能保证每一个 web 系统的所有元素都能提供一个唯一 id 或 name,当然如果能和前端开发达成合作,这就是一件很美好的事情了。一般情况下我们都需要面对没有 id 和 name 这两个属性的情况。这时我们就可以使用 css 样式,很多时候 css 样式是能满足我们的定位需求。当然在这些都不提供给我们的情况下就只能选择 xpath,使用 xpath 的优点:

  • 易获取,主流浏览器只要打开“查看”就可以通过 copy 轻松获取到;
  • 页面上的元素都可以用 xpath 来描述;缺点,不稳定,大量使用会给用例维护产生很大的负担。

xpath 一般只要前端在页面上做一下小调整,用例就必须重新维护,在不得不使用 xpath 的情况下,为了减少今后的维护量,可对 xpath 做一些优化,可以减少 xpath 的路径长度提高稳定性。以下是实践过程中最长用到的几种类型:

  • 依靠自己的属性文本定位,如 //input[@value=‘XXXXX’]
  • 包含指示性字符,如 //input[contains(text(),’指示性字符’)]
  • 巧妙使用content,如 //*[@id=‘app-container']

四、常见报错

使用过程中经常会遇到问题,这里做下总结方便 debug。

  • 某些页面弹窗,有时候定位不到弹窗元素。理论上 selenium 在一个页面中查找一个元素是可以定位到,但有些时候出现弹窗,此时就需要在重新定位弹窗。解决方法:

  • 有些输入框不能被 input 接口正常操作。实践过程中在日历控件中遇到过,元素定位什么的都对,但就是不能正常被操作。解决方法:判断元素是否是select类型,之后再赋值。解决代码:

3.发现 selenium 的某些接口不能 work 了,此时最大的可能就是浏览器升级了。解决方法:重新下载低版本浏览器。

4.元素不可见。有一种元素能在页面上正常展示,但对于工具来说它是不可见的,这是因为在一般情况下,元素可见需要满足以下几个条件:visibility!=hidden ; display!=none; opacity!=0; height、width都大于0;对于 input 标签,没有 hidden 属性。如截图就是只读的实例。

解决方法:调用接口 TestStartQuitwd.js.executeScript("var txtN = document.getElementsByName("timeRange"); txtN[0].readOnly = false;"); 

五、结束语

UI自动化是在开源工具的基础上做了些优化,在 driver 层,数据层、业务层以及用例层的解决方案还有很大的提升空间。WEB-UI自动化还不完美,后期还需继续努力。感谢一直以来支持研究的小伙伴。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/92895.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/92895.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试实战,问题六,被问数据库索引,怎么回答

Java开发面试:数据库索引的原理及常见问题解答 在Java开发面试中,数据库索引是核心知识点,涉及数据库优化和性能调优。索引通过高效的数据结构加速数据检索,降低磁盘IO成本,并支持排序操作。下面我将逐步解释索引的原理…

ARM-I2C硬实现

硬件I2C-GD32F4系列的实现初始化操作在初始化函数里执行以下代码uint32_t i2cx_scl_port_rcu RCU_GPIOB; uint32_t i2cx_scl_port GPIOB; uint32_t i2cx_scl_pin GPIO_PIN_6; uint32_t i2cx_scl_af GPIO_AF_4;uint32_t i2cx_sda_port_rcu RCU_GPIOB; uint32_t i2cx_sda_po…

WinUI3开发_过渡动画

简介 过渡动画是当发生事件时控件UI状态发生改变时以一种动画形式来演变到另外一种状态,而非瞬间改变,使用一种更加平滑的方式来进行切换,例如下图是文字切换的交叉栅栏效果:还有页面切换动画:在或者是图标动画&#x…

Linux下提权root权限

现在AI工具这么丰富,稍微搜一下就有一个差不多的总结输出。但是,可能还不够详细,或者给得太多~~~今天时间关系,今天只总结了在Linux如何提权到root,并没有写如何进行防护。后面有时间,我再总结一下。命令实…

焊接机器人节能先锋

汽车制造业中,机器人技术的应用已成为推动工业自动化和生产效率提升的重要力量。机器人在焊接、组装、涂装等关键制造环节中扮演着不可或缺的角色。随着工业生产规模的不断扩大,能源消耗和成本控制成为了企业必须面对的重大挑战。尤其是工业焊接用气的大…

MinIO:云原生对象存储的终极指南

MinIO 是什么? MinIO 是一款高性能、云原生的对象存储服务,具有以下优势: 轻量级部署:采用 Go 语言编写,资源占用低,支持快速部署 兼容性强:完全兼容 Amazon S3 API,轻松对接现有应用 高可用架构:支持分布式部署,确保数据持久性和服务可用性 高性能表现:专为云环境…

Spring AOP `MethodInvocation` 工作原理

⚙️ 一、通知到 MethodInterceptor 的转换机制 Spring AOP 通过适配器模式将开发者定义的注解型通知(如 Before)统一转换为 MethodInterceptor 接口实现,确保所有通知类型能接入同一调用链。以下是转换细节: 1. 适配器实现原理 核…

PPO原论文阅读

一、Introduction1.目前存在的问题:(deep)Q-learning:在一些简单问题上表现不佳,可理解性差基础的policy gradient算法:(如REINFORCE)鲁棒性差,需要大量数据TRPO:复杂,在包含噪音&am…

零基础也能创作专属歌曲:文心一言+蘑兔AI协同教程

在AI技术飞速发展的今天,音乐创作已不再是专业音乐人的专属领域。通过文心一言与蘑兔AI的协同使用,即使没有音乐基础,也能轻松完成从歌词创作到作曲编曲的全流程。本文将详细拆解操作步骤,助你快速上手,实现音乐创作梦…

图论:搜索问题

提到图论中的搜索问题,首先想到的也就是DFS和BFS了,而提到这两种搜索,那么最典型的题目就是岛屿问题了,下面就练习几道相关的题目,为之后的更深奥的图论学习打下基础! 孤岛的总面积 题目链接:…

AI驱动攻防升级,API安全走到关键档口

在数字化转型与AI技术快速发展的双重驱动下,API已成为企业业务与外部世界连接的神经中枢。然而,随着API的深度应用,针对API的攻击规模与复杂性也在持续升级。 API为何频频成为黑客重点盯防的突破口?企业常见的API防护手段是否还能…

网络基础DAY18-动态路由协议基础

动态路由协议基础知识回顾:1.什么是路由? 答:是三层设备转发IP报文的路径信息。 2.路由有哪些来源? 答:1.直连路由2.静态路由3.动态路由 3.有直连路由的条件? 答:1.二层和三层物理接口状态为UP …

axios统一封装规范管理

新建/api/ 1.新建统一处理文件/api/axios.ts import axios from "axios"const http axios.create({baseURL: import.meta.env.VITE_API_BASE_URL, // 从环境变量读取timeout: 10000, });// 请求拦截器(如添加 Token) http.interceptors.reque…

Java学习第七十四部分——Elasticsearch(ES)

目录 一、前言提要 二、核心特性 三、应用场景 四、主要优势 五、集成方式 六、基础操作 七、高级特性 八、概念类比——与关系型数据库 九、简单示例——实现存储与搜索 十、生态集成——基于Spring Data Elasticsearch 十一、性能优化建议 十二、总结归纳概述 一…

TDengine 转化函数 TO_UNIXTIMESTAMP 用户手册

TDengine TO_UNIXTIMESTAMP 函数用户使用手册 函数概述 TO_UNIXTIMESTAMP 是 TDengine 中的标量函数,用于将符合 ISO8601/RFC3339 标准的日期时间字符串转换为 Unix 时间戳。与 TO_TIMESTAMP 不同,该函数专门处理标准格式的时间字符串,无需指…

Java 中的排序算法详解

目录 一、冒泡排序(Bubble Sort) 原理​ 二、选择排序(Selection Sort) 原理​ 三、插入排序(Insertion Sort) 原理​ 四、快速排序(Quick Sort) 原理​ 五、归并排序&…

Gitee如何成为国内企业DevOps转型的首选平台?

Gitee如何成为国内企业DevOps转型的首选平台? 在数字化转型浪潮中,DevOps已成为提升企业研发效能的关键引擎。作为国内领先的代码托管与协作平台,Gitee凭借本土化优势与全流程支持能力,正成为越来越多企业DevOps实践的核心载体。本…

​Excel——SUMPRODUCT 函数

SUMPRODUCT 是 Excel 中最强大的函数之一,可以用于 ​多条件求和、加权计算、数组运算​ 等复杂场景。下面通过 ​基础语法 实用案例​ 彻底讲透它的用法!​一、基础语法​SUMPRODUCT(数组1, [数组2], [数组3], ...)​功能​:将多个数组的对…

告别虚函数性能焦虑:深入剖析C++多态的现代设计模式

🚀 引言:当多态遇上性能瓶颈 我经常被问到这样一个问题:“既然virtual函数这么方便,为什么在一些高性能场景下,大家却避之不及?” 答案很简单:性能。 在我参与的多个HPC项目和游戏引擎开发中,virtual函数调用往往成为性能分析工具中最显眼的那个红点。一个看似无害…

k8s-MongoDB 副本集部署

前提准备一套 k8s 集群worker 节点上的 /nfs/data 目录挂载到磁盘一、NFS 高可用方案(NFSkeepalivedSersync)本方案 NFS 的高可用方案,应用服务器为 Client ,两台文件服务器分别 Master 和 Slave,使用 keepalived 生成…