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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 09:51:03