Accessing IE tabs once created

我只是一个虾纸丫 提交于 2020-01-09 07:19:48

问题


Using VBA I can create an InternetExplorer object with 3 different tabs using the following

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

How can I then access these tabs to....

  1. Quit/Close a specific tab?
  2. Navigate to a new URL on a specific tab?
  3. Access a specific tab DOM?

I know how to do all of this with a single tab but not multiple tabs?


回答1:


I have found an answer that appears to work, though I haven't done rigorous testing. I've modified your code so that I can run it without your clsIE module. This code navigates the tabs to 3 urls when opening them and then navigates them to new urls using the shellwindows object.

I changed the do while .busy.. lines as they didn't work for the 2nd and 3rd tabs in that the state of the IE applecation was ready whilst the new tabs were still loading.

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

It uses the ShellWindows to manipulate the tabs. This is only done by number so I'm guessing it could be prone to errors.

To make it more robust you may want to get some info from the tab after an operation and check that the value is the same when returning to it. For example sPageTitle = SWs.Item(IETab3Number - 1).Document.Title could be used to store the title of the page in a tab, the next time you want to use the tab you can check that it hasn't changed.




回答2:


Simple workaround is just reassign the new tab to the object

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:


Here is how I solved the problem of grouping tabs in one IE window using VBScript. If the function finds IE window with a tab whose URL starts with tabGroupS (e.g. "http://stackoverflow.com") then it adds a new tab to this window and returns this tab otherwise it opens a new window.

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:


Try this code:

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


来源:https://stackoverflow.com/questions/16523271/accessing-ie-tabs-once-created

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!