From 160d6a24289177c621bf3a6f426bb6b9c8da2357 Mon Sep 17 00:00:00 2001 From: KenanZhu <3471685733@qq.com> Date: Wed, 18 Mar 2026 11:02:52 +0800 Subject: [PATCH] =?UTF-8?q?refactor(operators):=20=E4=B8=BA=20=5FshowTrace?= =?UTF-8?q?=20=E6=96=B9=E6=B3=95=E6=B7=BB=E5=8A=A0=E5=90=88=E9=80=82?= =?UTF-8?q?=E7=9A=84=20TraceLevel=20=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Main.py | 1 - src/base/MsgBase.py | 22 +++++++++++++++++ src/gui/ALConfigWidget.py | 1 - src/gui/ALMainWindow.py | 2 +- src/operators/AutoLib.py | 27 ++++++++++++-------- src/operators/LibChecker.py | 10 ++++---- src/operators/LibCheckin.py | 12 ++++----- src/operators/LibLogin.py | 26 +++++++++++++------- src/operators/LibLogout.py | 4 +-- src/operators/LibRenew.py | 21 ++++++++-------- src/operators/LibReserve.py | 49 +++++++++++++++++++++---------------- 11 files changed, 109 insertions(+), 66 deletions(-) diff --git a/src/Main.py b/src/Main.py index 5795315..f1468d8 100644 --- a/src/Main.py +++ b/src/Main.py @@ -7,7 +7,6 @@ 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. """ -import os import sys from PySide6.QtCore import QTranslator diff --git a/src/base/MsgBase.py b/src/base/MsgBase.py index 44150ee..1df0494 100644 --- a/src/base/MsgBase.py +++ b/src/base/MsgBase.py @@ -32,6 +32,18 @@ class MsgBase: implement queue polling to retrieve and process messages. """ + class TraceLevel: + """ + Enum class for trace levels. + + This class provides the trace levels for the logger. + """ + DEBUG = logging.DEBUG + INFO = logging.INFO + WARNING = logging.WARNING + ERROR = logging.ERROR + CRITICAL = logging.CRITICAL + def __init__( self, input_queue: queue.Queue, @@ -67,6 +79,16 @@ class MsgBase: self._logger.log(level, msg) + def _showLog( + self, + msg: str, + level: int = logging.INFO + ): + + if self._logger: + self._logger.log(level, msg) + + def _waitMsg( self, timeout: float = 1.0 diff --git a/src/gui/ALConfigWidget.py b/src/gui/ALConfigWidget.py index 976636a..0e4c8f9 100644 --- a/src/gui/ALConfigWidget.py +++ b/src/gui/ALConfigWidget.py @@ -8,7 +8,6 @@ You may use, modify, and distribute this file under the terms of the MIT License See the LICENSE file for details. """ import os -import sys from PySide6.QtCore import ( Qt, Signal, Slot, QTime, QDate, QDir, QFileInfo diff --git a/src/gui/ALMainWindow.py b/src/gui/ALMainWindow.py index 218a518..f033382 100644 --- a/src/gui/ALMainWindow.py +++ b/src/gui/ALMainWindow.py @@ -113,7 +113,7 @@ class ALMainWindow(MsgBase, QMainWindow, Ui_ALMainWindow): ): if not QSystemTrayIcon.isSystemTrayAvailable(): - self._showTrace("操作系统不支持系统托盘功能, 无法创建系统托盘图标") + self._showTrace("操作系统不支持系统托盘功能, 无法创建系统托盘图标", self.TraceLevel.WARNING) return self.TrayIcon = QSystemTrayIcon(self.icon, self) self.TrayIcon.setToolTip("AutoLibrary") diff --git a/src/operators/AutoLib.py b/src/operators/AutoLib.py index 651aa09..a1b8ecf 100644 --- a/src/operators/AutoLib.py +++ b/src/operators/AutoLib.py @@ -66,11 +66,14 @@ class AutoLib(MsgBase): case "firefox": driver_options = webdriver.FirefoxOptions() case _: - self._showTrace(f"不支持的浏览器驱动类型: {self.__driver_type} !") + self._showTrace( + f"不支持的浏览器驱动类型: {self.__driver_type} !", + self.TraceLevel.WARNING + ) return False if not web_driver_config: - self._showTrace("未配置浏览器驱动参数 !") + self._showTrace("未配置浏览器驱动参数 !", self.TraceLevel.ERROR) return False if web_driver_config.get("headless"): driver_options.add_argument("--headless") @@ -110,7 +113,7 @@ class AutoLib(MsgBase): # init browser driver self.__driver_path = web_driver_config.get("driver_path") if not self.__driver_path: - self._showTrace("未配置浏览器驱动路径 !") + self._showTrace("未配置浏览器驱动路径 !", self.TraceLevel.WARNING) return False self.__driver_path = os.path.abspath(self.__driver_path) try: @@ -128,13 +131,13 @@ class AutoLib(MsgBase): self.__driver = webdriver.Firefox(service=service, options=driver_options) case _: # actually will not happen, beacuse we have checked it at the initlization # of 'driver_options' - raise Exception(f"不支持的浏览器驱动类型: {self.__driver_type}") + raise Exception(f"不支持的浏览器驱动类型: {self.__driver_type} !") self.__driver.implicitly_wait(1) self.__driver.execute_script( "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})" ) except Exception as e: - self._showTrace(f"浏览器驱动初始化失败: {e}") + self._showTrace(f"浏览器驱动初始化失败: {e}", self.TraceLevel.ERROR) return False self._showTrace(f"浏览器驱动已初始化, 类型: {self.__driver_type}, 路径: {self.__driver_path}") return True @@ -145,7 +148,7 @@ class AutoLib(MsgBase): ): if not self.__driver: - self._showTrace(f"浏览器驱动未初始化, 请先初始化浏览器驱动 !") + self._showTrace(f"浏览器驱动未初始化, 请先初始化浏览器驱动 !", self.TraceLevel.WARNING) return self.__lib_checker = LibChecker(self._input_queue, self._output_queue, self.__driver) self.__lib_login = LibLogin(self._input_queue, self._output_queue, self.__driver) @@ -178,7 +181,7 @@ class AutoLib(MsgBase): ) return True except: - self._showTrace(f"登录页面加载失败 !") + self._showTrace(f"登录页面加载失败 !", self.TraceLevel.ERROR) return False @@ -188,7 +191,7 @@ class AutoLib(MsgBase): lib_config = self.__run_config.get("library", None) if not lib_config: - self._showTrace("未配置图书馆参数 !") + self._showTrace("未配置图书馆参数 !", self.TraceLevel.ERROR) return False url = lib_config.get("host_url") + lib_config.get("login_url") self.__driver.set_page_load_timeout(5) @@ -196,7 +199,9 @@ class AutoLib(MsgBase): self.__driver.get(url) except TimeoutException: self.__driver.execute_script("window.stop();") - self._showTrace(f"图书馆登录页面加载超时 ! 请检查网络环境是否正常") + self._showTrace( + f"图书馆登录页面加载超时 ! 请检查网络环境是否正常", self.TraceLevel.ERROR + ) return False if not self.__waitResponseLoad(): return False @@ -256,6 +261,7 @@ class AutoLib(MsgBase): if can_renew: if self.__lib_renew.renew(username, record, reserve_info): if self.__lib_checker.postRenewCheck(record): + self._showTrace(f"用户 {username} 续约成功 !") result = 0 else: result = 1 @@ -303,7 +309,8 @@ class AutoLib(MsgBase): ) if r == -1: self._showTrace( - f"用户 {user["username"]} 处理过程中页面发生异常,无法继续操作, 任务已终止 !" + f"用户 {user["username"]} 处理过程中页面发生异常,无法继续操作, 任务已终止 !", + self.TraceLevel.WARNING ) break elif r == 0: diff --git a/src/operators/LibChecker.py b/src/operators/LibChecker.py index 6560efd..0b72f0d 100644 --- a/src/operators/LibChecker.py +++ b/src/operators/LibChecker.py @@ -63,7 +63,7 @@ class LibChecker(LibOperator): EC.presence_of_element_located((By.CLASS_NAME, "myReserveList")) ) except: - self._showTrace("加载预约记录页面失败 !") + self._showTrace("加载预约记录页面失败 !", self.TraceLevel.ERROR) return False return True @@ -174,7 +174,7 @@ class LibChecker(LibOperator): ) return reservations except: - self._showTrace("加载预约记录失败 !") + self._showTrace("加载预约记录失败 !", self.TraceLevel.ERROR) return None @@ -197,10 +197,10 @@ class LibChecker(LibOperator): self.__driver.execute_script("arguments[0].click();", more_btn) return True else: - self._showTrace("用户无法加载更多预约记录") + self._showTrace("用户无法加载更多预约记录", self.TraceLevel.WARNING) return False except: - self._showTrace("加载更多预约记录失败 !") + self._showTrace("加载更多预约记录失败 !", self.TraceLevel.ERROR) return False @@ -211,7 +211,7 @@ class LibChecker(LibOperator): ) -> dict: if wanted_date is None: - self._showTrace("日期未指定, 无法检查当前预约状态") + self._showTrace("日期未指定, 无法检查当前预约状态", self.TraceLevel.WARNING) return None self._showTrace(f"正在检查用户在 {wanted_date} 是否有预约状态为 {wanted_status} 的预约记录......") diff --git a/src/operators/LibCheckin.py b/src/operators/LibCheckin.py index 37cd23c..568c901 100644 --- a/src/operators/LibCheckin.py +++ b/src/operators/LibCheckin.py @@ -51,7 +51,7 @@ class LibCheckin(LibOperator): ) ok_btn = self.__driver.find_element(By.CLASS_NAME, "btnOK") except: - self._showTrace("签到时发生未知错误 !") + self._showTrace("签到时发生未知错误 !", self.TraceLevel.ERROR) return False result_message = result_message_element.text if "签到成功" in result_message: @@ -109,7 +109,7 @@ class LibCheckin(LibOperator): if result: self._showTrace("签到按钮已启用") else: - self._showTrace("签到按钮启用失败") + self._showTrace("签到按钮启用失败", self.TraceLevel.WARNING) return result @@ -119,24 +119,24 @@ class LibCheckin(LibOperator): ) -> bool: if self.__driver is None: - self._showTrace("未提供有效 WebDriver 实例 !") + self._showTrace("未提供有效 WebDriver 实例 !", self.TraceLevel.WARNING) return False try: checkin_btn = WebDriverWait(self.__driver, 2).until( EC.element_to_be_clickable((By.ID, "btnCheckIn")) ) except: - self._showTrace(f"用户 {username} 签到界面加载失败 !") + self._showTrace(f"用户 {username} 签到界面加载失败 !", self.TraceLevel.ERROR) return False if "disabled" in checkin_btn.get_attribute("class"): self._showTrace("签到按钮不可用, 可能不在场馆内, 正在尝试启用......") if not self.__enableCheckinBtn(): - self._showTrace(f"签到按钮启用失败 !") + self._showTrace(f"签到按钮启用失败 !", self.TraceLevel.ERROR) return False checkin_btn.click() if self._waitResponseLoad(): self._showTrace(f"用户 {username} 签到成功 !") return True else: - self._showTrace(f"用户 {username} 签到失败 !") + self._showTrace(f"用户 {username} 签到失败 !", self.TraceLevel.ERROR) return False diff --git a/src/operators/LibLogin.py b/src/operators/LibLogin.py index 31cf2de..3a186c4 100644 --- a/src/operators/LibLogin.py +++ b/src/operators/LibLogin.py @@ -52,7 +52,10 @@ class LibLogin(LibOperator): ) return True except: - self._showTrace(f"登录页面加载失败 ! : 用户账号或者密码错误/验证码错误, 具体以页面提示为准") + self._showTrace( + f"登录页面加载失败 ! : 用户账号或者密码错误/验证码错误, 具体以页面提示为准", + self.TraceLevel.ERROR + ) return False @@ -71,7 +74,7 @@ class LibLogin(LibOperator): password_element.clear() password_element.send_keys(password) except Exception as e: - self._showTrace(f"用户名或密码填写失败 ! : {e}") + self._showTrace(f"用户名或密码填写失败 ! : {e}", self.TraceLevel.ERROR) return False return True @@ -90,10 +93,11 @@ class LibLogin(LibOperator): captcha_text = ''.join(filter(str.isalnum, captcha_text)).lower() self._showTrace(f"识别到验证码为 : '{captcha_text}'") if len(captcha_text) != 4: + self._showLog("识别到的验证码长度不等于 4 个字符 !", self.TraceLevel.WARNING) raise Exception("识别到的验证码长度不等于 4 个字符 !") return captcha_text except Exception as e: - self._showTrace(f"验证码识别失败 ! : {e}") + self._showTrace(f"验证码识别失败 ! : {e}", self.TraceLevel.ERROR) return "" @@ -107,10 +111,11 @@ class LibLogin(LibOperator): captcha_text = self._waitMsg(timeout=15) self._showTrace(f"输入的验证码为 : '{captcha_text}'") if len(captcha_text) != 4: + self._showLog("输入的验证码长度不等于 4 个字符 !", self.TraceLevel.WARNING) raise Exception("输入的验证码长度不等于 4 个字符 !") return captcha_text except Exception as e: - self._showTrace(f"输入验证码失败 ! : {e}") + self._showTrace(f"输入验证码失败 ! : {e}", self.TraceLevel.ERROR) return "" @@ -126,7 +131,7 @@ class LibLogin(LibOperator): ).click() return True except Exception as e: - self._showTrace(f"刷新验证码失败 ! : {e}") + self._showTrace(f"刷新验证码失败 ! : {e}", self.TraceLevel.ERROR) return False @@ -147,7 +152,10 @@ class LibLogin(LibOperator): else: if not self.__refreshCaptcha(): return "" - self._showTrace(f"验证码识别失败 {max_attempts} 次, 达到最大尝试次数 !") + self._showTrace( + f"验证码识别失败 {max_attempts} 次, 达到最大尝试次数 !", + self.TraceLevel.WARNING + ) return "" @@ -162,7 +170,7 @@ class LibLogin(LibOperator): captcha_element.send_keys(captcha_text) return True except Exception as e: - self._showTrace(f"验证码填写失败 ! : {e}") + self._showTrace(f"验证码填写失败 ! : {e}", self.TraceLevel.ERROR) return False @@ -175,7 +183,7 @@ class LibLogin(LibOperator): ) -> bool: if self.__driver is None: - self._showTrace("未提供有效 WebDriver 实例 !") + self._showTrace("未提供有效 WebDriver 实例 !", self.TraceLevel.WARNING) return False # begin login process for attempt in range(max_attempts): @@ -203,5 +211,5 @@ class LibLogin(LibOperator): self._showTrace(f"用户 {username} 第 {attempt + 1} 次登录成功 !") return True else: - self._showTrace(f"用户 {username} 第 {attempt + 1} 次登录失败 !") + self._showTrace(f"用户 {username} 第 {attempt + 1} 次登录失败 !",self.TraceLevel.WARNING) return False diff --git a/src/operators/LibLogout.py b/src/operators/LibLogout.py index c907835..72edf5d 100644 --- a/src/operators/LibLogout.py +++ b/src/operators/LibLogout.py @@ -42,7 +42,7 @@ class LibLogout(LibOperator): ) -> bool: if self.__driver is None: - self._showTrace("未提供有效 WebDriver 实例 !") + self._showTrace("未提供有效 WebDriver 实例 !", self.TraceLevel.WARNING) return False try: self.__driver.find_element( @@ -51,5 +51,5 @@ class LibLogout(LibOperator): self._showTrace(f"用户 {username} 注销成功 !") return True except Exception as e: - self._showTrace(f"用户 {username} 注销失败 ! : {e}") + self._showTrace(f"用户 {username} 注销失败 ! : {e}", self.TraceLevel.ERROR) return False diff --git a/src/operators/LibRenew.py b/src/operators/LibRenew.py index f6cf153..7c42370 100644 --- a/src/operators/LibRenew.py +++ b/src/operators/LibRenew.py @@ -54,7 +54,7 @@ class LibRenew(LibTimeSelector): EC.presence_of_element_located((By.CSS_SELECTOR, "#extendDiv div.resultMessage")) ) except: - self._showTrace("续约时间选择界面加载失败 !") + self._showTrace("续约时间选择界面加载失败 !", self.TraceLevel.ERROR) return False head_message = head_message.text.strip() if "警告" in head_message: @@ -73,7 +73,7 @@ class LibRenew(LibTimeSelector): EC.presence_of_element_located((By.CSS_SELECTOR, "#extendDiv .btnOK")) ) except: - self._showTrace("续约时间选择界面加载失败 !") + self._showTrace("续约时间选择界面加载失败 !", self.TraceLevel.ERROR) return False return True @@ -99,7 +99,7 @@ class LibRenew(LibTimeSelector): renew_ok_btn = self.__driver.find_element(By.CSS_SELECTOR, "#extendDiv .btnOK") renew_time_opts = self.__driver.find_elements(By.CSS_SELECTOR, "#extendDiv .renewal_List li") if not renew_time_opts: - self._showTrace("当前未查询到可用续约时间 !") + self._showTrace("当前未查询到可用续约时间 !", self.TraceLevel.WARNING) return False # Find best renewal time option @@ -110,7 +110,8 @@ class LibRenew(LibTimeSelector): return self.__confirmRenewal(best_opt, best_text, actual_diff, record, renew_ok_btn) self._showTrace( "无法选择最近的可用续约时间 ! " - f"所有可选时间与目标时间相差都超过了 {max_diff} 分钟 !" + f"所有可选时间与目标时间相差都超过了 {max_diff} 分钟 !", + self.TraceLevel.WARNING ) self._showTrace(f"当前可供续约的时间有: {free_times}") return False @@ -129,7 +130,7 @@ class LibRenew(LibTimeSelector): if target_renew_mins > LIBRARY_CLOSE_TIME: actual_renew_duration = LIBRARY_CLOSE_TIME - self._timeStrToMins(end_time) if actual_renew_duration <= 0: - self._showTrace(f"当前结束时间 {end_time} 已接近闭馆时间,无法续约 !") + self._showTrace(f"当前结束时间 {end_time} 已接近闭馆时间,无法续约 !", self.TraceLevel.ERROR) return False self._showTrace( f"续约时间已调整至闭馆时间 {self._minsToTimeStr(LIBRARY_CLOSE_TIME)}," @@ -163,7 +164,7 @@ class LibRenew(LibTimeSelector): ok_btn.click() return True except: - self._showTrace("确认续约时发生错误 !") + self._showTrace("确认续约时发生错误 !", self.TraceLevel.ERROR) return False @@ -175,28 +176,28 @@ class LibRenew(LibTimeSelector): ) -> bool: if self.__driver is None: - self._showTrace("未提供有效 WebDriver 实例 !") + self._showTrace("未提供有效 WebDriver 实例 !", self.TraceLevel.WARNING) return False try: renew_btn = WebDriverWait(self.__driver, 2).until( EC.element_to_be_clickable((By.ID, "btnExtend")) ) except: - self._showTrace(f"用户 {username} 续约界面加载失败 !") + self._showTrace(f"用户 {username} 续约界面加载失败 !", self.TraceLevel.ERROR) return False if "disabled" in renew_btn.get_attribute("class"): self._showTrace(f"用户 {username} 续约按钮不可用, 可能不在场馆内, 请连接图书馆网络后重试") return False renew_btn.click() if not self.__waitRenewDialog(): - self._showTrace(f"用户 {username} 续约失败 !") + self._showTrace(f"用户 {username} 续约失败 !", self.TraceLevel.ERROR) # After the renewal, the webpage will display a mask overlay, # so we need to refresh the page for subsequent operations. self.__driver.refresh() return False if not self.__selectNearestTime(record, reserve_info): - self._showTrace(f"用户 {username} 续约失败 !") + self._showTrace(f"用户 {username} 续约失败 !", self.TraceLevel.ERROR) self.__driver.refresh() return False if self._waitResponseLoad(): diff --git a/src/operators/LibReserve.py b/src/operators/LibReserve.py index 45749e0..91e23bc 100644 --- a/src/operators/LibReserve.py +++ b/src/operators/LibReserve.py @@ -72,13 +72,13 @@ class LibReserve(LibTimeSelector): By.CSS_SELECTOR, ".layoutSeat dd" ) if not content_elements: - self._showTrace("未找到预约结果") + self._showTrace("未找到预约结果", self.TraceLevel.WARNING) raise title = title_elements[0].text if title_elements else "" contents = [element.text for element in content_elements if element.text.strip()] for message in contents: if "预约失败" in message or "已有1个有效预约" in message: - self._showTrace(f"预约失败 - {"".join(contents)}") + self._showTrace(f"预约失败 - {"".join(contents)}", self.TraceLevel.ERROR) raise if "预定好了" in title or "预约成功" in title or "操作成功" in title: if len(contents) >= 6: @@ -96,7 +96,7 @@ class LibReserve(LibTimeSelector): ) return True except: - self._showTrace(f"预约结果加载失败 !") + self._showTrace(f"预约结果加载失败 !", self.TraceLevel.ERROR) return False @@ -125,7 +125,8 @@ class LibReserve(LibTimeSelector): except ValueError as e: self._showTrace( f"预约信息错误 ! : {e}, "\ - f"由于缺少必要的预约信息, 无法开始预约流程, 请检查预约信息是否完整" + f"由于缺少必要的预约信息, 无法开始预约流程, 请检查预约信息是否完整", + self.TraceLevel.ERROR ) return False @@ -145,7 +146,8 @@ class LibReserve(LibTimeSelector): if res_timestamp < cur_timestamp: self._showTrace( f"预约日期错误 ! :"\ - f"{reserve_info['date']} 早于当前日期 {cur_date_str}, 自动设置为当前日期" + f"{reserve_info['date']} 早于当前日期 {cur_date_str}, 自动设置为当前日期", + self.TraceLevel.WARNING ) reserve_info["date"] = cur_date_str return True @@ -229,7 +231,8 @@ class LibReserve(LibTimeSelector): # except that the user has set the satisfy_duration to True if end_mins < begin_mins and reserve_info["satisfy_duration"] is False: self._showTrace( - f"结束时间 {end_time['time']} 早于开始时间 {begin_time['time']}, 尝试交换时间" + f"结束时间 {end_time['time']} 早于开始时间 {begin_time['time']}, 尝试交换时间", + self.TraceLevel.WARNING ) reserve_info["end_time"], reserve_info["begin_time"] = begin_time, end_time begin_time, end_time = end_time, begin_time @@ -240,7 +243,8 @@ class LibReserve(LibTimeSelector): max_end_mins = self._timeStrToMins("23:30") if end_mins > max_end_mins: self._showTrace( - f"结束时间 {end_time['time']} 晚于 23:30, 自动设置为 23:30" + f"结束时间 {end_time['time']} 晚于 23:30, 自动设置为 23:30", + self.TraceLevel.WARNING ) reserve_info["end_time"]["time"] = "23:30" end_mins = max_end_mins @@ -251,7 +255,8 @@ class LibReserve(LibTimeSelector): self._showTrace( f"该用户设置了优先满足时长要求, 但是预约期望持续时间 " f"{reserve_info['expect_duration']} 小时 " - f"超出最大时长 8 小时, 自动设置为 8 小时" + f"超出最大时长 8 小时, 自动设置为 8 小时", + self.TraceLevel.WARNING ) reserve_info["expect_duration"] = 8 else: @@ -259,7 +264,8 @@ class LibReserve(LibTimeSelector): self._showTrace( f"该用户未设置优先满足时长要求, 但是检查到预约持续时间 " f"{float((end_mins - begin_mins)/60)} 小时 " - f"超出最大时长 8 小时, 自动设置为 8 小时" + f"超出最大时长 8 小时, 自动设置为 8 小时", + self.TraceLevel.WARNING ) reserve_info["end_time"]["time"] = self._minsToTimeStr(begin_mins + 8*60) return True @@ -429,7 +435,7 @@ class LibReserve(LibTimeSelector): EC.element_to_be_clickable((By.ID, "findRoom")) ).click() except: - self._showTrace("加载房间/区域失败 !") + self._showTrace("加载房间/区域失败 !", self.TraceLevel.ERROR) return False # select room try: @@ -439,7 +445,7 @@ class LibReserve(LibTimeSelector): self._showTrace(f"房间 {display_room} 选择成功 !") return True except: - self._showTrace(f"选择房间失败 ! : {display_room} 不可用") + self._showTrace(f"选择房间失败 ! : {display_room} 不可用", self.TraceLevel.ERROR) return False @@ -457,7 +463,7 @@ class LibReserve(LibTimeSelector): EC.presence_of_all_elements_located((By.CSS_SELECTOR, "li[id^='seat_']")) ) except: - self._showTrace(f"座位加载失败 !") + self._showTrace(f"座位加载失败 !", self.TraceLevel.ERROR) return False try: all_seats = self.__driver.find_elements( @@ -475,9 +481,9 @@ class LibReserve(LibTimeSelector): seat_status = seat_link.get_attribute("title") self._showTrace(f"座位 {seat_id} 选择成功 ! : 当前状态 - '{seat_status}'") return True - self._showTrace(f"座位 {seat_id} 在该楼层区域中不存在, 请检查座位号是否正确") + self._showTrace(f"座位 {seat_id} 在该楼层区域中不存在, 请检查座位号是否正确", self.TraceLevel.WARNING) except: - self._showTrace(f"座位选择失败 !") + self._showTrace(f"座位选择失败 !", self.TraceLevel.ERROR) return False @@ -504,7 +510,7 @@ class LibReserve(LibTimeSelector): ) ) except: - self._showTrace(f"{time_type} 选择失败 ! : 当前未查询到可用时间") + self._showTrace(f"{time_type} 选择失败 ! : 当前未查询到可用时间", self.TraceLevel.ERROR) return -1 # Find best time option @@ -513,7 +519,7 @@ class LibReserve(LibTimeSelector): f"#{time_id} ul li a" ) if not all_time_opts: - self._showTrace(f"{time_type} 选择失败 ! : 当前未查询到可用时间") + self._showTrace(f"{time_type} 选择失败 ! : 当前未查询到可用时间", self.TraceLevel.ERROR) return -1 best_opt, best_text, actual_diff, free_times = self._findBestTimeOption( all_time_opts, target_time, max_time_diff, prefer_earlier, is_reserve=True @@ -530,7 +536,7 @@ class LibReserve(LibTimeSelector): return target_time self._showTrace( f"无法选择最近的 {time_type} {self._minsToTimeStr(target_time)}, " - f"所有可选时间与目标时间相差都超过 {max_time_diff} 分钟" + f"所有可选时间与目标时间相差都超过 {max_time_diff} 分钟", self.TraceLevel.WARNING ) self._showTrace(f"当前可供预约的 {time_type} 有: {free_times}") return -1 @@ -610,7 +616,8 @@ class LibReserve(LibTimeSelector): if expect_end_mins > LIBRARY_CLOSE_TIME: expect_end_mins = LIBRARY_CLOSE_TIME self._showTrace( - f"预约持续时间 {duration} 小时, 超过最大预约时间 23:30, 自动调整为 23:30" + f"预约持续时间 {duration} 小时, 超过最大预约时间 23:30, 自动调整为 23:30", + self.TraceLevel.WARNING ) return expect_end_mins @@ -637,7 +644,7 @@ class LibReserve(LibTimeSelector): EC.presence_of_element_located((By.ID, "seatLayout")) ) except: - self._showTrace(f"加载预约选座页面失败 !") + self._showTrace(f"加载预约选座页面失败 !", self.TraceLevel.ERROR) return False # date, place, floor, room if not self.__selectDate(reserve_info["date"]): @@ -670,11 +677,11 @@ class LibReserve(LibTimeSelector): raise reserve_success = True except: - self._showTrace(f"预约提交失败 !") + self._showTrace(f"预约提交失败 !", self.TraceLevel.ERROR) if not submit_reserve and have_hover_on_page: self.__driver.refresh() if reserve_success: self._showTrace(f"用户 {username} 预约成功 !") else: - self._showTrace(f"用户 {username} 预约失败 !") + self._showTrace(f"用户 {username} 预约失败 !", self.TraceLevel.ERROR) return reserve_success \ No newline at end of file