UI自动化测试遇弹窗怎么办?这个解决方法你get到了没? 您所在的位置:网站首页 手机弹窗是什么原因 UI自动化测试遇弹窗怎么办?这个解决方法你get到了没?

UI自动化测试遇弹窗怎么办?这个解决方法你get到了没?

2024-06-03 11:39| 来源: 网络整理| 查看: 265

目录

引言

弹窗的种类:

APP内的业务弹窗

弹窗处理

watcher的使用

实战案例

软件测试技术的准备和建议

一、测试基础

二、Linux必备知识

三、Shell脚本

四、互联网程序原理

五、MySQL数据库

六、抓包工具

七、接口测试工具

八、Web自动化测试Java&Python

九、接口与移动端自动化

十、敏捷测试&TestOps构建

十一、性能测试&安全测试

引言

在UI自动化测试中遇到弹窗其实是一件非常常见的事情,不同的弹窗类型和弹出时机都会影响我们的测试结果和用例稳定性。

如果不能及时处理这些弹窗,就有可能导致测试用例失败,甚至直接影响整个测试流程。

本文将向大家介绍如何快速、便捷地解决所有弹窗的问题,让你的UI自动化测试用例稳定如一。

无论你是新手还是老手,只要认真阅读并掌握这个方法,相信你都能在日后的UI自动化测试中游刃有余,轻松应对各种弹窗的情况。

弹窗的种类:

安装APP时的系统弹窗 此类弹窗一般有两种,一种是自动化测试框初始化本身也需要安装一些APP,比如uiautomator2会安装atx-agent、com.github.uiautomator,这些弹窗在初始化环境的时候可以手动点掉,case里不需要关注。另一种就是安装我们的被测app,像下面这种

都是我们不得不去处理的,不然,自动化也就是不自动了。 APP启动时的权限弹窗

这类弹窗是APP在启动时会申请一些基础的权限

APP内的业务弹窗 弹窗处理

本文使用的是uiautomator2这个自动化框架,它提供了一种watcher对象,可以用来配置要监控的元素,这里我们配置要监控的就是页面上的弹窗,下面来看看具体怎么做。

watcher的使用 # 常用写法,注册匿名监控 d.watcher.when("安装").click() # 注册名为ANR的监控,当出现ANR和Force Close时,点击Force Close d.watcher("ANR").when(xpath="ANR").when("Force Close").click() # 其他回调例子 d.watcher.when("抢红包").press("back") d.watcher.when("//*[@text = 'Out of memory']").call(lambda d: d.shell('am force-stop com.im.qq')) # 回调说明 def click_callback(d: u2.Device): d.xpath("确定").click() # 在回调中调用不会再次触发watcher d.xpath("继续").click() # 使用d.xpath检查元素的时候,会触发watcher(目前最多触发5次 # 移除ANR的监控 d.watcher.remove("ANR") # 移除所有的监控 d.watcher.remove() # 开始后台监控 d.watcher.start() d.watcher.start(2.0) # 默认监控间隔2.0s # 强制运行所有监控 d.watcher.run() # 停止监控 d.watcher.stop() # 停止并移除所有的监控,常用于初始化 d.watcher.reset()

上面是watcher的一些常用api以及解释,来源于github。嘻嘻,自己懒的写了。

实战案例

下面我们用B站apk为例,处理从安装到登录后的一系列弹窗。

import uiautomator2 as u2 import os import time base_dir = os.path.dirname(__file__) apk_path = os.path.join(base_dir, 'apks/bilibili.apk') d = u2.connect_usb(serial='MDX0220924018819') # 从安装到登录成功后,可能会出现的弹窗,在这里进行注册,这个是华为手机出现的弹窗类型 d.watcher.when('继续安装').click() d.watcher.when('完成').click() d.watcher.when('同意并继续').click() d.watcher.when("我知道了").click() d.watcher.start() d.app_install(apk_path) d.app_start('tv.danmaku.bili') d(text='我的').click() time.sleep(3) if d(resourceId="tv.danmaku.bili:id/btn_change_account").exists: d(resourceId="tv.danmaku.bili:id/btn_change_account").click() else: d(resourceId="tv.danmaku.bili:id/tv_login").click() time.sleep(3) d(resourceId="tv.danmaku.bili:id/username").set_text('xxxxxxxxx') d(resourceId="tv.danmaku.bili:id/userpwd").set_text('xxxxxxxx') d(resourceId="tv.danmaku.bili:id/log_reg_checkbox").click() time.sleep(2) d(resourceId="tv.danmaku.bili:id/btn_login").click() d(text='首页').click()

弹窗处理的核心思想是,起一个线程,不停的监听页面上有没有弹窗出现,出现了就点击,或点击取消或点击确认等等。

uiautomator2处理弹窗的核心思想

采用了后台运行了一个线程的方法(依赖threading库),然后每隔一段时间dump一次hierarchy,匹配到元素之后执行相应的操作。

class Watcher(): def __init__(self, d: "uiautomator2.Device"): self._d = d self._watchers = [] self._watch_stop_event = threading.Event() self._watch_stopped = threading.Event() self._watching = False # func start is calling self._triggering = False self.logger = setup_logger() self.logger.setLevel(logging.INFO) def when(self, xpath=None): return XPathWatcher(self, xpath)

Watcher对象个self._watchers 属性来维护所有要监控的元素,d.watcher.when('继续安装')当我们调用when方法后会返回一个XPathWatcher对象,然后再调用这个对象的click方法实现对监控元素的操作。

class XPathWatcher(): def __init__(self, parent: Watcher, xpath: str, name: str = ''): self._name = name self._parent = parent self._xpath_list = [xpath] if xpath else [] def when(self, xpath=None): self._xpath_list.append(xpath) return self def call(self, func): """ func accept argument, key(d, el) d=self._d, el=element """ self._parent._watchers.append({ "name": self._name, "xpaths": self._xpath_list, "callback": func, }) def click(self): def _inner_click(selector): selector.get_last_match().click() self.call(_inner_click)

click方法就是将点击的操作放到回调函数,然后调用XPathWatcher对象的call方法,这个方法会生成一个监控规则,并将监控规则放到我们前面提到的Watcher对象的self._watchers 属性。

def start(self, interval: float = 2.0): """ stop watcher """ if self._watching: self.logger.warning("already started") return self._watching = True th = threading.Thread(name="watcher", target=self._watch_forever, args=(interval, )) th.daemon = True th.start() return th

再然后调用Watcher对象的的start方法,开启一个线程,按照指定间隔时间从页面dump信息,查看是否有要监控的元素,找到后调用回调函数。

以上是我们关于弹窗处理的一些操作,但是有没有发现,上面实战哪里写的是有问题,难道每一次有新的弹窗都要在这里写一行代码么,还有是不是能适配不同机型呢?

下期文章会对这里进行一下重构以及如何兼容不同机型,敬请期待。

软件测试技术的准备和建议

接下来我将分享一下这些年来,我对于技术一些归纳和总结,和自己对作为一名 高级测试工程师需要掌握那些技能的笔记分享,希望能帮助到有心在技术这条道路上一路走到黑的朋友!

一、测试基础

了解测试的基础技能,掌握主流缺陷管理工具的使用,熟练测试环境的操作与运维

bug捕手测试基础测试计划/测试用例黑盒用例设计等价类/边界值/场景分析/判定表/因果图分析/错误推断缺陷缺陷生命周期/缺陷分级/缺陷管理工具禅道/Jira数据库Mysql/环境搭建/增删改查/关联查询/存储过程Linux系统搭建/基本指令/日志分析/环境搭建 二、Linux必备知识

Linux作为现在最流行的软件环境系统,一定需要掌握,目前的招聘要求都需要有Linux能力。

bug捕手Linux必备知识Linux系统简介与准备Linux作为现在最流行的软件环境系统,一定得会,从CenterOS版本系统进行介绍,安装,目录结构等基础内容学起,也为后续自建测试环境准备。Linux远程工具Xshell详细介绍如何入门使用Linux,并进行常规的远程管理,文件传输操作,涉及其中的工具Xshell,XftpLinux文件属性与管理详细介绍如何入门使用Linux,并进行常规的远程管理,文件传输操作,涉及其中的工具Xshell,Xftp-Linux文件属性与管理详细介绍如何入门使用Linux,并进行常规的远程管理,文件传输操作,涉及其中的工具Xshell,XftpLinux文件属性与管理Linux文件,目录基本属性,文件操作,文件管理,目录操作,目录管理。切忌自毁行为操作,如何预防意外操作Linux用户与组管理如何在Linux中新增,删除,修改用户与组,并赋予相应权限,不再因为权限问题而卡壳--Linux文件编辑器Linux文件编辑器vi的使用,命令模式,输入模式,操作实例,快捷键,管道命令,使用心得。在一个没有图形化的系统下到底如何编辑的呢?Linux常用系统设置网络设置,环境变量,磁盘管理,时间设置,系统资源,防火墙,应有尽有,不用担心毫无头绪。Linux安装软件Linux安装命令,以及如何通过tar,gz等网络上下载的安装文件进行安装,如MySQL数据库安装。Linux Docker容器Docker容器技术讲解,image镜像管理,仓库,容器创建,启动,操作,镜像打包,赶上行业流行技术 三、Shell脚本

掌握Shell脚本:包括Shell基础与运用、Shell逻辑控制、Shell逻辑函数

bug捕手ShellLinux Shell基础与应用shell脚本编程介绍,环境类型,变量,参数,运算符,数组的使用,零距离接触脚本Linux Shell逻辑控制shell逻辑应用,test命令,流程控制,数据输入与输出,脚本逻辑不再单调,玩出花样Linux Shell函数-shell脚本函数写法,文件互相调用,脚本实战应用,懂得开发,测试,运维都可以做什么Windows 脚本批处理inux玩够了,再来看看Windows常规命令用法,批处理脚本写法,实战应用,并不是到哪都是Linux,Windows脚本也是常用脚本之一,看到这里可能你就用的Windows 四、互联网程序原理

自动化必经之路:前端开发基础知识以及互联网网络必备知识

bug捕手互联网程序原理Web前端开发基础HTML、CSS基本内容学习。为什么测试课程有开发?对不起,如果不会,自动化可能不欢迎,很多自动化测试问题都出自于开发基础Web前端开发脚本JavaScript最主流的脚本学习,同样的,这也会在自动化测试中涉及,在一些工具中其实也经常用到动态脚本,也是JavaScript语言开发者调试工具测试应用JavaScript最主流的脚本学习,同样的,这也会在自动化测试中涉及,在一些工具中其实也经常用到动态脚本,也是JavaScript语言开发者调试工具测试应用虽然浏览器的F12被命名为开发者工具,但实际上测试不管在功能测试还是自动化测试中,都起到了很关键的作用。如解析HTML,定位元素,调试脚本,监控网络抓包等等互联网程序网络架构通过网络架构详细理解互联网程序的诞生,逻辑细节,互联网通讯原理又是如何将数据传递到其他计算机的,TCP,UCP,HTTP,等等协议的关系又是什么。HTTP协议数据结构分析--完整解析HTTP协议数据结构,包括Request、Response数据格式,Header的定义和用法各种状态代表什么,如何辨别错误。分析协议中参数的位置,rest结构,各种常见的body数据形式,解析方式,常见数据解析错误的原因。Cookie与Session机制解读Cookie到底是什么,和Session存在什么样的关系,如何测试Cookie与Session,需要注意什么 五、MySQL数据库

软件测试工程师必备MySQL数据库知识,不仅仅停留在基本的“增删改查”。

bug捕手MySQL数据库MySQL数据库测试应用MySQL环境搭建,客户端Navicat的基本使用与数据操作,学习并巩固基本的SQL语法,增删改查缺一不可,掌握各种条件的使用方法-MySQL高级查询查询升级,掌握多表查询,子查询,查询分组,统计函数的使用,并对经典面试题进行学习与分析MySQL自定义函数既然有内置函数,当然也不缺自定义函数的位置,也是经常会使用到的,这就好比任意一种开发语言一样都离不开函数的定义与使用MySQL存储过程SP数据库必不可少的存储过程,通常也叫SP,如何定义?如何测试?怎么样使用更安全,测试到底用存储过程还能做什么更多便于测试的内容MySQL事物与编程数据库事务使用案例,索引的原理与使用,数据库SQL编程在测试中的应用,如何用其快速精准的产生大量指定的测试数据 六、抓包工具

Fiddler,Wireshark,Sniffer,Tcpdump各种抓包工具适用于各种项目,总有一款适合你的

bug捕手抓包工具抓包原理与方式只有了解抓包的原理,才能真正去用好一个适合的工具,选择合适的方向和方法,否则都是徒劳的抓包工具选择抓包工具的分类与功效,什么样的项目适合哪种工具,如何去辨别工具的优势Fiddler基础功能作为专业的HTTP体系的抓包工具,详细介绍其工具原理,如何过滤数据,如何搜索想要的数据,如何对web,非web,手机,HTTPS协议等各种环境进行抓包Fiddler高级功能学会使用其进行接口测试,断电,脚本等方式进行数据的修改,替换,模拟数据进行接口Mock测试,创建自己定义的菜单功能Wireshark与其说是抓包,更是一种抓包后的分析工具,在各个系统下利用其它与系统一体化的抓包工具进行数据抓取整理并展示,有着强大的过滤和分析功能Sniffe黑科技抓包工具,有多种版本,非常专业的抓包工具TcpdumpLinux、Android系列的系统中的抓包插件神器 七、接口测试工具

接口测试神器,你绕不开的强大工具:Jmeter。小巧灵活:Postman

bug捕手接口测试工具Jmeter接口测试入门Jmeter简介,环境准备,目录结构介绍 ,如何录制脚本,以及基础组件的使用,线程、作用域、HTTP请求、定时器、断言等等Jmeter接口测试进阶使用Jmeter逻辑控制、前置处理器、后置处理器、监视器、结果树,如何参数化、正则表达式关联、事务、检查点等等。并带领大家对带有token等动态数据的项目进行实战演练Jmeter接口测试高级功能Jmeter脚本思考时间、随机时间、线程启动间隔、并发集合点、联机远程调用,webservice、websocket、jdbc、命令调用等等Postman接口测试工具使用行业标准HTTP、rest接口测试神器,基本请求、分组保存、动态变量、脚本、数据关联、参数化、自动断言、批量运行、持续集成。思路类似其他接口工具,避免泛滥学习 八、Web自动化测试Java&Python

了解自动化的目的,熟练掌握TestNG&unittest自动化框架,以及断言与日志处理

bug捕手Web自动化测试Java&Python自动化框架思路引导我们做自动化到底为了什么?节省人力、加快速度、还是让机器代替手动、还是提升自我。应该如何建立思路,而非无脑进坑任机器摆布Java&Python3开发环境及基本语法Java&Python开发环境搭建,基础语法入门,让不会代码的以最快速度入门,方便适应后续自动化测试开发内容学习,代码够用即可,并不是学得越多越好Java&Python3集合类型与面向对象开发Java&Python各种基本类型、集合数据类型的理解与操作,循环语句、判断语句,面向对象的开发,函数的使用,类的使用Selenium3环境与浏览器驱动配置基于selenium3的web自动化环境搭建,正确的浏览器配置,不再为起不了浏览器而烦恼。支持IE、Firefox、Chrome等等Selenium3多种定位及动态操作基于selenium3的web自动化环境搭建,正确的浏览器配置,不再为起不了浏览器而烦恼。支持IE、Firefox、Chrome等等Selenium3多种定位及动态操作selenium3常见定位方法,属性和值的获取,如何动态判断不一定存在的元素,复杂的网页结构,需要多步骤操作的元素等等Selenium3环境与浏览器驱动配置基于selenium3的web自动化环境搭建,正确的浏览器配置,不再为起不了浏览器而烦恼。支持IE、Firefox、Chrome等等特殊情况处理(js、特殊控件等)selenium3自动化测试中,常见的特殊情况处理,如日期、控件、智能等待、文件上传下载、网页嵌套结构,各种弹窗的处理方式,cookie处理,JavaScript脚本调用等TestNG&unittest自动化框架使用Python unittest、Java TestNG自动化框架的使用,环境处理、基本使用逻辑,数据驱动模型,数据库数据载入等自动化框架断言与日志处理自动化中最重要的是什么?作为测试当然是断言,没有断言的自动化毫无用处,如何展示日志与结果是自动化测试的根本PageObject框架设计模式PageObject框架设计模式,到底是做什么的?如何更好的快速管理控件,从此做起 九、接口与移动端自动化

专业接口调用、测试解决方案。组建完整的web和接口自动化框架,Appium整体使用

bug捕手接口与移动端自动化接口自动化方案RequestsPython Requests、Java HTTPclient接口框架,都是专业的接口调用、测试的解决方案,使用简单快速,结合工具的使用方式和功能,快速上手并对其操作,解决其中的疑难杂症web+自动化框架整合自动化测试是相通的,如何将web与接口、甚至更多的测试类型和方向结合起来,组成完整的自动化框架Appium环境搭建Appium环境相对复杂,针对Android系统进行完整的环境搭建演练,解决环境上的问题,并进行基本的自动化操作Appium自动化实战与框架结合Appium整体使用与web自动化类似,引导使用典型功能,并针对一款APP进行实战操作 十、敏捷测试&TestOps构建

揭开TestOps的神秘面纱,持续集成Jenkins框架烂熟于心

bug捕手敏捷测试&TestOps构建构建敏捷测试运维架构体系敏捷测试是什么?为什么需要敏捷,行业都提到的devops又是什么?TestOps能做什么持续集成Jenkins框架实战持续集成最常见的一套框架,介绍Jenkins操作、权限、系统管理等,常用构建与运行实例讲解静态扫描测试Sonar一款自动化的代码扫描工具,便捷式快速扫描代码中的问题,做到提前发现,统一规范,自动化中的代码测试神器 十一、性能测试&安全测试

软件测试的彼岸:性能测试和安全测试,选个方向努力爬坑吧!

bug捕手性能测试&安全测试性能测试学习路线如何学习性能测试,性能测试到底该怎么学习,使用什么工具?工具并不代表性能,接口的基础对性能测试非常重要,而工具只是辅助,更多的是思路和策略。你不会并不是分析而是准备阶段loadrunner脱离浏览器录制专题E无法启动被测网站?打不开浏览器?程序无法在浏览器中被打开?这些都没关系,还是一样能录制,但录制是偷懒专用的,对于学习有一定的辅助作用,也会带入无法脱离的坑性能测试工具操作实践loadrunner、jmeter,有了前面的基础使用,看懂脚本不是问题,带上关键的参数化、动态数据关联、事物、日志,大部分的脚本都可以搞定进行实践系统监控方案实施工具自带监控?系统监控?JVM内部监控?数据库监控?各种监控的意义何在,如何在各种情况下精准监控数据安全测试起源与工具介绍应该如何进行安全测试,安全测试都有哪些分类?都会用到什么样的工具,各自的作用又是什么,如web漏洞扫描,端口扫描,系统扫描等web安全测试手工实战接口测试在安全中的作用,不会手动的安全测试,那就永远无法理解自动化以后产出的结果安全扫描工具测试实践实际介绍以及使用APPscan、awvs等专业安全扫描工具企业安全建设(SDLC)企业应该如何进行安全建设,制定更安全的软件生命周期。从哪些方面进行着手安全扫描工具测试实践实际介绍以及使用APPscan、awvs等专业安全扫描工具企业安全建设(SDLC)企业应该如何进行安全建设,制定更安全的软件生命周期。从哪些方面进行着手

希望大家能照着这个体系在1-2年内完成这样一个体系的构建。可以说,这个过程会让你痛不欲生,但只要你熬过去了。以后的生活就轻松很多。正所谓万事开头难,只要迈出了第一步,你就已经成功了一半,古人说的好“不积跬步,无以至千里。”等到完成之后再回顾这一段路程的时候,你肯定会感慨良多。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有