本文提供指导,帮助排查失败的无人参与桌面流运行问题,特别强调利用屏幕截图来诊断故障。
适用于: Power Automate
原始 KB 数: 5007976
症状
在参与模式下成功运行的桌面流无法在无人参与模式下正确执行。 它还可能失败,并显示如下所示的错误消息:
运行“Click”操作时出现了问题。 无法在网页上单击该链接。
原因
由于以下原因,可能会出现无人参与的运行失败:
- 在无人参与模式下部署之前,该脚本可能尚未在参与模式下进行彻底测试。
- 无人参与会话可能使用不同的配置(例如,不同的 Windows 帐户、屏幕分辨率或浏览器设置(例如用户配置文件、弹出窗口阻止程序设置、缺少扩展或已禁用的扩展)。
- 由于脚本中的延迟不足或计时问题,屏幕可能无法完全加载。
- 会话开始时,用户帐户控制(UAC)提示可能会阻止 UI 自动化。
决议
由于此问题的原因可能不同,以下解决方案描述了在失败操作之前和之后添加屏幕截图以获取一些视觉反馈的方法。 分析在无人参与模式下失败前后拍摄的屏幕截图有助于识别前面列出的问题的根本原因。 该解决方案还描述了如何对比有人值守和无人值守执行之间的显示分辨率和缩放设置。
如果在流中添加屏幕截图,并且它们无法执行,则可能有一个 UAC 对话框干扰了流的自动化。 使用为无人参与流执行配置的同一 Windows 帐户登录到出现问题的计算机,并检查是否有任何阻止对话框。 如果有此类对话框,请调整启动配置以防止此问题。
添加屏幕截图以排查问题
可以使用拍摄屏幕截图操作,在无人参与模式下于失败步骤前后立即捕获屏幕截图。 屏幕截图可以提供视觉反馈来帮助诊断问题。 可以通过修改其“出现错误时”行为来配置失败步骤,以便在失败后继续执行,从而允许在发生故障后捕获屏幕截图。 问题解决后,将流程的“出错时”行为恢复到其原始设置。
使用您在连接中使用的帐户登录到可以重现问题的计算机。 验证没有 UAC 提示阻止 UI 自动化。
找到 “屏幕截图” 操作。
将 “拍摄屏幕截图” 动作拖拽到脚本侧。
将“保存屏幕截图至:”字段设置为“文件”,并指定图像的文件路径和名称,确保文件名中包含“before”。 选择“保存”。
添加一个新的截图动作,并指定图像的文件路径和名称,确保文件名中包括“after”。 选择“保存”。
将失败的操作用截图操作围起来。
在此示例中,启动新的 Microsoft Edge 操作是失败的操作,并且被截图操作包围。
更改失败操作的“出错时”行为:
编辑失败的操作,然后选择底部的“出错时”按钮。
将流程运行设置为继续流程运行并转到下一个操作。 选择“保存”。
在本地运行流,验证是否生成了屏幕截图。
启动无人值守的运行。
检查无人参与运行期间生成的屏幕截图文件以获取线索,以帮助识别问题的根本原因。
检查屏幕分辨率和缩放差异
由于运行已参与会话和无人参与会话的计算机之间的屏幕分辨率差异,出现了许多 UI 自动化问题。 比较参与和无人参与的运行执行之间的分辨率设置,以确保它们在两种模式下匹配。 有关在无人参与模式下设置屏幕分辨率的详细信息,请参阅 在无人参与模式下设置屏幕分辨率。
在某些情况下(例如,使用虚拟机(VM)或 Hyper-V时),显示分辨率设置可能不可用或呈灰色。作为此类情况的解决方法,可以在脚本中添加以下操作,然后在这两种模式下运行。
将以下代码片段复制并粘贴到 Power Automate 桌面流设计器中。
DateTime.GetCurrentDateTime.Local DateTimeFormat: DateTime.DateTimeFormat.DateAndTime CurrentDateTime=> CurrentDateTime Text.ConvertDateTimeToText.FromCustomDateTime DateTime: CurrentDateTime CustomFormat: $'''yyyy_MM_dd_hh_mm_ss''' Result=> FormattedDateTime Workstation.GetScreenResolution MonitorNumber: 1 MonitorWidth=> MonitorWidth MonitorHeight=> MonitorHeight MonitorBitCount=> MonitorBitCount MonitorFrequency=> MonitorFrequency @@copilotGeneratedAction: 'False' Scripting.RunPowershellScript.RunPowershellScript Script: $'''Add-Type @\' using System; using System.Runtime.InteropServices; using System.Drawing; public class DPI { [DllImport(\"gdi32.dll\")] static extern int GetDeviceCaps(IntPtr hdc, int nIndex); public enum DeviceCap { VERTRES = 10, DESKTOPVERTRES = 117 } public static float scaling() { Graphics g = Graphics.FromHwnd(IntPtr.Zero); IntPtr desktop = g.GetHdc(); int LogicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.VERTRES); int PhysicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.DESKTOPVERTRES); return (float)PhysicalScreenHeight / (float)LogicalScreenHeight; } } \'@ -ReferencedAssemblies \'System.Drawing.dll\' -ErrorAction Stop Return [DPI]::scaling() * 100''' ScriptOutput=> MonitorScaleOutput File.WriteText File: $'''c:\\test\\resolution_%FormattedDateTime%.txt''' TextToWrite: $'''height: %MonitorHeight% width: %MonitorWidth% frequency: %MonitorFrequency% bitCount: %MonitorBitCount% scale: %MonitorScaleOutput%''' AppendNewLine: True IfFileExists: File.IfFileExists.Overwrite Encoding: File.FileEncoding.Unicode
该脚本将创建以下操作,以捕获分辨率设置,并将它们输出到带有时间戳的文件中。
查看上一作的输出文件路径,检查本地执行是否成功,然后选择“ 保存”。
在参与模式和无人参与模式中运行脚本,然后根据需要比较这两种模式的分辨率和缩放输出,并在必要时进行更新,以确保它们在这两种模式下匹配。