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