背景
大家是不是有觉得认证联网比较烦的时候,尤其是当在服务器上断网时,还需要认证联网,而此时你又不再服务器边上,对于需要使用服务器的你来说,简直是噩梦。
本文基于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选项,保证在无头浏览器下运行(代码中已解决)
更多详细参考: