转眼间学 Python 也有接近 4 年的事情了。
自从学了这门所谓的编程语言之后,一切皆对象的思维方式影响了我的工作、生活,顺带着影响着人生观等。所以说,专注一件事情的同时,顺带着把其他的一些东西醒悟了,这也算是一件圆满的答复吧。
- 本人学习、整理的笔记个人YY为比较直观,用词刺眼,如有冒犯,多多见谅。
网上介绍 Python 的太多,我就用最实际的来说:我个人认为硬件技术的发展使得目前的硬件问题变得性能过剩,加上最近几年网上大多数“专家”也发现了摩尔定律可能性或者存在被打破的规律,so,不用多说,学 Python 还是学 other 那是需求者要说的事情;假设你不喜欢蛋糕,每天路过一个蛋糕店,且这个蛋糕店能让你免费领取、试吃新鲜刚做好蛋糕,对于你自己而言,东西再好、免费也是白搭。所以说,一门技术对于一个人来说,最重要的第一点是用途,其次就是易学、易用。
与我来说,Python 在我实际当中本就有实现的用途,其次就是易学与易用。
那么本文的主角 Pywinauto 顾名思义,就是利用 Python 在电脑上进行软件的 GUI 自动化,模拟人工操作;那么,你的流程可以先这样:
- 利用面向对象的思维方式,先将重复性且有规律的工作内容进行分类;
- 利用流程思维(思维导图的方式)将工作类进行流程设计(面向过程);
- 使用 Python Pywinauto 库、os 模块(或者 Pathlib)、win32clipboard(像手动操作复制图片、或者文字需要的)……
[这里只列举了我自己常用的几个]
以上只是自己的开头,接下来是正文的开始,我自己从 Pywinauto 官方文档 - 点击传送 里使用 沉浸式翻译 插件进行摘录保存,里面根据自己的理解修改了一定量的东西,再加上根据自己的阅读习惯进行一定量的排版。
GUI 应用程序行为通常不稳定,您的脚本需要等待,直到出现新窗口或关闭/隐藏现有窗口。pywinauto 可以灵活地隐式(使用默认超时)或显式等待对话框初始化,使用专用方法/函数来帮助您使代码更轻松、更可靠。
桌面 GUI 测试通常需要活动桌面移动鼠标光标并在聚焦窗口中键入一些键。这完全阻止了本地计算机的正常使用。
但是在远程计算机上运行测试是一项挑战。本指南收集了已知问题和解决方案,以通过 GUI 测试控制远程计算机。
Windows 远程桌面功能
远程桌面 (RDP) 为具有 Windows 操作系统的远程计算机提供虚拟活动桌面。存在 2 个潜在问题:
- 如果 RDP 窗口最小化,则默认情况下远程 PC 上没有活动桌面。
- 如果 RDP 断开连接,则桌面将被锁定。
在这两种情况下,任何 GUI 自动化作业都将失败(如果您不使用下面描述的一些技巧)。解决方法在 TestComplete 文档中得到了很好的描述:
VNC Server 软件
有更简单的方法可以避免上述问题:使用 VNC 服务器软件(例如,Tight VNC)。它作为一对客户端和服务器工作。VNC 服务器还在远程计算机上提供活动桌面。
- 这是一个非虚拟桌面,因此在远程 PC 上使用本机屏幕分辨率可能需要更新视频驱动程序。
- 最小化或断开 VNC 客户端不会破坏活动桌面(默认情况下!
- 这是一个跨平台的解决方案(VNC 服务器是 macOS 的原生部分,可在 Linux 上使用)。
您可能面临的唯一问题:
使用远程桌面 (RDP) 可能会破坏 VNC 服务器的优势,您必须重新启动远程 PC 或应用上述 RDP 解决方法。
其他远程访问软件 ¶
如果有人尝试使用 Team Viewer、PowerBI 桌面或任何其他虚拟桌面软件远程运行 GUI 测试/自动化,请随时在本指南中添加更多详细信息。
在锁定的机器上运行自动化的技巧
对于某些应用程序,可以在锁定的计算机上运行 GUI 自动化,但这需要使用特殊方法。首先,值得列出在锁定的机器上不起作用的方法:
click_input
和所有其他鼠标单击和按方法,_input
以 结尾。set_focus
因为它使用SetCursorPos
和SetForegroundWindow
.type_keys
用于本机键盘输入。- 直接使用鼠标和键盘模块。
其他一些方法可能也不起作用,但这取决于应用。在 backend="win32"
以下情况下,有几种无声文本输入的方法:
send_chars
(仅限符号;特殊组合键不起作用)send_keystrokes
(某些特殊的组合键可能有效)
还有另一种有用的方法可以一次输入字符串(适用于两个后端,通常仅用于编辑框):
- “UIA”:
set_edit_text
(按原样输入文本,不支持修饰符) - “win32”:
set_edit_text
使用基于代理的 CI 启动远程脚本
当您的脚本准备就绪并且可以在远程计算机上手动运行它时,是时候自动执行最后一步了:从本地计算机或 CI 服务器触发运行脚本。
如果您有内部托管的 CI(例如 Jenkins),则目标计算机可能已经使用代理连接到 Jenkins master。有三种方法可以连接代理:
- 将代理即服务运行:在这种情况下,GUI 测试将不起作用,因为在作为服务运行时甚至无法创建 GUI。
- 通过 SSH 运行代理:GUI 测试不起作用。
- 像普通应用程序一样运行代理。这是唯一的工作案例!
直接启动远程脚本
本章的灵感来自问题 #401。 #401 (特别感谢 yangliang003))。
第一个选项是 PsExec。感谢 StackExchange 上的这篇文章。
- 下载 PsTools。
- 使用
tasklist
命令获取 RDP 会话的进程 ID。PowerShell 脚本:
$session = tasklist /fo CSV | findstr RDP ; $session = $session.Split(",")[3] ; $session.Split('"')[1]
- 启动进程:
PsExec.exe -s -i 123 python my_script.py
.
Ansible 具有简化它的 PsExec 插件。剧本示例:
- name: test ra module
hosts: *****
tasks:
- name: run GUI automation
win_psexec:
command: python pywinauto_example.py
executable: C:\Windows\PSTools\psexec.exe
interactive: yes
username: admin
password: ******
hostnames: ******
Windows 计划程序还能够启动具有 GUI 交互支持的作业。有一种简单的方法可以一次性 cmd.exe
安排任务:
Schtasks /Create /tn my_task /tr c:\temp\my_task.bat /sc ONCE /st hh:mi:ss /sd yyyy/mm/dd