利用 dogtail 快速进行 GUI 自动化测试

最近在协助测试小组做一些 GUI 方面的自动化测试,主要使用了 Python 中的 dogtail 框架,以及 Qt 中的 Accessibility 技术。

这个东西很有意思,可以让 GUI 的测试变得很方便,比如:模拟鼠标点击、用户输入等。因此在这里分享一下,希望能帮到大家!

1

概念描述

关于 dogtail

dogtail 是一个用 Python 编写的 GUI 自动化测试框架,它使用 Accessibility(a11y)技术与桌面应用程序通信。

dogtail 脚本是用 Python 编写的,并能够像其他 Python 程序一样执行。

sniff 组件

在 dogtail 的发行包中,自带了一个 sniff 组件(嗅探器),该组件在 GUI 程序追踪方面非常有用。

打开终端,执行 sniff 命令,会弹出一个 AT-SPI Browser 界面,里面包含了所有正在运行的程序。值得一提的是,这些程序是以 tree 的形式显示的。因此在 sniff 程序里面,根据显示便能够很容易地查看所要调试程序的 layout。

Accessibility 技术

既然 dogtail 利用 Accessibility 技术与桌面程序通信,那么想自动化测试 Qt 程序,就必须启用 Qt Accessibility。

Qt 中的 Accessibility 支持包含了一个通用接口,该接口对每种平台实现了一项技术:Windows 上的 MSAA、Mac 上的 Mac OS X accessibility,以及 Linux 上的 Unix/X11 AT-SPI。Qt 的 Accessibility 接口严格遵循 MSAA 标准。那么,什么是 MSAA 呢?

MSAA 全称为 Microsoft Active Accessibility,其初衷是为了方便残疾人士使用电脑 - 可用于放大器、屏幕阅读器,以及触觉型鼠标。比如盲人看不到窗口,但是他可以通过一个 USB 读屏器连接到电脑上,读屏器通过 UI 程序暴露出来的这个 Interface,就可以获取程序信息,通过盲文或者其它形式传递给盲人。

MSAA 的主要思想是提供一种以程序方式访问 UI 元素信息或操作这些 UI 元素的功能。支持这种功能的 UI 元素是可访问的。在大多数情况下,这意味着一个 UI 元素支持 IAccessible 接口。你也可以说在 MSAA 的世界里,一个可访问的 UI 元素可表示为 IAccessible 接口。

2

环境安装

安装依赖

要使用 dogtail,首先要安装依赖:

$ sudo apt-get install python3-pyatspi python3-pyqt5

安装 dogtail

下载 dogtail 源码(地址:https://gitlab.com/dogtail/dogtail/),并进行安装:

$ sudo python3 setup.py install

3

测试脚本

为了实现自动化测试,先用 Qt 编写一个简单的示例程序 - Sample01。

显示一个 button,并连接它的 clicked() 信号,当鼠标被点击之后,文本发生改变:

#include <QApplication>
#include <QPushButton>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QPushButton button("test");

    // 每点击一次,文本就会发生变化
    QObject::connect(&button, &QPushButton::clicked, [&]() {
        static int index = 0;
        index++;
        button.setText(QString("click %1").arg(index));
    });

    // 将被辅助技术识别
    button.setAccessibleName("button");
    button.setAccessibleDescription("this is a simple button");

    // 设置大小并显示
    button.resize(300, 200);
    button.show();

    return a.exec();
}

现在编写 Python 脚本 - autotest.py,模拟鼠标点击程序中的按钮:

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

from dogtail.tree import *
import time

# 获取应用程序(根据程序名称查找)
app = root.application(appName="Sample01", description="/home/waleon/workspace/demos/build-Samples-unknown-Debug/Sample01/Sample01")

# 获取按钮(根据 accessibleName 递归查找)
button = app.child('button')

# 模拟鼠标点击
for i in range(3):
    button.click()
    sleep(1)

4

执行自动化

运行上述的示例程序,然后执行 sniff 命令,可以查看 Sample01 的标记:

$ sniff

运行 Python 脚本,执行自动化测试:

$ python3 autotest.py

恭喜,这时候你就能看到鼠标被自动点击了。

后面还有更多有意思的功能,比如模拟键盘输入、自动生成测试报告等,敬请期待!

5

更多参考

  • dogtail 源码:https://gitlab.com/dogtail/dogtail/

  • dogtail api:http://fedorapeople.org/~vhumpa/dogtail/epydoc/

  • dogtail 教程:https://wiki.ubuntu.com/Testing/Automation/DogtailTutorial

  • 辅助功能在 GNOME 中如何工作:https://developer.gnome.org/accessibility-devel-guide/stable/gad-how-it-works.html.zh_CN

·END·
 

作者:一去、二三里

爱学习,爱编程,爱生活。

欢迎来撩,一起畅谈程序人生!

点个在看,么么哒!

©️2020 CSDN 皮肤主题: 代码科技 设计师:Amelia_0503 返回首页
实付 39.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值