JNU之一键打卡

目录

    • 一、关于selenium
    • 二、安装库函数、浏览器驱动
    • 三、分析网页,确定代码
    • 四、生成exe文件

一、关于selenium

  正如中文网站提到的:Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。 利用selenium,就可以驱动浏览器,实现一键打卡。

二、安装库函数、浏览器驱动

  参考selenium + python自动化测试环境搭建。由于本人使用的Anaconda的Spyder,在控制台里面通过pip安装比较方便,输入pip install selenium即可;然后,输入import selenium测试,如果没有报错,则安装成功。
  下面,下载浏览器(建议使用Microsoft Edge)驱动。建议直接到官方驱动网站下载,驱动的版本需要根据浏览器版本而定,查看方法如下图,设置—>常规(拉到底部)。
JNU之一键打卡_第1张图片

如果版本在18及以上,则以管理员身份打开命令提示符,输入DISM.exe /Online /Add-Capability /CapabilityName:Microsoft.WebDriver~~~~0.0.1.0即可。JNU之一键打卡_第2张图片

三、分析网页,确定代码

  查看打卡的网页源代码,可以发现登录页面的元素可以利用idtype定位,如下图:JNU之一键打卡_第3张图片
因此,可以确定代码为(假如学号为2018123456,密码为123456):

stuId = '2018123456' # 需要填入学号
stuPsw = '123456' # 需要填入密码

# 输入学号、密码
elem = driver.find_element_by_id('zh')
elem.send_keys(stuId)
         
elem = driver.find_element_by_id('passw')
elem.send_keys(stuPsw)
           
# 提交表单        
driver.find_element_by_xpath('//button[@type="submit"]').click()

登录成功后,需要选择省份、城市、地区。这里通过id定位下拉框,然后根据选项本身选定。
在这里插入图片描述
以重庆市—重庆市市辖区—渝中区为例,在双引号内依次填入选项名,代码如下:

# 选择省份                                     
 s1 = Select(driver.find_element_by_id('selectProvince'))  # 实例化Select
 s1.select_by_visible_text("重庆市") # 双引号内填入省份
 
 # 选择城市
 s2 = Select(driver.find_element_by_id('selectCity'))  # 实例化Select
 s2.select_by_visible_text("重庆市市辖区") # 双引号内填入城市
 

 s3 = Select(driver.find_element_by_id('selectDistrict'))  # 实例化Select
 s3.select_by_visible_text("渝中区") # 双引号内填入地区
 time.sleep(2)

然后点击确认无误,最后提交表单就好,代码如下:

# 勾选“确认无误”
driver.find_element_by_xpath('//input[@id="10000"]').click()

if driver.find_element_by_xpath('//input[@id="10000"]').is_selected:
    print('已点击确认无误')
else:
    print('未点击确认无误')

# 提交
driver.find_element_by_xpath("//button[@type='submit']").click()
time.sleep(2)

四、生成exe文件

  同样,以Anaconda为例,打开Anaconda Prompt,输入pip install pyinstaller命令,就会自动安装pyinstaller。安装完成后,继续输入pyinstaller -F C:\Users\hello.py-F-w为可选参数,选择-F,生成的执行文件较少,但运行时较慢,不选的话就相反;选择-w,则运行时不会打开cmd。最后,到C:\Users\XXXX\dist(示例路径,就在C盘->用户->自己的用户名->dist)找到exe文件就好,至此,所有工作就完成啦!
  最后,附上完整代码(需要填入自己的学号、密码、需要选择的地方):

# -*- coding: UTF-8 -*-
from selenium import webdriver
from selenium.webdriver.support.select import Select
from selenium.common.exceptions import TimeoutException
import time

stuId = '' # 引号内需要填入学号
stuPsw = '' # 引号内需要填入密码

def ClockIn(driver):
    time.sleep(5)
    try:
        url = r"https://stuhealth.jnu.edu.cn/#/login"
        for i in range(len(stuId)):
            driver.get(url)
            driver.maximize_window()
            
            # 输入学号、密码
            elem = driver.find_element_by_id('zh')
            elem.send_keys(stuId)
            
            elem = driver.find_element_by_id('passw')
            elem.send_keys(stuPsw)
            
            
            # 提交表单        
            driver.find_element_by_xpath('//button[@type="submit"]').click()
            time.sleep(5)
            
            target = driver.find_element_by_id("selectProvince")
            driver.execute_script("arguments[0].scrollIntoView();", target) #拖动到页面底部
            
             # 选择省份                                     
            s1 = Select(driver.find_element_by_id('selectProvince'))  # 实例化Select
            s1.select_by_visible_text("") # 双引号内填入省份
            
            # 选择城市
            s2 = Select(driver.find_element_by_id('selectCity'))  # 实例化Select
            s2.select_by_visible_text("") # 双引号内填入城市
            

            s3 = Select(driver.find_element_by_id('selectDistrict'))  # 实例化Select
            s3.select_by_visible_text("") # 双引号内填入地区
            time.sleep(2)
            
            # 勾选“确认无误”
            driver.find_element_by_xpath('//input[@id="10000"]').click()
            
            if driver.find_element_by_xpath('//input[@id="10000"]').is_selected:
                print('已点击确认无误')
            else:
                print('未点击确认无误')
            
            
            # 提交
            driver.find_element_by_xpath("//button[@type='submit']").click()
            time.sleep(2)
            
            driver.close()
            print('成功打卡')
            
    except TimeoutException:
        driver.execute_script('window.stop()')
        print(driver.page_source)
        print('打卡失败')

if __name__ == '__main__':
    # 加启动配置
    driver = webdriver.Edge()  # 采用Microsoft Edge
    ClockIn(driver)

你可能感兴趣的:(JNU之一键打卡)