我正在开展一些自动化工作,其中数据将处于Excel状态,需要使用Excel值更新网站中的字段。 我在网上找到了这个宏并尝试编辑它,但它不起作用。 请注意,一旦登录成功,我可以继续更新字段。
我添加了以下依据:
问题:尝试在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"> Caps Lock is on.</td></tr></table></span>
</td>
</tr>
</table>
<div class="div-submit"> </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">
答案 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