1
1
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:
2026-05-26 13:41:55 +08:00
parent 2226e8ac90
commit a6bc103c73
19 changed files with 608 additions and 580 deletions
+1 -1
View File
@@ -17,7 +17,7 @@ from selenium.webdriver.remote.webdriver import WebDriver
from base.MsgBase import MsgBase
from pages.MainShell import MainShell
from pages._dialogs import CheckinResultDialog
from pages.components.CheckinResultDialog import CheckinResultDialog
class CheckinFlow(MsgBase):
+1 -1
View File
@@ -18,7 +18,7 @@ from selenium.webdriver.remote.webdriver import WebDriver
from base.MsgBase import MsgBase
from pages.MainShell import MainShell
from pages._dialogs import RenewDialog
from pages.components.RenewDialog import RenewDialog
from pages.flows._helpers import (
timeStrToMins,
minsToTimeStr,
+12 -22
View File
@@ -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}, "