1. 为什么需要实验室安全考试挂机脚本实验室安全考试是很多高校的必修环节但10小时的学习时长确实让人头疼。更麻烦的是系统每5分钟就会弹出对话框如果没及时点击确认计时就会暂停。这种设计本意是确保学生真正在学习但对于已经掌握知识点的同学来说纯粹是浪费时间。我去年就遇到过这种情况盯着屏幕点了一整天对话框手指都快抽筋了。后来发现用PythonSelenium写个自动挂机脚本就能完美解决这个问题。这个方案有三大优势自动刷新页面每20秒刷新一次避免触发5分钟对话框保持屏幕常亮调用Windows API防止系统休眠操作简单只需首次登录之后全自动运行2. 环境准备与依赖安装2.1 安装Python环境建议使用Python 3.8版本太老的版本可能会有兼容性问题。我习惯用Anaconda管理环境conda create -n safety_exam python3.8 conda activate safety_exam2.2 安装必要库核心依赖就两个selenium浏览器自动化工具webdriver-manager自动管理浏览器驱动安装命令很简单pip install selenium webdriver-manager实测中发现Edge浏览器兼容性最好所以示例代码以Edge为例。如果你习惯用Chrome只需把代码中的Edge相关部分替换成Chrome即可。3. 脚本核心代码解析3.1 防止屏幕休眠的实现这个功能依赖Windows API通过ctypes库调用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)原理是通过SetThreadExecutionState告诉系统当前有重要任务在执行需要保持唤醒状态。实测下来这个方案比修改电源设置更可靠而且脚本退出时会自动恢复系统默认设置。3.2 自动刷新逻辑核心刷新代码要考虑几个关键点def auto_refresh(): edge_options Options() edge_options.add_argument(--ignore-certificate-errors) # 忽略证书错误 driver webdriver.Edge( serviceService(EdgeChromiumDriverManager().install()), optionsedge_options ) while True: try: sleep(20) # 20秒间隔 driver.refresh() WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.TAG_NAME, body)) ) except Exception as e: print(f刷新出错: {e}) sleep(5) # 出错后等待5秒重试这里有几个实用技巧添加ignore-certificate-errors参数避免证书问题中断脚本使用WebDriverWait确保页面完全加载异常捕获后延迟重试避免频繁报错4. 完整脚本使用指南4.1 脚本启动流程双击运行脚本后会弹出Edge浏览器手动输入学号和密码登录系统进入任意学习页面脚本开始自动运行建议首次运行时盯着看几分钟确认能正常刷新后再离开。我在测试时遇到过学校网站改版导致元素定位失败的情况所以加了个邮件通知功能作为增强版。4.2 常见问题排查问题现象可能原因解决方案浏览器无法启动驱动下载失败检查网络手动下载驱动刷新无效页面元素变更更新元素定位方式电脑仍会休眠权限不足以管理员身份运行脚本如果遇到其他问题可以尝试以下调试步骤在代码开头添加import logging; logging.basicConfig(levellogging.INFO)缩小刷新间隔到5秒方便观察打印driver.page_source检查页面内容5. 进阶优化建议5.1 添加异常通知功能用SMTP库实现邮件通知是个实用技巧import smtplib from email.mime.text import MIMEText def send_alert(error): msg MIMEText(f挂机脚本异常:{error}) msg[Subject] 安全考试脚本告警 smtp smtplib.SMTP(smtp.xxx.com) smtp.sendmail(senderxxx.com, receiverxxx.com, msg.as_string())5.2 多账号支持如果需要帮同学一起挂机可以改造为多线程版本accounts [ {user:学号1, pwd:密码1}, {user:学号2, pwd:密码2} ] threads [] for acc in accounts: t threading.Thread(targetauto_refresh, args(acc,)) threads.append(t) t.start()不过要注意学校可能检测并发登录建议间隔启动不同账号。6. 法律与道德考量虽然这个脚本能节省时间但有几点需要注意确保学校允许自动化工具不要公开分享具体账号信息实际学习安全知识很重要我个人的做法是先认真学完所有内容确认掌握后再使用脚本刷时长。毕竟实验室安全不是儿戏这些知识关键时刻能救命。