想請問各位高手,小弟用VBS弄了一個登入網頁,目前遇到了兩個問題,請教各位高手哪裡有問題,網頁屬於內網,沒辦法提供連線測試。
1.AppActivate抓不到IE的視窗,以至於後面的SendKeys無法輸入。
2.此網頁登入鍵button沒有給ID,要怎麼給指令?
1.AppActivate抓不到IE的視窗,以至於後面的SendKeys無法輸入。
Dim wsh,ie
Set wsh = CreateObject("wscript.shell")
Set ie = WScript.CreateObject("InternetExplorer.Application")
URL=" http://......"
ie.Visible = True
ie.navigate URL
wsh.AppActivate "????? - Internet Explorer" '引號中填標題
WScript.Sleep 10001
wsh.SendKeys "?????" '引號中填帳號
WScript.Sleep 10001
wsh.SendKeys "{TAB}"
WScript.Sleep 10001
wsh.SendKeys "?????" '引號中填密碼
WScript.Sleep 10001
wsh.SendKeys "{ENTER}"
2.此網頁登入鍵button沒有給ID,要怎麼給指令?
< button type="submit" class="button"> 登入/button >
VBS如下
username="?????" '用?名
password="?????" '密?
Set ie = CreateObject("internetexplorer.application")
ie.navigate "http:/....."
ie.Visible = true
do While ie.busy Or ie.readystate <> 4
loop
ie.document.getElementById("account").value=username
ie.document.getElementById("password").value=password
ie.document.getElementByid("button").click
網頁原始碼From如下
< form class="form-horizontal" role="form" method="POST" action="http:....">
< input type="hidden" name="_token"value="woMDt8OLwgrpRvVk95Wjs15MdHXa9MOTMeH4u1Rb">
< label for="account" class="label">帳號< /label>
< input id="account" type="text" class="input" name="account" value="" required="" autofocus="">
< div class="group">
< label for="password" class="label">密碼< /label>
< input id="password" type="password" class="input" name="password" required="">
< div class="group">
< label for="password" class="label">< /label>
< div class="group">
< button type="submit" class="button"> 登入< /button>
< /form >
1.AppActivate抓不到IE的視窗,以至於後面的SendKeys無法輸入。
AppActivate抓不到IE的視窗,因為IE還未完全啟動。
IE Automation這個石器時代的工具,是非常遲頓和不可靠的。在對它下每個指令前,必需要確定它做完之前的工作。如果要對它裏面的網頁下指令,更要等待網頁備妥。
因此,你的程式要改為
Dim objIE, url
url = "https://minecraft.net/zh-hant/login/"
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Navigate url
objIE.Visible = True
Const READYSTATE_COMPLETE = 4
Do While objIE.Busy Or objIE.ReadyState <> READYSTATE_COMPLETE
Wscript.Sleep 100
Loop
Wscript.Sleep 2000
' -----------------------------------------
Dim objShell
Set objShell = CreateObject("wscript.shell")
objShell.AppActivate "Internet Explorer"
再說,用SendKeys對IE下指令,非常依賴網頁當時的狀態,如果不配合便會下錯指令。
VBscript應該直接對objIE下指令,才較為可靠。
2.此網頁登入鍵button沒有給ID,要怎麼給指令?
如果要選取一個沒有ID的button,就要選用它的其他特徵(例如:屬性、內容)。
但是,如果所選用的特徵,在網頁中不是唯一的,便會下錯指令。
Dim strLoginName, strLoginPassword
strLoginName = "abc1234@gmail.com"
strLoginPassword = "abcdefg"
objIE.document.getElementByID("account").innerText = strLoginName
objIE.document.getElementByID("password").innerText = strLoginPassword
Wscript.Sleep 500
' <button type="submit" class="button"> 登入</button>
Dim objButton, strType, strText
For Each objButton In objIE.document.getElementsByTagName("button")
strType = objButton.getAttribute("type")
strText = Trim(objButton.innerText)
If (strType = "submit") And (strText = "登入") Then
objButton.Click
Exit For
End If
Next
[注意]如果VBscript文件裏有中文字,文件要用UTF16 LE格式來存放,否則會出現亂碼。
非常感謝 marlin12大大的解答,解答非常清楚完全正確。
小弟初學者獻上萬分感謝。
另外再請教大大另一個問題,如上述第二個問題,如果要判斷是否已經登入,若已登入則不執行程式碼。是否可以用IF判斷是否有ID("account")則執行程式碼?
如果你想用ID="account"這個element來判斷是否已經登入,就要確定[已登入]和[登入失敗]的頁面沒有element的ID="account",否則就會誤判。
Dim elemLoginName
Set elemLoginName = objIE.document.getElementByID("account")
If elemLoginName Is Nothing Then
Wscript.Echo "[error] 'login name' element NOT exist !"
Else
Dim strLoginName, strLoginPassword
strLoginName = "abc1234@gmail.com"
strLoginPassword = "abcdefg"
elemLoginName.innerText = strLoginName
objIE.document.getElementByID("password").innerText = strLoginPassword
Wscript.Sleep 500
' <button type="submit" class="button"> 登入</button>
Dim objButton, strType, strText
For Each objButton In objIE.document.getElementsByTagName("button")
strType = objButton.getAttribute("type")
strText = Trim(objButton.innerText)
If (strType = "submit") And (strText = "登入") Then
objButton.Click
Exit For
End If
Next
End If
marlin12大大 感謝您的回覆,
更改後,IF未登入時操作正常,IF登入時出現錯誤,
Set elemLoginName = objIE.document.getElementByID("account")
上述這行錯誤顯示需要物件:'document.getElementByID(...)'
似乎是沒抓到account就出現錯誤?
請問,若要判斷有沒有登入,有更好的方法嗎?