mirror of
https://github.com/KenanZhu/AutoLibrary.git
synced 2026-06-18 15:33:03 +08:00
refactor(pages): 拆分 _dialogs 为独立组件文件,解耦 Service 构造函数,消除 PageObject 重复逻辑
- 将 _dialogs.py 拆分为 pages/components/ 下的独立文件,Overlay 基类同步移入 - CaptchaHandler / RecordChecker 构造函数不再持有 PageObject,改为方法参数注入 - LoginPage.login() 直接接收 auto_captcha 参数,简化 captcha_solver 调用链 - SeatMapOverlay.selectSeat 引入两层查找:先按 ID 直查,失败后遍历匹配 - 移除 ReserveView 中与 Dialog/Overlay 重复的方法(selectSeat、getAvailableTimeOptions) - AutoLibPages 拆分 __initPagesServices / __initPagesFlows - 修复 RecordsView.MORE_BTN 选择器被错误 snake_case 化(more_btn → moreBtn) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -26,7 +26,8 @@ from pages.flows._helpers import (
|
||||
findBestTimeOption,
|
||||
)
|
||||
from pages.ReserveView import ReserveView
|
||||
from pages._dialogs import ReserveResultDialog
|
||||
from pages.components.ReserveResultDialog import ReserveResultDialog
|
||||
from pages.components.TimeSelectDialog import TimeSelectDialog
|
||||
|
||||
|
||||
@dataclass
|
||||
@@ -82,31 +83,27 @@ class ReserveFlow(MsgBase):
|
||||
except Exception as e:
|
||||
self._showTrace(f"加载预约选座页面失败 ! : {e}", self.TraceLevel.ERROR)
|
||||
return False
|
||||
|
||||
if not view.selectDate(ctx.date):
|
||||
self._showTrace(f"选择日期失败 ! : {ctx.date} 不可用", self.TraceLevel.ERROR)
|
||||
return False
|
||||
self._showTrace(f"日期 {ctx.date} 选择成功 !")
|
||||
|
||||
if not view.selectPlace("1"):
|
||||
self._showTrace("选择预约场所失败 ! : 图书馆 不可用", self.TraceLevel.ERROR)
|
||||
return False
|
||||
self._showTrace("预约场所 图书馆 选择成功 !")
|
||||
|
||||
if not view.selectFloor(ctx.floor):
|
||||
display_floor = ReserveView.FLOOR_MAP.get(ctx.floor, ctx.floor)
|
||||
self._showTrace(f"选择楼层失败 ! : {display_floor} 不可用", self.TraceLevel.ERROR)
|
||||
return False
|
||||
self._showTrace(f"楼层 {ReserveView.FLOOR_MAP.get(ctx.floor)} 选择成功 !")
|
||||
|
||||
if not view.selectRoom(ctx.room):
|
||||
display_room = ReserveView.ROOM_MAP.get(ctx.room, ctx.room)
|
||||
self._showTrace(f"选择房间失败 ! : {display_room} 不可用", self.TraceLevel.ERROR)
|
||||
return False
|
||||
self._showTrace(f"房间 {ReserveView.ROOM_MAP.get(ctx.room)} 选择成功 !")
|
||||
have_hover_on_page = True
|
||||
|
||||
seat_status = view.selectSeat(ctx.seat_id)
|
||||
seat_map = view.openSeatMap()
|
||||
seat_status = seat_map.selectSeat(ctx.seat_id)
|
||||
if seat_status is None:
|
||||
self._showTrace(
|
||||
f"座位 {ctx.seat_id} 在该楼层区域中不存在, 请检查座位号是否正确",
|
||||
@@ -114,8 +111,8 @@ class ReserveFlow(MsgBase):
|
||||
)
|
||||
else:
|
||||
self._showTrace(f"座位 {ctx.seat_id} 选择成功 ! : 当前状态 - '{seat_status}'")
|
||||
|
||||
select_time_ok = self._selectSeatTime(view)
|
||||
time_dialog = TimeSelectDialog(self._driver)
|
||||
select_time_ok = self._selectSeatTime(time_dialog)
|
||||
if not select_time_ok:
|
||||
self._showTrace("选择时间失败 !", self.TraceLevel.ERROR)
|
||||
else:
|
||||
@@ -149,7 +146,6 @@ class ReserveFlow(MsgBase):
|
||||
self._showTrace("预约提交失败 !", self.TraceLevel.ERROR)
|
||||
except Exception:
|
||||
self._showTrace("预约提交失败 !", self.TraceLevel.ERROR)
|
||||
|
||||
if not submit_reserve and have_hover_on_page:
|
||||
view.refresh()
|
||||
if reserve_success:
|
||||
@@ -160,7 +156,7 @@ class ReserveFlow(MsgBase):
|
||||
|
||||
def _selectSeatTime(
|
||||
self,
|
||||
view: ReserveView,
|
||||
time_dialog: TimeSelectDialog,
|
||||
) -> bool:
|
||||
|
||||
ctx = self._ctx
|
||||
@@ -172,9 +168,8 @@ class ReserveFlow(MsgBase):
|
||||
act_beg_tm_str = exp_beg_tm_str
|
||||
act_end_mins = exp_end_mins
|
||||
act_end_tm_str = exp_end_tm_str
|
||||
|
||||
act_beg_mins = self._selectNearestTime(
|
||||
view,
|
||||
time_dialog,
|
||||
time_id="startTime",
|
||||
time_type="开始时间",
|
||||
target_time=exp_beg_mins,
|
||||
@@ -184,7 +179,6 @@ class ReserveFlow(MsgBase):
|
||||
if act_beg_mins == -1:
|
||||
return False
|
||||
act_beg_tm_str = minsToTimeStr(act_beg_mins)
|
||||
|
||||
if ctx.satisfy_duration:
|
||||
exp_end_mins = self._calcEndTime(act_beg_mins, ctx.expect_duration)
|
||||
exp_end_tm_str = minsToTimeStr(exp_end_mins)
|
||||
@@ -192,10 +186,9 @@ class ReserveFlow(MsgBase):
|
||||
f"需要满足期望预约持续时间: {ctx.expect_duration} 小时, "
|
||||
f"根据开始时间 {act_beg_tm_str} 计算结束时间: {exp_end_tm_str}"
|
||||
)
|
||||
|
||||
act_end_mins = self._selectNearestTime(
|
||||
view,
|
||||
time_id="end_time",
|
||||
time_dialog,
|
||||
time_id="endTime",
|
||||
time_type="结束时间",
|
||||
target_time=exp_end_mins,
|
||||
max_time_diff=ctx.end_max_diff,
|
||||
@@ -204,7 +197,6 @@ class ReserveFlow(MsgBase):
|
||||
if act_end_mins == -1:
|
||||
return False
|
||||
act_end_tm_str = minsToTimeStr(act_end_mins)
|
||||
|
||||
self._showTrace(
|
||||
f"期望预约时间段: {exp_beg_tm_str} - {exp_end_tm_str}, "
|
||||
f"实际预约时间段: {act_beg_tm_str} - {act_end_tm_str}"
|
||||
@@ -213,7 +205,7 @@ class ReserveFlow(MsgBase):
|
||||
|
||||
def _selectNearestTime(
|
||||
self,
|
||||
view: ReserveView,
|
||||
time_dialog: TimeSelectDialog,
|
||||
time_id: str,
|
||||
time_type: str,
|
||||
target_time: int,
|
||||
@@ -221,13 +213,12 @@ class ReserveFlow(MsgBase):
|
||||
prefer_earlier: bool,
|
||||
) -> int:
|
||||
|
||||
all_time_opts = view.getAvailableTimeOptions(time_id)
|
||||
all_time_opts = time_dialog.getTimeOptions(time_id)
|
||||
if not all_time_opts:
|
||||
self._showTrace(
|
||||
f"{time_type} 选择失败 ! : 当前未查询到可用时间", self.TraceLevel.ERROR
|
||||
)
|
||||
return -1
|
||||
|
||||
best_opt, best_text, actual_diff, free_times = findBestTimeOption(
|
||||
all_time_opts, target_time, max_time_diff, prefer_earlier, is_reserve=True
|
||||
)
|
||||
@@ -245,7 +236,6 @@ class ReserveFlow(MsgBase):
|
||||
f"与期望 {time_type} 相比 {relation}"
|
||||
)
|
||||
return target_time + actual_diff
|
||||
|
||||
target_time_str = minsToTimeStr(target_time)
|
||||
self._showTrace(
|
||||
f"无法选择最近的 {time_type} {target_time_str}, "
|
||||
|
||||
Reference in New Issue
Block a user