5

使用 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?

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

4

4 回答 4

6

尽管我没有进行严格的测试,但我找到了一个似乎可行的答案。我已经修改了你的代码,这样我就可以在没有你的 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,可以用于将页面标题存储在选项卡中,下次您要使用选项卡时,可以检查它是否没有更改。

于 2013-08-24T10:39:41.937 回答
5

简单的解决方法是将新选项卡重新分配给对象

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
于 2014-09-05T00:28:50.663 回答
1

以下是我如何使用 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
于 2013-11-21T08:11:20.847 回答
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
于 2016-11-30T13:17:20.200 回答