【问题标题】:Accessing IE tabs once created创建后访问 IE 选项卡
【发布时间】:2013-05-07 13:24:50
【问题描述】:

使用 VBA,我可以使用以下方法创建一个带有 3 个不同选项卡的 InternetExplorer 对象

Option Explicit

Public Enum IE_READYSTATE
    Uninitialised = 0
    Loading = 1
    Loaded = 2
    Interactive = 3
    complete = 4
End Enum

Sub Example_Click()
Dim ieApp As clsIE

    'Create IE and login
    If ieApp Is Nothing Then
        Set ieApp = New clsIE
        With ieApp

            'IE Tab1
            .IE.Visible = True
            .IE.navigate "http://www.bbc.co.uk/news/"
            Do While .IE.Busy Or Not .IE.readyState = IE_READYSTATE.complete: DoEvents: Loop

            'IE Tab2
            .IE.Navigate2 "http://www.bbc.co.uk", CLng(2048)
            Do While .IE.Busy Or Not .IE.readyState = IE_READYSTATE.complete: DoEvents: Loop

            'IE Tab3
            .IE.Navigate2 "http://www.bbc.co.uk", CLng(2048)
            Do While .IE.Busy Or Not .IE.readyState = IE_READYSTATE.complete: DoEvents: Loop


        End With
    End If

End Sub

然后我怎样才能访问这些选项卡以......

  1. 退出/关闭特定选项卡?
  2. 导航到特定选项卡上的新 URL?
  3. 访问特定的选项卡 DOM?

我知道如何使用单个标签而不是多个标签来完成所有这些操作?

【问题讨论】:

    标签: internet-explorer vba internet-explorer-10


    【解决方案1】:

    虽然我没有进行严格的测试,但我找到了一个似乎可行的答案。我已经修改了你的代码,这样我就可以在没有你的 clsIE 模块的情况下运行它。此代码在打开选项卡时将它们导航到 3 个 url,然后使用 shellwindows 对象将它们导航到新的 url。

    我更改了 do while .busy.. 行,因为它们不适用于第二个和第三个选项卡,因为 IE 应用程序的状态已准备好,而新选项卡仍在加载。

    Sub Example_Click()
    Dim ieApp As InternetExplorer
    Dim SWs As ShellWindows
    Dim IETab1Number As Integer
    Dim IETab2Number  As Integer
    Dim IETab3Number As Integer
    
    Set SWs = New ShellWindows
    
    'Create IE and login
    If ieApp Is Nothing Then
        Set ieApp = CreateObject("InternetExplorer.Application")
        With ieApp
    
           'IE Tab1
           .Visible = True
           .Navigate "http://www.bbc.co.uk/news/"
           Do While .Busy Or Not .ReadyState = IE_READYSTATE.complete: DoEvents: Loop
           IETab1Number = SWs.Count
    
           'IE Tab2
           .Navigate2 "http://www.bbc.co.uk/news/uk-scotland-north-east-orkney-shetland-23822420", CLng(2048)
           'Do While .Busy Or Not .ReadyState = IE_READYSTATE.complete: DoEvents: Loop
           Do While SWs.Count = IETab1Number: DoEvents: Loop
    
           IETab2Number = SWs.Count
    
           'IE Tab3
           .Navigate2 "http://www.bbc.co.uk", CLng(2048)
           'Do While .Busy Or Not .ReadyState = IE_READYSTATE.complete: DoEvents: Loop
           Do While SWs.Count = IETab2Number: DoEvents: Loop
           IETab3Number = SWs.Count
           'ieApp.Visible = False
    
           SWs.Item(IETab1Number - 1).Navigate "http://www.bbc.co.uk/"
           SWs.Item(IETab2Number - 1).Navigate2 "http://www.bbc.co.uk/news/"
           SWs.Item(IETab3Number - 1).Navigate2 "http://www.bbc.co.uk/news/"
    
    
        End With
    End If
    Set ieApp = Nothing
    Set SWs = Nothing
    
    End Sub
    

    它使用 ShellWindows 来操作选项卡。这只是按数字完成的,所以我猜它可能容易出错。

    为了使其更健壮,您可能希望在操作后从选项卡中获取一些信息,并在返回时检查该值是否相同。例如,sPageTitle = SWs.Item(IETab3Number - 1).Document.Title 可用于将页面标题存储在选项卡中,下次您要使用该选项卡时,可以检查它是否没有更改。

    【讨论】:

    • 如果可以的话会 +5 :)
    【解决方案2】:

    简单的解决方法就是将新标签重新分配给对象

    IE.navigate "http://www.bbc.co.uk/news/", CLng(2048)
    Do While IE.Busy Or Not IE.readyState = IE_READYSTATE.complete: DoEvents: Loop
    With CreateObject("Shell.Application").Windows
    Set IE = .Item(.Count - 1)
    End With
    

    【讨论】:

      【解决方案3】:

      以下是我如何使用 VBScript 解决在一个 IE 窗口中分组选项卡的问题。如果该函数发现 IE 窗口的 URL 以 tabGroupS 开头的选项卡(例如“http://stackoverflow.com”),则它会在此窗口中添加一个新选项卡并返回此选项卡,否则会打开一个新窗口。

      Private Function getNewTab(tabGroupS)
          Dim i, objs, cnt, openflag
          Set objs = CreateObject("Scripting.Dictionary")
          Set SWObj = CreateObject("Shell.Application").Windows()
          For Each i In SWObj
              If LCase(Right(i.FullName, 12)) = "iexplore.exe" Then objs.Add objs.Count, i
          Next
          cnt = SWObj.Count
          For Each i In objs
              If Left(objs(i).LocationURL, Len(tabGroupS)) = tabGroupS Then
                  openflag = True
                  objs(i).Navigate2 "about:blank", &H800
                  Exit For
              End If
          Next
          If Not openflag Then
              Set getNewTab = CreateObject("InternetExplorer.Application")
              getNewTab.Visible = True
              Exit Function
          End If
          Do: WScript.Sleep 100: Loop Until SWObj.Count > cnt 'wait until new tab is opened
          For Each i In SWObj
              If LCase(Right(i.FullName, 12)) = "iexplore.exe" Then
                  If Not hasObj(i, objs) Then
                      Set getNewTab = i
                      Exit Function
                  End If
              End If
          Next
      End Function
      
      Function hasObj(obj, col)
          For Each i In col
              If obj Is col(i) Then
                  hasObj = True
                  Exit Function
              End If
          Next
      End Function
      

      【讨论】:

        【解决方案4】:

        试试这个代码:

        Sub FillinternetForm()
            Dim ie As Object
            Set ie = CreateObject("Internetexplorer.Application")
            ie.Navigate "https://google.com"
            ie.Visible = True
            While ie.Busy
                DoEvents 'wait until IE is done loading page.
            Wend
            ie.Document.all("lst-ib").Value = "Fast Sub"
            ie.Navigate "https://google.com", CLng(2048)
            ie.Document.all("lst-ib").Value = "Fast slow Sub"
        End Sub
        

        【讨论】:

        • 第一个选项卡在第二次打开它的未填充值指南时运行良好 任何人都可以输入这几个正常工作的代码吗?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-09
        • 1970-01-01
        • 2019-01-07
        相关资源
        最近更新 更多