我需要使用 GUI 实现打印到文件的 e2e 自动化测试作为打印过程的仿真。我有
- 在 selenium 和 nunit 下运行的 Web 应用程序。它按下打印按钮。
- 安装在计算机上的打印应用程序。它将数据从网络服务器打印到用户的打印机或文件(默认 XPS Windows 打印机)以满足测试需要。
- 使用安装了 TFS 代理的专用服务器作为前台控制台应用程序的自动 e2e 测试过程“以管理员身份”运行。
- 我已注销,由调度程序在 CI 服务器上测试运行。
我必须:处理“文件另存为”窗口,该窗口必须保存打印的 xps 文件(如果使用 pdf 打印机,则为 pdf):
- 设置文件名。我使用 SendKyes.SendWait(myFileName)
按确定按钮。SendKyes.SendWait("{ENTER}")
private void SaveFileIfRequired(int waitWindowTimeoutSeconds) { const string saveDialogWindowName = "Save Print Output As"; bool isSaveDialogShown = WasWinFromWindowShown(saveDialogWindowName, waitWindowTimeoutSeconds/3); Logger.Debug($"{nameof(isSaveDialogShown)} : {isSaveDialogShown}"); if (isSaveDialogShown) { string fileNameToSave = @"autmationTestPrintedFile_" + DateTime.Now.Ticks; string filePathToSave = Path.Combine(DefaultTestData.GetPathToPrintedLabels(), fileNameToSave).ToLower(); Logger.Trace($"{nameof(filePathToSave)} : {filePathToSave}"); var windowPointer = FindWindow(null, saveDialogWindowName); int foreground = SetForegroundWindow(windowPointer); // foreground 0 when logged off and Logger.Trace($"windowPointer: {windowPointer}, foreground {foreground}"); const int closeWindowsDelayMiliseconds = 1000; //SendKeys.SendWait(@"^+{LEFT}{BACKSPACE}"); SendKeys.SendWait("^{HOME}"); // Move to start of control SendKeys.SendWait("^+{END}"); // Select everything SendKeys.SendWait("{DEL}"); SendKeys.Flush(); Thread.Sleep(closeWindowsDelayMiliseconds/2); SendKeys.SendWait(filePathToSave); SendKeys.Flush(); Thread.Sleep(closeWindowsDelayMiliseconds/2); SendKeys.SendWait(@"{ENTER}"); SendKeys.Flush(); VerifyWindowIsClosed(saveDialogWindowName); }
接下来是问题:
如果我登录到运行测试的专用服务器(通过 RDP),一切都很好,文件将被保存,因为窗口将被处理。
如果我从服务器注销,SetForeground 将返回 0 并且文件不会被保存,并且会打开窗口。
我知道 Windows 7+ 的 UAC 限制。UAC 完全被禁用。我们使用 Windows server 2012。我需要一些解决方法。也许来自 UAC 关于这个操作,改变寄存器,也许是一些方法或库......
我当然用
<add key="SendKeys" value="SendInput"/>
在设置中
更新
看起来这不是 UAC 问题,而是从 RDP 机器注销或最小化 rdp 窗口时的无 GUI 模式问题。windows 锁定桌面并在没有活动窗口的情况下设置 gui-free 模式
详细信息:通过远程桌面进行测试
解决方案之一 -在测试 GUI 时保持 RDP 连接
还有可能的变体来最小化 RDP 窗口,甚至在断开连接时尝试不锁定: