Houyhnhnm: Popup vollständig geladen?

Hallo,

ich will das Abrufen von Daten von einer Internetseite automatisieren. Die Seite enthält eine Liste von Links, die man anklicken muß, um ein Popup zu bekommen, in dem man dann ein Form (bestehend aus nur dem Submit-Button) klicken muß, um den eigentlichen Downloadprozeß zu starten.

Der Haken bei der Sache ist, daß es sich um eine fremde Seite handelt, auf deren Funktionalität ich keinen Einfluß habe.

Ich habe folgendes versucht:

Meine Ladefunktion wird aus einem lokalen Skript per Bookmarklet in den IE geladen und dort ausgeführt. Es ruft eine Funktion auf, die das Popup anfordert.

Dabei ist schon eine kleine Klippe zu umschiffen: Die Seite, in die ich mich hineingemogelt habe, wird durch window.open deaktiviert. Meine Funktion läuft daher zustandsgesteuert als Timeoutfunktion.

Das funktioniert so weit - das Popup-Fenster erscheint.

Meine Funktion prüft per AutoIT3::WinExists (als ActiveX geladen), wann das Popup vollständig da ist. Auch das klappt und ich habe bisher AutoIT benutzt, um per simuliertem Mausklick das Form abzuschicken - abenteuerlich, aber auch das funktioniert.

Nun wirds allerdings haarig: Wenn die Timeout-Funktion auf das document des Popup zum falschen Moment zugreift, stürzt sie ab und die Automatisierung scheitert kläglich.

Nun meine Frage:
Wie kann die Timeout-Funktion feststellen, wann das Resultat des Form-Submit vollständig da ist?

Gruß,

Houyhnhnm

  1. ich will das Abrufen von Daten von einer Internetseite automatisieren. Die Seite enthält eine Liste von Links, die man anklicken muß, um ein Popup zu bekommen, in dem man dann ein Form (bestehend aus nur dem Submit-Button) klicken muß, um den eigentlichen Downloadprozeß zu starten.

    Der Haken bei der Sache ist, daß es sich um eine fremde Seite handelt, auf deren Funktionalität ich keinen Einfluß habe.

    Dann gute Nacht.

    Ich habe folgendes versucht:

    Meine Ladefunktion wird aus einem lokalen Skript per Bookmarklet in den IE geladen und dort ausgeführt. Es ruft eine Funktion auf, die das Popup anfordert.

    Kannst Du das bitte mal erkleren?

    Dabei ist schon eine kleine Klippe zu umschiffen: Die Seite, in die ich mich hineingemogelt habe, wird durch window.open deaktiviert.

    Ebenfalls.

    Aber interessant.

    1. Meine Ladefunktion wird aus einem lokalen Skript per Bookmarklet in den IE geladen und dort ausgeführt. Es ruft eine Funktion auf, die das Popup anfordert.

      Kannst Du das bitte mal erkleren?

      Lokales Skript: liegt auf meiner Platte und wird vom Bookmarklet (-> Wikipedia) zur fremden Seite dazugeladen und gestartet. (Das muß man von Hand machen.)
      Die Funktion, die das Popup anfordert: Die ist in der Orginalseite enthalten und führt im wesentlichen ein window.open auf eine weitere Seite auf dem Server aus.

      Dabei ist schon eine kleine Klippe zu umschiffen: Die Seite, in die ich mich hineingemogelt habe, wird durch window.open deaktiviert.

      Ebenfalls.

      Meine Funktion erhält erst wieder die Kontrolle, wenn das Popup wieder geschlossen ist. Das umgehe ich mit der Timeout-Mimik.

      Ist es jetzt klarer?

      Gruß,

      Houyhnhnm

  2. Der Haken bei der Sache ist, daß es sich um eine fremde Seite handelt, auf deren Funktionalität ich keinen Einfluß habe.

    und auch keine Zugriffsmöglichkeit mit JS.

    Dabei ist schon eine kleine Klippe zu umschiffen: Die Seite, in die ich mich hineingemogelt habe, wird durch window.open deaktiviert. Meine Funktion läuft daher zustandsgesteuert als Timeoutfunktion.

    Das verstehe ich nicht. Was bedeutet hingemogelt? Was wird deaktiviert? Was für eine Funktion?
    ....

    Meine Funktion prüft per AutoIT3::WinExists (als ActiveX geladen), wann das Popup vollständig da ist. Auch das klappt und ich habe bisher AutoIT benutzt, um per simuliertem Mausklick das Form abzuschicken - abenteuerlich, aber auch das funktioniert.

    Wir reden also nicht von JS sondern vorn ActiveX?
    Das ist eine komplett andere Sache, dazu wären ein paar hinweise was das ActiveX macht sinnvoll oder ist das so bekannt und nur mir bisher entgangen?

    Nun wirds allerdings haarig: Wenn die Timeout-Funktion auf das document des Popup zum falschen Moment zugreift, stürzt sie ab und die Automatisierung scheitert kläglich.

    Welche Timeout Funktion? Was macht die konkret?
    Du sprichst in Rätseln.

    Nun meine Frage:
    Wie kann die Timeout-Funktion feststellen, wann das Resultat des Form-Submit vollständig da ist?

    Erwartest du auf die Frage eine Antwort?
    Die einzige Antwort ist, nutze onload, aber sie wird dir nicht helfen. Und ein Eventhandler onResultatFormSubmit gibt es nicht.

    Du solltest konkreter schreiben, was du genau machst (inkl. relevanten Code) und welche Werkzeuge du verwendest. Ansonsten läßt sich dir nicht helfen.

    Struppi.

    --
    Javascript ist toll (Perl auch!)
    1. Hallo Struppi,

      Der Haken bei der Sache ist, daß es sich um eine fremde Seite handelt, auf deren Funktionalität ich keinen Einfluß habe.

      und auch keine Zugriffsmöglichkeit mit JS.

      Das ist falsch. Mit einem Bookmarklet kann man eigenen JS-Code in eine fremde Seite einschleusen und ausführen.

      Dabei ist schon eine kleine Klippe zu umschiffen: Die Seite, in die ich mich hineingemogelt habe, wird durch window.open deaktiviert. Meine Funktion läuft daher zustandsgesteuert als Timeoutfunktion.

      Das verstehe ich nicht. Was bedeutet hingemogelt? Was wird deaktiviert? Was für eine Funktion?

      Hineingemogelt per Bookmarlet - s.o.

      ....

      Meine Funktion prüft per AutoIT3::WinExists (als ActiveX geladen), wann das Popup vollständig da ist. Auch das klappt und ich habe bisher AutoIT benutzt, um per simuliertem Mausklick das Form abzuschicken - abenteuerlich, aber auch das funktioniert.

      Wir reden also nicht von JS sondern vorn ActiveX?
      Das ist eine komplett andere Sache, dazu wären ein paar hinweise was das ActiveX macht sinnvoll oder ist das so bekannt und nur mir bisher entgangen?

      Nein, wir reden von JS, das zu gewissen Zwecken auf ActiveX-Objekte zugreift - das ist nichts weltbewegendes. Ich benutze hier AutoIt3, um z.B. einen Button aus JScript heraus zu klicken.

      Nun wirds allerdings haarig: Wenn die Timeout-Funktion auf das document des Popup zum falschen Moment zugreift, stürzt sie ab und die Automatisierung scheitert kläglich.

      Welche Timeout Funktion? Was macht die konkret?

      Na ganz einfach: Meine Routine, die per Bookmarklet implantiert wurde, implementiert einen Automaten, der abhängig von der Zustandsvariablen in einem switch ein Stück Code abarbeitet (und dabei ggf. die Zustandsvariable ändert) und terminiert. Vor dem Return meldet sie sich selbst erneut als Timeout an.

      Der Effekt ist, daß mein Code asynchron zu den Abläufen in dem document läuft, in das er eingepflanzt wurde.

      Das sieht etwa so aus:
      var State = 0;
      function DownloadRobot() {
         switch (State) {
            case 1:
               ...
               if (Bedingung)
                  State = 2;
               break;
            case 2:
               ...
         }
         window.setTimeout(DownloadRobot, 1000);
      }

      Der Effekt ist, daß DownloadRobot auch dann gerufen wird, wenn gerade per window.open ein anderes Fenster aktiviert wurde. Die Kehrseite ist allerdings, daß man aus DownloadRobot heraus auch in eine Baustelle greifen und sich dort die Finger verbrennen kann - genau das ist das Problem, das ich einigermaßen sauber umschiffen will.

      Daß das mit onload nicht zu machen ist, liegt auf der Hand, wenn man auf den Server keinen Einfluß hat. Mir ist mittlerweile eine (unschöne) Lösung eingefallen: try/catch zum auffangen der Abstürze.

      Kann man eigentlich mit den bei Ajax benutzten Funktionen synchron ein Form.submit nachbauen und so eine Rückmeldung bekommen, wann das Resultat vorliegt?

      Gruß,

      Houyhnhnm

      1. Der Haken bei der Sache ist, daß es sich um eine fremde Seite handelt, auf deren Funktionalität ich keinen Einfluß habe.

        und auch keine Zugriffsmöglichkeit mit JS.

        Das ist falsch. Mit einem Bookmarklet kann man eigenen JS-Code in eine fremde Seite einschleusen und ausführen.

        Das ist mir neu, kann das jemand bestätigen?
        (ist aber nicht völlig undenkbar)

        Dabei ist schon eine kleine Klippe zu umschiffen: Die Seite, in die ich mich hineingemogelt habe, wird durch window.open deaktiviert. Meine Funktion läuft daher zustandsgesteuert als Timeoutfunktion.

        Du redest seltsam fremd. Mit "wird durch window.open deaktiviert"  kann ich nichts anfangen, window.open() öffnet u.U. ein neues Browserfenster. Ich bin mir sicher das du weißt was du tust, nur deine Beschreibungen helfen Aussenstehenden nicht das zu verstehen.

        Das verstehe ich nicht. Was bedeutet hingemogelt? Was wird deaktiviert? Was für eine Funktion?

        Hineingemogelt per Bookmarlet - s.o.

        dito, deine Erläuterung was hingemogelt und deaktiviert heißt, läßt sich nicht nachvollziehen,

        Meine Funktion prüft per AutoIT3::WinExists (als ActiveX geladen), wann das Popup vollständig da ist. Auch das klappt und ich habe bisher AutoIT benutzt, um per simuliertem Mausklick das Form abzuschicken - abenteuerlich, aber auch das funktioniert.

        Ab hier reden wir wohl von etwas völlig anderem, ich kann mir nicht vorstellen wie eine JS Anwendung per "AutoIT3::WinExists" ein popup prüft. Ich weiß nur soviel "AutoIT3 automatisiert alles", aber wie weit sich das mit JS verbinden läßt ist mir unbekannt.

        Wir reden also nicht von JS sondern vorn ActiveX?
        Das ist eine komplett andere Sache, dazu wären ein paar hinweise was das ActiveX macht sinnvoll oder ist das so bekannt und nur mir bisher entgangen?

        Nein, wir reden von JS, das zu gewissen Zwecken auf ActiveX-Objekte zugreift - das ist nichts weltbewegendes. Ich benutze hier AutoIt3, um z.B. einen Button aus JScript heraus zu klicken.

        OK, wir reden von etwas anderem, von JScript hab ich keine Ahnung.

        Nun wirds allerdings haarig: Wenn die Timeout-Funktion auf das document des Popup zum falschen Moment zugreift, stürzt sie ab und die Automatisierung scheitert kläglich.

        Ja, wenn man in JS auf Objekte zugreift die nicht existieren passieren manchmal seltsame Dinge, stimmt.

        Welche Timeout Funktion? Was macht die konkret?

        Na ganz einfach: Meine Routine, die per Bookmarklet implantiert wurde, implementiert einen Automaten, der abhängig von der Zustandsvariablen in einem switch ein Stück Code abarbeitet (und dabei ggf. die Zustandsvariable ändert) und terminiert. Vor dem Return meldet sie sich selbst erneut als Timeout an.

        du beschreibst einen normalen Programmablauf sehr schön. Nur sehe ich nicht, wo dein Beispielcode auf das oben erwähnte document zugreift?

        Der Effekt ist, daß mein Code asynchron zu den Abläufen in dem document läuft, in das er eingepflanzt wurde.

        ???

        Der Effekt ist, daß DownloadRobot auch dann gerufen wird, wenn gerade per window.open ein anderes Fenster aktiviert wurde. Die Kehrseite ist allerdings, daß man aus DownloadRobot heraus auch in eine Baustelle greifen und sich dort die Finger verbrennen kann - genau das ist das Problem, das ich einigermaßen sauber umschiffen will.

        Das stimmt.

        Daß das mit onload nicht zu machen ist, liegt auf der Hand, wenn man auf den Server keinen Einfluß hat. Mir ist mittlerweile eine (unschöne) Lösung eingefallen: try/catch zum auffangen der Abstürze.

        Was ist passiert, als du es mit einer Überprüfung ala typeof window.document probiert hast?

        Kann man eigentlich mit den bei Ajax benutzten Funktionen synchron ein Form.submit nachbauen und so eine Rückmeldung bekommen, wann das Resultat vorliegt?

        Entweder verstehe ich auch diese Frage nicht, oder du sprichst von dem was AJAX  eigentlich macht. Du bekommst eine Rückmeldung, wenn das Resultat vom Server vorliegt.

        Struppi.

        --
        Javascript ist toll (Perl auch!)
        1. Mit einem Bookmarklet kann man eigenen JS-Code in eine fremde Seite einschleusen und ausführen.

          Das ist mir neu, kann das jemand bestätigen?
          (ist aber nicht völlig undenkbar)

          http://cross-browser.com/x/examples/bookmarklets.html

          Was ist passiert, als du es mit einer Überprüfung ala typeof window.document probiert hast?

          Merkwürdigerweise hat das nichts gebracht: Die Object Errors kamen trotzdem. Offenbar existiern manchmal unvollständige Objekte, die man im normalen Ablauf von JS nicht zu sehen bekommt.

          Gruß,

          Houyhnhnm

          1. Was ist passiert, als du es mit einer Überprüfung ala typeof window.document probiert hast?

            Merkwürdigerweise hat das nichts gebracht: Die Object Errors kamen trotzdem. Offenbar existiern manchmal unvollständige Objekte, die man im normalen Ablauf von JS nicht zu sehen bekommt.

            Hab ich noch nie gesehen. Ich weiß dass der IE (und um den dreht sich's, oder?) manchmal und eher in noch älteren Versionen, seltsame Fehlermeldungen bei Zugriffen auf ein popup, geworfen hat. Aber von unvollständigen Objekten hab ich noch nie was gehört oder mitbekommen, entweder geht's oder es geht nicht.

            Struppi.

            --
            Javascript ist toll (Perl auch!)
            1. Das wirkte sich in Form intermittierender Fehler aus, die irgendwann mal auftraten , früher oder später und selten beim selben Download.

              Was in dem IE (aktuelle Version unter XP SP2) vorgeht, weiß ich natürlich auch nicht. Auf jeden Fall ist es gelöst und das Teil läuft wirklich wunderbar:

              • Das Popup wird geöffnet und (per AutoIT) der Button darauf geklickt
              • Dann wird über DOM-Zugriffe klassifiziert, was das Popup für Informationen enthält (dazu wird von der Timeout-Routine auf die Daten des Popup zugegriffen):
                  + Wenn der Download verfügbar ist, wird ein Link im Popup (per AutoIT) angeklickt.
                    Dann öffnet sich ein weiteres Popup, in dem der Save-Button geklickt wird und
                    zum guten Schluß wird der Windows 'Speichern unter'-Dialog bedient
                  + Wenn der Download nicht verfügbar (ausgelagert) ist, wird der (erste) Popup geschlossen

              All das passiert aus dem per Bookmarklet zugeladenen Skript, wirklich putzig...

              Es hat zwar einige Zeit gekostet, das alles auszutüfteln, aber bei mehreren hundert solchen Downloads per Monat (von einem furchtbar langsamen Server) lohnt sich der Aufwand.

              Gruß,

              Houyhnhnm

  3. Hurra,

    der Idiotenjob ist automatisiert. Der Trick: In die Daten des Popup wird in einem try-Block gegriffen und im zugehörigen catch-Block wird der Zustand 'Warten' erzeugt.

    Trotzdem Dank an die, die versucht haben, sich mit meinem schrägen Problem zu befassen.

    Gruß,

    Houyhnhnm