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

Selenium对接Testrail时报JObject无法转JArray异常问题求助

报错根因

你之前的代码默认Testrail的get_runs接口直接返回测试运行列表的JArray结构,但目前接口返回结构已经调整:

  • 外层是JObject类型的包装结构
  • 实际测试运行数据存储在runs字段下,且当项目下只有1条运行记录时,runs字段会直接返回JObject而非JArray,这就触发了类型转换异常

修复方案

不用大范围改动原有逻辑,只需要调整接口返回值的解析方式,兼容单条/多条测试运行的场景即可,修改后的代码如下:

if (RunId == null)
{
    // 先将返回值转为外层JObject,不再直接强转JArray
    JObject response = (JObject)client.SendGet($"get_runs/{ProjectId}");
    JToken runsToken = response["runs"];
    List<JObject> runList = new List<JObject>();

    // 兼容runs为单个对象/数组两种场景
    if (runsToken is JObject singleRun)
    {
        runList.Add(singleRun);
    }
    else if (runsToken is JArray multipleRuns)
    {
        runList = multipleRuns.ToObject<List<JObject>>();
    }

    // 原有遍历逻辑基本不变
    foreach (JObject testRun in runList)
    {
        bool isCompleted = Convert.ToBoolean(testRun["is_completed"]);
        string lastTestRunId = testRun["id"].ToString();
        string lastSuiteId = testRun["suite_id"].ToString();
        int failedTestCount = testRun["failed_count"].Value<int>();
        int untestedTestCount = testRun["untested_count"].Value<int>();

        // 原有判断逻辑可简化,减少重复判断
        if (!isCompleted && lastSuiteId.Equals(SuitId) && (failedTestCount > 0 || untestedTestCount > 0)) 
        {
            RunId = lastTestRunId;
            break;
        }
    }
}

关于JsonConvert.DeserializeObject方案的说明

该方案也完全适配你的场景,你可以提前定义TestRun的实体类,把返回值直接反序列化为强类型对象,代码可读性和可维护性会更高,适合长期迭代的项目。如果只是临时修复当前报错,上面的小范围调整方案就足够使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 06:15:05