mirror of
https://github.com/KenanZhu/AutoLibrary.git
synced 2026-06-18 07:23:03 +08:00
02463f087e
- 为 _showTrace 方法添加 no_log 参数,支持控制日志写入 - 在主窗口各关键操作点添加日志输出 - 优化错误信息输出策略,分离 trace 和 log 输出 - 改进配置目录初始化过程的日志记录
143 lines
4.7 KiB
Python
143 lines
4.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""
|
|
Copyright (c) 2025 - 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.
|
|
"""
|
|
import time
|
|
import queue
|
|
|
|
from selenium.webdriver.common.by import By
|
|
from selenium.webdriver.chrome.webdriver import WebDriver
|
|
from selenium.webdriver.support.ui import WebDriverWait
|
|
from selenium.webdriver.support import expected_conditions as EC
|
|
|
|
from base.LibOperator import LibOperator
|
|
|
|
|
|
class LibCheckin(LibOperator):
|
|
|
|
def __init__(
|
|
self,
|
|
input_queue: queue.Queue,
|
|
output_queue: queue.Queue,
|
|
driver: WebDriver
|
|
):
|
|
|
|
super().__init__(input_queue, output_queue)
|
|
|
|
self.__driver = driver
|
|
|
|
|
|
def _waitResponseLoad(
|
|
self
|
|
) -> bool:
|
|
|
|
try:
|
|
WebDriverWait(self.__driver, 2).until(
|
|
EC.presence_of_element_located((By.CLASS_NAME, "ui_dialog"))
|
|
)
|
|
WebDriverWait(self.__driver, 2).until(
|
|
EC.presence_of_element_located((By.CLASS_NAME, "resultMessage"))
|
|
)
|
|
WebDriverWait(self.__driver, 2).until(
|
|
EC.element_to_be_clickable((By.CLASS_NAME, "btnOK"))
|
|
)
|
|
result_message_element = self.__driver.find_element(
|
|
By.CLASS_NAME, "resultMessage"
|
|
)
|
|
ok_btn = self.__driver.find_element(By.CLASS_NAME, "btnOK")
|
|
except:
|
|
self._showTrace("签到时发生未知错误 !", self.TraceLevel.ERROR)
|
|
return False
|
|
result_message = result_message_element.text
|
|
if "签到成功" in result_message:
|
|
try:
|
|
detail_elements = self.__driver.find_elements(
|
|
By.CSS_SELECTOR, ".resultMessage dd"
|
|
)
|
|
except:
|
|
pass
|
|
if detail_elements:
|
|
details = [element.text for element in detail_elements if element.text.strip()]
|
|
if len(details) >= 5:
|
|
self._showTrace(f"\n"\
|
|
f" 签到成功 !\n"\
|
|
f" {details[1]}\n"\
|
|
f" {details[2]}\n"\
|
|
f" {details[3]}\n"\
|
|
f" {details[4]}"
|
|
)
|
|
else:
|
|
self._showTrace(f"\n"\
|
|
" 签到成功 !\n"\
|
|
" 未获取到签到详情 !"
|
|
)
|
|
ok_btn.click()
|
|
return True
|
|
else:
|
|
failure_reason = result_message.replace("签到失败", "").strip()
|
|
self._showTrace(f"\n"\
|
|
" 签到失败 !\n"\
|
|
f" {failure_reason}"
|
|
)
|
|
ok_btn.click()
|
|
return False
|
|
|
|
|
|
def __enableCheckinBtn(
|
|
self
|
|
) -> bool:
|
|
|
|
script = """
|
|
try {
|
|
var checkin_btn = document.getElementById('btnCheckIn');
|
|
if (checkin_btn) {
|
|
checkin_btn.classList.remove('disabled');
|
|
return true;
|
|
}
|
|
return false;
|
|
} catch (e) {
|
|
return false;
|
|
}
|
|
"""
|
|
result = self.__driver.execute_script(script)
|
|
time.sleep(0.1)
|
|
if result:
|
|
self._showTrace("签到按钮已启用", no_log=True)
|
|
else:
|
|
self._showTrace("签到按钮启用失败", self.TraceLevel.WARNING)
|
|
return result
|
|
|
|
|
|
def checkin(
|
|
self,
|
|
username: str
|
|
) -> bool:
|
|
|
|
if self.__driver is None:
|
|
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.TraceLevel.ERROR)
|
|
return False
|
|
if "disabled" in checkin_btn.get_attribute("class"):
|
|
self._showTrace("签到按钮不可用, 可能不在场馆内, 正在尝试启用......", no_log=True)
|
|
if not self.__enableCheckinBtn():
|
|
self._showTrace(f"签到按钮启用失败 !", self.TraceLevel.ERROR)
|
|
return False
|
|
checkin_btn.click()
|
|
if self._waitResponseLoad():
|
|
self._showTrace(f"用户 {username} 签到成功 !", no_log=True)
|
|
return True
|
|
else:
|
|
self._showTrace(f"用户 {username} 签到失败 !", self.TraceLevel.ERROR)
|
|
return False
|