Appium Images插件多结果图像对比类型转换异常求助
解决Appium Images插件多匹配结果类型转换异常问题
问题原因分析
你遇到的ArrayList cannot be cast to Map异常,大概率是Appium Java客户端与服务端/Images插件版本不兼容,或是客户端封装的getMultiple()方法内部解析逻辑存在bug——开启enableMultiple()后,服务端实际返回匹配结果数组,但客户端错误地尝试将其解析为Map结构,导致类型转换失败。
解决方案
1. 校验并同步版本
- Java客户端版本:确保使用与Appium 2.5.4兼容的
java-client版本(Appium 2.x系列需搭配java-client 8.x,推荐8.6.0及以上)。Maven依赖示例:<dependency> <groupId>io.appium</groupId> <artifactId>java-client</artifactId> <version>8.6.0</version> </dependency> - Images插件版本:执行命令更新到最新版:
appium plugin update images
2. 绕过客户端封装,手动调用底层命令
若版本同步后问题仍存在,直接调用Appium底层的image:findOccurrence命令,手动解析返回结果:
import io.appium.java_client.imagecomparison.OccurrenceMatchingOptions; import io.appium.java_client.imagecomparison.OccurrenceMatchingResult; import org.openqa.selenium.Rectangle; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; // 构建匹配选项 OccurrenceMatchingOptions options = new OccurrenceMatchingOptions() .withEnabledVisualization() .enableMultiple(); // 组装命令参数 Map<String, Object> params = new HashMap<>(); params.put("fullImage", fullImage); // 你的设备截图对象 params.put("partialImage", partialImage); // 待匹配的局部图像对象 params.put("options", options.build()); // 直接调用底层图像匹配命令 List<Map<String, Object>> rawResults = (List<Map<String, Object>>) driver.executeScript("image:findOccurrence", params); // 手动转换为OccurrenceMatchingResult列表 List<OccurrenceMatchingResult> results = new ArrayList<>(); for (Map<String, Object> rawItem : rawResults) { OccurrenceMatchingResult result = new OccurrenceMatchingResult(); // 填充位置信息 Rectangle rect = new Rectangle( ((Number) rawItem.get("x")).intValue(), ((Number) rawItem.get("y")).intValue(), ((Number) rawItem.get("width")).intValue(), ((Number) rawItem.get("height")).intValue() ); result.setRect(rect); // 填充匹配分数 result.setScore(((Number) rawItem.get("score")).doubleValue()); // 如果开启了可视化,处理可视化数据 if (rawItem.containsKey("visualization")) { result.setVisualization((String) rawItem.get("visualization")); } results.add(result); }
额外提示
可先通过Appium Inspector执行image:findOccurrence命令,确认服务端返回的是数组格式结果,以此排查问题出在服务端还是客户端。
内容的提问来源于stack exchange,提问作者Beñat Garrido
相关产品推荐
相关产品推荐

