GUIを使用した印刷プロセスのエミュレーションとして、ファイルへの印刷のe2e自動テストを実装する必要があります。私は持っている
- Selenium と nunit で実行される Web アプリケーション。印刷ボタンを押します。
- コンピューターにインストールされている印刷アプリケーション。テストの必要に応じて、Web サーバーからユーザーのプリンターまたはファイル (デフォルトの XPS Windows プリンター) にデータを出力します。
- 自動化された e2e テスト プロセスは、TFS エージェントがインストールされた専用サーバーをフォアグラウンド コンソール アプリケーションとして使用し、「管理者として」実行されました。
- ログオフし、CI サーバーでスケジューラーによるテスト実行を行います。
印刷されたxpsファイル(またはpdfプリンターが使用される場合はpdf)を保存する必要がある「名前を付けてファイルを保存」ウィンドウを処理します。
- ファイル名を設定します。SendKyes.SendWait(myFileName) を使用します
OKボタンを押します。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フリーモードを設定します
解決策の 1 つ - GUI のテスト中に RDP 接続を維持する
RDP ウィンドウを最小化し、切断中にロックしないようにするためのバリアントも考えられます。