页面

2009年3月9日

web测试,vbs自动登陆脚本批量生成器

web测试,vbs自动登陆脚本批量生成器_学海无涯


做这个东西的原因以及其功能:

我们的web项目是个进销存系统,有丰富的权限控制和业务流程,因此测试的时候需要以指定角色的用户名登陆去测试,这时候,要反复输入各用户的用户名和密码就变得非常琐碎了,用户名难以记住,手工输入密码容易出错,另外登陆密码经常变更并且可能各不相同……

我的这些vbs脚本就能很好解决这些问题,首先《模板.vbs》可以自动登陆并且可以自动尝试url、密码,做到判断服务器是否开启、哪个url可用、哪个密码正确,当密码变更或都不对的时候有提示,当尝试出正确的url/密码的时候自动覆盖脚本自身内容,设置正确的url/密码以便下次使用;其次《生成.vbs》能够根据列出的用户名列表批量生成指定文件名、登陆帐号的登陆脚本。

一.使用说明

1.按需要修改《pwd.txt》添加测试环境的密码;修改模板文件《模板.vbs》中的url;修改完后双击测试是否正常
totalurls=totalurls+1:ReDim Preserve urls(totalurls):urls(totalurls)="http://192.77.11.122:5858/"

2.修改《userAndFileName.txt》指定要生成测试帐号的,如……其中,“=”前面的为帐号后面的为脚本文件名。
----------------------------------------------------------------
sa=超管

3.双击《生成.vbs》生成自动登陆脚本,脚本在目录“自动登陆脚本”里面。


特别提醒:
脚本文件将会默认读取 D:\pwd.txt 的密码,如果没有该密码文件将在当前目录和上层目录搜索 pwd.txt
因此请不要随便移动密码文件 pwd.txt
每次有新的密码请用添加而不是修改密码的方式。

==========================================================================

二.自动登陆模板,文件名《模板.vbs》,代码如下

'1.修改《模板.vbs》中的url、pwd.txt的候选密码、userAndFileName.txt中的帐号和脚本文件名
'2.双击《生成.vbs》生成

Set fso = Wscript.CreateObject("Scripting.FileSystemObject")
Set WshShell = WScript.CreateObject("WScript.Shell")
Set ie = Wscript.CreateObject("InternetExplorer.Application")


'-------------------------------------------------------------------------------------------------
'可选url
Dim urls():totalurls=0
totalurls=totalurls+1:ReDim Preserve urls(totalurls):urls(totalurls)="http://192.77.11.122:5858/"'urls(totalurls)=readTxtFile("url.txt")
'totalurls=totalurls+1:ReDim Preserve urls(totalurls):urls(totalurls)="http://localhost:8080/drp/"
'totalurls=totalurls+1:ReDim Preserve urls(totalurls):urls(totalurls)="http://localhost/"
'totalurls=totalurls+1:ReDim Preserve urls(totalurls):urls(totalurls)="http://localhost/drp/"
'totalurls=totalurls+1:ReDim Preserve urls(totalurls):urls(totalurls)="http://localhost:8080/"

'首页首选项
Dim currentUrl:currentUrl=1
'保证不越界
If currentUrl>UBound(urls) Then
Call reWriteVbs("Dim currentUrl:currentUrl="+CStr(currentUrl),"Dim currentUrl:currentUrl="++CStr(UBound(urls)))
currentUrl=UBound(urls)
End If

'-------------------------------------------------------------------------------------------------
'可修改模板中的用户名,但不要加换行符号
Dim username:username="sa"
'-------------------------------------------------------------------------------------------------
'可选密码
'Dim passwords():totalPwds=0
'totalPwds=totalPwds+1:ReDim Preserve passwords(totalPwds):passwords(totalPwds)="000000"
'totalPwds=totalPwds+1:ReDim Preserve passwords(totalPwds):passwords(totalPwds)="333333"

'读取文件中的候选密码(文本文件,每行一个密码)
defaultPWDFile="D:\pwd.txt"
If fso.FileExists(defaultPWDFile)=False Then
If fso.FileExists("pwd.txt")=True Then
   defaultPWDFile="pwd.txt"
Else
   If fso.FileExists("../pwd.txt")=True Then
    defaultPWDFile="../pwd.txt"
   Else
    MsgBox "密码文件指定错误,当前目录也没有密码文件,脚本将不能正常运行"
   End If
End If
End If
Dim passwords,pwdStr:pwdStr=readTxtFile(defaultPWDFile):passwords=Split(pwdStr,vbCrLf)
'For idx = 1 To UBound(passwords):MsgBox passwords(idx):Next

'帐号首选项
Dim currentPwd:currentPwd=5
'保证不越界
If currentPwd>UBound(passwords) Then
Call reWriteVbs("Dim currentPwd:currentPwd="+CStr(currentPwd),"Dim currentPwd:currentPwd="++CStr(UBound(passwords)))
currentPwd=UBound(passwords)
End If
'-------------------------------------------------------------------------------------------------

'尝试登陆【自动尝试,自动变更脚本文件】
Function tryServer()
loginRst=openServer(urls(currentUrl))

If loginRst=False Then   
   For idx = 1 To UBound(urls)   
    If currentUrl<>idx Then
     loginRst=openServer(urls(idx))
     If loginRst=True Then  
      MsgBox "将自动更改首页首选项为 "+urls(idx)
      Call reWriteVbs("Dim currentUrl:currentUrl="+CStr(currentUrl),"Dim currentUrl:currentUrl="++CStr(idx))
      Exit For
     End If
    End If
   Next   
End If

If loginRst=False Then
   MsgBox "无法显示网页或网页不正常,服务暂停或首页有问题?"
   ie.Visible=1
Else
   toLogin
End If
End Function


Sub toLogin
   tryLogin()
   ie.Visible=1
End Sub

'尝试打开首页
Function openServer(url)
ie.navigate url
SynchronizeIE()
If InStr(ie.Document.body.innerHTML,"无法显示网页") >0 Or InStr(ie.Document.body.innerHTML,"form1")<1 Then
   openServer=False
Else
   openServer=True
End If
End Function

'尝试登陆【自动尝试,自动变更脚本文件】
Function tryLogin()
loginRst=login(currentPwd)

If loginRst=False Then
   For idx = 1 To UBound(passwords) Step 1
    If currentPwd<>idx Then
     loginRst=login(idx)
     If loginRst=True Then
      'temp = msgbox("用户名、密码已经变更为password="+passwords(idx)+",是否自动修改登陆脚本,设置当前成功登陆的帐号为首选项。",32+4)
      'If temp=vbYes Then
      If True Then
       MsgBox "密码已经变更为:password="+passwords(idx)+",下次登陆将优先使用此密码登陆。"
       Call reWriteVbs("Dim currentPwd:currentPwd="+CStr(currentPwd),"Dim currentPwd:currentPwd="++CStr(idx))
      End if
   
      Exit Function
     End If
    End If
   Next
   MsgBox "密码已变更,并且不在预想的可能之中。"
End If
End Function


'替换关键内容后重写自身
Function reWriteVbs(keyForm,keyTo)
strPath = Wscript.ScriptFullName
content=readTxtFile(strPath)
content = ReplaceAll(content,keyForm,keyTo)
Call createNewFile(strPath,content)  
End Function


'用指定索引的用户名、密码登陆
Function login(idx)
Set doc=ie.Document
doc.form1.username.value=username
doc.form1.password.value=passwords(idx)
doc.form1.submit()

SynchronizeIE()  

If InStr(ie.Document.body.innerHTML,"登录失败,请输入正确的用户名和密码!") < 1 Then
   login=True
Else
   login=False
End If
End Function

'Do
'Loop While (InStr(ie.Document.body.innerHTML,"登录失败,请输入正确的用户名和密码!") >0)

'//等待IE操作结束。
Function SynchronizeIE()
    While ie.Busy
          WScript.Sleep(100)
    Wend
End Function

'创建文件,存在则覆盖
Public function createNewFile(dscFile, msgs)
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Dim f
Set f = fso.OpenTextFile(dscFile, ForWriting, True)
f.Write msgs
f.Close
End Function

'读运文本文件内容
Private Function readTxtFile(file_path)
Const ForReading = 1, ForWriting = 2
Dim MyFile
Set MyFile = fso.OpenTextFile(file_path, ForReading)
readTxtFile = MyFile.ReadAll()
MyFile.Close
End Function

Function ReplaceAll(content,patrn,replStr)
Dim regEx
Set regEx = New RegExp      ' 建立正则表达式。
regEx.Pattern = patrn      ' 设置模式。
regEx.IgnoreCase = True      ' 设置是否区分大小写。
ReplaceAll = regEx.Replace(content,replStr)    ' 作替换。
End Function

tryServer()

==========================================================================

三、批量生成器,文件名《生成.vbs》,代码

Set fso = Wscript.CreateObject("Scripting.FileSystemObject")
Set WshShell = WScript.CreateObject("WScript.Shell")
Set ie = Wscript.CreateObject("InternetExplorer.Application")


'读取模板文件
Dim templateStr:templateStr=readTxtFile("模板.vbs")

Dim userFilename,tmpStr,filename,currentUsername
'读取文件中的用户名和文件名
Dim rows,rowStr:rowStr=readTxtFile("userAndFileName.txt"):rows=Split(rowStr,vbCrLf)

'保存自动生成的脚本的目录
Dim foldName:foldName="自动登陆脚本"
If fso.FolderExists(foldName)=False Then
fso.CreateFolder(foldName)
Else
Dim fold:Set fold = fso.GetFolder(foldName)'文件对象一定要定义、set
If fold.files.Count > 0 Then
   For Each af In fold.files
    fso.DeleteFile(af)
   Next
end If
End If

'查找模板中的用户名
iBg=InStr(templateStr,"Dim username:username="+Chr(34))+Len("Dim username:username="+Chr(34))
iEnd=InStr(iBg,templateStr,Chr(34))
currentUsername=Mid(templateStr,iBg,iEnd-iBg)

vbsNums=0'生成的脚本数目
For idx = 0 To UBound(rows)
'MsgBox rows(idx)
If InStr(rows(idx),"=") >0 Then
   userFilename=Split(rows(idx),"=")
   tmpStr = ReplaceAll(templateStr,"Dim username:username="+Chr(34)+currentUsername+Chr(34),"Dim username:username="+Chr(34)+userFilename(0)+Chr(34))
   filename=foldName+"\"+userFilename(1)+".vbs"
   'If fso.FileExists(filename)=True Then:fso.DeleteFile(filename):End If
   createNewFile filename,tmpStr
   vbsNums=vbsNums+1
End If
Next
'MsgBox CStr(vbsNums)+"个自动登陆脚本已经生成好了"


'替换关键内容后重写自身
Function reWriteVbs(keyForm,keyTo)
strPath = Wscript.ScriptFullName
content=readTxtFile(strPath)
content = ReplaceAll(content,keyForm,keyTo)
Call createNewFile(strPath,content)  
End Function

'创建文件,存在则覆盖
Public function createNewFile(dscFile, msgs)
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Dim f
Set f = fso.OpenTextFile(dscFile, ForWriting, True)
f.Write msgs
f.Close
End Function

'读运文本文件内容
Private Function readTxtFile(file_path)
Const ForReading = 1, ForWriting = 2
Dim MyFile
Set MyFile = fso.OpenTextFile(file_path, ForReading)
readTxtFile = MyFile.ReadAll()
MyFile.Close
End Function

Function ReplaceAll(content,patrn,replStr)
Dim regEx
Set regEx = New RegExp      ' 建立正则表达式。
regEx.Pattern = patrn      ' 设置模式。
regEx.IgnoreCase = True      ' 设置是否区分大小写。
ReplaceAll = regEx.Replace(content,replStr)    ' 作替换。
End Function

==========================================================================

四、用户名列表,文件名《userAndFileName.txt》,内容按需填写,每行一用户名,如

sa

user_a

==========================================================================

五、登陆密码,以便自动尝试密码,文件名《pwd.txt》

没有评论: