🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 远程执行指南 桌面GUI测试通常需要活动桌面来移动鼠标光标并将某些键键入焦点窗口。 这完全阻止了本地机器的正常使用。 但是在远程计算机上运行测试是一项挑战。 本指南收集了使用GUI测试控制远程计算机的已知问题和解决方案。 ## Windows远程桌面功能 远程桌面(RDP)通过Windows操作系统向远程计算机提供虚拟活动桌面。 有两个潜在问题: > * 如果RDP窗口最小化,则默认情况下远程PC上没有活动桌面。 > * 如果RDP断开连接,桌面将被锁定。 在这两种情况下,任何GUI自动化作业都将失败(如果您不使用下面描述的一些技巧)。 TestComplete文档中详细描述了变通方法: > * [在最小化的远程桌面Windows中运行测试](https://support.smartbear.com/testcomplete/docs/testing-with/running/via-rdp/in-minimized-window.html) > * [在运行自动测试时断开与远程桌面的连接](https://support.smartbear.com/testcomplete/docs/testing-with/running/via-rdp/keeping-computer-unlocked.html) ## VNC服务器软件 有更简单的方法可以避免上述问题:使用VNC服务器软件(例如,Tight VNC)。 它作为一对客户端和服务器工作。 VNC服务器还在远程计算机上提供活动桌面。 > * 这是一个非虚拟桌面,因此在远程PC上使用本机屏幕分辨率可能需要更新视频驱动程序。 > * 最小化或断开VNC客户端不会破坏活动桌面(默认情况下!)。 > * 这是一个跨平台的解决方案(VNC服务器是macOS的本机部分,可在Linux上使用)。 您可能面临的唯一问题: > * 使用远程桌面(RDP)可能会破坏VNC服务器的优势,您必须重新启动远程PC或应用上述RDP解决方法。 ## 其他远程访问软件 如果有人试图使用Teamviewer,Power BI桌面或任何其他虚拟桌面软件远程运行GUI测试/自动化,请随意在本指南中添加更多详细信息。 ## 在锁定的机器上运行自动化的技巧 对于某些应用程序,可以在锁定的计算机上运行GUI自动化,但它需要使用特殊方法。 首先,值得列出在锁定机器上不起作用的方法: > * [click\_input](code/pywinauto.base_wrapper.html#pywinauto.base_wrapper.BaseWrapper.click_input)和所有其他鼠标单击并按下以`_input`结尾的方法. > * [set\_focus](code/pywinauto.controls.hwndwrapper.html#pywinauto.controls.hwndwrapper.HwndWrapper.set_focus) as it uses `SetCursorPos` and `SetForegroundWindow`. > * [type\_keys](code/pywinauto.base_wrapper.html#pywinauto.base_wrapper.BaseWrapper.type_keys) for native keyboard input. > * Direct usage of modules [mouse](code/pywinauto.mouse.html) and [keyboard](code/pywinauto.keyboard.html). 其他一些方法也可能不起作用,但这取决于应用程序。 在`backend="win32"`中输入静默文本的方法很少: > * [send\_chars](code/pywinauto.controls.hwndwrapper.html#pywinauto.controls.hwndwrapper.HwndWrapper.send_chars) (仅符号; 特殊键组合不起作用) > * [send\_keystrokes](code/pywinauto.controls.hwndwrapper.html#pywinauto.controls.hwndwrapper.HwndWrapper.send_keystrokes) (一些特殊的组合键可能起作用) 另一种有用的方法是一次输入字符串(两个后端都可用,通常只用于编辑框): > * [“uia”: set\_edit\_text](code/pywinauto.controls.uia_controls.html#pywinauto.controls.uia_controls.EditWrapper.set_edit_text) (按原样输入文本,不支持修饰符) > * [“win32”: set\_edit\_text](code/pywinauto.controls.win32_controls.html#pywinauto.controls.win32_controls.EditWrapper.set_edit_text) ## 使用基于代理的CI启动远程脚本 当您的脚本准备好并且您可以手动在远程计算机上运行它时,是时候自动执行最后一步:从本地计算机或CI服务器触发运行脚本。 如果您有内部托管CI(例如,Jenkins),则可能目标计算机已使用代理连接到Jenkins master。 连接代理有三种方法: > * 将代理程序作为服务运行:在这种情况下,GUI测试将不起作用,因为在作为服务运行时甚至无法创建GUI。 > * 通过SSH运行代理:GUI测试不起作用。 > * 将代理作为普通应用程序运行。 这是唯一的工作案例! ## 直接启动远程脚本 本章的灵感来自于 [issue #401](https://github.com/pywinauto/pywinauto/issues/401) (特别感谢[yangliang003](https://github.com/yangliang003)). 第一个选项是PsExec。 感谢 [这篇文章在StackExchange上](https://serverfault.com/a/852877/368634). > 1. 下载[PsTools](https://docs.microsoft.com/en-us/sysinternals/downloads/psexec). > 2. 使用`tasklist`命令获取RDP会话的进程ID。 PowerShell脚本: > > > ~~~ > > $session = tasklist /fo CSV | findstr RDP ; $session = $session.Split(",")[3] ; $session.Split('"')[1] > > ~~~ > > 3. Start process: `PsExec.exe -s -i 123 python my_script.py`. [Ansible](https://github.com/ansible/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 Scheduler还能够通过GUI交互支持启动作业。 有一种简单的方法可以从`cmd.exe`安排一次任务: ~~~ Schtasks /Create /tn my_task /tr c:\temp\my_task.bat /sc ONCE /st hh:mi:ss /sd yyyy/mm/dd ~~~ ### How To`s * [How To’s](HowTo.html)