正文共:3716字 预计阅读时间:10分钟
我记得我们抓到一颗流星是的,我记得
我记得我们分享的一切
我们只答应你和我
![c500044d9f5532b0be4498bee929d4a4.png](https://img-blog.csdnimg.cn/img_convert/c500044d9f5532b0be4498bee929d4a4.png)
1
合理使用appium自动化等待方法
在自动化测试脚本的运行过程中,webdriver操作浏览器的时候,对于元素的定位是有一定的超时时间,大致应该在1-3秒的样子,如果这个时间内仍然定位不到元素,就会抛出异常,中止脚本执行。 我们可以通过在脚本中设置等待的方式来避免由于网络延迟或浏览器卡顿导致的偶然失败,常用的等待方式有三种强制等待
强制等待是利用python语言自带的time库中的sleep()方法:import timetime.sleep(3)
sleep()顾名思义就是睡觉的意思,就是脚本一旦执行到条语句sleep(10)就睡10s,再执行后面的语句,他是一个强制等待的方式,使得整个脚本暂停。
但是这种方式会导致这个脚本运行时间过长,不到万不得已尽可能少用,特殊情况下,时间设置最好不超过1秒,一般0.5秒。
隐式等待
隐式等待(全局):服务端会在特定的超时时间内重试多次寻找控件driver.implicitly_wait(20)
隐式等待相比强制等待更智能,顾名思义,在脚本中我们一般看不到等待语句,但是它会在每个页面加载的时候自动等待;
隐式等待只需要声明一次,一般在打开浏览器后进行声明。声明之后对整个drvier的生命周期都有效,后面不用重复声明。
implicitly_wait()方法用来等待页面加载完成(直观的就是浏览器tab页上的小圈圈转完)
如driver.implicitly_wait(20),超时时间20s,20秒内一旦加载完成,就执行下一条语句,如果20秒内页面都没有加载完,就超时抛出异常。
但是隐式等待依然存在一个问题,那就是程序会一直等待整个页面加载完成,也就是一般情况下你看到浏览器标签栏那个小圈不再转,才会执行下一步 有时候页面想要的元素早就在加载完成了,但是因为个别js之类的东西特别慢,我仍得等到页面全部完成才能执行下一步。所以,这里webdriver提供了一种更加智能的等待方式:显示等待
显示等待
在一个超时时间范围内,每隔一段时间去搜索一次元素是否存在,如果存在返回定位对象,如果不存在直到超时时间到达,报超时异常错误。
// 在Appium中用了Selenium中造的轮子(显示等待)// 方法:WebDriverWait(driver, timeout, poll_frequency).until(method)//参数:1.driver:手机驱动对象2.timeout:搜索超时时间3.poll_frequency:每次搜索间隔时间,默认时间为0.5s4.method:定位方法(匿名函数
// 使用示例:from selenium.webdriver.support.wait import WebDriverWaitWebDriverWait(driver, timeout, poll_frequency).until(lambda x: x.find_elements_by_id(id_value))
等待方法的应用在app脚本自动化里面非常重要,通过不同的场景使用不同的等待方法,才能使得用例更加的健壮。
2
使用稳定的控件定位方法
常见定位方法主要是:id、accessibility ID、XPath
为什么这三个元素可以定位到控件,我们首先要了解UI界面控件的基础知识。 在最早的控件体系是来自于web网页,DOM对象它其实就是把界面的所有元素使用一个标准的文档和格式对他进行表示,可以通过他去解析和渲染 打开网页里面所能看到的一个个组件、标签本质底层对应都是文档节点,DOM结构实际都是用XML表示的,也因为所有的节点都是使用XML表示,所以我们就可以使用xpath来去表示XML节点定位,就可以找到页面中任何一个元素分析安卓UI automator2 定位逻辑源码,查看每个定位方式实际的使用什么元素定位
最后一个是安卓的原生定位符,跟他的平台绑定太严格,不太建议使用
常见的元素定位符定位方法都用: 1、findElementByxxxx: 写法简单,编写速度快 2、findElement(by,value) : 主要用于page Object模式作准备的,他可以得到元素的定位方法,和元素的查找过程进行分离,也是行业内的最常用的方式。 有了这些知识,我们就可以利用这些知识逐渐去完善、优化已有的录制出来的用例,比如说脚本里面很多的xpath是我们录制工具自动生成的,这些工具本身录制的过程中并没有考虑足够好的可维护性,录制出来xpath的有可能是一个长的表达式,那我们就可以改用用更短 更容易维护的id、accessibility ID等定位方式3
使用单元测试框架pytest重构代码
当我们使用appium-desktop录制好脚本,并使用上述的控件定位方法和等待方法优化代码了以后,我们还可以使用单元测试框架pytest去重构,使代码规范、项目完整度、稳定程度上升到另一个层次。 步骤: 1、Python版本的客户端安装:Pip install Appium-python-client
2、安装PyCharm IDE:
https://www.jetbrains.com/pycharm/download/#section=windows
3、
在appium-desktop中 把录制的脚本代码下载下来
4、代码放到PyCharm 新建的python文件中
5、国内依赖源: 使用豆瓣依赖源下载依赖,
解决错误,导入包
如下述demo脚本,我们可以用单元测试框架进行重构
from appium import webdriver# 配置capabilitycaps = {}caps["platformName"] = "Android"caps["platformVersion"] = "8.0.0"caps["appPackage"] = "com.gkeeper.client"caps["appActivity"] = "com.gkeeper.client.ui.main.IndexActivity"caps["deviceName"] = "WGY0217C11001442"caps["noReset"] = "true"caps["autoGrantPermissions"] = "true"# 生成driver对象driver = webdriver.Remote("http://localhost:4723/wd/hub", caps)# 隐式等待driver.implicitly_wait(50)# 找到元素,发送点击事件 el1 = driver.find_element_by_id("com.gkeeper.client:id/iv_close")el1.click()el2 = driver.find_element_by_id("com.gkeeper.client:id/rc_conversation_title")el2.click()# session结束driver.quit()
参考网址
:
https://github.com/appium/appium/tree/master/sample-code/python
参考demo可以发现,我们使用pytest的前置函数、自动化脚本函数封装、断言机制等去重构代码,再加上使用更加稳定的控件定位方法ID、accessibility ID,针对不用场景运用appium自动化等待方法,可以得到相对优雅且健壮的UI单元测试脚本代码。
课
间
时
刻
我记得你看我的眼神是的,我记得我记得我们抓到一颗流星是的,我记得
我记得我们分享的一切
我们只答应你和我
I remember the way you glance at me yes I remember
I remember when we caught a shooting star yes I remember
I remember all the things that we shared
and the promise we made just you and I
美国励志剧情电视剧《女王的棋局》
End
以防走丢,请及时 星标 置顶 关注 我