20
08

实现自动化测试框架

主要解决的就是利用Python模拟鼠标和键盘操作的问题。这里我们需要使用到PyWin32的库,以便于直接使用Python操作Windows系统接口。同样的,使用“pip install pywin32”安装完成后,实现代码及功能备注如下:


本次分享《利用Python开发图像识别测试框架》实验中的实现自动化测试框架,回顾本章节的前期分享,请点击

图像识别的基本思路

模板匹配的核心算法

模板匹配的代码实现


当我们完成了相对比较复杂的匹配算法后,剩下的框架开发部分的内容则相对容易理解了。主要解决的就是利用Python模拟鼠标和键盘操作的问题。这里我们需要使用到PyWin32的库,以便于直接使用Python操作Windows系统接口。同样的,使用“pip install pywin32”安装完成后,实现代码及功能备注如下:


from PIL import Image, ImageGrab
import os
import time
import win32api
import win32con
from ctypes import *

class ImageMatch:
    # 定义键盘常用按钮,用于文本框的输入操作
    VK_CODE = {
        'backspace': 0x08,
        'tab': 0x09,
        'enter': 0x0D,
        'left_arrow': 0x25,
        'up_arrow': 0x26,
        'right_arrow': 0x27,
        'down_arrow': 0x28,
        '0': 0x30,
        '1': 0x31,
        '2': 0x32,
        '3': 0x33,
        '4': 0x34,
        '5': 0x35,
        '6': 0x36,
        '7': 0x37,
        '8': 0x38,
        '9': 0x39,
        'a': 0x41,
        'b': 0x42,
        'c': 0x43,
        'd': 0x44,
        'e': 0x45,
        'f': 0x46,
        'g': 0x47,
        'h': 0x48,
        'i': 0x49,
        'j': 0x4A,
        'k': 0x4B,
        'l': 0x4C,
        'm': 0x4D,
        'n': 0x4E,
        'o': 0x4F,
        'p': 0x50,
        'q': 0x51,
        'r': 0x52,
        's': 0x53,
        't': 0x54,
        'u': 0x55,
        'v': 0x56,
        'w': 0x57,
        'x': 0x58,
        'y': 0x59,
        'z': 0x5A
    }

    # 启动一个应用程序
    def start_app(self, cmd):
        # start /b 命令的目的是让程序在后台运行,不阻塞当前程序的运行主线程
        os.system("start /b " + cmd)
        time.sleep(3)

    # 移动到对象所在位置并实现单击操作
    def click(self, target):
        x, y = self.find_image(target)      # 查找模板图片的中心点位置
        windll.user32.SetCursorPos(x, y)    #将光标移动到指定位置
        # 实现鼠标左键的点击操作(按下,弹起两步操作)
        win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
        win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
    # 双击操作
    def double_click(self, target):
        x, y = self.find_image(target)
        windll.user32.SetCursorPos(x, y)
        win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
        win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
        win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
        win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)

    # 在文本框中输入内容
    def input(self, target, content):
        self.double_click(target)   # 先双击选择文本框中已有内容(没有也不影响)
        # 再点击回退键将已有内容删除
        win32api.keybd_event(self.VK_CODE['backspace'], 0, 0, 0)
        win32api.keybd_event(self.VK_CODE['backspace'], 0,

win32con.KEYEVENTF_KEYUP, 0)
        time.sleep(1)

        # 根据输入的字符串内容遍历每一个字符,将其输入(从VK_CODE字典中获取)
        for c in content:
            win32api.keybd_event(self.VK_CODE[c], 0, 0, 0)
            win32api.keybd_event(self.VK_CODE[c], 0,

win32con.KEYEVENTF_KEYUP, 0)
            time.sleep(0.1)
    # 下拉框的选择,使用下箭头按键次数来决定选择哪一条
    def select(self, target, count):
        self.click(target)
        time.sleep(0.5)
        for i in range(count):
            win32api.keybd_event(self.VK_CODE['down_arrow'], 0, 0, 0)
            win32api.keybd_event(self.VK_CODE['down_arrow'], 0, win32con.KEYEVENTF_KEYUP, 0)
            time.sleep(0.5)
        win32api.keybd_event(self.VK_CODE['enter'], 0, 0, 0)
        win32api.keybd_event(self.VK_CODE['enter'], 0, win32con.KEYEVENTF_KEYUP, 0)


当然,上述操作只是封装了几个最常用的操作而已。由于本书篇幅有限,其它类型的操作本书将不再赘述,其原理和实现手段都是一样的,没有任何本质区别。最后我们来完成一个简单的基于图像识别的自动化测试脚本的开发。拿笔者开发的一个简单的计算器来举例,整个计算器的截图如下:

20190807_164159_820.png


截取如下模板图片(含文件名):

20190807_164211_183.png


基于类ImageMatch,完成如下自动化测试脚本:


from imagetest import ImageMatch
import time
im = ImageMatch.ImageMatch()
im.start_app("java -jar D:/Other/JavaSwingCalc.jar") 
im.input("numberx.png", '200')
im.input("numbery.png", '100')
im.select('calctype.png', 1)
time.sleep(1)
im.click('docalc.png')
if im.check_exist('result.png'):
    print("测试成功.")
else:
    print("测试失败.")
time.sleep(1)
im.click('doclose.png')


到目前为止,我们已经可以使用完全自主开发的一套基于图像识别的自动化测试框架来完成绝大多数的测试工作了。虽然,在实际的项目应用中,基于图像识别来进行GUI界面的自动化测试并不是首选,但是很多情况下如果我们无法识别和操作一些特定的元素的时候,那么利用图像识别技术将是一种很好的补充。而且整个代码量非常少,我们可以嵌入在任何我们需要使用的地方,并不会对整个测试脚本有大的影响。但是能够帮助我们解决的问题,却是实实在在的。


下期推送:利用OpenCV完成模板匹配


为了答谢大家对蜗牛学院的支持,蜗牛学院将会定期对大家免费发放干货,敬请关注蜗牛学院的官方微信。


20190320_095757_834.jpg




版权所有,转载本站文章请注明出处:蜗牛学苑, https://www.woniuxy.cn/article/301