背景
大家是不是有覺得認證聯網比較煩的時候,尤其是當在服務器上斷網時,還需要認證聯網,而此時你又不再服務器邊上,對於需要使用服務器的你來說,簡直是噩夢。
本文基於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同級目錄下,其執行流程如下:
- 首先登錄
- 每隔一段時間,ping一次百度,檢查網絡狀態,當網絡出現問題時,自動調用Netlogin.py重新登錄。
- 命令行輸出記錄保存在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選項,保證在無頭瀏覽器下運行(代碼中已解決)
更多詳細參考: