mirror of
https://github.com/KenanZhu/AutoLibrary.git
synced 2026-06-17 23:13:03 +08:00
345cb95b98
将 findBestTimeOption 中的预约/续约双分支逻辑抽象为策略模式: - TimeOptionReader 负责从 WebElement 提取时间数据(ReserveTimeReader / RenewTimeReader) - TimeDecisionMaker 执行纯决策算法,零 Selenium 依赖 - TimeSelectMaker 作为工厂统一创建配置好的决策器 - 共享常量 LIBRARY_CLOSE_MINS 统一收敛至 TimeSelectMaker 同时将 Overlay 基类重命名为 Dialog,SeatMapOverlay 同步更名为 SeatMapDialog,保持命名一致性。 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
76 lines
1.9 KiB
Python
76 lines
1.9 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""
|
|
Copyright (c) 2026 KenanZhu.
|
|
All rights reserved.
|
|
|
|
This software is provided "as is", without any warranty of any kind.
|
|
You may use, modify, and distribute this file under the terms of the MIT License.
|
|
See the LICENSE file for details.
|
|
"""
|
|
from selenium.common.exceptions import (
|
|
ElementNotInteractableException,
|
|
NoSuchElementException,
|
|
StaleElementReferenceException,
|
|
TimeoutException,
|
|
)
|
|
from selenium.webdriver.common.by import By
|
|
from selenium.webdriver.remote.webdriver import WebDriver
|
|
|
|
from pages.components.Dialog import Dialog
|
|
|
|
|
|
class CheckinResultDialog(Dialog):
|
|
"""
|
|
Check-in result dialog.
|
|
"""
|
|
|
|
ROOT = (By.CLASS_NAME, "ui_dialog")
|
|
|
|
RESULT_MSG = (By.CLASS_NAME, "resultMessage")
|
|
OK_BTN = (By.CLASS_NAME, "btnOK")
|
|
DETAIL_DD = (By.CSS_SELECTOR, ".resultMessage dd")
|
|
|
|
def __init__(
|
|
self,
|
|
driver: WebDriver,
|
|
) -> None:
|
|
|
|
super().__init__(driver, self.ROOT, auto_close_on_exit=False)
|
|
|
|
def getResultMessage(
|
|
self,
|
|
) -> str:
|
|
|
|
try:
|
|
self._waitPresence(self.RESULT_MSG)
|
|
el = self._find(*self.RESULT_MSG)
|
|
return el.text
|
|
except (TimeoutException, NoSuchElementException, StaleElementReferenceException):
|
|
return ""
|
|
except Exception:
|
|
return ""
|
|
|
|
def getDetails(
|
|
self,
|
|
) -> list[str]:
|
|
|
|
try:
|
|
elements = self._findAll(*self.DETAIL_DD)
|
|
return [el.text for el in elements if el.text.strip()]
|
|
except (NoSuchElementException, StaleElementReferenceException):
|
|
return []
|
|
except Exception:
|
|
return []
|
|
|
|
def clickOk(
|
|
self,
|
|
) -> bool:
|
|
|
|
try:
|
|
self._waitClickable(self.OK_BTN).click()
|
|
return True
|
|
except (NoSuchElementException, TimeoutException, ElementNotInteractableException):
|
|
return False
|
|
except Exception:
|
|
return False
|