Python+selenium实现Drcom校园网自动检测网络以及自动登录

前言

   因为很多工作和软件都在实验室的电脑里面,很多时候在外面需要利用远程软件来控制这台电脑。但是学校的校园网在长时间不工作时经常性的断开,每次都需要在群里@大佬帮忙连接网络,很麻烦。因此想到可以设置自动检测登录的脚本解决这个问题,在舍友的建议下找到了这个方法,非常感谢。
此脚本理论上所有校园网网页都可以执行。

下载:https://github.com/ken-arch/drcom-

环境

1、操作系统:Win10 专业版
2、编程语言:python 3.7 (anaconda)
3、依赖包:selenium
4、浏览器:Chrome

详细步骤

一、python下载配置

   这里就不细讲了,直接下载anaconda安装就行,然后我用的是Jupyter notebook(anaconda里有)来编写Python脚本。
        

二、安装selenium

   直接win+R输入cmd进入命令行,然后输入:

pip install selenium

在这里插入图片描述
        

三、安装webdriver:

3.1、下载地址
   Chrome:http://chromedriver.storage.googleapis.com/index.html
需要注意的是:webdriver需要和对应的浏览器版本以及selenium版本对应
Python+selenium实现Drcom校园网自动检测网络以及自动登录_第1张图片
  这里由于webdriver需要和selenium的版本对应,因此需要将Chrome的自动更新禁用,不然到时候Chrome更新版本导致你的webdriver版本跟不上,脚本就失效了。
可参考:https://www.cnblogs.com/jinanxiaolaohu/p/10605034.html

3.2、webdriver 安装路径
  压缩包解压后,将exe文件复制到Python 安装目录下即可。
python安装路径就是anaconda的安装路径,实在找不到可以在命令行输入:

Python
import sys
sys.path

就可以找到了。
Python+selenium实现Drcom校园网自动检测网络以及自动登录_第2张图片
        

四、写python脚本

4.1、在jupyter notebook 新建一个notebook
        
4.2、判断网络连接情况
  首先:我们需要判断网络是否断开,如果断开则进行登录操作,否则就什么都不用做。
刚开始,外面可以使用os.systerm库函数,直接调用系统函数,如:

import os
def test_net():
    #检查网络是否联通
    res = os.system('ping 8.8.8.8')
    if res:#如果返回1代表网络连接失败
        Login()
    else:#如果返回0代表网络连接成功
        print('ping ok')

  这里就相当于在命令行输入’ping 8.8.8.8’。
虽然上面的函数可行,但是每次执行都会打开命令行,很不方便。因此使用下面的函数。

from subprocess import run
def test_net():
    #检查网络是否联通,利用此函数将不会主动弹出命令行窗口
    #shell是True,则将通过shell执行指定的命令。
    res = run('ping 8.8.8.8',shell=True)
    if res.returncode:
        Login()
    else:
        print('ping ok')

        
4.3、编写自动登录脚本
        
  方法一:普通方式启动

  第一步,先导入selenium库文件,import webdriver。然后初始化url,账号密码。


from selenium import webdriver

def Login():
    # 打开谷歌浏览器
    driver = webdriver.Chrome()
    url = "https://drcom.szu.edu.cn/a70.htm" #登录网址
    Name = "name"  #账号
    Password = "****"  #密码

        
  第二步,访问url。通过检查元素找到对应账号密码的id(当然还有可以用name,xpath等来定位)。
xpath定位方法可参考:https://www.cnblogs.com/chenshaoping/p/5540434.html

 # 访问网址
    driver.get(url)
    driver.implicitly_wait(20)  # 隐性等待,最长等20秒
    # 输入账号
    driver.find_element_by_id("VipDefaultAccount").send_keys(Name)
    # 输入密码
    driver.find_element_by_id("VipDefaultPassword").send_keys(Password)
    # 点击登录按钮
    driver.find_element_by_xpath("//*[@name='f1']/div[@id='btn']/input[@id='login']").click()
    driver.quit()

  其中,在定位登录按钮时,先前一直用对应的id来定位,但一直失效。经过检查源代码,发现按钮对应的id 不是唯一的,因此出现定位错误的问题,之后改用xpath方法定位该元素。如下图id="login"出现了冲突。

Python+selenium实现Drcom校园网自动检测网络以及自动登录_第3张图片
  此外,网址加载速度不一样,要是再网址还没加载完就寻找对应元素,就会找不到。所以加上了隐性等待条件,

driver.implicitly_wait(20)  # 隐性等待,最长等20秒

当页面全部加载完成后就可以继续下一步,不然就最多等待20秒。
        
  方法二:Headless方式启动

  上面访问浏览器的方法会将浏览器打开来,再关闭。我们可以使用另外一种方法,不用真正的打开浏览器,也可以支持运行脚本。

    
    chrome_options = webdriver.ChromeOptions()
    # 使用headless无界面浏览器模式
    chrome_options.add_argument('--headless') #增加无界面选项
    chrome_options.add_argument('--disable-gpu') #如果不加这个选项,有时定位会出现问题
    
    # 打开谷歌浏览器
    driver = webdriver.Chrome(chrome_options=chrome_options)
    

完整代码如下

Drcom_login.1.2.ipynb

from selenium import webdriver
from subprocess import run

def Login():
    
    chrome_options = webdriver.ChromeOptions()
    # 使用headless无界面浏览器模式
    chrome_options.add_argument('--headless') #增加无界面选项
    chrome_options.add_argument('--disable-gpu') #如果不加这个选项,有时定位会出现问题
    
    # 打开谷歌浏览器
    driver = webdriver.Chrome(chrome_options=chrome_options)
    
    url = "https://drcom.szu.edu.cn/a70.htm" #登录网址
    Name = "name"  #账号
    Password = "****"  #密码
    
    # 访问网址
    driver.get(url)
    driver.implicitly_wait(20)  # 隐性等待,最长等20秒
    # 输入账号
    driver.find_element_by_id("VipDefaultAccount").send_keys(Name)
    # 输入密码
    driver.find_element_by_id("VipDefaultPassword").send_keys(Password)
    # 点击登录按钮
    driver.find_element_by_xpath("//*[@name='f1']/div[@id='btn']/input[@id='login']").click()
    driver.quit()
    
def test_net():
    #检查网络是否联通,利用此函数将不会主动弹出命令行窗口
    res = run('ping 8.8.8.8',shell=True)
    if res.returncode:
        Login()
    else:
        print('ping ok')

if __name__ == "__main__":
    test_net()
    

        

五、自动化运行脚本

        
5.1、导出脚本
点击jupyter notebook 左上角的File, 将ipynb文件下载为py文件。
Python+selenium实现Drcom校园网自动检测网络以及自动登录_第4张图片
        
5.2、新建drcom_test.bat文件

cd [py脚本的下载路径]
python Drcom_login_1.2.py

在这里插入图片描述
保存后,双击试一下是否可以执行。若成功,接下来就要将此脚本加入到计算机任务中,实现定时执行的自动化过程。

        
5.3、计算机任务管理
建议参考官方文档:https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-r2-and-2008/cc722178(v=ws.11)

  1. 右键我的电脑-》管理
  2. 系统工具-》任务管理程序-》创建任务
    Python+selenium实现Drcom校园网自动检测网络以及自动登录_第5张图片
    Python+selenium实现Drcom校园网自动检测网络以及自动登录_第6张图片
    以上选择“不管用户是否登录都要运行”,需要做一些修改:

https://www.cnblogs.com/shendeng23/p/9910529.html
记住当前用户名,找到“运行任务时,请使用下列用户账户”下面就是当前用户名了;
然后【win+s】输入“本地安全策略”->本地策略->用户权限分配->作为批处理作业登录->添加用户或组 ->输入当前用户名->检查名称->确定。(中途可能提示输入密码,输 入解锁密码就行)

  1. 新建触发器,按照自己需求来设置。
    1、如果想每天,每隔一个小时执行一次的话,就要参照下图设置。
    参考链接
    Python+selenium实现Drcom校园网自动检测网络以及自动登录_第7张图片
    在这里插入图片描述

  2. 新建操作,将bat文件导入
    Python+selenium实现Drcom校园网自动检测网络以及自动登录_第8张图片

  3. 其他设置,安装需求来就行了。
    对于等待空闲时间的理解,有一个回答得比较好的,我认为应该有所帮助。
    http://ask.zol.com.cn/x/4506197.html

  4. 最后测试,可以将时间间隔选择小一点,然后过一段时间查看历史记录如下,任务有执行则表示成功。
    Python+selenium实现Drcom校园网自动检测网络以及自动登录_第9张图片

        
5、参考资料
1、Python+Selenium基础入门及实践
2、python3:定时执行自动化测试脚本

你可能感兴趣的:(随便写写,python,selenium)