VBA填写webform

时间:2016-05-16 07:07:32

标签: excel vba internet-explorer-11

我正在开展一些自动化工作,其中数据将处于Excel状态,需要使用Excel值更新网站中的字段。 我在网上找到了这个宏并尝试编辑它,但它不起作用。 请注意,一旦登录成功,我可以继续更新字段。

我添加了以下依据:

  • Microsoft HTML对象库
  • Microsoft Internet控件

问题:尝试在IE8中运行它。我需要更新到IE 11吗? 收到错误:

  

对象'IWebBrowser2'的方法'文档'在线失败

已更改: 我已更新至IE11,现在错误已更改为

  

“自动化错误,未指定错误”
  IE.document.getelementsbyname("_58_login").Value = "jigarjigar"

Public Declare PtrSafe Function SetForegroundWindow Lib "user32" (ByVal HWND As Long) As Long

Sub Automate_IE_Enter_Data()
    'This will load a webpage in IE
    Dim i As Long
    Dim URL As String
    Dim IE As Object
    Dim objElement As Object
    Dim objCollection As Object
    Dim HWNDSrc As Long
    Dim document As HTMLDocument

    'Create InternetExplorer Object
    Set IE = GetObject("new:{D5E8041D-920F-45e9-B8FB-B1DEB82C6E5E}")
    'Set IE = CreateObject("InternetExplorer.Application")

    'True to make IE visible, or False for IE to run in the background
    IE.Visible = True

    'Navigate to URL
    IE.Navigate https://www.asite.com/login-home/
    ' Wait while IE loading...
    Do While IE.ReadyState = 4: DoEvents: Loop

    'Get Window ID for IE so we can set it as activate window
    HWNDSrc = IE.HWND

    'Set IE as Active Window
    SetForegroundWindow HWNDSrc

   'Find & Fill Out Input Box

   IE.document.getelementsbyname("_58_login").Value = "jigarjigar"
   IE.document.getelementsbyname("_58_password").Value = "mypassword"
   IE.document.getelementsbyclassname("btn-submit nobgcolor").Click
   'Unload IE
endmacro:
   Set IE = Nothing
   Set objElement = Nothing
   Set objCollection = Nothing

End Sub
 <table class="lfr-table">
    <tr>
        <td class="label-unm">
            Login (Email)
        </td>
        <td>
            <div class="inp-login"><input name="_58_login" type="text" value="jigar@jigar.com" onblur="checkforGSUser(this)" autocomplete="off"/></div>
        </td>
    </tr>
    <tr>
        <td class="label-pass">
            Password
        </td>
        <td>
            <div class="inp-login"><input id="_58_password" name="_58_password" type="password" autocomplete="off" value="" /></div>
            <span id="_58_passwordCapsLockSpan" class="pwdCapsMsgSpan" style="position:absolute;display:none;"><table width="111" border="0" cellspacing="0" cellpadding="0"><tr><td class="pwdCapsBorder"><img src="/html/themes/asite/images/common/caps_msg_arrow.gif" hspace="10" /></td></tr><tr><td class="pwdCapsMsg">&#160;Caps Lock is on.</td></tr></table></span>
        </td>
    </tr>
</table>
<div class="div-submit">&#160;</div>
<div class="div-login-link">
    <input class="btn-submit nobgcolor" type="image" src="/html/themes/asite/images/common/login.gif" />
    <a target="_self" href="https://portal.asite.com/widget/web/guest/home?p_p_id=58&p_p_lifecycle=0&p_p_state=normal&p_p_mode=view&_58_struts_action=%2Flogin%2Fview&_58_cmd=forgot-password">Forgot Password?</a>
    <br/>
    <a href="https://www.asite.com/contactus" target="_top">Don't have an account?</a>
    <br/>
    <div class="clear-all"></div>
    <div class="clear-all"></div>
</div>
</form>
<script type="text/javascript">

1 个答案:

答案 0 :(得分:0)

此:

Do While IE.ReadyState = 4: DoEvents: Loop

应该是这样的:

Do While IE.ReadyState <> 4 Or IE.Busy: DoEvents: Loop

IE.ReadyState枚举中,4 = READYSTATE_COMPLETE因此,当页面完成时,您将告诉代码循环>被送达。

在此基础上,代码将不会在页面加载时等待(ReadyState 1 To 3),并且当您进行编辑时,DOM中的元素可能尚未可用。

进一步说明:

  • 在您使用它时,我可能也会在API声明中将HWND更改为LongPtr。 (假设您使用的是x64版本 - 如果要在其他计算机上使用,则需要使用条件编译)。

  • 此外,SetForegroundWindow方法会返回Long,在继续之前应检查该消息是否已成功发送。

  • 您的DOM方法看起来不对,您应该使用:

    IE.Document.getElementById("_58_login").Value
    
    '// Class names don't have spaces in them, so the below is also wrong
    IE.Document.getElementsByClassName("btn-submit nobgcolor")(0).Click
    '// Or
    IE.Document.Forms(0).Submit
    
  • 具有复数名称(getElements&lt; ~~注意's')的DOM方法返回一个HTMLColletion,需要迭代并测试,或者有一个元素直接通过使用包含该项目索引的parethese直接访问(如上例所示 - 注意索引从零开始)

  • 您实际上并没有在任何时候关闭IE,只是从内存中释放对象。在将应用程序设置为IE.Quit

  • 之前,请使用Nothing关闭该应用程序
  • 最后,不需要endmacro:标签,因为您不会在任何时候更改错误处理或指导代码。

在OP中看到HTML后:

For Each el In IE.Document.GetElementsByTagName("input")
    If el.Name = "_58_login" Then
        el.Value = "jigar@jigar.com"
        Exit For
    End If
Next

IE.Document.GetElementById("_58_password").Value = "Password"

IE.Document.GetElementsByClassName("btn-submit nobgcolor")(0).Click

'// or IE.Document.Forms(0).Submit