長話短說,你必須使用Firefox + Greasemonkey的或Chrome更輕鬆地+ Tampermonkey。枚舉背景選項卡需要使用Shell.Application
對象.Windows()
方法。模糊的窗口對象似乎打破了DOMelement.parentNode
以及類似的操作,所以每次您瀏覽DOM時都必須重新建立從tabCollection.item(i).document
開始的完整層次結構。用戶名字段是用戶名,用戶名,登錄名,登錄ID,電子郵件還是其他名稱?您可以嘗試使用正則表達式來預測它,但如果您計劃擴展此腳本以登錄其他站點,可能會涉及一些試驗和錯誤。
雖然不可能的部分是表單提交。表單提交是否會在發佈之前調用回發來設置隱藏的輸入值?如果是這樣,那麼form.submit()
可能在提交之前不會觸發必要的事件,從而導致身份驗證失敗。我測試過的兩個網站就是這種情況。
如果你可以觸發提交按鈕的click()
事件,這可能會有所幫助。但提交按鈕是一個按鈕?輸入類型=按鈕?一個圖像?一個程式化的超鏈接?一個div?好的,所以也許發送在密碼字段中輸入會更好。我一直在嘗試使用initKeyboardEvent
和passwordField.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;
感謝您的支持。我會嘗試使用批處理文件。我可能需要做一些試驗和錯誤。如果這有效,我會告訴你。 ☺ – kiantaray
@kiantaray看到我的第二個解決方案。它比第一種效果更好,如果您可以使用不加載爲背景選項卡的標籤並將焦點放在最終選項卡上而不是第一種上。 – rojo
嗨,我發現一個更簡單的參數讓我自動加載用戶名和密碼。但我仍然試圖弄清楚如何在至少有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