我刚认识这个。我目前正在我们办公室的一个项目工作,我已经有了如何在一个窗口中打开多标签IE的脚本。这是我用它的脚本。
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
我希望有人可以帮我理解,谢谢
答案 0 :(得分:1)
长话短说,您可以更轻松地使用Firefox + Greasemonkey或Chrome + Tampermonkey。
枚举背景标签需要使用Shell.Application
对象.Windows()
方法。模糊的窗口对象似乎打破DOMelement.parentNode
和类似,因此每次导航DOM时,您必须重新建立以tabCollection.item(i).document
开头的完整层次结构。用户名字段是用户名,用户名,登录名,登录ID,电子邮件还是其他名称?您可以尝试使用正则表达式进行预测,但如果您计划扩展此脚本以登录其他站点,则可能会涉及一些试验和错误。
但不可能的部分是表格提交。表单提交是否会在发布之前调用回发来设置隐藏的输入值?如果是这样,则form.submit()
可能在提交之前不会触发必要的事件,从而导致身份验证失败。这是我测试的两个站点的情况。
如果你可以触发提交按钮的click()
事件,那可能会有所帮助。但提交按钮是按钮吗?输入类型=按钮?一个图像?一个程式化的超链接?一个div?好的,所以也许在密码字段中发送 Enter 会更好。我现在已经用initKeyboardEvent
和passwordField.dispatchEvent(evt)
进行了几个小时的试验,似乎在这里,由window
产生的模糊Shell.Application
对象正在阻止成功。
这是我的几乎工作解决方案。它是批量+ 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;