Steuern des IE mit einem Script aus dem Taskplaner

  • Guten Morgen,

    bin ein Neuling mit AutoIt und habe gleich mal ein Problem....

    Ein Script soll den IE fernsteuern, und zwar in der Weise, dass der IE aufgerufen, ein Login-Formular ausgefüllt und abgeschickt und der IE wieder beendet wird.
    Das klappt soweit auch auch wunderbar.
    Der Haken an der Sache: Das Script wird aus einem php-script heraus aufgerufen, das wiederum sebst aus dem Taskplaner gestartet wird.
    Wenn ich das AutoIt-Script direkt auf dem Rechner ausführe, läuft es tadellos durch, wenn es vom Taskplaner gestartet wird, bleibt es hängen.
    (Benutzer ist derselbe, Rechte stimmen usw). Das Script startet, ruft auch den IE auf, bleibt aber dann hängen.

    Ich füge den Sourcecode mal hier ein (den habe ich aus der Hilfe übernommen uns ausgebaut...):

    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Res_requestedExecutionLevel=asInvoker
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include <ie.au3>

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

    ;Erstellt eine Instanz (neues Fenster) des InternetExplorers und gibt ein entsprechendes Objekt zurück.
    $oIE = _IECreate ("http://www.example.com",0,0)

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

    ;Prüfen ob ein Objekt erzeugt wurde
    If IsObj($oIE) Then

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

    ;warten bis die Seite komplett geladen wurde
    _IELoadWait($oIE)
    ;Erzeugen eines HTML-Formular-Objekts mit Hilfe des Formularnamens
    $oForm = _IEFormGetObjByName($oIE, "login")
    ;Erzeugen eines Formularfeld-Objekts mit Hilfe des Feldnames
    $oUsername = _IEFormElementGetObjByName($oForm, "userId")
    ;Setzen des Formularfeldinhalts
    _IEFormElementSetValue($oUsername, "username")
    ;Erzeugen eines Formularfeld-Objekts mit Hilfe des Feldnames
    $oPasswd = _IEFormElementGetObjByName($oForm, "password")
    ;Setzen des Formularfeldinhalts
    _IEFormElementSetValue($oPasswd, "geheim")
    ;Absenden des Formulars

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

    _IEFormSubmit($oForm)

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

    $Text = _IEBodyReadText($oIE)

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

    if StringInStr($Text, "User in use") Then

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

    $oForm = _IEFormGetObjByName($oIE, "login")
    $oPasswd = _IEFormElementGetObjByName($oForm, "password")
    ;Setzen des Formularfeldinhalts
    _IEFormElementSetValue($oPasswd, "geheim")

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

    ;Absenden des Formulars
    _IEFormSubmit($oForm)
    _IELoadWait($oIE)

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

    EndIf

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

    Local $i = 1

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

    While 1

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

    $oIE1 = _IEAttach("", "instance", $i)

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

    ;*******************************************************************
    ; ******bis hierher läuft das Script, dann bleibts hängen
    ;*******************************************************************

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

    If @error = $_IEStatus_NoMatch Then
    ExitLoop
    EndIf

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

    ;Frameset laden

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

    Local $oFrames = _IEFrameGetCollection($oIE1)
    Local $iNumFrames = @extended
    local $iFehler = @error

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

    If $iNumFrames > 0 Then
    For $j = 0 To ($iNumFrames - 1)
    Local $oFramex = _IEFrameGetCollection($oIE1, $j)
    Next

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

    $oFrame = _IEFrameGetObjByName ($oIE1, "rviewer")

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

    if IsObj($oFrame) Then

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

    $f = _IEBodyReadHTML($oFrame)

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

    $sMyString = "Logoff"
    $oLinks = _IELinkGetCollection($oFrame)

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

    For $oLink in $oLinks
    $sLinkText = _IEPropertyGet($oLink, "innerText")

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

    If StringInStr($sLinkText, $sMyString) Then

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

    _IEAction($oLink, "click")

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

    ExitLoop
    EndIf
    Next

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

    EndIf

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

    EndIf

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

    $i += 1

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

    WEnd

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

    Local $aIE[1]
    $aIE[0] = 0

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

    Local $k = 1
    While 1
    $oIE2 = _IEAttach("", "instance", $k)
    If @error = $_IEStatus_NoMatch Then ExitLoop

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

    _IEQuit($oIE2)
    $k += 1
    WEnd

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

    EndIf

    [/autoit]

    An der markierten Stelle ist Schluss...
    Hat irgendjemand einen Tip für mich, woran das liegen könnte?
    Jede Hilfe ist willkommen!

    Grüße

    Safe T. First

    2 Mal editiert, zuletzt von Safe T. First (5. Juni 2012 um 09:04)

  • hallo ...

    1. ist dein pc zu dem zeitpunkt gesperrt, wenn der task aufgerufen wird?
    2. hast du die felder mal mit firefox und firebug plugin kontrolliert?

    hier mal ein beispiel (arbeitszeitlogin)von mir, bei dem der login aus dem taskmanager bzw. über eine interne schleife klappt!

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

    $user = "xxx"
    $pass = "xxxx"

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

    $seite_state = "Complete Control - Windows Internet Explorer"
    $oIE = _IECreate ("http://ipadresse/wfmLogin.aspx") ;livesystem

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

    WinSetState ($seite_state, "", @SW_MAXIMIZE )

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

    _IELoadWait($oIE)
    $oForm = _IEFormGetObjByName($oIE, "Form1")
    $oUsername = _IEFormElementGetObjByName($oForm, "pnlFrame_tbxName")
    _IEFormElementSetValue($oUsername, $user)
    $oPasswd = _IEFormElementGetObjByName($oForm, "pnlFrame_tbxPasswort")
    _IEFormElementSetValue($oPasswd, $pass)
    $oSubmit = _IEFormElementGetObjByName($oForm, "pnlFrame_btnAnmelden")
    _IEAction ($oSubmit, "click")
    Sleep (1000)
    WinActivate($seite_state)
    ;WinWaitActive($seite_state)

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

    While 1

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

    $nowtime = _NowTime(4)
    ;MsgBox(0,"",$nowtime)

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

    ;KommGeh
    $abegin = "8:00"
    $aend = "16:30"

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

    ;pause
    $pbegin = "13:10"
    $pend = "13:40"

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

    IF $nowtime = $abegin OR $nowtime = $aend Then _KommGeh()
    IF $nowtime = $pbegin OR $nowtime = $pend Then _PAUSE()

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

    Sleep(500)

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

    WEnd

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

    Func _KommGeh()

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

    WinActivate($seite_state)
    _IENavigate ($oIE, "http://ipadresse/infopool/wfmipzeiterfassung.aspx")
    $AccountButton = _IEGetObjById($oIE,'pnlAnwesendNew_btnKOMGEH')
    _IEAction($AccountButton, "click")
    Sleep(1000)
    _IENavigate ($oIE, "http://ipadresse/infopool/wfmipmain.aspx")
    Exit
    Sleep (60000)

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

    EndFunc

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

    Func _KommGeh()

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

    WinActivate($seite_state)

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

    _IENavigate ($oIE, "http://ipadresse/infopool/wfmipzeiterfassung.aspx")

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

    $AccountButton = _IEGetObjById($oIE,'pnlAnwesendNew_btnKOMGEH')

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

    _IEAction($AccountButton, "click")

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

    Sleep(1000)

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

    _IENavigate ($oIE, "http://ipadresse/infopool/wfmipmain.aspx")

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

    Exit

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

    Sleep (60000)

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

    EndFunc

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

    gruß gmmg

    Einmal editiert, zuletzt von gmmg (26. Mai 2012 um 00:56)

  • Nein, der PC ist nicht gesperrt...(zur Info: ist ein Windows Server 2003 SP2)

    Die Felder sind korrekt beschickt.
    Das Script läuft ja auch fehlerfrei, wenn ich es direkt starte, aber nicht aus dem Taskplaner heraus.

    Sieht so aus, als würde der _IEAttach keine Instanz des IEs finden, aber warum?
    Im Taskmanager erscheint er....

    Irgendwelche weitere Ideen?

    Grüße
    Safe T. First

  • Es könnte sein, dass dein Script die maximale Ausführungszeit überschreitet die im Task angegeben ist und dadurch dann abgebrochen wird.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Hmm, nein das Script bleibt beim _IEAttach einfach stehen.
    Hatte zum debuggen mal eine Logdatei geöffnet und jeden Schritt dort rein protokolliert, nach dem _IEAttach ist definitiv Schluss.

    Ich habe keine Idee mehr....

  • Liefert @error irgendwas relevantes zurück?

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Leider auch nicht. Es sieht so aus, als würde sich der _IEAttach irgendwo "verlaufen".
    Der nächste Befehl hinter _IEAttach wird nicht ausgeführt, egal was es ist....

  • Da stellt sich allerdings die Frage wozu brauchst das _IEAttach überhaupt? Du hast doch schon beim erstellen des Browserfenster die Objekt-ID ind $oIE gespeichert.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Das brauchts, weil der IE 2 Instanzen aufruft, und ich demnach in einer Schleife alle IE-Instanzen abfragen muss.
    Die Frage, warum da 2 Instanzen laufen, kann ich leider nicht beantworten, ich sehe die nur im TaskManager...
    Vielleicht sollte ich hier mal ansetzen...

  • Das ist dann allerdings ungewöhnlich das sich da zwei Instanzen bei einmaligem ausführen von _IECreate bei dir öffnen.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • @ chip

    ist bei mir und auf auf arbeit bei den clients so! (IE 8 ,Windows XP)
    hängt bestimmt mit dem InPrivateBrowsen zusammen!

    eigentlich benötigt man das ieAttach nicht!
    weil du öffnest ja deine eigene instanz und diese wird dann auch vom script benutzt!
    habe auch mehrere automatisierte website logins auf arbeit über autoit am laufen, da gab es noch keine probleme.

    gruß gmmg

  • Mh komisch bei meinem privaten PC hier kommen auch zwei iexplorer.exe Instanzen auf der Arbeit allerdings nicht.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Also Leuts,

    ich hab die Schleife mit dem _IEAttach rausgenommen, wie chip oben schon erwähnt hat.
    Scheinbar brauchts den wirklich nicht, trotz der 2 Instanzen des IE. Bei meinen ersten Versuchen hatte ich wohl noch andere Probleme...

    Oh, grade noch gesehen, ich hatte zu Testzwecken den Schalter "visible" beim _IECreate auf 1 (sichtbar) gesetzt und nicht wieder auf unsichtbar gestellt....ist komisch, aber mit dieser Einstellung funzt das Ganze!

    Auf jeden Fall tuts jetzt genau das, was es soll.
    Vielen Dank für die Hilfe und Tips hier, ich setz das Ganze mal auf gelöst.

    Safe T. First