如何验证行程时长计算正确性?Java+Selenide代码报错排查
问题排查与解决方案
核心问题分析
- 错误用LocalTime表示时间段:
LocalTime是用来标记一天中的具体时刻(比如02:00、06:15),但行程时长是时间间隔,用LocalTime解析"4:15"属于概念错误——虽然短时长可能暂时解析成功,但逻辑完全不对,也无法处理跨天或超过24小时的时长。 - 未限定元素查找范围:全局选择器
$(".wl-offer_duration")可能匹配页面中其他同类型元素,应该从当前卡片card内查找,避免取到错误的时长文本。 - Period使用逻辑混乱:Java 8的
Period用于表示年月日周期,不适合处理时分级的时长间隔;代码里把LocalTime转成字符串再解析为Period的操作完全冗余,还容易引发格式错误。
修正后的代码
import java.time.Duration; import java.time.LocalTime; import java.time.format.DateTimeFormatter; import com.codeborne.selenide.SelenideElement; public void checkFlightDurationTime() { SelenideElement card = $$(".wl").get(0); // 解析出发、到达时间 DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm"); LocalTime departure = LocalTime.parse(card.find(".wl-offer_edge-from").text(), timeFormatter); LocalTime arrival = LocalTime.parse(card.find(".wl-offer_edge-back").text(), timeFormatter); // 计算实际行程时长(支持跨天场景) Duration actualDuration = Duration.between(departure, arrival); if (arrival.isBefore(departure)) { actualDuration = actualDuration.plusHours(24); } // 解析页面显示的时长 String durationText = card.find(".wl-offer_duration").text().replace("on the way ", ""); String[] durationParts = durationText.split("h |m"); long displayedHours = Long.parseLong(durationParts[0]); long displayedMinutes = Long.parseLong(durationParts[1]); Duration displayedDuration = Duration.ofHours(displayedHours).plusMinutes(displayedMinutes); // 验证时长一致性 if (actualDuration.equals(displayedDuration)) { System.out.println("时长验证通过"); } else { System.out.printf("时长验证失败:实际时长%dh %dm,页面显示%dh %dm%n", actualDuration.toHours(), actualDuration.toMinutesPart(), displayedHours, displayedMinutes); } }
关键优化点
- 用
Duration专门处理时分级的时间间隔,符合语义且支持跨天计算。 - 限定元素查找范围为当前卡片
card,确保获取目标行程的时长。 - 直接拆分页面时长文本为小时、分钟,避免复杂字符串替换引发的解析错误。
- 新增跨天场景处理逻辑(若业务存在跨天行程)。
内容的提问来源于stack exchange,提问作者EYE
相关产品推荐
相关产品推荐

