【问题标题】:How is it possible to click on a button present in a newly opened tab in internet explorer using VBA?如何使用 VBA 单击 Internet Explorer 中新打开的选项卡中的按钮?
【发布时间】: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


【解决方案1】:

如果 URL 每次都不同,并且您无法使用该 URL,则可以尝试参考以下步骤。

(1) 创建Shell应用对象。

(2) 比尝试计算 IE 窗口并循环遍历它。

(3) 然后将 页面标题 与所有选项卡匹配,找到所需的选项卡并将其分配给 IE 对象,然后您可以尝试与该页面进行交互。

例子:

Set objShell = CreateObject("Shell.Application")
IE_count = objShell.Windows.Count
For x = 0 To (IE_count - 1)
    On Error Resume Next    ' sometimes more web pages are counted than are open
    my_url = objShell.Windows(x).Document.Location
    my_title = objShell.Windows(x).Document.Title

 'find the desired page
    If my_title Like "Put something from your IE page title here" & "*" Then
        Set ie = objShell.Windows(x)
        Exit For
    Else
    End If
Next

您可以根据自己的需要修改以上代码。

更多信息,您可以参考下面的链接。

VBA-Excel: Get ALL The Opened Internet Explorer (IE) using Microsoft Excel

【讨论】:

    猜你喜欢
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-11
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 2019-09-20
    相关资源
    最近更新 更多