相关术语
缩写 | 全称 | 描述 |
---|---|---|
LDTP | Linux Desktop Testing Project | Linux桌面自动化测试工具 |
Dogtial | Dogtial | Linux桌面自动化测试工具 |
问题
对于UI自动化测试,无论是桌面应用、WEB端应用还是移动端应用,其实现逻辑都是通过一定的方法去获取应用的元素控件,从而鼠标可以定位到该元素控件,然后我们就可以使用鼠标或键盘对其进行点击、拖拽、输入等事件操作。比如,在web端,采用selenium通过html标签的属性值(id、class、tag等),从而定位到页面中的元素控件,然后对元素控件进行点击、拖拽、输入等操作。
那么,在Linux平台的操作系统上进行桌面应用的UI自动化测试,目前可参考的案例不多,因为Linux平台的软件生态相比于windows和mac的软件生态要差很多,大多Linux桌面应用并没有进行系统的测试,更别说自动化测试,而UOS作为国内新起的操作系统,我们致力于打造更加丰富的软件生态,我们在桌面应用功能上要做到稳定、易用,就需要采用系统的功能测试,同时,为了保证版本稳定,以及日常的质量监控,采用自动化测试也是非常必要的。
现状
目前,在Linux平台能够支持Accessibility去获取元素控件的工具,主要有Dogtail和LDTP两个工具。
在对UOS操作系统上的多媒体应用进行UI自动化测试时,目前是采用的Dogtail通过Accessibility去获取元素控件,然后通过鼠标可以定位到该元素控件,Dogtail在定位桌面应用的元素控件时,是通过AP-SPI browser这个工具去实现的,对大多数情况下,都能够准确的定位到元素控件,稳定性和易用性还是非常不错的。
但是,如果遇到控件是变化的情况,就可能存在无法定位到元素的情况。比如,在dde-dock上的结束录屏的按钮,是在开始录屏之后才会出现,如果在录屏时间较短的情况下,可能存在Dogtail无法定位到按钮的情况,从而造成测试用例执行失败。
技术方案
LDTP
技术原理简介
在Python中导入LDTP模块,然后调用模块里面的方法,就可以通过传入应用的相关参数,实现对应用元素的定位,然后,配合Python的PyAutoGui或xdotool或PyUserInput等控制鼠标和键盘的三方库进行相关的操作,从而实现,模拟手工测试对应用程序的操作。
技术实现
安装
安装LDTP
方法1:
在UOS终端执行命令:sudo pip3 install ldtp
pypi上面只有1.0.0版本,所以直接使用pip安装之后,还需要升级,所以不推荐这种方式。
方法2:
git clone https://github.com/ldtp/ldtp2.git
cd ldtp2/
sudo python3 setup.py build
sudo python3 setup.py install
安装相关依赖
在终端执行命令:
sudo pip3 install python-atspi
sudo pip3 install python-twisted-web
sudo pip3 install python-wnck
sudo pip3 install python-gnome
代码实现
from ldtp import *
启动应用程序
ldtp.launchapp(cmd, args = [], delay = 0)
# 参数 cmd: 应用程序名称
# 参数 args: 应用程序参数列表
# 参数 delay: 启动延时
鼠标点击操作
ldtp.click(window_name, object_name)
# 参数 window_name: 窗口名称
# 参数 object_name: 对象名称
获取Text文本框内容
ldtp.gettextvalue(window_name, object_name)
# 参数 window_name: 窗口名称
# 参数 object_name: 对象名称
关闭窗口
ldtp.closewindow(window_name)
# 参数 window_name: 窗口名称
获取窗口大小
ldtp.getwindowsize(window_name)
# 参数 window_name: 窗口名称
判断窗口是否存在
ldtp.objectexist(window_name, object_name)
获取一个对象的属性值
ldtp.getobjectproperty(window_name, object_name, property_name)
# 参数 window_name: 窗口名称
# 参数 object_name: 对象名称
# 参数 property_name: 属性名称
Dogtail
技术原理简介
Dogtail是Python的一个三方库,是用于GUI自动化测试的工具,Dogtail提供了一个方法,来查找定位应用的元素,类似于Selenium/Appium里面的find_element这个功能。在Dogtail里面,通过Accessibility(辅助功能)实现与App的通讯。
技术实现
安装
安装Dogtail
sudo pip3 install dogtail
安装依赖
sudo apt-get install python3-pyatspi
代码实现
from dogtail.tree import root
获取app的对象
app_obj = root.application(Name, description)
# 参数 Name: 应用的名称
# 参数 description: 应用的描述
获取app元素的对象
element_obj = app_obj.child(element)
# 参数 element:元素名称
点击应用的元素
element_click = element_obj.click()
实验验证
LDTP与Dogtail特点
环境搭建
LDTP安装更加复杂,其依赖包也更多,特别是在安装python-wnck和python-gnome的时候,特别容易出现连接超时。
Dogtail安装比较轻便,依赖也少,目前多次安装测试下来,没有出现问题,可用性较高。
实现原理
LDTP和Dogtail都是基于Accessibility实现对应用元素控件的定位,从实现原理上讲是相同的,在UOS上的应用都需要依赖于对应用添加Accessibility。
文档丰富度
LDTP官方文档内容较多,社区文档少,项目案例少。
Dogtail官方文档内容较少,写得不太清楚,社区文档少,项目案例少。
两个工具的官方文档都很久没更新了。
提供的接口
两个都支持Python调用,LDTP还支持java、ruby的调用,LDTP在python的支持上,官方建议是python2.6/2.7,所以有点过时了。
错误定位
LDTP的源码里面很多try-except语句都是直接返回pass或0,这样如果代码运行过程中出现问题,很难定位到具体原因。
Dogtail的源码里面在处理异常的语句里面,都是采用抛异常的方式,而且还会有比较准确的日志显示,调试脚本时可以很清楚的看到运行的过程,出现问题也比较容易定位问题。
对中文的支持
LDTP对于中文的支持有点问题,当Accessibility名称为中文时,存在无法定位的问题,还有一种情况就是,Accessibility的名称是英文,定位到元素之后,我们需要获取元素的文本内容(text),此时text是中文时,会返回乱码。
Dogtail对中文的支持没有问题,通过Accessibility名称为中文时,可以正常定位,获取text也正常。
日志文件格式
LDTP的日志文件是生成xml文件,要查看的话,最好是通过解析之后再查看。
Dogtail的日志文件是生成普通的文本文件,可以直接查看。
运行测试脚本
Dogtail可以很方便,也很容易进行运行。
LDTP需要xml文件,需要安装“xmlrpc-daemon”,不然运行时会报错。
定位控件的出错率
同样是在录制视频时间为2秒的情况下,分别使用Dogtail和LDTP去定位停止录屏,仍然存在无法定位到的情况,目前没有分析出具体的原因,可能是dock设置的属性问题,也可能是工具的原因,使得在短时间内,没能够获取到元素。
LDTP与Dogtail对比
对比项目 | Dogtail | LDTP |
---|---|---|
环境搭建 | 简单 | 复杂 |
实现原理 | 无差异(基于Accessibility) | 无差异(基于Accessibility) |
文档丰富度 | 较少 | 相对较多 |
提供的接口 | 支持Python | 支持Python |
错误定位 | 容易 | 不容易 |
对中文的支持 | 没问题 | 有问题 |
日志文件格式 | 普通文本文件 | xml文件 |
运行测试脚本 | 方便 | 需要xml文件 |
定位控件的出错率 | 无差异 | 无差异 |
小结
UOS操作系统多媒体桌面应用,在代码中加入Accessibility属性值,通过AT-SPI可以获取到应用控件,对其进行点击、拖拽、输入文本等操作,从实现逻辑讲,LDTP和Dogtail两个工具是一样的,并且对于Dogtail在UOS上出现的短时间内无法获取到元素的情况,LDTP同样存在,但是从环境搭建的便捷程度、错误定位、对中文的支持以及代码的便利性来讲,Dogtail表现得很好,因此我认为更加适合我们自动化测试项目使用。
参考资料
LDTP官方文档:https://ldtp.freedesktop.org/user-doc
Dogtail官方文档:https://fedorapeople.org/~vhumpa/dogtail/epydoc/