IE Fenster "Seiten Ladestatus" abfragen

  • Hallo zusammen,

    ich suche eine möglichkeit einem IE Fenster zu sagen, wenn du in 5 sec nicht komplett geladen bist dann mache schliesse dich.

    Hat einer nen Tip wie ich das machen kann?

    Danke und Gruß
    Norman

    Einmal editiert, zuletzt von Norman Bates (7. April 2013 um 12:16)

  • Hallo Norman Bates,

    ich habe mein "Embedded Web control Test" Beispiel darauf angepasst:

    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    AutoIt Version: 3.3.6.1
    Author: AutoBert: http://www.autoit.de/index.php?page…4679#post164679

    [/autoit] [autoit][/autoit] [autoit]

    Skriptbeispiel für den Umgang mit _IECreateEmbedded, _IEErrorHandlerRegister, _IENavigate, _IEAction GuiCtrlCreateProgress, _IEPropertyGet
    #ce ----------------------------------------------------------------------------
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <IE.au3>

    [/autoit] [autoit][/autoit] [autoit]

    _IEErrorHandlerRegister()

    [/autoit] [autoit][/autoit] [autoit]

    $oIE = _IECreateEmbedded()
    $SinkObject = ObjEvent($oIE, "IEEvent_", "DWebBrowserEvents2") ; Ereignisse den UDFs zuweisen, beginnend mit IEEvent_
    GUICreate("Embedded Web control Test", 640, 600, _
    (@DesktopWidth - 640) / 2, (@DesktopHeight - 580) / 2, _
    $WS_OVERLAPPEDWINDOW + $WS_VISIBLE + $WS_CLIPSIBLINGS + $WS_CLIPCHILDREN)
    $hInput = GUICtrlCreateInput("Hier URL eingeben: ", 10, 10, 500)
    $hGo = GUICtrlCreateButton("&Go", 520, 10, 50)
    $GUIActiveX = GUICtrlCreateObj($oIE, 0, 40, 640, 480)
    ;$GUIActiveX = GUICtrlCreateObj($oIE, 0, 40, 683, 480) ;wenn der vertikale Skrollbalken nicht zu sehen sein soll
    GUICtrlSetResizing($GUIActiveX, $GUI_DOCKAUTO)
    $GUI_Button_Back = GUICtrlCreateButton("Back", 10, 525, 100, 22)
    GUICtrlSetResizing(-1, $GUI_DOCKSTATEBAR)
    $GUI_Button_Forward = GUICtrlCreateButton("Forward", 120, 525, 100, 22)
    GUICtrlSetResizing(-1, $GUI_DOCKSTATEBAR)
    $GUI_Button_Home = GUICtrlCreateButton("Home", 230, 525, 100, 22)
    GUICtrlSetResizing(-1, $GUI_DOCKSTATEBAR)
    $GUI_Button_Stop = GUICtrlCreateButton("Stop", 340, 525, 100, 22)
    GUICtrlSetResizing(-1, $GUI_DOCKSTATEBAR)
    $GUI_Button_Print = GUICtrlCreateButton("PRINT", 450, 525, 100, 22)
    GUICtrlSetResizing(-1, $GUI_DOCKSTATEBAR)
    $idProgress = GUICtrlCreateProgress(0, 555, 640, 18)
    GUICtrlSetResizing(-1, $GUI_DOCKSTATEBAR)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState() ;Show GUI
    $iTime=TimerInit()
    _IENavigate($oIE, "http://www.autoit.de/index.php?page=Thread&postID=164679#post164679")

    [/autoit] [autoit][/autoit] [autoit]

    ; Waiting for user to close the window
    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    ExitLoop
    Case $msg = $hGo
    _IENavigate($oIE, GUICtrlRead($hInput))
    Case $msg = $GUI_Button_Home
    _IENavigate($oIE, "http://www.autoitscript.com")
    Case $msg = $GUI_Button_Back
    _IEAction($oIE, "back")
    Case $msg = $GUI_Button_Forward
    _IEAction($oIE, "forward")
    Case $msg = $GUI_Button_Stop
    _IEAction($oIE, "stop")
    Case $msg = $GUI_Button_Print
    _IEAction($oIE, "print")
    EndSelect
    $surl1 = _IEPropertyGet($oIE, "locationurl")
    $surl2 = GUICtrlRead($hInput)
    ; ConsoleWrite($surl1 & " " & $surl2 & " " & GUICtrlRead($idProgress) & @CRLF)
    If $surl1 <> $surl2 And GUICtrlRead($idProgress) > 90 Then GUICtrlSetData($hInput, $surl1)
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $SinkObject = 0 ; IE Eventzuweisung aufheben
    _IEQuit($oIE)
    GUIDelete()
    Exit

    [/autoit] [autoit][/autoit] [autoit]

    Func IEEvent_ProgressChange($Progress, $ProgressMax)
    if TimerDiff($iTime)>5000 Then
    _IEAction($oIE,"stop")
    ;Exit
    EndIf
    $percent = Int(($Progress * 100) / $ProgressMax)
    If $percent >= 0 And $percent <= 100 Then GUICtrlSetData($idProgress, $percent)
    EndFunc ;==>IEEvent_ProgressChange

    [/autoit]

    wichtig ist Zeile 15 und die damit aufgerufene Func: IEEvent_ProgressChange

    mfg autoBert

  • Habe mir das Script mal ausgeführt.
    Verstehe nicht was die Func mit der Zeile 15 zu tun hat und wie diese funktioniert.

    Kannst Du mir diese erklären?

    Danke und Gruß
    Norman

  • Das kann die Hilfe zu

    [autoit]

    ObjEvent

    [/autoit]

    besser. Ich habe damals auch nur die benötigten Zeilen aus der Hilfe herauskopiert und bei mir angepasst auf eine Progressbar eingesetzt.

    mfg autoBert

  • Ich brauche hier bitte nochmal eure Hilfe.

    Habe mir in der Hilfe mal ObjEvent angeguckt und ein Code ausschnitt ausprobiert wo ich dachte dass das doch eigentlich funktionieren müsste.

    [autoit]

    If $oIE.readyState = "complete" Or $oIE.readyState = 4 Then ExitLoop

    [/autoit]

    Das habe ich dann wie folgt eingesetzt mit hilfe eines Scripts aus dem Englischen Forum.

    [autoit]

    Dim $oIE = _IECreate()

    [/autoit][autoit][/autoit][autoit]

    ObjEvent($oIE,"IEEvent_","DWebBrowserEvents2")
    _IENavigate($oIE, "www.34jk5h4j3k5hj3453.com",0)
    Sleep(10000)
    If not $oIE.readyState = "complete" Or $oIE.readyState = 4 Then
    _IEQuit($oIE)
    ConsoleWrite("Nicht geladen" &@CRLF)
    Exit
    Else
    _IEQuit($oIE)
    ConsoleWrite("Seite komplett geladen" &@CRLF)
    EndIf

    [/autoit][autoit][/autoit][autoit]

    Func IEEvent_NavigateError($pdisp, $url, $tf, $status,$cancel)
    $msg = "Problems loading page: " & $url & @CRLF
    $msg = $msg & "Status: " & $status & @CRLF
    MsgBox(0,"PROBLEMS",$msg)
    EndFunc

    [/autoit]

    Egal ob die Seite geladen ist oder nicht er springt direkt zu Else Anweisung.

    Vllt hat ja noch der eine oder andere ne Idee.

    Danke und Gruß
    Norman

  • Kann dein Problem bestätigen, ich bekomme immer "Seite komplett geladen". Ist aber auch logisch da der Readystate 4 für komplett geladen steht, deine If Bedinung muss also so aussehen:

    [autoit]

    If Not $oIE.readyState = "complete" and Not $oIE.readyState = 4 Then
    ConsoleWrite("Nicht geladen" & @CRLF)
    Else
    ConsoleWrite("Seite komplett geladen" & @CRLF)
    EndIf
    _IEQuit($oIE)
    Exit

    [/autoit]

    mfg autoBert

  • Lass mal dieses Skript unverändert laufen:

    Spoiler anzeigen
    [autoit]

    #include <IE.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Dim $oIE = _IECreate()
    ObjEvent($oIE, "IEEvent_", "DWebBrowserEvents2")
    $bTimeOut = False
    $iTimeOut=900000 ;bitte mindestenst 1 mal mit diesem Wert durchlaufen lassen danach 1 mal mit 10 dies sollte beide Varianten zeigen
    $iTime=TimerInit()
    $sURL = "www.autoit.de"
    _IENavigate($oIE, $sURL, 0)
    If $oIE.readyState <> "Vor While...Wend: complete" and $oIE.readyState <> 4 Then
    ConsoleWrite("Nicht geladen" & @CRLF)
    Else
    ConsoleWrite("Vor While...Wend: Seite komplett geladen" & @CRLF)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    While Not $bTimeOut And $oIE.readyState <> 4
    Sleep(1000)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    If $oIE.readyState <> "Nach While...Wend: complete" and $oIE.readyState <> 4 Then
    ConsoleWrite("Nicht geladen" & @CRLF)
    Else
    ConsoleWrite("Nach While...Wend: Seite komplett geladen" & @CRLF)
    EndIf
    If $bTimeOut Then
    ConsoleWrite(@CRLF&@CRLF&'Seite: ' & $sURL&' nicht in '&$iTime &' ms geladen!'&@CRLF)
    Else
    ConsoleWrite(@CRLF&@CRLF&'Seite: ' & $sURL&' in '&$iTime &' ms geladen!'&@CRLF)
    EndIf;_IEQuit($oIE)
    ;_IEQuit($oIE)
    Exit

    [/autoit] [autoit][/autoit] [autoit]

    Func IEEvent_NavigateError($pdisp, $url, $tf, $status, $cancel)
    $msg = "Problems loading page: " & $url & @CRLF
    $msg = $msg & "Status: " & $status & @CRLF
    MsgBox(0, "PROBLEMS", $msg)
    EndFunc ;==>IEEvent_NavigateError

    [/autoit] [autoit][/autoit] [autoit]

    Func IEEvent_ProgressChange($Progress, $ProgressMax)
    Local $iDiff=TimerDiff($iTime)
    ;ConsoleWrite($Progress & '/' & $ProgressMax &@TAB& $oIE.readyState & ' bisher: ' &$iDiff & @CRLF)
    If TimerDiff($iTime) > $iTimeOut Then
    If $oIE.readyState <> 4 Then $bTimeOut = True
    $iTime=TimerDiff($iTime)
    ;_IEAction($oIE,"stop")
    ;Exit
    EndIf
    EndFunc ;==>IEEvent_ProgressChange

    [/autoit]

    nach dem 1. Durchlauf änderst du $iTimeOut auf einen extrem kleinen Wert. Speichere dir beidesmal die Consolenausgaben in ein Textfile, falls du weitere Nachfragen hast möchte ich sie sehen.

    mfg autoBert

  • DANKE.
    Funktioniert Super. :thumbup:

    Könntest Du für die jenigen die diesen Beitrag finden weil sie auch dieses Problem haben und natürlich für mich noch die IF Anweisung kommentieren?

    Danke und Gruß
    Norman