由于我们学校的校园网认证是弹出页面的那种,每次输密码都会很蛋疼,于是大一的时候我写过一个宏,每次打开认证界面按一下设定好的键就可以自动填上账号密码了,用了将近三年,效果一直不错。
但最近我发现了一个新的问题,我懒得连浏览器都不想自己打开了。
于是我用selenium又写了一个小工具。Selenium也是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE、Mozilla Firefox、Mozilla Suite等。
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By
def submit():
browser = webdriver.Firefox()
browser.get("http://61.137.86.87:8080/portalNat444/index.jsp")
browser.maximize_window()
try:
submit_account = WebDriverWait(browser,timeout=10).until(EC.presence_of_element_located((By.ID,'account')),message=u'元素加载超时!')
submit_account.send_keys("--YOUR_ACCOUNT--")
submit_password = WebDriverWait(browser,timeout=10).until(EC.presence_of_element_located((By.ID,'userPassword')),message=u'元素加载超时!')
submit_password.send_keys("--YOUR_PASSWORD--")
browser.find_element_by_id("login_button").click()
browser.quit()
print ("登录成功!")
except NoSuchElementException as e:
print ("登录失败:")
print (e.message)
if __name__ == "__main__":
submit()
其实这段代码已经可以很好地满足我的需要了。
不过因为这两天在学习PyQt4,所以一顺手就写了一个界面,方便使用。
import sys
import os
from PyQt4 import QtGui ,Qt ,QtCore
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By
class Window( QtGui.QWidget ):
def __init__( self ):
super( Window, self ).__init__()
self.setWindowTitle( "Auto Submit tool" )
self.setFixedSize(150, 50)
gridlayout = QtGui.QGridLayout()
button1 = QtGui.QPushButton( "Come on!" )
self.connect( button1, QtCore.SIGNAL( 'clicked()' ), self.submit )
gridlayout.addWidget( button1, 0, 0)
self.setLayout( gridlayout )
def OnButton1(self):
submit()
def submit(self):
browser = webdriver.Firefox()
browser.get("http://61.137.86.87:8080/portalNat444/index.jsp")
browser.maximize_window()
try:
submit_account = WebDriverWait(browser,timeout=10).until(EC.presence_of_element_located((By.ID,'account')),message=u'元素加载超时!')
submit_account.send_keys("--YOUR_ACCOUNT--")
submit_password = WebDriverWait(browser,timeout=10).until(EC.presence_of_element_located((By.ID,'userPassword')),message=u'元素加载超时!')
submit_password.send_keys("--YOUR_PASSWORD--")
browser.find_element_by_id("login_button").click()
browser.quit()
message = "Successful"
QtGui.QMessageBox.about( self, 'State', message )
print ("登录成功!")
except NoSuchElementException as e:
message = "Login Failed:" + e.message
print ("登录失败:")
print (e.message)
app = QtGui.QApplication( sys.argv )
win = Window()
win.show()
app.exec_()
之后我们惯例应该生成exe的,不过这个东西貌似受众并不广泛,需要的就自己去生成一下喽,记得加上selenium库~
python setup.py py2exe -p selenium
另外,我在找DOM的id的时候发现了一些羞羞的东西(啊啊啊,我真的只是去看一下id的啊!)
1.index.js:
var publickey = RSAUtils.getKeyPair("10001","","a8a02b821d52d3d0ca90620c78474b78435423be99da83cc190ab5cb5b9b922a4c8ba6b251e78429757cf11cde119e1eacff46fa3bf3b43ef68ceb29897b7aa6b5b1359fef6f35f32b748dc109fd3d09f3443a2cc3b73e99579f3d0fe6a96ccf6a48bc40056a6cac327d309b93b1d61d6f6e8f4a42fc9540f34f1c4a2e053445");
var logFlag = false;
$(document).ready(function(){
$('#DialogNote').dialog({
modal:true,
title:'XX大学上网注意事项',
iconCls:'icon-help',
buttons:[
{
text:'确 认 ',
handler:function()
{
$('#DialogNote').dialog('close');
}
}]
});
$.get('gonggao/usingNote.txt',function(data){
$('#Notes').html(data)});
$('body').bind('contextmenu', function() {
return false;
});
$("#login_button").click(function(){
if(true == logFlag)
{
alert("正在提交服务器,请稍后!");
return;
}
if(("" == $("#account").val())||(""==$("#userPassword").val()))
{
alert("账号或密码不能空");
return;
}
if(($("#account").val().length>32)||($("#userPassword").val().length>32))
{
alert("账号或密码超长");
return;
}
if((""==$("#userIntranetAddress").val())||("null"==$("#userIntranetAddress").val()))
{
alert('无法获取您的网络地址,请输入任意其它网站从网关处导航至本认证页面');
return;
}
if((""==$("#brasAddress").val())||("null"==$("#brasAddress").val()))
{
alert('无法获取您接入点设备地址,请输入任意其它网站从网关处导航至本认证页面');
return;
}
logFlag = true ;
$("#account").attr("readonly",true);
$("#userPassword").attr("readonly",true);
$.ajax({
url:'AccessServices/login',
data:{
'accountID':$("#account").val()+'@zndx.inter',
'password':RSAUtils.encryptedString(publickey, encodeURIComponent($("#userPassword").val())),
'brasAddress':$("#brasAddress").val(),
'userIntranetAddress':$("#userIntranetAddress").val()
},
type:'post',
dataType:'json',
contentType:'application/x-www-form-urlencoded;charset=utf-8',
cache:false,
success:function(data){
logFlag = false ;
$("#account").attr("readonly",false);
$("#userPassword").attr("readonly",false);
switch (data.resultCode){
case '0':
window.location="main2.jsp";
break;
case '1'