You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);

根因与对应解决方案

按优先级从高到低排查以下问题:

  1. ADO Agent运行模式错误,无活跃交互式桌面会话
    • 问题说明:如果将Azure DevOps Agent配置为Windows服务运行,进程默认在会话0隔离环境执行,该环境无完整的桌面渲染能力,哪怕手动配置了分辨率,屏幕渲染内容、元素样式和正常用户登录的桌面会话完全不同,Sikuli作为基于屏幕像素匹配的工具,根本无法识别到目标元素。这是服务端跑Sikuli类UI自动化最常见的故障原因。
    • 解决方法:不要将Agent部署为Windows服务,登录VM桌面后手动执行Agent目录下的run.cmd以交互式进程模式启动Agent;同时配置VM电源策略为永不休眠、永不自动锁屏,保持登录用户会话始终处于活跃连接状态。
  2. 跨环境截图素材不兼容,显示配置不一致
    • 问题说明: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开始逐步调试,找到可稳定匹配的最低阈值即可
  3. 分辨率配置未实际生效
    • 问题说明:多数命令行分辨率调整工具在无物理显示器接入、无活跃用户会话的VM环境下,只会修改注册表中的分辨率配置项,不会真正修改当前会话的实际渲染分辨率,导致Sikuli读取到的屏幕区域参数和实际显示内容不匹配。
    • 验证&解决方法:在找图逻辑前增加一行调试代码,执行screen.capture().save("debug_screenshot.png")保存运行时的实际屏幕截图,直接查看截图内容是否为目标页面、分辨率是否符合预期;如果截图为黑屏、锁屏界面或分辨率不对,优先修复会话和分辨率配置,不要调整找图逻辑。
  4. 路径拼接不规范导致资源加载异常
    • 问题说明:代码中路径拼接混用了Windows反斜杠\和正斜杠/,部分Sikuli版本在Windows环境下解析这类混合路径时会出现资源加载异常。
    • 解决方法:设置完BundleFolder后不需要手动拼接图片全路径,直接用图片文件名初始化Pattern即可,比如new Pattern("UserName_TextBox.png");如果必须拼接全路径,统一用File.separator代替硬编码的斜杠,避免跨系统路径兼容问题。

内容的提问来源于stack exchange,提问作者Mohd Nazim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 00:27:23