获取元素定位方式,是UI自动化测试过程中最重要的一步,如果无法获取有效的定位方式,其它操作将无从进行。
通常在使用Appium框架进行自动化测试时,我们依赖GUI工具Appium Inspector、UIAutomatorViewer来获取元素属性,经过分析验证,从而得到正确的定位方式。
使用GUI工具获取元素定位
美好的想法
安装Appium环境,并能正常运行demo;
安装appium GUI客户端;
使用Appium Inspector或者UIAutomatorViewer获取Android版本App元素属性;
使用Appium Inspector获取IOS版本App 元素属性;
分析元素属性,得到定位方式;
将定位方式添加到测试脚本,运行测试。
如果一切顺利,重复以上过程,元素定位自然不是问题。然而,理想很丰满,现实很骨感,过程往往是非常痛苦的。
痛苦的过程
(安装过程的痛处,不是本文重点,在这就不多说了)
用Appium Inspector在真机上运行并定位元素的时候,不管App有没有安装,都会重新安装,而Appium安装启动App的过程是非常耗时的;
使用Linux系统开发时,由于Appium Inspector无Linux版本,只能通过UIAutomatorViewer工具来获取Android页面元素属性,然而,有的元素就是那么任性:期望的属性都没有!想通过name和id定位是行不通了。
有的元素是有text和id属性的,不过中文汉字显示成了“?”
这样的话,需要先解决了这个编码问题。
打开Appium Inspector,无奈报错“Could Not Launch Appium Inspector”,经过检查,app path以及关键参数已经设置,还是无法打开。所以想要通过Appium Inspector获取元素属性,只能上网搜索一番,先解决了这个问题。
在解决了Appium Inspector无法启动问题以及UIAutomatorViewer编码问题后,对于既没有name,也没有ID属性的元素,只能通过分析,得到xpath,添加进脚本试用,确认定位信息是否准确。而这时,就不可避免的遇到NoSuchElement错误。
如果通过分析元素属性得到的xpath无法准确定位,只能采用万能的page source方法,根据source继续分析,得到定位方式,再来验证。
@property
defpage_source(self):
"""
Gets the source of the current page.
:Usage:
driver.page_source
"""returnself.execute(Command.GET_PAGE_SOURCE)['value']
以上列举了一些使用GUI工具Appium Inspector和UIAutomatorViewer获取元素定位方法的一些问题,虽说问题都能一一被解决,但花费的时间以及不断重复获取精确定位的过程,让人不能忍,如果有人真不幸的一一遇到了,那么使用新的方法来获取定位方式,便迫在眉睫了。
新方法的实践
1、期望的获取方式
在App指定的界面,解析页面并获取所有元素的定位方式
对分析到的元素定位方式进行验证
确认定位信息无误后添加进自动化脚本中
2、解决思路
配置Desired Capabilities,并启动Appium Server
运行App并调整到指定界面
通过source = driver.page_source获取页面source
分析页面source,得到该页面所有元素的定位方法,可根据ID>name>text>xpath的顺序
指定得到的定位元素方式,执行click操作,观察交互是否正确
将正确的定位方式添加进测试脚本
3、如何实现(主要代码)
如何解析source
Android也是同样的思路,直接获取属性clickable为True的元素。
对得到的定位方式进行验证
4、以demo为例说明
打开app后界面
根据分析得到的定位方式
选择11,验证定位信息是否正确
执行click操作,跳转到buttons页面,说明定位信息准确,可添加进脚本
5、该方法解决的主要问题
Appium Inspector以及UIAutimatorViewer工具,因环境问题带来的困扰;
UIAutimatorViewer无法直接获取xpath的不足;
获取定位方式后可以直接判断是否准确。
6、该方法带来的几个主要问题以及改善
以上是通过xpath得到的定位信息,可以根据需要进行修改,建议ID优先;
对于无明显特征的定位信息,无法判断属于页面哪个元素,需要根据元素类型如button或者页面元素显示顺序,来猜测是哪个元素。如果能与开发约定元素id,相信获取元素定位,将事半功倍。
小结
以上主要根据使用工具获取元素定位方式的各种痛处,探索了一种新的获取元素定位的思路,希望能通过对该思路不断的优化、改进和完善,解决获取定位的烦恼,从而高效的完成自动化测试工作。
本文作者:李吉兵(点融黑帮),现任点融网测试开发工程师,主要从事App自动化测试,测试框架以及工具开发工作。