基于Python+uiautomation的windowsGUI自动化测试概述

简介: 基于Python+uiautomation的windowsGUI自动化测试概述

1 前言

一直使用Python做自动化测试,近期遇到了要对桌面端软件即windowsGUI进行自动化测试。Python的GUI自动化测试工具有很多,但是都有不同的侧重点。本次会详细说明为啥选择uiautomation来做测试。

2 PythonGUI工具

2.1 常用的PythonGUI编程工具

详情参考:https://blog.csdn.net/NoamaNelson/article/details/113678356

工具 官网 简介
wxPython https://www.wxpython.org/ wxPython 是 Python 语言的一套优秀的 GUI 图形库,允许 Python 程序员很方便的创建完整的、功能键全的 GUI 用户界面
Kivy https://kivy.org/#home vy是一个开源工具包能够让使用相同源代码创建的程序能跨平台运行。它主要关注创新型用户界面开发,如:多点触摸应用程序。Kivy还提供一个多点触摸鼠标模拟器。当前支持的平台包括:Linux、Windows、Mac OS X和Android
Flexx https://flexx.readthedocs.io/en/stable/ Flexx 是一个纯 Python 工具包,用来创建图形化界面应用程序。其使用 Web 技术进行界面的渲染。你可以用 Flexx 来创建桌面应用,同时也可以导出一个应用到独立的 HTML 文档。因为使用纯 Python 开发,所以 Flexx 是跨平台的。
PyQt https://www.riverbankcomputing.com/static/Docs/PyQt5/ PyQt是Qt库的Python版本。PyQt3支持Qt1到Qt3。 PyQt4支持Qt4。它的首次发布也是在1998年,但是当时它叫 PyKDE,因为开始的时候SIP和PyQt没有分开。PyQt是用SIP写的。PyQt 提供 GPL版和商业版
Tkinter https://docs.python.org/zh-cn/3/library/tkinter.html Tkinter(也叫Tk接口)是Tk图形用户界面工具包标准的Python接口。Tk是一个轻量级的跨平台图形用户界面(GUI)开发工具。Tk和Tkinter可以运行在大多数的Unix平台、Windows、和Macintosh系统
Pywin32 https://pypi.org/project/pywin32/223/ Windows Pywin32允许你像VC一样的形式来使用PYTHON开发win32应用
PyGTK https://iowiki.com/pygtk/pygtk_quick_guide.html PyGTK让你用Python轻松创建具有图形用户界面的程序.底层的GTK+提供了各式的可视元素和功能,如果需要,你能开发在GNOME桌面系统运行的功能完整的软件
pyui4win 域名停更 pyui4win是一个开源的采用自绘技术的界面库。支持C++和python,用它可以很容易实现QQ和360安全卫士这样的绚丽界面。而且,pyui4win有所见即所得界面设计器,让C++开发人员和python开发人员直接用

2.2 常用PythonGUI自动化测试工具

详细对比参考:https://blog.csdn.net/m0_37602827/article/details/108308991

工具 官网 简介
pywinauto https://pypi.org/project/pywinauto/0.4.0/ 主要使用到 Application 类,用于应用程序管理(打开与关闭应用等)、窗口管理(最小化、最大化、关闭窗口)
Pywin32 https://pypi.org/project/pywin32/223/ 包含 win32gui、win32api、win32con 3个子模块,用于窗口管理(定位窗口、显示和关闭窗口、获取窗口位置等)
pyautogui https://pyautogui.readthedocs.io/en/latest/ 屏幕控制(截屏等)、鼠标控制(移动鼠标、单击、双击、右击、拖拽等)、键盘控制(编辑、按键等)

2.3 说明

经过前边的介绍,我们主要是用例进行自动化测试的,所有pythonGUi编程的一些工具就用不到了。而常用的那三种pythonGUI自动化测试工具,有支持的平台有限,所以经过一番折腾,看到大神使用uiautomation,经过验证该工具很不错,用起来也方便。

3 uiautomation简介

3.1 作者博客

https://www.cnblogs.com/Yinkaisheng/p/3444132.html

3.2 uiautomation信息获取

3.3 大体内容

  • uiautomation是作者业余时间开发的供自己使用的一个python模块;
  • 所以安装的时候直接:
pip install uiautomation
  • UIAutomation实现的自动化支持微软提供的各种界面开发框架,如Win32, MFC, Windows Forms, WPF, Metro App, IE;
  • 另外Qt, Firefox, Chrome实现了UI Automation Provider,也支持UIAutomation;
  • 作者用Python和C++对UIAutomation做了一层封装,方便我自己的使用,可以快速开发自动化脚本;
  • UIAutomation支持平台包括Windows XP(SP3),Windows Vista, Windows 7, Windows 8、8.1、10;

4 uiautomation使用方法

4.1 常用方法

1、WindowContrl(searchDepth,ClassName,SubName) # 查找窗口中的程序,如果有中文则需用Unicode;可用window.Exists(maxSearchSeconds)来判断此窗口是否存在;

2、EditControl(searchFromControl) # 查找编辑位置,找到后可用DoubleClick()来改变电脑的focus;edit.SetValue(“string”)输入值;

3、Win32API.SendKeys(“string”) # 如果已在编辑位置,则可用此方法来输入值,{Ctrl}为ctrl键,其他类似;{@ 8}格式可输入8个@,对于数字也可实现此功能,但对于字母不能…;

4、MenuItemControl(searchFromControl,Name) # 查找菜单按钮;

5、ComboBoxControl(searchFromControl,AutomationI) # 查找下拉框,然后在此基础上用Select(“name”)方法来选择需要的选项;

6、BottonControl(searchFromControl,Name,SubName) # 查找按钮;

7、automation.FindControl(firefoxWindow, lambda c:(isinstance(c, automation.EditControl) or isinstance(c, automation.ComboBoxControl)) and c.Name == 'Enter your search term') # 按条件搜索handle

4.2 句柄常用操作

Click() # 点击;

RighClik() # 右键点击;

SendKeys() # 发送字符;

SetValue() # 传值,一般对EditControl用;

4.3 windows程序常用操作

subprocess.Popen(‘Name’) # 用进程打开程序;

window.Close() # 关闭窗口;

window.SetActive() # 使用;

window.SetTopMost() # 设置为顶层

window.ShowWindow(uiautomation.ShowWindow.Maximize) # 窗口最大化

window.CaptureToImage(‘Notepad.png’) # 截图

uiautomation.Win32API.PressKey(uiautomation.Keys.VK_CONTROL) # 按住Ctrl键

uiautomation.Win32API.ReleaseKey(uiautomation.Keys.VK_CONTROL) # 释放Ctrl键

automation.GetConsoleWindow() # return console window that runs python,打开控制台

automation.Logger.ColorfulWriteLine(’\nI will open <Color=Green>Notepad and <Color=Yellow>automate it. Please wait for a while.’) # 控制台传值(彩色字体),普通传值用WriteLine;

automation.ShowDesktop() # 显示桌面;

4.4 句柄的抓取

直接运行automation模块枚举窗口时,支持下列参数(从doc窗口运行automation.py程序 ):

-t intValue 延迟枚举时间,单位秒

-r 从树的根部枚举,如果不指定,从当前窗口枚举

-d intValue 枚举控件树的的深度,如果不指定,枚举整个树

-f 从焦点控件枚举,如果不指定,从当前窗口枚举

-c 从光标下的控件枚举,如果不指定,从当前窗口枚举

-a 获取光标下控件及其所有父控件

-n 显示控件的完整Name, 如果不指定,只显示前30个字符

-m 显示控件更多属性,默认只显示控件的四个属性
示例:

automation.pyc –t3, 3秒后枚举当前窗口所有控件

automation.pyc –d2 –t3, 3秒后枚举当前窗口前三层控件

automation.pyc –r –d1 –t0 -n, 0秒后从根部枚举前两层控件,并显示控件完整名称

automation.pyc –c –t3, 3秒后显示鼠标光标下面的控件信息

5 控件定位

使用Inspect.exe工具进行控件识别和定位

  • 网上下载该软件,双击打开,如下:

在这里插入图片描述

  • 设置定位控件高亮显示

在这里插入图片描述

  • 示例:比如打开计算器后,识别控件的信息如下

在这里插入图片描述

6 项目示例

6.1 示例说明

1.打开本地计算器软件;
2.输入2+8计算结果
3.进行断言结果的准确性

6.2 示例代码

# -*- coding:utf-8 -*-

import unittest
import logging
import time
import uiautomation
import os

# @unittest.skip("跳过")
class TestFaultTree(unittest.TestCase):
    def setUp(self) -> None:
        # 初始化
        os.system("calc")  # 打开计算器
        time.sleep(2)
        self.calc = uiautomation.WindowControl(Name="计算器")
        self.calc_list = ["二", "加", "八", "等于"]
        self.result = "10"


    def tearDown(self) -> None:
        time.sleep(1)
        self.calc.ButtonControl(Name="关闭 计算器").Click()


    def test_toolbar(self):

        time.sleep(1)
        for i in range(0, len(self.calc_list)):
            self.calc.ButtonControl(Name=self.calc_list[i]).Click()
            time.sleep(0.5)

        calc_result = self.calc.TextControl(foundIndex=3).Name
        print("计算器运行结果为:", calc_result)
        print("预期结果为:", self.result)
        self.assertIn(self.result, calc_result)

if __name__ == "__main__":
    unittest.main()

7 示例效果

在这里插入图片描述

8 预告

会出一个系列文章主要讲解如何搭建windowsGUI自动化测试框架从0到1,基于Python+Unittest+UIautomation+HtmlTestRunner的架构

目录
相关文章
|
2月前
|
搜索推荐 Python
使用Python自动化生成物业通知单
本文介绍如何使用Python结合Pandas和python-docx库自动化生成物业通知单。通过读取Excel数据并填充至Word模板,实现高效准确的通知单批量制作。包括环境准备、代码解析及效果展示,适用于物业管理场景。
87 14
|
2月前
|
数据采集 数据可视化 数据挖掘
利用Python自动化处理Excel数据:从基础到进阶####
本文旨在为读者提供一个全面的指南,通过Python编程语言实现Excel数据的自动化处理。无论你是初学者还是有经验的开发者,本文都将帮助你掌握Pandas和openpyxl这两个强大的库,从而提升数据处理的效率和准确性。我们将从环境设置开始,逐步深入到数据读取、清洗、分析和可视化等各个环节,最终实现一个实际的自动化项目案例。 ####
293 10
|
2月前
|
Python
自动化微信朋友圈:Python脚本实现自动发布动态
本文介绍如何使用Python脚本自动化发布微信朋友圈动态,节省手动输入的时间。主要依赖`pyautogui`、`time`、`pyperclip`等库,通过模拟鼠标和键盘操作实现自动发布。代码涵盖打开微信、定位朋友圈、准备输入框、模拟打字等功能。虽然该方法能提高效率,但需注意可能违反微信使用条款,存在风险。定期更新脚本以适应微信界面变化也很重要。
200 61
|
3月前
|
数据采集 监控 数据挖掘
Python自动化脚本:高效办公新助手###
本文将带你走进Python自动化脚本的奇妙世界,探索其在提升办公效率中的强大潜力。随着信息技术的飞速发展,重复性工作逐渐被自动化工具取代。Python作为一门简洁而强大的编程语言,凭借其丰富的库支持和易学易用的特点,成为编写自动化脚本的首选。无论是数据处理、文件管理还是网页爬虫,Python都能游刃有余地完成任务,极大地减轻了人工操作的负担。接下来,让我们一起领略Python自动化脚本的魅力,开启高效办公的新篇章。 ###
|
1月前
|
机器学习/深度学习 运维 数据可视化
Python时间序列分析:使用TSFresh进行自动化特征提取
TSFresh 是一个专门用于时间序列数据特征自动提取的框架,支持分类、回归和异常检测等机器学习任务。它通过自动化特征工程流程,处理数百个统计特征(如均值、方差、自相关性等),并通过假设检验筛选显著特征,提升分析效率。TSFresh 支持单变量和多变量时间序列数据,能够与 scikit-learn 等库无缝集成,适用于大规模时间序列数据的特征提取与模型训练。其工作流程包括数据格式转换、特征提取和选择,并提供可视化工具帮助理解特征分布及与目标变量的关系。
70 16
Python时间序列分析:使用TSFresh进行自动化特征提取
|
1月前
|
存储 安全 数据可视化
用Python实现简单的任务自动化
本文介绍如何使用Python实现任务自动化,提高效率和准确性。通过三个实用案例展示:1. 使用`smtplib`和`schedule`库自动发送邮件提醒;2. 利用`shutil`和`os`库自动备份文件;3. 借助`requests`库自动下载网页内容。每个案例包含详细代码和解释,并附带注意事项。掌握这些技能有助于个人和企业优化流程、节约成本。
69 3
|
2月前
|
JSON 数据可视化 测试技术
python+requests接口自动化框架的实现
通过以上步骤,我们构建了一个基本的Python+Requests接口自动化测试框架。这个框架具有良好的扩展性,可以根据实际需求进行功能扩展和优化。它不仅能提高测试效率,还能保证接口的稳定性和可靠性,为软件质量提供有力保障。
90 7
|
3月前
|
Java 测试技术 持续交付
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
本文重点讲解如何搭建App自动化测试框架的思路,而非完整源码。主要内容包括实现目的、框架设计、环境依赖和框架的主要组成部分。适用于初学者,旨在帮助其快速掌握App自动化测试的基本技能。文中详细介绍了从需求分析到技术栈选择,再到具体模块的封装与实现,包括登录、截图、日志、测试报告和邮件服务等。同时提供了运行效果的展示,便于理解和实践。
188 4
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
|
2月前
|
Android开发 开发者 Python
通过标签清理微信好友:Python自动化脚本解析
微信已成为日常生活中的重要社交工具,但随着使用时间增长,好友列表可能变得臃肿。本文介绍了一个基于 Python 的自动化脚本,利用 `uiautomator2` 库,通过模拟用户操作实现根据标签批量清理微信好友的功能。脚本包括环境准备、类定义、方法实现等部分,详细解析了如何通过标签筛选并删除好友,适合需要批量管理微信好友的用户。
102 7
|
2月前
|
安全 API 文件存储
Yagmail邮件发送库:如何用Python实现自动化邮件营销?
本文详细介绍了如何使用Yagmail库实现自动化邮件营销。Yagmail是一个简洁强大的Python库,能简化邮件发送流程,支持文本、HTML邮件及附件发送,适用于数字营销场景。文章涵盖了Yagmail的基本使用、高级功能、案例分析及最佳实践,帮助读者轻松上手。
87 4