मैं HTML को परिमार्जन करने के लिए Internet Explorer के दो उदाहरण चलाने का प्रयास कर रहा हूँ। लक्ष्य अधिकांश कार्यक्षमता के लिए एक वैश्विक आईई है। हालांकि, मुझे एक विशिष्ट उद्देश्य (प्रमाणीकरण) के लिए एक उदाहरण की आवश्यकता है जो मेरे द्वारा किए जाने के बाद नष्ट हो जाता है।

आईई के इस दूसरे उदाहरण का कारण वेबसाइट की प्रमाणीकरण प्रक्रिया के कारण है जो एक चेतावनी() जावास्क्रिप्ट पॉपअप फेंक देगा जिसे स्वीकार करना और बंद करना मुश्किल है। मैं वर्तमान में इस परिदृश्य में आईई के पूरे उदाहरण को समाप्त कर रहा हूं।

ध्यान दें कि मैं यहां एक अन्य पोस्ट में पॉपअप पर चर्चा कर रहा था: पूर्ण से सहभागी तक

जैसे ही मैं आईई के दूसरे उदाहरण को पीआईडी ​​​​का उपयोग करके समाप्त करता हूं, ऐसा लगता है कि यह आईई के वैश्विक उदाहरण को भी प्रभावित करता है। जब मैं आईई के वैश्विक उदाहरण पर लौटता हूं, तो मुझे मिलता है: रन-टाइम त्रुटि '462': रिमोट सर्वर मशीन मौजूद नहीं है या अनुपलब्ध है।

नकल बनाना:

  1. निष्पादन समारोह runIE1 (कई बार चलाया जा सकता है)
  2. निष्पादन समारोह runIE2 (कई बार चलाया जा सकता है)
  3. त्रुटि प्राप्त करने के लिए फ़ंक्शन runIE1 निष्पादित करें

मॉड्यूल कोड:

Option Explicit

Public Declare Function GetWindowThreadProcessId Lib "user32" _
                                                 (ByVal lHWnd As Long, _
                                                  ByRef lProcessId As Long) As Long
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal Milliseconds As LongPtr)

Public ie_browser As New InternetExplorer

Sub runIE1()
    Debug.Print "--- runIE1 ---"
    Debug.Print "ie_browser PID: "; ie_browser.hwnd
    With ie_browser
        .Navigate "http://127.0.0.1/good.html"
        .Silent = True
        .Visible = False
    End With
    Debug.Print "ie_browser1 Navigated..."
    
    Do Until ie_browser.readyState = 4: DoEvents: Loop
    Do Until ie_browser.Busy = False: DoEvents: Loop
    Debug.Print "ie_browser should have parsed and rendered the page at this time"

    Debug.Print "--- runIE1 ---"
End Sub

Sub runIE2()
    Debug.Print "--- runIE2 ---"
    Dim ie_browser2_hwnd As Long
    Dim ie_browser2 As InternetExplorer
    
    Set ie_browser2 = CreateObject("InternetExplorer.Application")
    Debug.Print "ie_browser2 PID: "; ie_browser2.hwnd
    
    With ie_browser2
        .Navigate "http://127.0.0.1:9000/ftw/bad.html"
        .Silent = True
        .Visible = False
    End With
    
    Debug.Print "ie_browser2 Navigated..."
    
    Debug.Print "ie_browser2 Start wait..."
    Call waitForIE(ie_browser2)
    Debug.Print "ie_browser2 End wait..."
        
    'close if found
    If Not ie_browser2 Is Nothing Then
        Debug.Print "ie_browser2 not null..."
        ie_browser2_hwnd = ie_browser2.hwnd
        ie_browser2.Quit
        Set ie_browser2 = Nothing
        Debug.Print "ie_browser2 quit, set to null"
        Call KillHwndProcess(ie_browser2_hwnd)
        Debug.Print "terminated ie_browser2 PID: " & ie_browser2_hwnd
    End If
    Debug.Print "--- runIE2 ---"
End Sub

Public Sub waitForIE(i As InternetExplorer)
    Dim ie_hwnd As Long
    
    'Ensure browser has completed
    Do While i.readyState = 4: DoEvents: Loop
    
    'Sleep to ensure that we let the readyState to flip back
    Sleep (250)
    
    'popup occurred!
    If i.readyState = 3 Then
        Debug.Print "waitForIE - Popup occurred"
        ie_hwnd = i.hwnd
        Debug.Print "waitForIE - ie PID: " & ie_hwnd
        i.Quit
        Set i = Nothing
        Debug.Print "waitForIE - quit IE, set to nothing..."
        Call KillHwndProcess(ie_hwnd)
        Debug.Print "waitForIE - Terminated IE process: " & ie_hwnd
    Else
        Do Until i.readyState = 4: DoEvents: Loop
        Do Until i.Busy = False: DoEvents: Loop
        
        Debug.Print "Browser should have parsed and rendered the page at this time"
        Debug.Print "IE State: " & i.readyState & " IE busy: " & i.Busy
    End If
    
End Sub


 
'---------------------------------------------------------------------------------------
' Procedure : KillHwndProcess
' Author    : Daniel Pineault, CARDA Consultants Inc.
' Website   : http://www.cardaconsultants.com
' Purpose   : Terminate a process based on its Windows Handle (Hwnd)
' Copyright : The following is release as Attribution-ShareAlike 4.0 International
'             (CC BY-SA 4.0) - https://creativecommons.org/licenses/by-sa/4.0/
' Req'd Refs: Uses Late Binding, so none required
'
' Input Variables:
' ~~~~~~~~~~~~~~~~
' lHWnd     : Windows Handle number (Hwnd)
'
' Usage:
' ~~~~~~
' Call KillHwndProcess(Application.hWnd)
'
' Revision History:
' Rev       Date(yyyy/mm/dd)        Description
' **************************************************************************************
' 1         2018-09-09              Initial Website Release
'---------------------------------------------------------------------------------------
Public Function KillHwndProcess(lHWnd As Long)
' https://docs.microsoft.com/en-us/windows/desktop/cimwin32prov/win32-process
    On Error GoTo Error_Handler
    Dim oWMI                  As Object
    Dim oProcesses            As Object
    Dim oProcess              As Object
    Dim lProcessId            As Long
    Dim sSQL                  As String
    Const sComputer = "."
 
    'Retrieve the ProcessId associated with the specified Hwnd
    Call GetWindowThreadProcessId(lHWnd, lProcessId)
 
    'Iterate through the matching ProcessId processes and terminate
    '   each one.
    Set oWMI = GetObject("winmgmts:\\" & sComputer & "\root\cimv2")
    sSQL = "SELECT * FROM Win32_Process WHERE ProcessId=" & lProcessId
    Set oProcesses = oWMI.ExecQuery(sSQL)
    For Each oProcess In oProcesses
        oProcess.Terminate
    Next
 
Error_Handler_Exit:
    On Error Resume Next
    If Not oProcess Is Nothing Then Set oProcess = Nothing
    If Not oProcesses Is Nothing Then Set oProcesses = Nothing
    If Not oWMI Is Nothing Then Set oWMI = Nothing
    Exit Function
 
Error_Handler:
    MsgBox "The following error has occurred" & vbCrLf & vbCrLf & _
           "Error Number: " & Err.Number & vbCrLf & _
           "Error Source: KillHwndProcess" & vbCrLf & _
           "Error Description: " & Err.Description & _
           Switch(Erl = 0, "", Erl <> 0, vbCrLf & "Line No: " & Erl) _
           , vbOKOnly + vbCritical, "An Error has Occurred!"
    Resume Error_Handler_Exit
End Function

तत्काल विंडो में आउटपुट:

ie_browser PID: 593524
--- runIE1 ---
ie_browser PID:  593524 
ie_browser Navigated...
ie_browser should have parsed and rendered the page at this time
--- runIE1 ---
--- runIE1 ---
ie_browser PID:  593524 
ie_browser Navigated...
ie_browser should have parsed and rendered the page at this time
--- runIE1 ---
--- runIE1 ---
ie_browser PID:  593524 
ie_browser Navigated...
ie_browser should have parsed and rendered the page at this time
--- runIE1 ---
--- runIE2 ---
ie_browser2 PID:  397928 
ie_browser2 Navigated...
ie_browser2 Start wait...
waitForIE - Popup occurred
waitForIE - ie PID: 397928
waitForIE - quit IE, set to nothing...
waitForIE - Terminated IE process: 397928
ie_browser2 End wait...
--- runIE2 ---
--- runIE1 ---

फ़ाइल bad.html (good.html के लिए अलर्ट हटाएं)

<html>
<head>
<title>Bad file</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> 
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
Bad!
<script type="text/javascript">
    alert("Hello World!");
</script>
</body>
</html>
0
TekiusFanatikus 16 मार्च 2021, 17:03
क्या अलर्ट () उस पेज से फेंका गया है जिसके साथ आप इंटरैक्ट कर रहे हैं, या किसी नए पेज से जो अभी-अभी नेविगेशन इवेंट के परिणामस्वरूप लोड हुआ है?
 – 
Tim Williams
16 मार्च 2021, 23:13
...और क्या आपने अलर्ट पर ओके बटन क्लिक करने के लिए विंडोज एपीआई का उपयोग करने पर विचार किया है?
 – 
Tim Williams
17 मार्च 2021, 00:00
जिस पृष्ठ पर आईई नेविगेट कर रहा है, वह अलर्ट() फेंक रहा है। और नहीं, मैंने ओके पर क्लिक करने के लिए विंडोज एपीआई के बारे में नहीं सोचा था (पता नहीं था कि यह एक विकल्प था)। जांच करेंगे। धन्यवाद!
 – 
TekiusFanatikus
17 मार्च 2021, 04:12
मुझे लगता है कि टिम विलियम्स का समाधान समझ में आता है। आप इसे आज़मा सकते हैं। इसके अलावा, क्या आप भेजेंकुंजी? आप अलर्ट पॉपअप को बंद करने के लिए एंटर कुंजी दबाकर अनुकरण करने के लिए SendKeys ("{ENTER}") का प्रयास कर सकते हैं।
 – 
Yu Zhou
17 मार्च 2021, 09:47
मुझे विश्वास है कि मैंने कोशिश की लेकिन कहीं नहीं मिला। मैं निश्चित रूप से इसे एक और बार दे सकता हूं।
 – 
TekiusFanatikus
17 मार्च 2021, 14:41

1 उत्तर

सबसे बढ़िया उत्तर

एक त्वरित परीक्षण में यह विंडोज एपीआई दृष्टिकोण मेरे लिए काम कर रहा था:

Option Explicit

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
           (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, _
            ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
        (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
                                                        lParam As Any) As Long

Private Const BM_CLICK As Integer = &HF5
Private Const WM_ACTIVATE As Integer = &H6
Private Const WA_ACTIVE As Integer = 1

Sub TestAPI()

    Dim IE As InternetExplorer, el, hwnd As Long, btn As Long
    Set IE = New InternetExplorerMedium
    
    'open a test document with an auto-alert (using your example)
    With IE
        .Visible = False
        .navigate "http://localhost/testpages/Bad.html"
    End With
    
    Application.Wait Now + TimeSerial(0, 0, 3)
    
    'find the alert
    hwnd = FindWindow("#32770", "Message from webpage")
    
    If hwnd <> 0 Then
        btn = FindWindowEx(hwnd, 0, "Button", "OK") 'find the OK button
        If btn <> 0 Then ' button found
            ' activate the button on dialog first or it
            '   may not acknowledge a click msg on first try
            SendMessage btn, WM_ACTIVATE, WA_ACTIVE, 0
            ' send button a click message
            SendMessage btn, BM_CLICK, 0, 0
        Else
            MsgBox "button not found!"
        End If
    End If
    
    IE.Visible = True 'make visible to ensure the prompt is gone...
    
End Sub

3
Tim Williams 17 मार्च 2021, 08:54
मैं देख रहा हूँ कि आप InternetExplorerMedium का उपयोग कर रहे हैं। मेरा वर्तमान सेटअप InternetExplorer का उपयोग करता है (मैं एक सुरक्षा क्षेत्र में रह रहा हूं)। फर्क पड़ता है क्या?
 – 
TekiusFanatikus
17 मार्च 2021, 14:40
मैं नहीं कह सकता - मैंने केवल पोस्ट किए गए कोड का परीक्षण किया है
 – 
Tim Williams
17 मार्च 2021, 17:58
ऐसा लगता है कि यह विधि मेरे छोटे परीक्षण मामले में काम कर रही है। मेरे वास्तविक दुनिया परिदृश्य में तैनात करने का समय। :)
 – 
TekiusFanatikus
17 मार्च 2021, 21:57