我正在尝试使用VBA在没有任何ID或名称的表单上自动输入用户名/密码。这可能吗?
查看sample webpage。这个网页与我所知道的名字不起作用。
VBS代码:
uname = "myusername"
pword = "mypassword"
Set objIE = CreateObject("InternetExplorer.Application")
WebSite = "https://cis.mesaaz.gov/eservices/p_template"
With objIE
.Visible = True
.Navigate WebSite
Do While .Busy Or .ReadyState <> 4
DoEvents
Loop
Set element = .Document.getElementsByName("userid")
element.Item(0).Value = uname
Set element = .Document.getElementsByName("ping")
element.Item(0).Value = pword
Set element = .Document.getElementsByName("submit")(0)
element.Click
Do While .Busy Or .ReadyState <> 4
DoEvents
Loop
End With
表单HTML代码:
<form action="uwpqutil.p_VALLOGIN" method="POST" target="_top" name="Login">
<center>
<table border="0" cellpadding="3" cellspacing="0">
<tbody><tr>
<td rowspan="1" colspan="3" align="LEFT"><b>Log-In</b></td>
</tr>
<tr>
<td valign="middle"><b>UserName</b></td>
<td valign="middle"><input name="userid" size="30" type="text"></td>
<td> </td>
</tr>
<tr>
<td valign="middle"><b>Password</b></td>
<td valign="middle"><input name="pin" size="30" type="password"></td>
<input name="JavaScript" value="enabled" type="hidden">
<script language="JavaScript"><!--
document.Login.JavaScript.value = 'enabled';
//--></script>
<td> </td>
</tr>
<tr>
<td> </td>
<td> </td>
<td valign="middle" align="right"><input value="Log-In" type="submit"></td>
</tr>
</tbody></table>
</center>
</form>
答案 0 :(得分:1)
从我可以立即看到的内容,您收到名为ping
而不是pin
的输入,.Document.getElementsByName("submit")
不返回任何元素,因为没有名称为submit
的元素。< / p>
您可以改为使用getElementsByTagName("input")
并循环搜索结果以找到正确的结果,或者您可以通过getElementsByName("Login")
获取表单并使用其Submit
方法。
VBS中也没有DoEvents
功能。相反,你应该使用WScript.Sleep
以合理的毫秒数作为参数(我建议100)。 (假设WScript
对象可用。There are circumstances it is not.)
但是,代码中还存在更严重的错误。您请求的页面不包含表单。它仅包含帧定义。如果您将WebSite
更改为
WebSite = "https://cis.mesaaz.gov/eservices/p_UWGPDYNA"
它开始工作,但不加载其他帧。
uname = "myusername"
pword = "mypassword"
Set objIE = CreateObject("InternetExplorer.Application")
WebSite = "https://cis.mesaaz.gov/eservices/p_UWGPDYNA"
With objIE
.Visible = True
.Navigate WebSite
Do While .Busy Or .ReadyState <> 4
WScript.Sleep 100
Loop
With .Document
.getElementsByName("userid")(0).Value = uname
.getElementsByName("pin")(0).Value = pword
.getElementsByName("Login")(0).Submit
End With
Do While .Busy Or .ReadyState <> 4
WScript.Sleep 100
Loop
End With
如果您也要加载它们,则必须保留原始网址,选择正确的框架并使用其ContentDocument
。我完成的代码:
uname = "myusername"
pword = "mypassword"
Set objIE = CreateObject("InternetExplorer.Application")
WebSite = "https://cis.mesaaz.gov/eservices/p_template"
With objIE
.Visible = True
.Navigate WebSite
Do While .Busy Or .ReadyState <> 4
WScript.Sleep 100
Loop
With .Document.getElementsByName("main")(0).ContentDocument
.getElementsByName("userid")(0).Value = uname
.getElementsByName("pin")(0).Value = pword
.getElementsByName("Login")(0).Submit
End With
Do While .Busy Or .ReadyState <> 4
WScript.Sleep 100
Loop
End With
您应该改进HTML标记并修复JavaScript检测。
现在JavaScript
输入始终包含enabled
。其默认值应为disabled
,并且应由JavaScript更改为enabled
。
标记本身至少应该从负责格式化的元素和属性中删除。这应该在CSS中完成。你使用的风格来自于90年代,当CSS还没有出现时。您还应该validate you markup(it matters)。在head
之后重复body
。框架定义文档在script
元素之前有html
,它应该在head
中。这样的错误可能会使您的网页表现得异常。