同济体育馆自动化预约小软件实现原理


项目文档说明

概述

本项目旨在使用Python和Selenium自动化操作预约同济大学体育馆场地,但仅作为内部学习交流,禁止外传或用于其它破坏公平性活动,如若侵权或造成不良影响请联系我及时删除。

项目涵盖了用户登录、元素查找与点击、元素滚动、处理弹出窗口以及自动进行多步骤操作的完整过程。本文档将详细阐述项目的技术路线、相关知识以及每个函数的功能和用法。


技术路线

  1. Selenium WebDriver: 用于控制浏览器执行自动化操作。通过Selenium WebDriver,可以模拟用户在浏览器上的各种操作,如点击、输入、滚动等。

  2. WebDriverWait: 用于显式等待某些条件的实现,如元素可点击、元素出现等。显式等待提高了代码的稳定性和可靠性。

  3. ActionChains: 用于执行一系列复杂的用户操作,如点击并拖动、鼠标悬停等。

  4. Datetime: 用于处理和格式化时间,以便在特定时间点进行操作。

  5. 脚本化配置读取: 通过读取配置文件,实现了灵活的参数配置,便于不同场景下的快速调整。


相关知识

Selenium WebDriver

Selenium WebDriver是Selenium项目的核心组件之一,用于与浏览器进行交互。通过WebDriver,可以实现对浏览器的各种操作,如打开页面、查找元素、点击元素等。常用类和方法包括:

  • webdriver.Chrome(): 启动Chrome浏览器。

  • find_element(By.XPATH, xpath_expression): 通过XPath查找元素。

  • execute_script(script): 执行JavaScript脚本。

WebDriverWait

在进行自动化测试时,通常需要等待某些条件满足后再进行下一步操作。WebDriverWait提供了显式等待机制,可以设置等待条件和超时时间,常用方法包括:

  • until(condition): 等待直到某个条件为真。

  • element_to_be_clickable((By.XPATH, xpath_expression)): 等待元素可点击。

ActionChains

ActionChains用于执行一系列复杂的用户操作,例如点击并拖动、鼠标悬停、双击等。常用方法包括:

  • click_and_hold(element): 点击并按住元素。

  • move_by_offset(xoffset, yoffset): 移动鼠标到指定的偏移位置。

  • release(): 释放按住的鼠标按钮。

  • perform(): 执行所有已定义的操作。

时间处理

在自动化操作中,时间处理非常重要。使用datetime模块,可以获取和格式化当前时间,以便在特定时间点执行操作。常用方法包括:

  • datetime.now(): 获取当前时间。

  • strftime(format): 按指定格式输出时间。


项目结构

主函数

basic_info_input是项目的主函数,负责执行整个自动化流程。其主要步骤包括:

  1. 初始化: 启动浏览器并打开指定页面。

  2. 登录: 读取用户名和密码,填写并提交登录表单。

  3. 选择运动类型和场地: 查找并点击指定的运动类型和场地。

  4. 等待并点击日期元素: 根据设定的时间阈值,不断刷新页面并查找特定日期元素,直到找到并点击为止。

  5. 点击座位: 尝试点击预定的座位,如果失败则尝试其他备选座位。

  6. 附加操作: 点击确认和复选框等附加操作,完成预定流程。

辅助函数

display_author_info(driver)

功能:显示作者信息弹出框,通过JavaScript脚本实现。

知识点:execute_script方法用于执行JavaScript代码。

read_config(file_path)

功能:读取配置文件,返回配置字典。

知识点:文件读写操作,字符串处理。

scroll_element(driver, element_xpath, distance)

功能:水平滚动指定元素。

知识点:使用ActionChains实现点击并拖动操作。

click_seat(driver, time_choice, selected_seat_index)

功能:尝试点击指定时间和座位位置的座位。

知识点:元素查找,属性判断,点击操作。

additional_clicks(driver)

功能:执行点击下一步按钮、复选框和确认按钮的附加操作。

知识点:显式等待,元素查找与点击。


流程图

关键技术解析

浏览器初始化与打开页面

chrome_options = webdriver.ChromeOptions() chrome_options.binary_location = chrome_path service = Service(driver_path) service.start() driver = webdriver.Chrome(options=chrome_options) driver.get(url_input)

这一部分代码通过指定Chrome浏览器路径和驱动路径,启动浏览器并打开指定的URL。

显示作者信息

script = f"""
alert(`{author_info}`);
"""
driver.execute_script(script)

通过execute_script方法执行JavaScript代码,显示作者信息的弹出框。

登录操作

username_input = driver.find_element(By.ID, 'j_username') username_input.send_keys(student_id) password_input = driver.find_element(By.ID, 'j_password') password_input.send_keys(student_password) submit_button = driver.find_element(By.ID, 'loginButton') submit_button.click()

查找用户名和密码输入框,并输入相应的值,然后点击提交按钮完成登录。

等待并点击日期元素

while current_time < time_threshold: try: date_element = WebDriverWait(driver, 0.4).until( EC.element_to_be_clickable((By.XPATH, date_xpath_expression))) date_element.click() break except: driver.refresh() finally: current_time = datetime.now().strftime('%H:%M:%S.%f')

通过不断刷新页面并显式等待,直到找到并点击指定的日期元素或时间超过阈值。

点击座位

seat_element = driver.find_element(By.XPATH, seat_xpath) if "unselected-seat" in seat_element.get_attribute("class"): next_div_element = seat_element.find_element(By.XPATH, './div') next_div_element.click()

查找指定时间和座位位置的元素,并判断其是否可点击,如果可以则点击该元素。

附加操作

next_button = WebDriverWait(driver, 2).until(EC.element_to_be_clickable((By.XPATH, next_button_xpath))) next_button.click() checkbox = WebDriverWait(driver, 2).until(EC.element_to_be_clickable((By.XPATH, checkbox_xpath))) checkbox.click() confirm_button = WebDriverWait(driver, 2).until(EC.element_to_be_clickable((By.XPATH, confirm_button_xpath))) confirm_button.click()

依次点击下一步按钮、复选框和确认按钮,完成附加操作。


总结

本项目通过Python和Selenium实现了自动化操作网页的功能,包括显示弹出框、登录、选择元素、点击座位和附加操作等。项目使用了显式等待、动作链、时间处理等技术,确保操作的稳定性和可靠性。通过配置文件的方式实现参数的灵活配置,提高了代码的可维护性和适应性。

声明:ZY|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 同济体育馆自动化预约小软件实现原理