凌的博客

您现在的位置是: 首页 > 学无止境 > python > 

python

模拟鼠标点击程序,在远程连接最小化和关闭后执行失败的解决方案

2020-03-13 python 5074

一、初识鼠标键盘失效问题

当用户在一段时间内没有对Windows进行任何操作,Windwos会自动切换到锁屏模式(或屏保模式),甚至待机。

对于普通用户来说,这样设置没问题,而且这也是官方推荐的设置。但如果这台电脑是IT开发人员用来进行自动化测试的机器,尤其是包含UI交互的测试(比如,用脚本操控鼠标来模拟点击一个按钮),这样设置就是错误的,因为退出桌面后,鼠标键盘会失效,UI自动化无法正常进行。

解决这一问题思路很简单:保持计算机一直在桌面上。

具体实施的方法如下:设置Windows的电源模式,让Windows不要自动锁屏和待机,同时去掉屏保。


二、问题进阶

UI自动化测试期间,执行测试的电脑几乎不能被其他人使用(因为鼠标、键盘等输入设备此时需要响应自动化测试脚本)。

为了不影响工作我们通常会搭一台虚拟机,然后远程连接到虚拟机,在虚拟机里进行UI自动化测试。

这种方式很常用,但存在一个问题:如果我们在测试过程中将远程桌面最小化或关闭远程桌面,那测试也会因为鼠标键盘失效而中断。


三、问题成因

最小化会让远程桌面的会话切换到无图形界面的模式,这自然就无法继续接收鼠标、键盘的指令。

关闭远程桌面会让系统切换到登录Desktop的界面,而在登录Desktop的界面上没有我们打开的其他窗口,因此会导致UI自动化测试失败。


四、初级解决方案

1、远程连接上虚拟机,永不关闭,永不最小化

2、如果远程连接的机器是物理机的话,直接打开物理机,启动测试,关闭屏幕。注意:不要远程登录本机器,否则参考方法1


五、远程桌面最小化中断测试的解决办法(注:从机器A通过远程桌面连接机器B,则需要在机器A上修改注册表)

1、运行regedit

2、找到注册表项HKEY_CURRENT_USER\Software\Microsoft\TerminalServer Client

3、新建一个类型为DWORD的注册表项RemoteDesktop_SuppressWhenMinimized并设置值为2

4、然后找到注册表项HKEY_CURRENT_USER\Software\Wow6432Node\Microsoft\TerminalServer Client

5、新建一个类型为DWORD的注册表项RemoteDesktop_SuppressWhenMinimized并设置值为2

6、关闭注册表编辑窗口并重启计算机


注意:上述配置仅对当前用户生效,如果你想让新增的注册表项应用于所有用户的话,则需要在HKEY_LOCAL_MACHINE下新建对应的注册表项。


六、关闭远程桌面中断测试的解决办法1

1、我们之前通过点击x图标来关闭远程桌面会导致鼠标键盘失效,本方法的解题思路是用命令关闭远程桌面,同时保留连接。

2、在远程桌面(被连接的电脑)中先执行 query session 来查看当前登录到的 session,(远程桌面的 sessionName 都以 rdp-tcp 开头)。

3、以管理员身份打开命令行工具,并执行 "tscon rdp-tcp#71 /dest:console",其中 rdp-tcp#71 为SessionName,我们可以把rdp-tcp#71替换为对应的ID。

4、该命令会关闭远程桌面的连接,然后把连接返回给远程的那台电脑(绕开登录过程)。

5、这里的 console 也是一个 SessionName,而这个名字的意思并非是 C# 中 “控制台” 的意思,而是指带有输入输出设备的机器,一般直接登录电脑的会话就是 console。

21.png

七、关闭远程桌面中断测试的解决办法2

1、每次都打开cmd执行命令太麻烦了,我们可以把命令封装成bat文件,当需要关闭远程桌面并保留连接时以管理员身份执行即可。

2、新建文本文件,将其重命名为Close_RDP.bat

3、将下边六行代码拷贝进去

@%windir%\System32\tscon.exe 0 /dest:console

@%windir%\System32\tscon.exe 1 /dest:console

@%windir%\System32\tscon.exe 2 /dest:console

@%windir%\System32\tscon.exe 3 /dest:console

@%windir%\System32\tscon.exe 4 /dest:console

@%windir%\System32\tscon.exe 5 /dest:console


当多个用户登录同一台计算机时,就会出现 Session ID 大于1的情况,比如远程桌面。

.bat文件中有六行命令,在本例中实际起作用的是ID=4的那一条,由于你不能确定自己是第几个登录到远程桌面的,也就无法确定自己的SessionID,

本例仅处理了0~5的SessionID,如果你进行远程连接时被分配的SessionID是6,那脚本就对你无效了,自己稍加修改即可。 


八、关闭远程桌面中断测试的解决办法3

假设用于进行UI自动化测试的机器是虚拟机B,现在使用另一台虚拟机A作为中转。

1、本机先连接虚拟机A

2、然后再从虚拟机A连接到虚拟机B

3、最后断开本机与虚拟机A的连接

3.jpg

如果文章对您有帮助,请点赞、评论支持一下,谢谢!


参考内容:


https://www.cnblogs.com/bangejingting/p/6846480.html#commentform

https://blog.csdn.net/sogouauto/article/details/43269045 

————————————————

版权声明:本文为CSDN博主「changuncle」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:

https://blog.csdn.net/xiaouncle/article/details/103035537


综合:

最小化解决方案:

修改本地电脑A的注册表!

键盘按Win + R,输入regedit命令,打开注册表 ,找到位置:HKEY_LOCAL_MACHINE\Software\Microsoft\Terminal Server Clien

在该节点下创建一个 DWORD 类型的值,名字叫做 RemoteDesktop_SuppressWhenMinimized,然后设置值为 2

退出注册表,现在我们最小化远程桌面,自动化程序将继续执行!

远程桌面关闭解决方案:

如果需要关闭远程桌面,我们可以使用另外一台云服务器C,使用远程桌面连接到云服务器A,同时修改服务器C的注册表,然后断开服务器C即可!自动化程序将继续执行!


##########################

那些远程桌面连接遇到的坑

TestBird在远程调试上有非常成熟的技术,在APP测试中广受业界好评。下面我们谈谈WEB环境下如何避免远程调试的坑。在Windows桌面软件进行UI自动化测试时,如果只为了替换手工,编写的测试脚本只在实体机上运行的话,不会涉及到远程桌面连接的问题。但在工作中,我们经常会将测试脚本部署到虚拟机上去执行,从而在自动化测试执行过程中,还可以进行一些其他的工作。这时,问题来了,如果只是在虚机后台运行而没有远程桌面连接的话,鼠标点击、键盘操作事件均是无效的,如何解决呢?

于是我们就在自己的工作机上,远程连接上了虚机,执行测试脚本,ok,一切顺利,但是当我们把远程连接窗口最小化时,问题又出现了,鼠标键盘模拟又失效了,怎么办?

当我们通过mstsc启动远程桌面连接时,被连接的Windows会启动一个会话。此时你对远程桌面窗口里面的所有操作将会‘翻译’成TCP包传输过去,被连接的Windows接收到这些包之后,‘还原’命令并且在当前的活动会话上面执行。而当你断开连接时,会话变成断开状态,Windows会自动关闭会话,也就导致了所有基于GUI的操作‘失效’了。而当最小化远程桌面时,Windows为了节约网络带宽传输,会暂时‘关闭会话’,导致你的模拟操作程序失效。

为了能够让测试脚本正常执行,第一个想到的办法就是,远程连接上虚机,永远不要关,也不要最小化。当然,我们如果能够操作虚机所在的远程机器的话,我们可以在远程机器上登录虚机,然后永远不再远程登录虚机。当然,还有其他更好的方案:

l注册表法

如果从A机器通过远程桌面连接到机器B,则我们需要修改机器A上的注册表项,步骤如下:

1.运行regedit

2.找到注册表项HKEY_CURRENT_USER\Software\Microsoft\TerminalServer Client

3.创建一个类型为DWORD的注册表值项RemoteDesktop_SuppressWhenMinimized并设置值为2

4.然后找到注册表项HKEY_CURRENT_USER\Software\Wow6432Node\Microsoft\TerminalServer Client

5.创建一个类型为DWORD的注册表值项RemoteDesktop_SuppressWhenMinimized并设置值为2

6.关闭注册表编辑窗口

PS:如果你想针对所有用户进行修改的话,只需要将HKEY_LOCAL_MACHINE下对应的项修改即可。完成以上操作后,如果在A机器上连接机器B后,窗口最小化后,鼠标键盘操作也可以正常模拟了。

l自登陆法

我们远程连接上虚机后,可以在远程虚机上执行一个bat脚本,使得虚机能够自己登陆自己,bat脚本如下:

@%windir%\System32\tscon.exe 0/dest:console

@%windir%\System32\tscon.exe 1/dest:console

@%windir%\System32\tscon.exe 2/dest:console

将脚本内容,保存为Close_RDP.bat,在远程虚机上双击运行,正常情况下,虚机会自动关闭,在虚机关闭的情况下,鼠标键盘的模拟仍然是生效的,不过此方法存在不太稳定的情况,不推荐使用。

l开源远程桌面连接软件法

使用C#开源远程桌面连接软件Multi RDP Client .NET,当远程连接上后,最小化的情况下,鼠标键盘模拟仍然是生效的。另外由于是开源软件,所以我们可以在源码基础上,扩展自己的功能,比如说在自动化测试过程中,接收请求,自动远程连接相应机器,来满足自动化测试的需求。另外,使用第三方远程连接软件,我们可以将软件的数据保存到远程的数据库中,这样,我们只需要有软件,不需要知道机器密码就可以使用执行机器了。

以上几种解决远程桌面问题的方法,在工作中都有可能用到,比如说在脚本初期,我们使用到的机器不是太多的情况下,脚本的运行需要手工进行,这时,我们可以采用注册表法,这样就可以将远程桌面的窗口最小化到任务栏了;而当我们机器不断增多时,比如说自动化执行的机器超过了10个甚至更多,这时我们最好借助开源远程连接软件了。对于大规模的虚机管理,我们推荐使用开源远程连接软件来进行管理。



作者:alston123
链接:https://www.jianshu.com/p/5218682b306b
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


文章评论

0条评论