Problem mit den IE Functions in Virtualisierter Umgebung

  • Moin moin Leute,

    ich hab da mal ein recht exotisches Problem.
    Vorweg: Dieses Problem tritt bei mir nur in VMs auf, welche in ESXi oder im VMware Player 6.0.4 laufen.
    Reale Hardware und in Virtual Box sind nicht von diesem Fehler betroffen. ||
    OS: Windows 7 (32 und 64bit), Windows 8.1, Windows 10, Windows Server 2012
    Die Sprache macht keinen Unterschied.
    Es ist auch egal ob das System frisch Installiert ist (zuletzt getestet mit Windows 7) oder ob es schon eine Zeit läuft.
    UAC und Sicherheitsoptionen des IE machen ebenfalls keinen Unterschied.
    AutoIT: Getestet mit 3.3.8.1 und 3.3.14.1

    Problem: In dem angehängten Beispielskript wird ein IE gestartet, Maximiert und anschließend zwei Websiten (nacheinander) aufgerufen. Bei dieser Website sucht er nach einem Searchtext -> Gefunden: MsgBox mit Quellcode der Seite | Nicht gefunden: Neuer Schleifendurchlauf bis Timeout (5sek) durch.

    In diesem Beispiel sucht er erst nach USA auf aldi.de, anschließend bei bing.de nach Bing.
    Bing.de wird nicht abgeschlossen. Hier bekomme ich jedesmal den Quellcode von Aldi.de, zusätzlich ist der ReadyStatus auf 1.

    Setz ich Google als erste Seite, dann geht es.
    Zusätzliches Problem:
    Ich kann leider kein _IELoadWait nutzen, weil diese Funktion mehrfach gecrashed ist. Meine Vermutung ist, da er den IE am Ende auch nicht mehr schließt, dass das Objekt vom IE irgendwo/wann im Hintergrund verändert wird.

    Hat hier einer eine Idee, was das Problem sein könnte?
    Lösungsvorschläge?
    Known Bug?
    DAU und es ist ein ganz einfacher Fehler?

    Mal gucken, vielleicht habt ihr eine Idee.
    Danke euch
    Mfg

    "Beispielscript"

    Einmal editiert, zuletzt von lachi (11. September 2015 um 13:55)

  • Du nutzt da irgendwie nen paar umwege... Bei _IENavigate($oIE, $m, 0) sagst du mit der 0, dass er nicht warten soll... Danach wartest du kompliziert mit dem Readystate...
    Sag doch einfach _IENavigate($oIE, $m, 1), oder sonst _IELoadWait(), dafür sind diese Funktionen ja gedacht...
    Generell, wenn du nur den Quelltext der Seite willst, brauchst du garkeinen IE, das geht viel einfacher:
    $html=BinaryToString(InetRead($URL,4),4)
    So kann man dein Script auf weniger als 20 zeilen kürzen:

    Warum das mit dem IE mal funktioniert und mal nicht, kann ich dir auch nicht sagen, ich kann dir nur sagen, dass du da sehr viele unnötige und komplizierte Wege genommen hast, statt vorhandene Funktionen ^^
    Ich glaub ich will garnicht wissen, wo du den kram her hast :D

    MfG Kanashius

  • Moin,

    ja... hälfte der Informationen vergessen :D
    Hab das Script schon zusammen gekürzt.
    Dieses Script nutze ich um Websiten zu messen. Also wie lange brauch ich um diese zu öffnen.
    Da aber zwischen dem Navigieren und dem fertig geladen noch andere Operation durchgeführt werden (Teilweise) und andererseits die _IELoadWait() Funktion auch Probleme bereitet, nutze ich nicht das warten von _IENavigate().

    Die Seite soll gerendert werden, deswegen kann ich auch kein InetRead verwenden.
    Zum Beispiel auch um weiter zu Navigieren auf der Website.

    Den Readystate lese ich aus, da ich _IENavigate nicht zuverlässig verwenden kann.

    Trotzdem danke für deine Hilfe!
    Mfg

  • Das Problem tritt auch auf realer Hardware auf - zumindestens mit der aktuellen AutoIt-Version.

    Das Problem ist einfach und ein typischer "DAU"-Fehler: Du verwechselt AutoIt mit einer Hochsprache. Dein Fehler im Script lässt sich mit einem Zeichen zu viel erklären: Du verwendest in Zeile 32 "==" um zu prüfen, ob $ier_timeout 1 zurückgibt. Dies ist in AutoIt allerdings nicht zulässig. Glaube in AutoIt steht "==" für "identisch".

    "If Not (IsNumber($ier_timeout) = 1) Then" wäre korrekt und führt nicht mehr zu dem oben beschriebenen Problem.

    Es gibt Tage, da trete ich nicht ins Fettnäpfchen. Ich falle in die Friteuse.

  • Moin,

    Kanashius: Ich habe es noch mal mit _p(_IENavigate($oIE, $m, 1)) anstelle von _p(_IENavigate($oIE, $m, 0)) getestet. Hier hängt er sich dann aber für lange auf. Bei meiner Methode habe ich wenigstens nach 5 Sekunden den Timeout.

    Runa: Das wäre zu schön gewesen, leider hilft dies auch nicht :(
    Habe zum Test auch sämtliche "==" entfernt, nur bringt es keine Besserung.
    Mein Fehler tritt ja nicht an der Stelle auf. Der Timeout hat die ganze Zeit über hervorragend Funktioniert.

    Hier die letzten Zeilen aus der Console. Ein Stück Quellcode von der Aldi Website ist gekürzt.

    AutoIt: Ausgabe aus der Console
    Timer: 5095.8121 - Readystate: 1 || (Write HTML into Error Log)
    <html xmlns="http://www.w3.org/1999/xhtml"><head>
    	<title>Welcome to ALDI</title>
    [...]
    </body></html>
    Website Test: could not find string: Bing
    +>14:30:11 AutoIt3.exe ended.rc:0
    +>14:30:11 AutoIt3Wrapper Finished.
    >Exit code: 0    Time: 15.52

    Danke euch!

    Mfg lachi

  • Sehe gerade: Das ist kein "zuverlässiges" Problem: Es tritt mal auf und mal nicht. Es hat nichts mit der eigentlichen Installation zu tun. Es ist wurscht ob es VM oder RM ist. Bei beiden tritt das Problem gleichermaßen auf.

    Das einzige, was mir aufgefallen ist, ist, dass das Problem SEHR offensichtlich von Aldi.de verursacht wird. Denn EGAL welche Webseite ich dahinter setze, das Problem tritt weiter auf. Setze ich hingegen eine andere beliebige Seite ein - zum Beispiel autoit.de mit dem Suchwort "autoit" - funktioniert alles fehlerfrei. Das Problem scheint zu sein, dass Aldi niemals den "complete" - Status erreicht, was etwas unglücklich ist.

    Das Problem ließe sich grundsätzlich dadurch lösen, dass eben nur eine Seite abgehandelt wird pro Object - an deinem Beispiel oben:


    Das klärt zwar nicht, wo das Problem herkommt, aber es klärt zumindest, wie das Problem gekonnt ignoriert wird.

    Es gibt Tage, da trete ich nicht ins Fettnäpfchen. Ich falle in die Friteuse.

  • Moin moin,

    dein Weg wäre eine Lösung, nur finde ich die leider nicht wirklich schön :/
    Du schriebst, dass Aldi niemals den complete Status erreicht. Ja, anscheinend nicht, aber Aldi ist damit nicht die einzige Seite.
    Hier folgt gleich der Quellcode einer "umfassenden" Website (13 Zeilen inkl. Header) welche das Problem auch hat.
    Es gibt Head, Title, Body, Div, B, code und br.
    Kein Javascript, kein Css, kein irgendetwas.
    Verwende ich diese Seite als Seite 1 (getestet auf unterscheidlichen Webservern), dann kann Seite 2 nicht genutzt werden.

    Vielleicht kannst du das Problem mit der Datei in deiner Umgebung Reproduzieren.