zoukankan      html  css  js  c++  java
  • 基于Accessibility的Linux桌面应用自动化测试工具

    相关术语

    缩写 全称 描述
    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/

    没伞的孩子,就要学会在雨中奔跑!
  • 相关阅读:
    使用jsonEditor打造一个复杂json编辑器
    【原创】一次“诡异”的容器Unix Socket通信问题分析
    【原创】Ingress-Nginx-Controller的Metrics监控源码改造简析
    IDEA+DevTools实现热部署功能
    ElementUI按需引入各种组件
    vue-cli4.0更新后怎样将eslint关闭
    Mysql修改字段名、修改字段类型
    博客搬家CSDN
    如何优雅的处理Restful
    java系列之注解
  • 原文地址:https://www.cnblogs.com/mikigo/p/14301179.html
Copyright © 2011-2022 走看看