ArrayList断言比对抛出异常:打印格式不一致问题排查求助
问题分析与解决方案
咱们先把核心问题拆明白:你看到的“垂直/水平排列”只是打印时的展示形式,本质是两个列表的元素实际值或类型不匹配导致断言失败。下面一步步帮你排查解决:
第一步:先搞清楚两个列表的真实内容
别被打印排版误导,直接输出每个元素的原始内容和哈希值,精准定位差异:
// 打印网站拉取的列表详情 System.out.println("网站拉取的时间列表:"); for (Object item : webTimeList) { String content = item.toString().trim(); System.out.printf("元素值:'%s',哈希码:%d%n", content, content.hashCode()); } // 打印本地生成的列表详情 System.out.println("本地生成的时间列表:"); for (Object item : localTimeList) { String content = item.toString().trim(); System.out.printf("元素值:'%s',哈希码:%d%n", content, content.hashCode()); }
通过这个你能快速发现问题:比如网站时间带了时区后缀("14:00 UTC" vs "14:00")、格式是12小时制("2:00 PM" vs "14:00"),或者存在隐藏空格。
第二步:检查时间生成逻辑的细节
你说按“当前时间2小时增量生成12个值”,这里有几个容易踩的坑:
- 起始时间对齐:网站的时间是不是从当前整点/下一个2小时节点开始?比如现在是13:30,网站可能从14:00开始,而你从13:00生成,自然会错位。
- 时区一致:网站返回的是服务器时区还是本地时区?比如你本地用UTC+8,网站返回UTC时间,那生成的时间会差8小时。
- 循环次数正确:12个元素需要从0到22小时(每次加2),别多循环或少循环一次。
给你一个标准的时间生成示例(假设网站是24小时制字符串):
LocalDateTime start = LocalDateTime.now().truncatedTo(ChronoUnit.HOURS); // 如果网站起始时间是下一个2小时节点,就改成start.plusHours(2 - start.getHour() % 2) List<String> localTimeList = new ArrayList<>(); for (int i = 0; i < 12; i++) { LocalDateTime time = start.plusHours(i * 2); // 严格按照网站的时间格式格式化 String formatted = time.format(DateTimeFormatter.ofPattern("HH:mm")); localTimeList.add(formatted); }
第三步:最容易忽略的坑——列表元素类型不匹配
如果你的网站列表是直接从findElements获取的WebElement集合,那你存的是元素对象,不是时间文本!和本地生成的字符串列表比对肯定失败:
// 错误做法:直接存WebElement对象 List<WebElement> webElements = driver.findElements(By.cssSelector("your-time-selector")); List<Object> webTimeList = new ArrayList<>(webElements); // 正确做法:取出元素的文本值 List<String> webTimeList = new ArrayList<>(); for (WebElement elem : webElements) { webTimeList.add(elem.getText().trim()); }
第四步:用精准的断言方式定位问题
如果直接用Assert.assertEquals(list1, list2)失败,换成逐个元素比对,能直接看到哪个位置不匹配:
Assert.assertEquals(webTimeList.size(), localTimeList.size(), "两个列表长度不一样"); for (int i = 0; i < webTimeList.size(); i++) { String webVal = webTimeList.get(i).trim(); String localVal = localTimeList.get(i).trim(); Assert.assertEquals(webVal, localVal, String.format("第%d个元素不匹配:网站值='%s',本地值='%s'", i, webVal, localVal)); }
内容的提问来源于stack exchange,提问作者Mo Samuel
相关产品推荐
相关产品推荐

