因为很多工作和软件都在实验室的电脑里面,很多时候在外面需要利用远程软件来控制这台电脑。但是学校的校园网在长时间不工作时经常性的断开,每次都需要在群里@大佬帮忙连接网络,很麻烦。因此想到可以设置自动检测登录的脚本解决这个问题,在舍友的建议下找到了这个方法,非常感谢。
此脚本理论上所有校园网网页都可以执行。
下载:https://github.com/ken-arch/drcom-
1、操作系统:Win10 专业版
2、编程语言:python 3.7 (anaconda)
3、依赖包:selenium
4、浏览器:Chrome
这里就不细讲了,直接下载anaconda安装就行,然后我用的是Jupyter notebook(anaconda里有)来编写Python脚本。
直接win+R输入cmd进入命令行,然后输入:
pip install selenium
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.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"出现了冲突。
此外,网址加载速度不一样,要是再网址还没加载完就寻找对应元素,就会找不到。所以加上了隐性等待条件,
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文件。
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)
https://www.cnblogs.com/shendeng23/p/9910529.html
记住当前用户名,找到“运行任务时,请使用下列用户账户”下面就是当前用户名了;
然后【win+s】输入“本地安全策略”->本地策略->用户权限分配->作为批处理作业登录->添加用户或组 ->输入当前用户名->检查名称->确定。(中途可能提示输入密码,输 入解锁密码就行)
其他设置,安装需求来就行了。
对于等待空闲时间的理解,有一个回答得比较好的,我认为应该有所帮助。
http://ask.zol.com.cn/x/4506197.html
5、参考资料
1、Python+Selenium基础入门及实践
2、python3:定时执行自动化测试脚本