1

我需要使用 GUI 实现打印到文件的 e2e 自动化测试作为打印过程的仿真。我有

  1. 在 selenium 和 nunit 下运行的 Web 应用程序。它按下打印按钮。
  2. 安装在计算机上的打印应用程序。它将数据从网络服务器打印到用户的打印机或文件(默认 XPS Windows 打印机)以满足测试需要。
  3. 使用安装了 TFS 代理的专用服务器作为前台控制台应用程序的自动 e2e 测试过程“以管理员身份”运行。
  4. 我已注销,由调度程序在 CI 服务器上测试运行。

我必须:处理“文件另存为”窗口,该窗口必须保存打印的 xps 文件(如果使用 pdf 打印机,则为 pdf):

  1. 设置文件名。我使用 SendKyes.SendWait(myFileName)
  2. 按确定按钮。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 窗口,甚至在断开连接时尝试不锁定:

4

0 回答 0