乐趣区

关于python:基于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/… Flexx 是一个纯 Python 工具包,用来创立图形化界面应用程序。其应用 Web 技术进行界面的渲染。你能够用 Flexx 来创立桌面利用,同时也能够导出一个利用到独立的 HTML 文档。因为应用纯 Python 开发,所以 Flexx 是跨平台的。
PyQt https://www.riverbankcomputin… PyQt 是 Qt 库的 Python 版本。PyQt3 反对 Qt1 到 Qt3。PyQt4 反对 Qt4。它的首次公布也是在 1998 年,然而过后它叫 PyKDE,因为开始的时候 SIP 和 PyQt 没有离开。PyQt 是用 SIP 写的。PyQt 提供 GPL 版和商业版
Tkinter https://docs.python.org/zh-cn… Tkinter(也叫 Tk 接口)是 Tk 图形用户界面工具包规范的 Python 接口。Tk 是一个轻量级的跨平台图形用户界面(GUI)开发工具。Tk 和 Tkinter 能够运行在大多数的 Unix 平台、Windows、和 Macintosh 零碎
Pywin32 https://pypi.org/project/pywi… Windows Pywin32 容许你像 VC 一样的模式来应用 PYTHON 开发 win32 利用
PyGTK https://iowiki.com/pygtk/pygt… 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/pywi… 次要应用到 Application 类,用于应用程序治理(关上与敞开利用等)、窗口治理(最小化、最大化、敞开窗口)
Pywin32 https://pypi.org/project/pywi… 蕴含 win32gui、win32api、win32con 3 个子模块,用于窗口治理(定位窗口、显示和敞开窗口、获取窗口地位等)
pyautogui https://pyautogui.readthedocs… 屏幕管制(截屏等)、鼠标管制(挪动鼠标、单击、双击、右击、拖拽等)、键盘管制(编辑、按键等)

2.3 阐明

通过前边的介绍,咱们次要是用例进行自动化测试的,所有 pythonGUi 编程的一些工具就用不到了。而罕用的那三种 pythonGUI 自动化测试工具,有反对的平台无限,所以通过一番折腾,看到大神应用 uiautomation,通过验证该工具很不错,用起来也不便。

3 uiautomation 简介

3.1 作者博客

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

3.2 uiautomation 信息获取

  • 博客:https://www.cnblogs.com/Yinkaisheng/p/3444132.html
  • github:https://github.com/yinkaisheng/Python-UIAutomation-for-Windows/blob/master/readme_cn.md

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 的架构

退出移动版