Linux下的GUI自动化

前言

背景

探索在liunx 环境中的GUI自动化测试框架,以便用户在我们的平台上实现对自己项目的自动化测试。

实现目标

1、GUI自动化的所有组件必须是开源。
2、实现对GUI程序的自动启动关闭和操作。
3、模拟用户鼠标键盘操作。
4、能够对执行情况进行断言。
5、可以输出执行日志。
6、测试完成可以输出报告。
7、测试用例和数据分离。
8、模块化设计。
9、支持截屏和图片比对。
10、支持截图文字提取。
11、支持按屏幕坐标操作。
12、被测程序为linux程序。

技术栈

技术 版本和说明 对应目标
Python 建议3.7以上版本。 开源技术
Dogtail 0.9.10 驱动GUI
unittest 跟随python版本 自动化测试框架
Logging 跟随python版本 实现日志功能
Smtplib,email 跟随python版本 实现邮件发送
Os 跟随python版本 操作系统的相关命令执行
subprocess 跟随python版本 操作系统命令执行的相关断言
pytesseract 跟随python版本 支持截图的文字提取
imagehash 跟随python版本 支持截图文件的比对
BeautifulReport 测试用例执行报告 支持生成html的执行报告
A11y Accessibility 可访问性技术

环境搭建(本文以ubuntu系统为例)

安装虚拟机环境(有操作系统环境的可跳过)

1)下载VMware player (免费使用,一次只能启动一个虚拟机。)
官方下载地址。https://www.vmware.com/
2)下载liunx镜像文件。可以到网上找,有很多,这次我下载了2个系统一个redhat 7,一个ubuntu2。在redhat7上我探索了基于python2的框架,在ubuntu上使用的python3框架。
3)安装虚拟机,打开VMware player 加载操作系统镜像文件进行安装,安装流程比较简单,注意要安装GUI界面系统,不要最小安装或服务器安装哈。

检查更新和安装yum 或 apt

1)以ubuntu为例。打开apt的源文件,sudo gedit /etc/apt/sources.list
2)修改源文件的源到阿里源。
在这里插入图片描述
3)sudo apt-get update 跟新源。如下图所示更新完成。
在这里插入图片描述

检查更新和安装python和pip

1)检查python版本,输入命令 python3. 如果低于3.7需要升级。
在这里插入图片描述
2)安装更高版本的python,我这里选择安装3.9。
a.安装前的必要软件
sudo apt install software-properties-common

b.将Deadsnakes PPA添加到系统的来源列表中
sudo add-apt-repository ppa:deadsnakes/ppa

c.安装python3.7
sudo apt install python3.7

d.去掉老版本的软链接
sudo rm /usr/bin/python3

e.添加新版本的软链接
sudo ln -s /usr/bin/python3.7 /usr/bin/python3

3)安装对应版本的pip
a.安装PIP3
sudo apt install python3-pip

b.安装setup工具
pip3 install -U setuptools

安装dogtail

a.安装支撑包
sudo apt-get install python3-pyatspi python3-pyqt5

b.安装dogtail包
sudu pip3 install dogtail

c.检查dogtail的安装是否正常
登录操作系统,输入sniff命令。
如果能打开AT-SPI 说明安装正常。
在这里插入图片描述

安装BeautifulReport

输入命令 sudo pip3 install BeautifulReport。

安装 imagehash

输入命令 sudo pip3 install imagehash

安装cnocr

输入命令sudo pip3 install cnocr -i https://pypi.tuna.tsinghua.edu.cn/simple–ignore-installed
在这里插入图片描述
PS:注意安装包较多,且较大,尽量使用国内源,否则下载速度慢,且可能中途断掉,更多本地源请查看 问题记录章节。

框架功能

AT-SPI

(1)查看桌面所有应用
在这里插入图片描述
(2)选择GUI的时候在桌面突出显示控件
Actions 下面的 highlight item 可以高亮显示你选中的控件,帮助你定位。
在这里插入图片描述

Dogtail

(1)启动应用
Dogtail可以直接通过进程启动应用。
首先导入 dogtail.utils 。通过run(‘应用名称’)启动应用。
可以先手动启动应用,在AT-SPI中查看应用名称。
在这里插入图片描述
(2)获取应用
导入dogtail.tree,通过root.application(appName=“应用名称”)获得被测应用句柄。

(3)获取应用中的控件
导入dogtail.tree,通过 节点对象.child(‘控件名称’, ‘角色名称’)获取对应控件。注意部分控件可能只有角色名称,控件名称为空,这里是可以传空字符的。
同一个角色名称的控件可能有多个,这种情况需要先找到最近的父控件,以父控件作为节点对象再找child。
Child返回的是节点树中获取的第一个控件。

(4)点击控件
导入dogtail.tree,通过 节点对象.click() 点击对象。注意dogtail.rawinput 下也有click 两个不一样,后者是通过坐标点击,前者是通过控件对象点击。

(5)在文本类型的控件中输入文字
导入dogtail.tree,通过 节点对象.typeText(‘文本内容’) 输入文字。输入的文字将会在AT-SPI 控件的 text标签显示,这里可以做文本检查。
在这里插入图片描述
(6)键盘操作,敲击键盘和组合键盘
使用键盘操作需要导入 rawinput 模块,支持单个按键和组合按键。
单个按键:
rawinput.pressKey(keyName)

keyName = {
‘enter’: ‘Return’,
‘esc’: ‘Escape’,
‘alt’: ‘Alt_L’,
‘control’: ‘Control_L’,
‘ctrl’: ‘Control_L’,
‘shift’: ‘Shift_L’,
‘del’: ‘Delete’,
‘ins’: ‘Insert’,
‘pageup’: ‘Page_Up’,
‘pagedown’: ‘Page_Down’,
’ ': ‘space’,
‘\t’: ‘Tab’,
‘\n’: ‘Return’
}

组合按键:
rawinput.keyCombo(comboString)

comboString组合按键,比如:
‘p’
‘PageUp’
‘q’

(7)检查控件文本
通过 节点对象.text 可以访问文本信息,并进行断言。

(8)屏幕截图
首先导入 dogtail.utils, 直接输入方法 screenshot(‘截图名称’)就可以截图。默认支持PNG,文件名自动带入时间戳。截图文件会放在tmp目录下。
在这里插入图片描述
(9)利用坐标点的屏幕操作
导入rawinput
click(x, y, button=1, check=True) #单击 坐标X,Y
doubleClick(x, y, button=1, check=True)#双击 坐标X,Y
press(x, y, button=1, check=True)#按下 坐标X,Y
release(x, y, button=1, check=True)#松开 坐标X,Y

PS:这里并不推荐使用坐标操作。

操作系统操作

引用包os,subprocess 可以执行操作系统命令,用于检查执行结果,比如:
#获取/home/guliangce 目录下的文件,并检查。
subprocess.Popen([“ls”, “/home/guliangce/”],stdout=subprocess.PIPE)

图片文字抽取

(1)在图片中抽取文字用作检查。
导入 from cnocr import CnOcr
加载图片资源 res = ocr.ocr(“20230410151552.png”)
Res 是列表,列表的每个值就是获取的文字片段,文字片段是用字典来描述的。
在这里插入图片描述
通过这种功能可以做屏幕输入或输出文字的断言。

图片对比

(1)检查两个图片是否一致。
需要导入
from PIL import Image,ImageFile
import imagehash

通过 Image.open(‘图片路径’)加载图片。
使用 imagehash.average_hash 向量化图片,对两个图片的hash进行比较,得出差异值,
通过这种方式可以对屏幕预期结果进行断言。(比如电路图是否一致?)

案例

项目目录结构

在这里插入图片描述
logs:用于存放日志的目录。
testreport:用于存放测试报告的目录。
auto_log.py: 打印日志的模块。
automain.py:自动化的主程序。
imagecomparison.py: 截图对比模块。
mail.py: 发送邮件的模块。
testdemo1.py: 一个测试用例的案例。
textfromimage.py: 获取截图中的文件。
demoimage1.png,demoimage2.png:用于做截图对比的两个案例。

测试用例介绍

(1)主程序 automain.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
这是gui自动化的主程序
"""
#加载unittest模块
import unittest
#加载dogtail
from dogtail.utils import * 
#加载日志模块
import logging
from auto_log import *
#加载报告模块
from BeautifulReport import BeautifulReport as bf
#加载邮件模块
from mail import *

#定义全局变量
#日志保存目录
LOG_DIR = '/home/guliangce/auto_gui/logs/'
#测试名称(日志用)
TEST_NAME = 'liunx_auto_gui_test' 
#报告名称
REPORT_NAME = '/home/guliangce/auto_gui/testreport/'
#报告发送地址
MAIL_ADD = 'guliangce@163.com'

if __name__ == '__main__':
    write_log(LOG_DIR,TEST_NAME)
    log = logging.getLogger()
    #确定A11y是否可用
    if not isA11yEnabled():
        log
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值