对没有标记为安全的activex控件进行初始化和脚本运行_Appium学废系列(四) 如何写出优雅又健壮的脚本...

‍ ‍ c500044d9f5532b0be4498bee929d4a4.png     正文共:3716字  预计阅读时间:10分钟

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节点定位,就可以找到页面中任何一个元素

ac3609f7836e41f518e2fc6a068a17b5.png

移动时代,同样也是类似DOM结构,与XML是有差别的但整体是相似的,所以与传统的web定位是一样的,仍然需要去了解元素里面的关键属性

36845d2d000a58a2c6bfac03a54582fa.png

现在我们已经知道元素定位的原理了,就是:当我们去定位一个控件时,本质就是使用一个关键的组件去识别它;获取页面上所有的组件,对于每一个组件,都找到一个关键的标记,去检索到它就可以了 所以,Appium给我们提供了常见的,根据关键属性去定位的几个方式: 1、id(重要) 2、accessibility ID:content-desc(重要) 3、XPath(重要) class在移动端几乎没有用,同时Appium也支持图像识别和AI识别(有组件支持),我们往后再去学习。 有了定位符号之后怎么使用他它呢, 通常一个测试用例是有多个测试步骤的,然后每个测试步骤有三要素: 1、定位: 各种定位方法定位元素 2、交互: 点击、滑动、输入等操作 3、断言: 完成自动化的步骤之后,需要对结果进行断言

6a3c29d0b50e0c6a5f46274a6e3c8edc.png

分析安卓UI automator2 定位逻辑源码,查看每个定位方式实际的使用什么元素定位

59d214219c8bbe56d4263f4027df97dc.png

由于xpath的处理逻辑非常复杂,所以他的定位方法是慢很多的(1s~5s),并且xpath表达式过长,维护也会更困难。

最后一个是安卓的原生定位符,跟他的平台绑定太严格,不太建议使用

常见的元素定位符定位方法都用: 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单元测试脚本代码。

31e6d0ead93da9f19a1bf08b7cef1c39.png4d6ae9e2e5b0d20c24ca979f27d6d823.png

我记得你看我的眼神是的,我记得
我记得我们抓到一颗流星是的,我记得
我记得我们分享的一切
我们只答应你和我

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

以防走丢,请及时 星标 置顶 关注 我

 098ffa812e58824161b8c966aa4aaec2.png

你这么可爱,点个三连再走呗~
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值