Python+Selenium实战:5分钟搞定实验室安全考试自动挂机脚本(附防熄屏代码)

张开发
2026/4/11 22:32:35 15 分钟阅读

分享文章

Python+Selenium实战:5分钟搞定实验室安全考试自动挂机脚本(附防熄屏代码)
Python自动化实战高效完成实验室安全考试的智能解决方案引言在高校学习过程中实验室安全考试是每位理工科学生必须完成的基础培训。这类考试通常要求累计观看时长达到10小时以上但实际内容往往重复枯燥。更令人困扰的是系统会每隔5分钟弹出验证对话框若未及时点击学习时间便会停止累积。这种设计本意是确保学生真正参与学习但对于已经掌握安全知识的学生而言反而成了时间上的负担。本文将介绍一种基于Python和Selenium的自动化解决方案不仅能智能处理周期性弹窗还能防止电脑进入休眠状态。这个方案特别适合那些已经熟悉实验室安全规范但需要快速完成学时要求的学生群体。我们将从环境配置开始逐步讲解核心代码实现并分享一些优化技巧和注意事项。1. 环境准备与基础配置1.1 安装必要的Python库在开始编写自动化脚本前我们需要搭建适当的开发环境。以下是需要安装的核心组件pip install selenium webdriver-managerSelenium是自动化浏览器操作的核心库而webdriver-manager则能自动管理浏览器驱动省去手动下载配置的麻烦。1.2 浏览器选择与配置虽然本方案以Edge浏览器为例但代码可轻松适配Chrome或Firefox。Edge的优势在于与Windows系统深度集成默认支持WebDriver自动更新性能稳定资源占用相对较低以下是浏览器选项的基础配置from selenium.webdriver.edge.options import Options edge_options Options() edge_options.add_argument(--ignore-certificate-errors) edge_options.add_argument(--ignore-ssl-errors)这些配置跳过了证书验证错误确保脚本能在各种网络环境下稳定运行。2. 核心自动化逻辑实现2.1 定时刷新机制规避5分钟弹窗的关键在于在系统检测之前主动刷新页面。我们采用20秒一次的刷新频率这个间隔既不会太频繁导致服务器压力过大又能有效避开检测。from time import sleep from selenium import webdriver def auto_refresh(): driver webdriver.Edge(optionsedge_options) driver.get(https://examsafety.example.com/index.php) refresh_count 0 while True: sleep(20) driver.refresh() refresh_count 1 print(f已刷新 {refresh_count} 次)2.2 页面状态检测单纯的刷新可能不够可靠我们还需要确认页面确实重新加载成功from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.TAG_NAME, body)) )这段代码会等待最多10秒直到页面body元素加载完成确保每次刷新后系统能正确记录学习时长。3. 系统级优化防止屏幕休眠3.1 Windows电源管理API长时间运行脚本时系统默认的电源设置可能导致屏幕关闭进而中断学习进程。我们可以调用Windows API来临时修改电源策略import ctypes # Windows API常量 ES_CONTINUOUS 0x80000000 ES_SYSTEM_REQUIRED 0x00000001 ES_DISPLAY_REQUIRED 0x00000002 def prevent_screen_off(): while True: ctypes.windll.kernel32.SetThreadExecutionState( ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED ) sleep(30)3.2 多线程实现为防止屏幕休眠的函数需要持续运行我们将其放在单独的线程中import threading prevent_thread threading.Thread(targetprevent_screen_off, daemonTrue) prevent_thread.start()daemonTrue参数确保当主程序退出时这个线程也会自动终止避免资源泄漏。4. 完整脚本与使用指南4.1 整合后的完整代码将上述模块组合起来我们得到完整的自动化脚本import datetime from time import sleep from selenium import webdriver from selenium.webdriver.edge.options import Options from selenium.webdriver.edge.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from webdriver_manager.microsoft import EdgeChromiumDriverManager import ctypes import threading # 防止屏幕休眠的实现 ES_CONTINUOUS 0x80000000 ES_SYSTEM_REQUIRED 0x00000001 ES_DISPLAY_REQUIRED 0x00000002 def prevent_screen_off(): while True: ctypes.windll.kernel32.SetThreadExecutionState( ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED ) sleep(30) def auto_refresh(): edge_options Options() edge_options.add_argument(--ignore-certificate-errors) edge_options.add_argument(--ignore-ssl-errors) refresh_count 0 prevent_thread threading.Thread(targetprevent_screen_off, daemonTrue) prevent_thread.start() try: driver webdriver.Edge( serviceService(EdgeChromiumDriverManager().install()), optionsedge_options ) driver.maximize_window() driver.get(https://examsafety.example.com/index.php) while True: current_time datetime.datetime.now().strftime(%Y-%m-%d %H:%M:%S) sleep(20) driver.refresh() WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.TAG_NAME, body)) ) refresh_count 1 print(f[{current_time}] 第{refresh_count}次刷新成功) except KeyboardInterrupt: print(f\n程序已停止共成功刷新 {refresh_count} 次) finally: ctypes.windll.kernel32.SetThreadExecutionState(ES_CONTINUOUS) driver.quit() if __name__ __main__: print(程序启动按CtrlC停止) print(-------------------) auto_refresh()4.2 使用步骤详解环境准备确保已安装Python 3.6运行pip install selenium webdriver-manager安装依赖脚本配置将代码中的URL替换为实际考试系统的地址可根据需要调整刷新间隔当前为20秒执行流程运行脚本后会自动打开浏览器窗口手动登录考试系统并进入学习页面脚本会自动处理后续的刷新和防休眠按CtrlC可安全停止脚本5. 高级优化与注意事项5.1 错误处理与恢复机制为增强脚本的稳定性我们应加入更完善的错误处理try: driver.refresh() WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.TAG_NAME, body)) ) except Exception as e: print(f刷新失败: {e}) # 尝试重新初始化浏览器 driver.quit() driver webdriver.Edge( serviceService(EdgeChromiumDriverManager().install()), optionsedge_options ) driver.get(https://examsafety.example.com/index.php)5.2 资源占用优化长时间运行浏览器可能占用大量内存可以添加定期清理的机制if refresh_count % 100 0: # 每100次刷新后重启浏览器 driver.quit() driver webdriver.Edge( serviceService(EdgeChromiumDriverManager().install()), optionsedge_options ) driver.get(https://examsafety.example.com/index.php)5.3 使用建议与道德考量虽然这个脚本能节省时间但请注意仅用于已经掌握的安全知识复习新知识仍需认真学习不要分享个人账号信息确保账号安全遵守学校规定某些学校可能禁止自动化工具合理使用电脑资源长时间运行注意散热在实际项目中我发现Edge浏览器在长时间运行后可能出现内存泄漏建议每4-5小时重启一次脚本。另外将刷新间隔设置在15-25秒之间最为可靠太短可能被系统检测为异常行为太长则可能错过防弹窗的时机。

更多文章