Sikuli在WinServer2019 ADO VM pipeline运行报FindFailed错误
Sikuli在ADO Windows Server 2019 VM上运行报FindFailed问题排查
问题背景
- 相同Sikuli自动化脚本在分辨率1920×1080的Windows 10环境可正常运行,在Azure DevOps Pipeline的Windows Server 2019 VM上执行时抛出找图失败错误
- 已尝试配置:通过pipeline内置分辨率工具将VM分辨率调整为1920×1080,通过代码设置Sikuli图片资源Bundle路径
- 报错信息:
FindFailed : C:\agent\vsts-agent-win-x64-2.200.2_work\1\s\Automation/SikuliImages/UserName_TextBox.png: (378x54) in R[0,0 1920x1080]@S(0),报错触发位置为Region.java第2226行 - 核心业务代码如下:
ImagePath.setBundleFolder(new File(System.getProperty("user.dir")+"/SikuliImages")); System.out.println("Image Bundle Path="+ImagePath.getBundlePath()); Screen screen=new Screen(); String UserName_Image_Path = System.getProperty("user.dir")+"/SikuliImages/UserName_TextBox.png"; String UserPassword_Image_Path = System.getProperty("user.dir")+"/SikuliImages/UserPassword_TextBox.png"; String SignIn_Image_Path = System.getProperty("user.dir")+"/SikuliImages/SignIn_Button.png"; Pattern P_UserName = new Pattern(UserName_Image_Path); Pattern P_UserPassword = new Pattern(UserPassword_Image_Path); Pattern P_SignIn = new Pattern(SignIn_Image_Path); System.out.println("Wait for popup"); screen.wait(P_UserName,30); Match UserName_Found = screen.exists(UserName_Image_Path); UserName_Found.highlight(2); screen.type(P_UserName,UserName); Match UserPassword_Found = screen.exists(UserPassword_Image_Path); UserPassword_Found.highlight(2); screen.type(P_UserPassword,UserPassword); Match SignIn_Found = screen.exists(SignIn_Image_Path); SignIn_Found.highlight(2); screen.click(P_SignIn);
根因与对应解决方案
按优先级从高到低排查以下问题:
- ADO Agent运行模式错误,无活跃交互式桌面会话
- 问题说明:如果将Azure DevOps Agent配置为Windows服务运行,进程默认在会话0隔离环境执行,该环境无完整的桌面渲染能力,哪怕手动配置了分辨率,屏幕渲染内容、元素样式和正常用户登录的桌面会话完全不同,Sikuli作为基于屏幕像素匹配的工具,根本无法识别到目标元素。这是服务端跑Sikuli类UI自动化最常见的故障原因。
- 解决方法:不要将Agent部署为Windows服务,登录VM桌面后手动执行Agent目录下的
run.cmd以交互式进程模式启动Agent;同时配置VM电源策略为永不休眠、永不自动锁屏,保持登录用户会话始终处于活跃连接状态。
- 跨环境截图素材不兼容,显示配置不一致
- 问题说明:Windows Server 2019默认的主题、字体渲染(ClearType)、显示缩放比例、透明效果配置和Windows 10存在差异,哪怕分辨率同为1920×1080,相同UI元素的像素特征也会有区别,Sikuli默认0.9左右的严格匹配阈值下会直接判定匹配失败。
- 解决方法:
- 登录Server 2019 VM,将显示缩放强制设为100%,关闭系统透明效果、高对比度主题,配置和截图环境一致的字体渲染规则
- 不要直接复用Win10环境下截取的图片素材,直接在Server 2019的实际运行环境下重新截取所有目标元素图片替换原有素材
- 给匹配规则设置合理的相似度阈值,比如将Pattern初始化改为
new Pattern(UserName_Image_Path).similar(0.7f),从0.7开始逐步调试,找到可稳定匹配的最低阈值即可
- 分辨率配置未实际生效
- 问题说明:多数命令行分辨率调整工具在无物理显示器接入、无活跃用户会话的VM环境下,只会修改注册表中的分辨率配置项,不会真正修改当前会话的实际渲染分辨率,导致Sikuli读取到的屏幕区域参数和实际显示内容不匹配。
- 验证&解决方法:在找图逻辑前增加一行调试代码,执行
screen.capture().save("debug_screenshot.png")保存运行时的实际屏幕截图,直接查看截图内容是否为目标页面、分辨率是否符合预期;如果截图为黑屏、锁屏界面或分辨率不对,优先修复会话和分辨率配置,不要调整找图逻辑。
- 路径拼接不规范导致资源加载异常
- 问题说明:代码中路径拼接混用了Windows反斜杠
\和正斜杠/,部分Sikuli版本在Windows环境下解析这类混合路径时会出现资源加载异常。 - 解决方法:设置完BundleFolder后不需要手动拼接图片全路径,直接用图片文件名初始化Pattern即可,比如
new Pattern("UserName_TextBox.png");如果必须拼接全路径,统一用File.separator代替硬编码的斜杠,避免跨系统路径兼容问题。
- 问题说明:代码中路径拼接混用了Windows反斜杠
内容的提问来源于stack exchange,提问作者Mohd Nazim
相关产品推荐
相关产品推荐

