创建后访问IE选项卡

时间:2013-05-13 13:27:53

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

使用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. 导航到特定标签上的新网址?
  3. 访问特定标签DOM?
  4. 我知道如何使用单个标签但不是多个标签来完成所有这些操作?

4 个答案:

答案 0 :(得分:5)

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

我更改了do而.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可用于在选项卡中存储页面标题,下次要使用选项卡时,可以检查它是否未更改。

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

以下是我如何解决使用VBScript在一个IE窗口中对选项卡进行分组的问题。如果函数找到带有以tabGroupS开头的标签的IE窗口(例如“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

答案 3 :(得分:0)

试试这段代码:

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