一、概述
很多高校都有自己的校园网,学生在联网时登录特定网址,输入自己的学号密码等信息即可连接校内网。这一系列操作虽然简单,但如果要在远程服务器上实现,可能要费一点点功夫了。由于服务器上时不时需要安装一些环境,所以随时随地连接校园网(最好还能断网)成为我面临的一个不得不解决的问题。
具体而言,困难体现在如下方面:其一,通过ssh连接服务器时,所有操作都要在命令行完成。或许看到这里你觉得还OK,作为经验丰富的宅男,鼠标盲点打开网页还不是分分钟。那么下一条——没有可用的X service,chrome,teamviewer等许多应用都无法正常打开——宣告宅男们可以洗洗睡了。
(远程连接没法使用X service确实是一个头疼的问题。很多原来用终端一句命令就可以打开的应用都无法正常开启。比如teamviewer,lantern等,现在还没有找到很好的办法。teamviewer只能通过开机启动,然后中间不能关掉。其他类似应用只能通过teamviewer打开。如果哪位朋友有好的方法希望不吝赐教!)
其实可能有同学会想到一个方法——VNC Viewer。其实之前看舍友用的时候感觉还挺方便,毕竟teamviewer需要服务器和笔记本都联网,本身限制就多一些。然而之前在公司实习有一次向mentor提出安装vnc的请求时别他驳回,理由是VNC Vierwer“比较占用带宽”。网上查了下好像还真是,VNC的一大特点就是带宽占得多,慢...所以后来还是老实回去用ssh了。
二、selenium库实现自动点击与文本输入
selenium是一个常用于自动化网页测试以及爬虫的Python库,可以模拟用户点击、文本输入等事件。selenium库的安装和使用并不复杂,不过要注意应保持浏览器版本与驱动版本的一致,否则用一段时间浏览器自动更新,可能导致webdriver无法访问网页。
2.1 selenium库的安装
安装直接用pip install selenium即可。该模块支持多种浏览器,好像火狐浏览器是最方便的,有相关开发工具栏。不过这里我使用的是chrome。装好之后如果直接使用webdriver.Chrome()会报错,什么PATH之类的。意思就是没检测到可用的chromedriver。去网上下一个和自己chrome版本对应的driver,放在chrome浏览器安装路径下即可。(由于Chrome一般是自动安装,所以路径比较固定: win->C:\Program Files(x86), linux->/opt/google/chrome/)
驱动版本映射表以及下载地址见这里。
2.2 selenium库的使用
使用起来还是比较直观和方便的。主要涉及到以下几个接口函数:
-
driver = webdriver.Chrome()
打开Chrome浏览器并创建一个driver对象(这一步通常是最容易出错的) -
driver.get("www.baidu.com")
成员函数get接收一个url作为参数,浏览器将跳转至指定页面 -
driver.find_element_by_XXX()
该函数需要我们进入chrome开发者模式,检查目标按钮或区域(统称为元素element),寻找一些可用的pattern。这里的XXX可以是id,或者name等。比如下图中我检查了一个输入框的元素:
从右侧可以看出,该输入框id为"username", name为"DDDDD"(不知道啥意思..),还有其他很多信息。这里只需要返回elem = find_element_by_id("username")
的结果即可获取到这一个元素。

-
elem.click()
,elem.send_keys()
模拟鼠标、键盘事件
非常直观。click就是点按钮,send_keys就是输入一串字符。 -
driver.switch_to.alert()
该函数应该引起特别注意。因为很多时候在浏览器上操作,网页也有可能触发被动操作。如下图:
该图是我在点击注销按钮之后弹出来的提示窗口。如果忽略这个窗口的处理,将导致注销功能失败。因此selenium还需要知道一个用于应对被动弹出窗口(alert/confirm/prompt等)的接口,即driver.switch_to.alert()
。该函数的返回值具有几个有用的功能:
-
text
: 返回alert/confirm/prompt中的文字信息; -
accept()
:接受现有警告框; -
dismiss()
: 解散现有警告框; -
send_keys
: 发送文本至警告框(没用过)

-
driver.quit()
该函数用于关闭chrome应用。
之前没加这一句,发现测试脚本每运行一次就会打开一个浏览器,次数多了以后可能影响电脑运行速度。故该接口也是非常有必要的。
由于实现连接校园网的脚本涉及的selenium接口不是很多,以后如果用到了再在这里补充。
三、 通过ssh运行selenium脚本
使用上面的接口函数就足够写一个自动打开chrome浏览器实现登录的脚本了。不过我们最终的目的是在服务器上运行。然而试了一下,发现ssh打开命令行之后,运行这个脚本无法打开浏览器。
Google了一下,找到了解决办法. 大概意思就是说,由于小黑窗没有图形界面,所以我们可以启动一个虚拟桌面,然后利用这个虚拟桌面操作原来操作在图形界面上的功能。具体就是再导入一个库:pyvirtualdisplay
中的Display
模块,然后:
display = Display(visible=0)
display.start()
(隐隐感觉这个pyvirtualdisplay
库能解决一大类问题~~)
最后再driver.quit() 之后别忘了把虚拟桌面关闭:
display.stop()
四、 封装可执行文件
至此,login.py脚本已经完成。完整的脚本可以随意到我的github上获取。考虑脚本要在linxu服务器上为师门多位同学服务,每次都用Python运行不是很方便,可移植性也不是很好,故考虑将脚本封装成可执行文件。
使用模块:pyinstaller。 用法非常简单:
pyinstaller -F -w login.py
哈哈~ 非常感谢大家阅读~ 欢迎大家留下自己的见解!
网友评论