Linux桌面GUI自动化测试工具-----dogtail

Dogtail是一个Python编写的GUI测试工具,适用于Linux系统,利用A11Y技术进行桌面应用交互。它包括sniff组件用于追踪运行程序,提供元素控件的标签名称。Dogtail支持启动应用、获取应用、定位及操作元素,如点击、双击、鼠标移动等,并能进行键盘和鼠标模拟操作。此外,还介绍了如何通过sniff获取元素标签名以及dogtail的安装步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考1
参考2
源码

1. 关于dogtail

dogtail 是 使用可访问性(A11Y,Accessibility)技术与桌面应用程序通信的图形用户界面GUI测试工具和自动化框架。
dogtail 是 用 Python 编写,是python 中的一个第三方包。
dogtail 适用于Linux系统

2. 安装dogtail

①首先需要安装依赖包

sudo apt-get install python3-pyatspi python3-pyqt5

②再进入该网站下载安装包,并且解压。terminal中切换到解压的安装包目录下,并且输入如下命令进行安装

sudo python3 setup.py install

或者

sudo pip3 install dogtail (我执行这个,sniff不能用)

3. sniff 组件

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

在terminal终端,输入 sniff 命令并执行,会弹出一个 AT-SPI Browser 界面,里面包含了所有正在运行的程序。所有程序是以 tree 的形式显示。
在这里插入图片描述

  1. 获取元素控件的标签名称
    为了方便查看元素控件对应的位置,建议现在上方工具栏点击Actions,然后勾选Hightlight Items。
    在这里插入图片描述
    在 AT-SPI Browser 界面中点击相应的应用标签tree,点击相应的元素控件,在工具的下方会显示元素空间的Name,这个就是标签名。
    在这里插入图片描述

4. dogtail的 应用

4.1 启动应用

dogtail 中utils 模块下提供run()方法,用于启动应用。

run(string, timeout=30, interval=0.5, desktop=None, dumb=False, appName='')
# Runs an application.

这种方法的优点是采用进程的方式直接启动,不依赖与UI,无论桌面或任务栏上是否存在应用图标,都可以正常启动。

应用:

from dogtail.utils import *

run('deepin-music')
4.2 获取应用程序

dogtail 中tree 模块下root类 提供了一个application方法,用于启动应用。

API具体 方法:


1. applications(self)    # Get all applications.	
2. application(self, appName, retry=True)	#Gets an application by name, returning an Application instance or raising an exception. This is implemented using findChild, and hence will automatically retry if no such child is found, and will eventually raise an exception. It also logs the search.

源码:请看这里哦

应用:

from dogtail.tree import *
root.application(AppName,) ## 获取应用程序(根据程序名称查找)

4.3. 定位元素控件

在这里插入图片描述

应用对象使用child()方法

from dogtail.tree import *

app_obj = root.application(AppName,) # 获取应用程序(根据程序名称查找)
element = app_obj.child('element_name') # 定位元素控件

我们可以通过传入元素的Name,获取到相应元素的对象。Name可以通过sniff查看

4.4. 操作元素

单击

element.click(button=1) #button 1 —>左键,2—>滚轮,3—>右键,默认为1

双击

element.doubleClick(button=1)

鼠标移动到元素控件上

element.point()
4.5.控制键盘和鼠标操作

dogtail中控制键盘和鼠标操作,依赖于rawinput包
首先需要导入rawinput包

from dogtail import rawinput
4.5.1鼠标相关操作

点击

rawinput.click(x, y, button=1, check=True)
#1.x, y 为所要点击的坐标
#2.button为鼠标左右键,1代表左键,2代表滚轮,3代表右键,默认参数,可以不传
#3.check为坐标检查,如果为负数,会抛异常,默认参数,可以不传

双击

rawinput.doubleClick(x, y, button=1, check=True)

长按鼠标左键不放

rawinput.press(x, y, button=1, check=True)

长按鼠标左键后松开

rawinput.release(x, y, button=1, check=True)

鼠标移动(相对位置、绝对位置)

# 一.鼠标移动到相对位置
rawinput.relativeMotion(x, y, mouseDelay=None)
# 1.x, y 为所要移动的相对位置,比如从当前位置移动100,100,注意和绝对位置的区别
# 2.mouseDelay为鼠标移动的延迟时间,默认参数,可以不传
# 二. 鼠标移动到绝对位置
rawinput.absoluteMotion(x, y, mouseDelay=None, check=True)
# 1.x, y 为所要移动到的坐标
# 2.mouseDelay为鼠标移动的延迟时间,默认参数,可以不传
# 3.check为坐标检查,如果为负数,会抛异常,默认参数,可以不传

  1. 绝对位置
rawinput.drag(fromXY, toXY, button=1, check=True)
# 1.fromXY 起始位置的坐标(x, y )
# 2.toXY 目标位置的坐标(x, y )
  1. 相对位置
    rawinput没有提供相对位置的拖拽,但是我们可以通过如下代码,进行二次封装实现相对位置的拖拽。
rawinput.press(x, y ) 
rawinput.relativeMotion(x, y)
rawinput.release(x, y)

4.5.2 键盘相关操作

键盘输入文本

rawinput.typeText(string)  #传入要输入的字符串即可

注意: 不支持中文输入,经过分析源码,输入的功能实际是遍历字符串里面的每一个字符然后调用的pressKey,也就是敲键盘的方式实现输入,所以中文输入的bug无解。在UOS上使用这个方法输入中文的时候,系统直接崩溃(注销)。

键盘按键

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组合按键,比如:
'<Control><Alt>p' 
'<Control><Shift>PageUp' 
'<Control>q'
### 不同公司使用的自动化测试工具及框架 #### 测试工具的选择依据 不同的公司在选择自动化测试工具时会考虑多个因素,包括但不限于项目需求、开发环境和技术栈。对于Web应用程序的测试,许多企业倾向于采用Selenium这样的开源解决方案[^2]。 #### Web 应用程序测试 - **Google**: 使用内部定制版本的WebDriver及其他自研工具集成了大量特性以满足复杂的需求。 - **Facebook**: 开发并维护了多种开放源码项目如Sauce Labs集成和Detox(移动端),同时也利用Selenium进行部分网页端的功能验证工作。 #### 移动应用测试 针对移动设备上的软件产品,一些知名企业可能更偏好特定类型的框架: - **Apple (iOS)**: 主要依赖XCUITest作为官方推荐的应用级UI测试方案;同时也会借助KIF或者EarlGrey等社区贡献的产品补充某些场景下的不足之处。 - **阿里巴巴集团**: 对于Android平台而言,则较多运用Airtest这类图像识别驱动型框架完成界面级别的回归检验任务;而在跨平台方面则有Weex TestKit可供选用[^1]。 #### GUI 自动化测试Linux桌面环境中开展图形用户界面相关的质量保障活动时,像Dogtail这样基于Accessibility API构建而成的专业级库显得尤为重要[^3]。 ```python from dogtail.tree import root app = root.application('gnome-calculator') window = app.childnamed('Calculator') # 获取窗口对象 button_7 = window.findChild(lambda x: x.name == '7' and x.roleName == 'push button') button_7.click() ``` 上述代码展示了如何使用Dogtail控制GNOME计算器应用中的按钮点击事件。 #### BDD 风格的支持 当涉及到行为驱动开发(Behavior Driven Development, BDD)实践领域内的选型决策时,Calabash、RoboSpock以及JBehave均属于较为流行的候选者之一,在实际应用场景里各有千秋。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值