没有ID或名称的VBA IE Automation

时间:2014-07-06 11:21:38

标签: html vba internet-explorer

我正在尝试使用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>&nbsp;</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>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td valign="middle" align="right"><input value="Log-In" type="submit"></td>
</tr>
</tbody></table>
</center>
</form>

1 个答案:

答案 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 markupit matters)。在head之后重复body。框架定义文档在script元素之前有html,它应该在head中。这样的错误可能会使您的网页表现得异常。