python+selenium實現自動聯網認證,並實現斷網重連

背景

大家是不是有覺得認證聯網比較煩的時候,尤其是當在服務器上斷網時,還需要認證聯網,而此時你又不再服務器邊上,對於需要使用服務器的你來說,簡直是噩夢。

本文基於python+selenium模擬聯網,並通過腳本每隔一段時間,ping一次百度,檢查網絡狀態,當斷網時自動重連。

開始

環境搭配

參考:https://www.cnblogs.com/jjstrip/p/11670747.html

不多贅述。注意環境間版本要兼容,如使用新版driver,最好確認兼容瀏覽器。

本文使用環境如下(ubantu下自帶瀏覽器爲火狐,如果用谷歌的話,要相應下載chromedriver):

  • Mozilla Firefox 70.0.1
  • selenium: 3.141.0
  • geckodriver : v0.26

代碼

Netlogin.py

實現登錄認證頁面功能。需要更加自己情況修改賬戶密碼、url和登錄按鈕元素。

# from etc import jboxenv
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.firefox.options import Options


def Netlogin(username, password):
    #設置無頭瀏覽器,否則在命令行下執行可能會報錯
    options = Options()
    options.headless = True
    driver = webdriver.Firefox(options=options)
    try:
        driver.get("your login url")
        name = driver.find_element_by_id('username')
        print("debug: name {}".format(name))
        name.send_keys(username)
        psd = driver.find_element_by_id('password')
        print("debug: passwd {}".format(psd))
        psd.send_keys(password)
        btn = driver.find_element_by_class_name('login-btn') #根據自己url,確定登錄按鈕元素
        print("debug: btn {}".format(btn))
        btn.click()

        wait = WebDriverWait(driver, 10)
        #todo
        # wait.until(EC.presence_of_element_located((By.ID, 'showMine'))) #error
    finally:
        driver.close()

    return "lOG_IN !!!!"

if __name__ == '__main__':
    print(Netlogin('username', '123456'))

net_login.sh

將此文件置於Netlogin.py同級目錄下,其執行流程如下:

  1. 首先登錄
  2. 每隔一段時間,ping一次百度,檢查網絡狀態,當網絡出現問題時,自動調用Netlogin.py重新登錄。
  3. 命令行輸出記錄保存在txt文件下。
#!/bin/bash

#運行命令: nohup ./net_start.sh &

python Netlogin_headless.py

nexttime=60
while : ;
do 
    icmp_cnt=`ping www.baidu.com -c4 | grep icmp_seq | wc -l`
    echo "[`date +'%Y-%m-%d_%H:%M:%S'`]: ping receives: $icmp_cnt / 4"

    if [ $icmp_cnt -lt 4 ]
    then
        python Netlogin_headless.py
    fi
    sleep $nexttime
done

問題

出現如下錯誤:

selenium.common.exceptions.WebDriverException: Message: invalid argument: can't kill an exited process

解決方法有以下幾個:

  • 瀏覽器driver和瀏覽器版本不符,升級舊的版本
  • 將GeckoDriver放到/usr/lib下
  • 在非root用戶下執行你的命令
  • 添加headless選項,保證在無頭瀏覽器下運行(代碼中已解決)

更多詳細參考:

https://stackoverflow.com/questions/52534658/webdriverexception-message-invalid-argument-cant-kill-an-exited-process-with

效果

發佈了69 篇原創文章 · 獲贊 16 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章