通用技术 PyLinuxAuto—Linux GUI 自动化利器

mikigo · 2024年11月20日 · 最后由 mikigo 回复于 2024年11月21日 · 2775 次阅读

PyLinuxAuto 是一个用于 Linux 桌面 GUI 自动化测试的 Python 模块,支持多种元素定位方法和键鼠操作。

官方文档:https://youqu.uniontech.com/

安装

pip3 install pylinuxauto

键鼠控制

import pylinuxauto

# 单击
pylinuxauto.click()
# 双击
pylinuxauto.double_click()
# 右键点击
pylinuxauto.right_click()

4 种元素定位方法

使用 Accessibility 操作元素

sniff(嗅探器)使用

安装 PyLinuxAuto 之后,在终端输入 sniff 启动 AT-SPI Browser:

shell

mikigo@mikigo-PC:~$ sniff

img

查看应用的标签

在 sniff 里面可以看到系统中已启动的应用,点击应用名称前面的三角形图标,可以展开应用的标签,所有标签以 tree 的形式展示,对应应用里面的父窗口和子窗口。

获取元素控件的标签名称

首先,为了方便查看元素控件对应的位置,建议现在上方工具栏点击 Actions,然后勾选 Hightlight Items,这样在 sniff 中鼠标选中元素标签的时候,应用中会有相应的光标锁定。

img

在 sniff 里面点击进入应用的标签 tree 中后,点击相应的元素控件,在工具下方,会展示元素控件的 Name,这个就是标签名称。

img

tree 中有些地方是空白的或者是 Form,是因为开发人员在添加标签的时候没有添加,或者有些父窗口不需要添加,这种在实际业务中是不影响的,我们只要保证自动化测试用例中,要用到的元素都添加了标签即可。

img

通过 Accessibility 路径查找并操作元素,路径名称可以通过 sniff 命令查看。

调用
import pylinuxauto

pylinuxauto.find_element_by_attr_path("/dde-doc/Btn_文件管理器").click()

使用图像识别操作元素

在元素识别的过程中,我们需要截取某个元素的小图进行识别,比如截取播放按钮:

img

那么实际上,元素定位的问题就转换为,将截图的小图(play_btn)拿到整个屏幕的大图(screen)中去做匹配,如果匹配成功,返回小图在大图中的坐标( x, y )即可。

传入一张目标图片的路径,自动在当前屏幕中查找目标图片。

Client 代码:

python

import pylinuxauto
from pylinuxauto.config import config

# 配置IMAGE服务端IP
config.IMAGE_SERVER_IP = "192.168.0.1"
# 获取元素对象
pylinuxauto.find_element_by_image("~/Desktop/template.png")

对目标图像进行操作:

# 本地路径
pylinuxauto.find_element_by_image("~/Desktop/template.png").click()
pylinuxauto.find_element_by_image("~/Desktop/template.png").right_click()
pylinuxauto.find_element_by_image("~/Desktop/template.png").double_click()
pylinuxauto.find_element_by_image("~/Desktop/template.png").center()
pylinuxauto.find_element_by_image("~/Desktop/template.png").result

图片资源为远程 URL

from pylinuxauto.config import config

config.IMAGE_BASE_URL = "http://10.8.12.24/image_res/deepin-music/"

# 简写形式,@ 符号代表 IMAGE_BASE_URL
pylinuxauto.find_element_by_image("@1.png").result
# 全 URL
pylinuxauto.find_element_by_image("http://10.8.12.24/image_res/deepin-music/1.png").result

使用 OCR 操作元素

使用传入需要识别的文本字符,使用 OCR 在当前屏幕中识别。

import pylinuxauto
from pylinuxauto.config import config

config.OCR_SERVER_IP = "192.168.0.1"
pylinuxauto.find_element_by_ocr("中国").click()

对于一些文字的场景非常适用,可以用于元素定位操作

pylinuxauto.find_element_by_ocr("中国").click()
pylinuxauto.find_element_by_ocr("中国").right_click()
pylinuxauto.find_element_by_ocr("中国").double_click()
pylinuxauto.find_element_by_ocr("中国").center()
pylinuxauto.find_element_by_ocr("中国").result

使用 UI 相对位移操作元素

在 UI 设计图中我们是可以获取到元素按钮相对于应用边框的距离的,然后我们可以获取到应用界面在当前屏幕中的位置及应用窗口的大小,示意图如下:

img

在 UI 设计稿上点击【播放所有】图标,然后移动鼠标就就可以看到上图的参考线及数据;

配置

通过将目标按钮相对于应用窗口的位置信息配置,然后动态获取应用窗口在当前屏幕中的信息,最后计算出目标按钮在当前屏幕中的位置。

from pylinuxauto import Ele, Ref

playall_btn = Ele(xy=(290, 80), ref=Ref.LEFT_TOP, appname="deepin-music", alias="播放全部")
  • xy 是该元素按钮的相对与参考系的 (x, y) 的距离;

  • ref 是配置该元素的参考系,Ref 是参考系的类对象:

    • Ref.LEFT_TOP 左上;
    • Ref.LEFT_BOTTOM 左下;
    • Ref.RIGHT_TOP 右上;
    • Ref.RIGHT_BOTTOM 右下;

参考系的选取标准:拉动改变窗口大小时,元素按钮相对于参考系位置是不变的;

  • appname 应用的包名;

  • alias 可选,元素的别名;

调用
pylinuxauto.find_element_by_ref(playall_btn).click()
pylinuxauto.find_element_by_ref(playall_btn).right_click()
pylinuxauto.find_element_by_ref(playall_btn).double_click()
共收到 2 条回复 时间 点赞

请问这个能识别 Linux 文件上传框内的元素吗,如果浏览器是开的无头模式呢

无头模式这种没有 GUI 的怕是不行,PyLinuxAuto 主要是针对 Linux GUI 自动化,浏览器项目有专业的开源项目,比如:Selenium、Playwright

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册