Variable must be of type "Object"

  • Hallo,


    Ich habe auch schon die sufu benutzt jedoch ohne eine Lösung zu finden.
    Ich habe ein kleines Problem bei einem Website login. Und zwar geht das erste Ausführen
    Problemlos. Jedoch bekomme ich bei jedem folgenden ausführen diesen fehler.:

    Zitat

    OFFICE.au3 (18) : ==> Variable must be of type "Object".:
    $oUser.value = $sUser
    $oUser^ ERROR



    Diese Version habe ich wie gefolgt geändert.:

    Code
    #include <IE.au3> Local $oUser, $oPass Local $sUser = "Benutzername" Local $sPass = "Kennwort" Local $url = "http://url/login.php" Local $oIE = _IECreate($url, 1) _IELoadWait($oIE) $oInputs = _IETagNameGetCollection($oIE, "input") for $oInput in $oInputs if $oInput.type = "text" And $oInput.name = "username" Then $oUser = $oInput if $oInput.type = "password" And $oInput.name = "password" Then $oPass = $oInput if isObj($oUser) And isObj($oPass) then exitloop Next $oUser.value = $sUser $oPass.value = $sPass Local $oButton = _IEGetObjByName($oIE, "login") _IEAction($oButton, "click") _IELoadWait($oIE)

    Ich bin kein Großer Autoit user, und habe das mehr schlecht als recht zusammen "gebrutzelt". 
    Funktioniert soweit ganz gut, bis auf diesen kleinen Fehler. 

    Danke für Hilfe, Gruß 

    User1963 

    Einmal editiert, zuletzt von user1963 (2. September 2012 um 00:48)

  • Der Fehler sagt doch schon alles 8|

    Das hier

    [autoit]

    $oInputs = _IETagNameGetCollection($oIE, "input")
    for $oInput in $oInputs
    if $oInput.type = "text" And $oInput.name = "username" Then $oUser = $oInput
    if $oInput.type = "password" And $oInput.name = "password" Then $oPass = $oInput
    if isObj($oUser) And isObj($oPass) then exitloop
    Next

    [/autoit]


    ist nicht gerade die beste Lösung.

    Die Schleife geht durch alle Elemente durch, aber das garantiert noch lange nicht, dass $oUser und $oPass auch mit Objekten gefüllt sind.
    Der Ansatz:

    [autoit]

    if isObj($oUser) And isObj($oPass) then exitloop

    [/autoit]


    ist zwar nicht ganz verkehrt, aber falsch eingesetzt.
    Bevor du auf $oUser oder $oPass zugreifst, solltest du auch überprüfen, ob diese auch gültige Objekte sind.

    Das ganze in der Schleife zu überprüfen bringt nicht viel, da die Schleife ja auch verlassen wird, wenn er einfach durch alle Elemente durch ist. Dabei ist dem Programm aber egal, ob $oUser und $oPass nun mit Objekten gefüllt sind.

    Wie auch immer, für mich sieht es ganz einfach so aus, dass diese If Abfrage nie true ergibt:

    [autoit]

    if $oInput.type = "text" And $oInput.name = "username" Then
    if $oInput.type = "password" And $oInput.name = "password" Then

    [/autoit]

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • So endlich frei geschalten. Kurz nachdem ich den Post eingetragen habe, kam mir des Rätsels Lösung.
    Und zwar hat die Seite sich den Login gemerkt wenn der User nun nicht auf Logoff gegangen ist, Sondern den Browser
    einfach geschlossen hat, ist er beim nächsten Aufruf auf der folge Seite gelandet. Auf der es kein Objekt "username"
    gibt. Somit konnte er Sie nicht finden und das war das Problem. ich habe dann einfach folgendes gezimmert:

    Code
    $oInputs = _IETagNameGetCollection($oIE, "input") 
    for $oInput in $oInputs 
    if $oInput.name = "newid" then exit  ;newid deklariert hierbei ein Objekt auf der folgeseite
    if $oInput.type = "text" And $oInput.name = "username" Then $oUser = $oInput 
    if $oInput.type = "password" And $oInput.name = "password" Then $oPass = $oInput 
    if isObj($oUser) And isObj($oPass) then exitloop 
    Next

    Jetzt beendet sich das programm, sollte auf der seite das objekt "newid" vorhanden sein. Und das ist in meinem
    Fall nur dann so, wenn der User kein Logoff benutzt hat. Andernfalls läuft das programm weiter und trägt alles ein.

    Finde ist eine gute Lösung die zudem funktioniert.