See You Again

使用pyautogui配合pytesseract进行桌面应用自动化

对于使用系统原生组件开发的桌面应用,可以使用系统提供的方案(WADApple Automator)进行自动化,但是某些例如PC版微信、微信开发者工具不使用原生组件(可能出于开发效率考虑)的应用,就束手无策了。

于是有人提出来一种方案,基于图像识别的模式,不管你使用什么技术实现,我都当成图像处理。代表性方案有:

今天要说的也是类似的方案,不过是基于 pyautogui 和 pytesseract 的。

pyautogui

官方对他的定义如下

A cross-platform GUI automation Python module for human beings. Used to programmatically control the mouse & keyboard.

主要功能有:

其主要解决的问题是鼠标和键盘的自动操作(一个类似按键精灵的东西),通过识别子图片来定位子元素,屏蔽了应用的实现细节。
这种实现思路理论上对任何应用都适用。

  1. pyautogui.moveTo(x, y, duration=0.2)
  2. pyautogui.click(x, y)
  3. pyautogui.locateCenterOnScreen('piece.png', grayscale=False)

pytesseract

pyautogui只能做一些点点点的操作,对于自动化来讲缺少了核心功能——获取和判断界面的元素,这也是其核心的软肋。
从图片里提取文本是很难的一件事,于是轮到 pytesseract 出场了。

pytesseract 是 Google 项目 Google’s Tesseract-OCR Engine 的封装,使用经过训练后的数据识别各个国家的语言,可以获得令人满意的结果。

  1. pytesseract.image_to_string('input.png', lang='eng').strip()

实战

现在我们需要采集微信开发者工具里的包大小数据,包括本地代码、主包两个维度。

需要做的工作如下:

完成这些工作只需要不到半天时间,由于目标图片较为简单,OCR 识别效果比较理想:

以下为截图的图片:

以下为识别的结果:

  1. 4826 KB

小结

对于一些特定的场景,图像识别方案有其合理性,但是应认清该方案的局限性:

在一些特定的场景也许有其价值,例如没有文字或者组件ID但有图片的场景(游戏),或者更极端的Flash等,另外是它可以和现有的测试框架较好的集成(例如BDD、Pytest)等。

黑猫白猫,抓到耗子就是好猫

2019-08-12 喜欢

Copyright © 2015-2018 转载请注明出处

回到顶部 ↑