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
相关产品推荐
相关产品推荐

