_FFLoadWait wiedermal / -> _FFCmd ?

  • Eins vorne weg. Leider geht stilgars Seite nicht(down seid ein paar Stunden) und deshalb sind alle Infos aus'm google cache oder hier aus dem Forum.
    Auch die FF.au3 musste ich vom google cache ziehen.

    Nun aber zu meiner Frage.
    Ich habe eine Seite und möchte dort checken ob sie fertig geladen wurde. Leider geht das mit FFLoadWait nicht. Bei Seiten die wirklich einen Fortschrittsbalken während des Ladens haben funktioniert es. Meine hat es nicht. Ist also sicher was mit JavaScript Ajax oder so. Nicht näher angeguckt...
    Zumindest steht unten in der Leiste "Übertragen der Daten von..."
    Kann man das auslesen?
    Wenn alles geladen ist steht unten "Fertig". Also bräuchte ich ja nur eine Abfrage ob unten "Fertig" steht. Wenn, dann mach weiter.

    Wie macht man das am besten? FFCmd scheint ja recht mächtig zu sein, nur weiß ich leider nicht wirklich wie ich es zu handeln hab.
    Aber so einfach ist es ja vll auch wieder nicht, sonst würde es ja sicher damit laufen :S

    Danke
    Snuffy

    Einmal editiert, zuletzt von Snuffy (4. August 2009 um 05:38)

  • Ja stimmt jetzt geht es wieder. Jetzt konnte ich auch die <FF_Screengrab.au3> mal probieren. Wobei ich glaube ich bleibe bei meiner selfmade Funktion die einen Nutzer simuliert, da seh ich wenigstens was passiert. ;)

    Bin aber bei meinem Problem nicht wirklich weiter, trotz Doku auf seiner Seite.

    Wenn ich z.B. auf maps.google.de gehen, dann auf der Karte per Cursortasten navigiere dann lädt er neue Kacheln. Da würde dann unten wieder "Übertrage Daten von..." stehen, Der Fortschrittsbalken bleibt aber unverändert (100%).
    Somit bekomm ich es nicht hin zu warten bis alles geladen ist. Könnte einfach ein langes sleep reinmachen, aber Sinn der Sache ist das ja nicht wirklich.


    Snuffy

  • Hallo,

    _FFLoadWait arbeitet über das webProgress-Interface von FF, welches "nur" sagt ob die Seite geladen ist bzw. wie der Ladezustand gerade ist. Mit asynchronen Sachen wie AJAX funktioniert die Funktion infolgedessen nicht.

    Die Statusleiste kannst du allerdings mit:

    [autoit]

    $sStatus = _FFCmd("document.getElementById('statusbar-display').label")

    [/autoit]


    auslesen.

    _FFCmd macht nichts weiter als JavaScript Befehle zu FF zu senden und das Resultat, falls es eines gibt, zurückzuliefern.

    [EDIT]
    oder auch:

    [autoit]

    $sStatus = _FFCmd("XULBrowserWindow.statusTextField.label")

    [/autoit]


    falls du dich in die Tiefen von FF begeben möchtest ...

  • Cool das läuft. Hatte selber schon etwas mit _FFCmd probiert aber es fehlte offensichtlich einfach an Wissen bezüglich der richtigen Befehle. "XULBrowserWindow.statusTextField.label" Hatte ich nirgends gesehen.

    Beim testen gab es ebend nen kleinen Fehler, da hat er dennoch weitergemacht obwohl er noch am übertragen war. Vll steht da ganz kurz Fertig und dann lädt er weiter. Werde ich also 2-3mal mit delay abfragen.
    Aber das Prinzip ist korrekt.

    Danke dir.

    Btw
    Die FF.au3 ist gut kommentiert, weiter so..


    Snuffy

  • Habe da mal was zusammengebastelt:
    _FFLoadWaitASYNC

    Spoiler anzeigen
    [autoit]

    ; #FUNCTION# ===================================================================
    ; Name ..........: _FFLoadWaitASYNC
    ; Description ...: Wait while the page is loading (AJAX)
    ; Beschreibung ..: Wartet bis die Seite geladen ist. (AJAX)
    ; AutoIt Version : V3.3.0.0
    ; Syntax ........: _FFLoadWaitASYNC([$iDelay = 0[, $iTimeOut = 20000]])
    ; Parameter(s): .: $iDelay - Optional: (Default = 0) : Delay before and after waiting in ms
    ; $iTimeOut - Optional: (Default = 20000) : Timeout while waiting in ms
    ; Return Value ..: Success - 1
    ; Failure - 0
    ; @ERROR -
    ; @EXTENDED - loading time in ms
    ; Author(s) .....: Thorsten Willert
    ; Date ..........: Tue Aug 04 21:38:42 CEST 2009
    ; Link ..........:
    ; Related .......: _FFDialogWait, _FFLoadWait
    ; Example .......: No
    ; ==============================================================================
    Func _FFLoadWaitASYNC($iDelay = 0, $iTimeOut = 20000)
    Local $sFuncName = "_FFLoadWaitASYNC"

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

    Local $iLoadingTime = 0, $i = 0
    Local $bTrace = $_FF_COM_TRACE
    $_FF_COM_TRACE = False

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

    Local $TimeOutTimer = TimerInit()

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

    Sleep($iDelay + $_FF_CON_DELAY)

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

    While TimerDiff($TimeOutTimer) < $iTimeOut
    If _FFCmd("gNavigatorBundle.getString('nv_done') == XULBrowserWindow.statusTextField.label ? 1 : 0") Then $i += 1
    If $i > 4 Then
    $iLoadingTime = Round(TimerDiff($TimeOutTimer))
    Sleep($_FF_CON_DELAY + 25)
    $_FF_COM_TRACE = $bTrace
    Return SetError(0, $iLoadingTime - $_FF_CON_DELAY - 25 - $iDelay, 1)
    EndIf
    Sleep(250)
    Wend

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

    Return SetError(__FFError($sFuncName, $_FF_ERROR_Timeout, "Can not check site status."), $iLoadingTime,0)
    EndFunc ;==> _FFLoadWaitASYNC

    [/autoit]

    sollte auch sprachunabhängig funktionieren.

    Probier doch mal bitte ob das für deine Zwecke funktioniert.