2013-05-13 21 views
5

Sử dụng VBA tôi có thể tạo một đối tượng InternetExplorer với 3 tab khác nhau bằng cách sử dụng sau đâyTruy cập tab IE khi tạo

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 

Làm thế nào tôi có thể sau đó truy cập vào các tab để ....

  1. Quit/Đóng một tab cụ thể?
  2. Điều hướng đến một URL mới trên một tab cụ thể?
  3. Truy cập vào tab DOM cụ thể?

Tôi biết cách thực hiện tất cả điều này bằng một tab nhưng không phải là nhiều tab?

Trả lời

4

Tôi đã tìm thấy câu trả lời dường như hoạt động, mặc dù tôi chưa thực hiện kiểm tra nghiêm ngặt. Tôi đã sửa đổi mã của bạn để tôi có thể chạy nó mà không cần mô-đun clsIE của bạn. Mã này điều hướng các tab đến 3 url khi mở chúng và sau đó điều hướng chúng đến các url mới bằng cách sử dụng đối tượng shellwindows.

Tôi đã thay đổi các dòng .busy .. khi chúng không hoạt động đối với tab thứ 2 và thứ 3 trong đó trạng thái của ứng dụng IE đã sẵn sàng trong khi các tab mới vẫn đang tải.

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 

Sử dụng ShellWindows để thao tác các tab. Điều này chỉ được thực hiện bằng số vì vậy tôi đoán nó có thể dễ bị lỗi.

Để làm cho nó mạnh mẽ hơn, bạn có thể muốn nhận một số thông tin từ tab sau một thao tác và kiểm tra xem giá trị có giống nhau không khi quay lại. Ví dụ: sPageTitle = SWs.Item(IETab3Number - 1).Document.Title có thể được sử dụng để lưu trữ tiêu đề của trang trong tab, lần tiếp theo bạn muốn sử dụng tab, bạn có thể kiểm tra xem nó có thay đổi hay không.

+1

Would 5 nếu tôi có thể :) – user3357963

1

Đây là cách tôi giải quyết vấn đề nhóm các tab trong một cửa sổ IE trên VBScript./tabGroupS/là smth. như "http://stackoverflow.com". Nếu chức năng tìm thấy cửa sổ IE với tab stackoverflow đã mở, nó sẽ thêm một tab mới vào cửa sổ này và trả về tab này nếu không sẽ mở cửa sổ mới.

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

Simple workaround chỉ được phân công lại tab mới để các đối tượng

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 
0

Cố gắng mã này:

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 
+0

Đầu tiên Tab làm việc tốt khi thứ hai mở hướng dẫn giá trị không điền của nó về điều này Bất cứ ai có thể đặt trong vài mã này hoạt động chính xác? – Raulsoul