2016-02-23 32 views
1

我剛剛對此感到陌生。我目前正在我們辦公室的一個項目中工作,我已經有了關於如何在一個窗口中打開多標籤IE的腳本。這是我用它的腳本。如何使用VBS腳本自動登錄

Const navOpenInBackgroundTab = &H1000 

site1 = "http://site1.com/" 
site2 = "https://site2.com" 



Set oIE = CreateObject("InternetExplorer.Application") 
oIE.Visible = True 
oIE.Navigate2 site1 
oIE.Navigate2 site2,navOpenInBackgroundTab 



Set oIE = Nothing 

但這些網站中有兩個需要登錄信息。我想知道可以讓我自動登錄這些網站的腳本。我想知道我需要在上面的腳本中添加什麼,以便每次使用腳本時都會自動登錄。

下面是該網站的一個: https://myapps.uhc.com/Citrix/AccessPlatform/auth/login.aspx

我希望有人能幫助我找到答案,謝謝

回答

1

長話短說,你必須使用Firefox + Greasemonkey的或Chrome更輕鬆地+ Tampermonkey。枚舉背景選項卡需要使用Shell.Application對象.Windows()方法。模糊的窗口對象似乎打破了DOMelement.parentNode以及類似的操作,所以每次您瀏覽DOM時都必須重新建立從tabCollection.item(i).document開始的完整層次結構。用戶名字段是用戶名,用戶名,登錄名,登錄ID,電子郵件還是其他名稱?您可以嘗試使用正則表達式來預測它,但如果您計劃擴展此腳本以登錄其他站點,可能會涉及一些試驗和錯誤。

雖然不可能的部分是表單提交。表單提交是否會在發佈之前調用回發來設置隱藏的輸入值?如果是這樣,那麼form.submit()可能在提交之前不會觸發必要的事件,從而導致身份驗證失敗。我測試過的兩個網站就是這種情況。

如果你可以觸發提交按鈕的click()事件,這可能會有所幫助。但提交按鈕是一個按鈕?輸入類型=按鈕?一個圖像?一個程式化的超鏈接?一個div?好的,所以也許發送在密碼字段中輸入會更好。我一直在嘗試使用initKeyboardEventpasswordField.dispatchEvent(evt)幾個小時,而且看起來這裏再次出現導致的模糊的window對象,它阻止了成功。

這裏是我的幾乎的工作解決方案。這是一批+ Jscript混合動力車。用.bat擴展名保存它,然後用它做什麼。 *聳聳肩*也許form.submit()將適用於您正在使用的網站?

@if (@CodeSection == @Batch) @then 
@echo off & setlocal 

cscript /nologo /e:JScript "%~f0" 
goto :EOf 

@end // end Batch/begin JScript hybrid code 

var navOpenInBackgroundTab = 4096, 
    site = [ 
     "http://www.site1.com/", 
     "http://www.site2.com/" 
    ], 
    IE = WSH.CreateObject("InternetExplorer.Application"), 
    oSH = WSH.CreateObject("Shell.Application"), 
    username = 'username', 
    password = 'password'; 

IE.Visible = true; 

for (var i=0; i<site.length; i++) { 
    IE.Navigate(site[i], i ? 4096 : null); 
} 

var tabs = oSH.Windows(); 

for (var x = 0; x < tabs.Count; x++) { 
    if (!!(tabs.item(x))) { 
     WSH.Echo('tab ' + x); 
     var entered = { 'username': 0, 'password': 0 }; 
     while (tabs.item(x).Busy || tabs.item(x).ReadyState != 4) WSH.Sleep(50); 
     // sleep 1 second regardless, just in case there's some jquery crap going on 
     WSH.Sleep(1000); 
     for (var i in tabs.item(x).document.forms) { 
      if (i == 'length') break; 
      var inputs = tabs.item(x).document.forms[i].getElementsByTagName('input'); 
      for (var j = inputs.length; j--;) { 
       if (/\b(login|user(name|id)?|e\-?mail)\b/i.test(inputs[j].name) 
       && inputs[j].type.toLowerCase() == "text") { 
        entered.username = inputs[j]; 
        inputs[j].value = username; 
       } else if (inputs[j].type.toLowerCase() == 'password') { 
        entered.password = inputs[j]; 
        inputs[j].value = password; 
       } 
      } 
      if (entered.username && entered.password) { 
       tabs.item(x).document.forms[i].submit(); 

       /* === NOT QUITE WORKING === 
       try { 
        var evt = tabs.item(x).document.createEvent('KeyboardEvent'); 
        // What is "window"? tabs.item(x) doesn't work, nor does IE. 
        evt.initKeyboardEvent('keypress', true, true, tabs.item(x), 
         false, false, false, false, 13, 13); 
        entered.password.dispatchEvent(evt); 
       } 
       catch(e) { WSH.Echo(e.message) } 
       */ 

       i = tabs.item(x).document.forms.length; 
      } 
     } 
    } 
} 

var IE = null; 

另一個想法是做passwordElement.focus()和使用WshShell.SendKeys()發送回車,但你將無法加載標籤的背景。我還沒有找到一種通過編程方式來激活標籤的方法;但如果它們在前臺加載,則它們已經處於活動狀態。雖然這不會在後臺加載選項卡,但它比第一種方法更好。

@if (@CodeSection == @Batch) @then 
@echo off & setlocal 

cscript /nologo /e:JScript "%~f0" 
goto :EOf 

@end // end Batch/begin JScript hybrid code 

var sites = { 
     "http://www.site1.com/" : { 
      'username': 'site1user', 
      'password': 'site1pass' 
     }, 
     "http://www.site2.net/" : { 
      'username': 'site2user', 
      'password': 'site2pass' 
     } 
    }, 
    IE = WSH.CreateObject("InternetExplorer.Application"), 
    oSH = WSH.CreateObject("Shell.Application"), 
    WshShell = WSH.CreateObject("WScript.Shell"), 
    proc = GetObject("winmgmts:").ExecQuery("SELECT Handle FROM Win32_Process " 
     + "WHERE Name='iexplore.exe'"), 
    handle = new Enumerator(proc).item().Handle; 

awesomeness: 
for (var url in sites) { 

    // if not a new window, open a new tab 
    IE.Navigate(url, IE.Visible ? 2048 : null); 
    IE.Visible = true; 

    // give the tab a chance to load 
    WSH.Sleep(1000); 

    var tabs = oSH.Windows(), 
     tab = tabs.item(tabs.Count - 1), 
     entered = { 'username': 0, 'password': 0 }; 

    while (tab.Busy || tab.ReadyState != 4) WSH.Sleep(50); 

    for (var i in tab.document.forms) { 
     if (i == 'length') break; 
     var inputs = tab.document.forms[i].getElementsByTagName('input'); 
     for (var j = inputs.length; j--;) { 
      if (/\b(login|user(name|id)?|e\-?mail)\b/i.test(inputs[j].name) 
      && inputs[j].type.toLowerCase() == "text") { 
       entered.username = inputs[j].value = sites[url].username; 
      } else if (inputs[j].type.toLowerCase() == 'password') { 
       entered.password = inputs[j]; 
       inputs[j].value = sites[url].password; 
      } 
      if (entered.username && entered.password) { 
       // force IE window to have focus 
       while (!(WshShell.AppActivate(handle))) WSH.Sleep(50); 
       entered.password.focus(); 
       WshShell.SendKeys('{END}{ENTER}'); 
       continue awesomeness; 
      } 
     } 
    } 
} 

var IE = null; 
+0

感謝您的支持。我會嘗試使用批處理文件。我可能需要做一些試驗和錯誤。如果這有效,我會告訴你。 ☺ – kiantaray

+0

@kiantaray看到我的第二個解決方案。它比第一種效果更好,如果您可以使用不加載爲背景選項卡的標籤並將焦點放在最終選項卡上而不是第一種上。 – rojo

+0

嗨,我發現一個更簡單的參數讓我自動加載用戶名和密碼。但我仍然試圖弄清楚如何在至少有2或3個網站自動登錄的多標籤頁中打開它。下面是我擁有的: set WshShell = WScript.CreateObject(「WScript.Shell」) 調用WshShell.Run( 「網站」,1,假)「這將打開您的默認瀏覽器 WScript.Sleep 6000 WshShell.SendKeys 「用戶名」 WScript.Sleep 1000個 WshShell.SendKeys 「{TAB}」 WScript.Sleep 1000個 WshShell.SendKeys 「密碼」 WshShell.SendKeys 「{TAB}」 WScript.Sleep 1000個 WshShell.SendKeys 「{} ENTER」 WScript.Q uit() – kiantaray