Python+selenium實現Drcom校園網自動檢測網路以及自動登入

ken的學習之路發表於2020-11-21

前言

因為很多工作和軟體都在實驗室的電腦裡面,很多時候在外面需要利用遠端軟體來控制這臺電腦。但是學校的校園網在長時間不工作時經常性的斷開,每次都需要在群裡@大佬幫忙連線網路,很麻煩。因此想到可以設定自動檢測登入的指令碼解決這個問題,在舍友的建議下找到了這個方法,非常感謝。
此指令碼理論上所有校園網網頁都可以執行。

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

環境

1、作業系統:Win10 專業版
2、程式語言:python 3.7 (anaconda)
3、依賴包:selenium
4、瀏覽器:Chrome

詳細步驟

1、python下載配置就不細講了,直接下載anaconda安裝就行,然後我用的是Jupyter notebook(anaconda裡有)來編寫Python指令碼。
        

2、安裝selenium,也很簡單,直接win+R輸入cmd進入命令列,然後輸入:

pip install selenium

在這裡插入圖片描述
        

3、安裝webdriver:
   3.1、 Chrome:http://chromedriver.storage.googleapis.com/index.html
需要注意的是:webdriver需要和對應的瀏覽器版本以及selenium版本對應
在這裡插入圖片描述
  這裡由於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

就可以找到了。

        
4、寫python指令碼
1、在jupyter notebook 新建一個notebook
        
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')

        
3、編寫自動登入指令碼
        
3.1、普通方式啟動

  第一步,先匯入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"出現了衝突。

在這裡插入圖片描述
  此外,網址載入速度不一樣,要是再網址還沒載入完就尋找對應元素,就會找不到。所以加上了隱性等待條件,

driver.implicitly_wait(20)  # 隱性等待,最長等20秒

當頁面全部載入完成後就可以繼續下一步,不然就最多等待20秒。
        
3.2、Headless方式啟動

上面訪問瀏覽器的方法會將瀏覽器開啟來,再關閉。我們可以使用另外一種方法,不用真正的開啟瀏覽器,也可以支援執行指令碼。

    
    chrome_options = webdriver.ChromeOptions()
    # 使用headless無介面瀏覽器模式
    chrome_options.add_argument('--headless') #增加無介面選項
    chrome_options.add_argument('--disable-gpu') #如果不加這個選項,有時定位會出現問題
    
    # 開啟谷歌瀏覽器
    driver = webdriver.Chrome(chrome_options=chrome_options)
    

3.3、完整程式碼

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()
    

        
4、自動化執行指令碼
        
4.1、匯出指令碼
點選jupyter notebook 左上角的File, 將ipynb檔案下載為py檔案。
在這裡插入圖片描述
        
4.1、新建drcom_test.bat檔案

cd [py指令碼的下載路徑]
python Drcom_login_1.2.py

在這裡插入圖片描述
儲存後,雙擊試一下是否可以執行。若成功,接下來就要將此指令碼加入到計算機任務中,實現定時執行的自動化過程。

        
4.1、計算機任務管理

  1. 右鍵我的電腦-》管理

  2. 系統工具-》任務管理程式-》建立任務
    在這裡插入圖片描述
    在這裡插入圖片描述

  3. 新建觸發器,按照自己需求來設定。
    在這裡插入圖片描述

  4. 新建操作,將bat檔案匯入
    在這裡插入圖片描述

  5. 其他設定,安裝需求來就行了。
    對於等待空閒時間的理解,有一個回答得比較好的,我認為應該有所幫助。
    http://ask.zol.com.cn/x/4506197.html

        
5、參考資料
Python+Selenium基礎入門及實踐
python3:定時執行自動化測試指令碼

相關文章