# 远程执行指南
桌面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)
- 什么是Pywinauto
- 入门指南
- 如何
- 等待长时间操作
- 远程执行指南
- 每种不同控制类型可用的方法
- 贡献者
- 开发笔记
- 待办项目
- 更新日志
- 基本用户输入模块
- pywinauto.mouse
- pywinauto.keyboard
- 主要用户模块
- pywinauto.application
- pywinauto.findbestmatch
- pywinauto.findwindows
- pywinauto.timings
- 特定功能
- pywinauto.clipboard
- pywinauto.win32_hooks
- 控件参考
- pywinauto.base_wrapper
- pywinauto.controls.hwndwrapper
- pywinauto.controls.menuwrapper
- pywinauto.controls.common_controls
- pywinauto.controls.win32_controls
- pywinauto.controls.uiawrapper
- pywinauto.controls.uia_controls
- Pre-supplied Tests
- pywinauto.tests.allcontrols
- pywinauto.tests.asianhotkey
- pywinauto.tests.comboboxdroppedheight
- pywinauto.tests.comparetoreffont
- pywinauto.tests.leadtrailspaces
- pywinauto.tests.miscvalues
- pywinauto.tests.missalignment
- pywinauto.tests.missingextrastring
- pywinauto.tests.overlapping
- pywinauto.tests.repeatedhotkey
- pywinauto.tests.translation
- pywinauto.tests.truncation
- 后端内部实施模块
- pywinauto.backend
- pywinauto.element_info
- pywinauto.win32_element_info
- pywinauto.uia_element_info
- pywinauto.uia_defines
- 内部模块
- pywinauto.controlproperties
- pywinauto.handleprops
- pywinauto.xml_helpers
- pywinauto.fuzzydict
- pywinauto.actionlogger
- pywinauto.sysinfo
- pywinauto.remote_memory_block