【发布时间】:2019-06-20 16:37:40
【问题描述】:
这是我写的代码。
Option Explicit
Public Sub Press_Button()
Dim objIE As SHDocVw.InternetExplorer 'microsoft internet controls (shdocvw.dll)
Dim htmlDoc As MSHTML.HTMLDocument 'Microsoft HTML Object Library
Dim htmlInput As MSHTML.HTMLInputElement
Dim htmlColl As MSHTML.IHTMLElementCollection
Dim the_input_elements As MSHTML.IHTMLElementCollection
Dim input_element As MSHTML.HTMLInputElement
Dim IeDoc As MSHTML.HTMLDocument
Dim IeDoc2 As MSHTML.HTMLDocument
Dim input_element2 As MSHTML.HTMLInputElement
Dim the_input_elements2 As MSHTML.IHTMLElementCollection
Set objIE = New SHDocVw.InternetExplorer
With objIE
.Navigate "https://www.ndexsystems.com/fengine/fullservice/en/kerrfinancialsalogin.go?fromLogoff=true" ' Main page
.Visible = 1
Do While .readyState <> 4: DoEvents: Loop
Application.Wait (Now + TimeValue("0:00:02"))
'PART 1: set user name and password
Set htmlDoc = .document
Set htmlColl = htmlDoc.getElementsByTagName("INPUT")
Do While htmlDoc.readyState <> "complete": DoEvents: Loop
For Each htmlInput In htmlColl
If htmlInput.Name = "textbox_password" Then
htmlInput.Value = "***"
Else
If htmlInput.Name = "textbox_id" Then
htmlInput.Value = "***"
End If
End If
Next htmlInput
'PART 2: click login
Set htmlDoc = .document
Set htmlColl = htmlDoc.getElementsByTagName("input")
Do While htmlDoc.readyState <> "complete": DoEvents: Loop
For Each htmlInput In htmlColl
If Trim(htmlInput.Type) = "submit" Then
htmlInput.Click
Exit For
End If
Next htmlInput
'PART 3: Clicks on portfolio management button
Do While .Busy: DoEvents: Loop
Do Until .readyState = READYSTATE_COMPLETE: DoEvents: Loop
Set IeDoc = .document
Set the_input_elements = IeDoc.getElementsByClassName("big_button")
For Each input_element In the_input_elements
If input_element.href = "javascript:changePageToFrontdoor(false);" Then
input_element.Click
Exit For
End If
Next input_element
'PART 4: Clicks on the 'Advanced search' button
Do While .Busy: DoEvents: Loop
Do Until .readyState = READYSTATE_COMPLETE: DoEvents: Loop
Set IeDoc2 = .document
Set the_input_elements2 = IeDoc2.getElementsByClassName("parent-item")
For Each input_element2 In the_input_elements2
If input_element2.href = "javascript:directToSearch()" Then
input_element2.Click
Exit For
End If
Next input_element2
End With
End Sub
第 1、2 和 3 部分完美运行。当我运行这个宏时,它实际上是使用我的凭据登录网站。在第 3 部分中,它还单击了名为“投资组合管理”的按钮。 但是,通过单击“投资组合管理”按钮,会打开一个新选项卡,其中包含同一网站的另一个页面。 在这个新打开的页面上,有一个我想点击的名为“高级搜索”的按钮。这是按钮的 HTML 代码。
第 4 部分不适用于此代码。它没有给我任何错误,它只是没有做任何事情。我不知道我的错误在哪里,因为我用与第 3 部分完全相同的语法编写了第 4 部分,并且只有第 3 部分实际运行并给出了正确的结果(单击按钮)。
也许第 3 部分打开了该网站的新标签,这意味着我在第 4 步中没有执行的附加步骤?因为我不再使用同一个选项卡了......
谁能帮我找出错误?
谢谢你:)
【问题讨论】:
-
也许这是另一个问题的答案:stackoverflow.com/a/21050966/8769365
-
@Nacorid 我尝试在您发送给我的链接中添加代码。感谢您的反馈,但它并没有改变运行宏的结果
-
在单步执行您的代码时,您是否确认
input_element2正在捕获正确的元素?您的 if 语句可能永远不会返回True,因此它永远不会触发 click 事件。 -
@RobertTodar 感谢您的反馈!实际上,在调试的时候,当代码到达Part4代码中的“For Each input_element2 in the_input_elements2”这一行时,实际上并没有进入if语句,而是直接跳转到了“End With”,实际上是循环了所有元素。你知道如何解决这个问题吗?
-
我会单步执行代码,看看故障在哪里。从 `Set IeDoc2 = .document` 开始,并确保它正在捕获正确的文档。如果是这样,请检查
.getElementsByClassName("parent-item")是否实际上正在返回元素(听起来好像不是)。
标签: excel vba internet-explorer