htmlfile Objekt und <META> Tags

  • Moin,

    ich versuche gerade, ein AHK-Codeschnipsel nach AutoIt (3.3.16) zu portieren:

    Mit AHK liefert die erste MsgBox folgende Ausgabe

    und die zweite liefert

    Zitat

    Contents lol

    Mit AutoIt sieht die erste Meldung so aus

    und die zweite liefert den Fehler

    Zitat

    "D:\AutoIt_Neu\HTMLDOC\HTMLDOC.au3" (15) : ==> The requested action with this object has failed.:

    MsgBox(0, "InnerText", $oHtmlDoc.querySelector("Main > h3 > em").innerText)

    MsgBox(0, "InnerText", $oHtmlDoc^ ERROR

    ->10:40:39 AutoIt3.exe ended.rc:1

    Was mache ich falsch?

    Einmal editiert, zuletzt von Velted (12. September 2022 um 11:43) aus folgendem Grund: Code korrigiert.

  • Wenn die eingesetzten Daten nicht passen, kann es nicht funktionieren.

    Zusätzlich zu dem fehlenden schließenden Main Tag (siehe meinen Post #2) ist dein meta tag auch falsch:

    Code
    ;deins: $sMeta = "<meta http-equiv=""X-UA-Compatible"" content=""IE=9"">"
    $sMeta = '<meta http-equiv="X-UA-Compatible" content="IE=9">'

    zudem scheint das HTML Objekt den queryselector nicht zu kennen. Da ist Aspirins Frage sehr berechtigt.

  • Moombas:

    Natürlich. Der Fehler entstand bei meinen vielen Versuchen, das irgendwie zum Laufen zu bringen. Ist korrigiert, ändert aber nichts am Ergebnis.

    Die Schreibweise "<meta http-equiv=""X-UA-Compatible"" content=""IE=9"">" ist nach Doku immer noch zulässig. Ich habe auch schon die Alternativen probiert.

    AspirinJunkie:

    Ja, das funktioniert ja mit AHK. Eine eigene Doku zu htmlfile gibt es nicht. Dahinter verbirgt sich das Webbrowser.Document Objekt. Der erste Kommentar im Code liefert die Beschreibung von w3schools. Auch in AHK funktioniert das aber nur, wenn das <META> Tag gesetzt wird.

  • Velted : Zumindest änder es nichts am Ergebnis, wenn auch ich diese Schreibweise verwirrend finde ;)

    Also ich erhalte keine Fehlermeldung wenn ich deinen query an das innerHTML hinten dran packe ($oHtmlDoc.documentElement.innerHTML.querySelector), bekomme allerdings immer nur eine leere Ausgabe.

    Ich weiß nicht ob dir das hilft aber probieren kann man es ja mal.

    Einmal editiert, zuletzt von Moombas (12. September 2022 um 13:30)

  • Mit folgendem bekommst du immerhin die einzelnen Zeilen:

    $oHtmlDoc.body.innerText bzw. $oHtmlDoc.body.innerHTML

    Wie du das dann aber wiederum genauer "Filtern" kannst, weißt du evtl. besser.

    Edit:

    Ich würde den Elemente, die von dir angesprochen werden müssen eine ID zuweisen. Beispiel: '<H3><EM id="test">Contents lol</EM></H3>'

    Dann kannst du sie hiermit direkt ansprechen: $oHtmlDoc.getElementById('test').innerText

    Velted und AspirinJunkie

    Und zur Doku geht es hierlang: https://www.w3.org/TR/selectors-api/#queryselector

    Anbei eine Vermutung:

    Wennn ich richtig bin gibt es den "main" tag erst mit html5, evtl. kann das autoit objekt damit nicht umkommen, denn das der main-start-tag im header vor dem schließenden head-tag und vor dem body-tag eingefügt wird, sieht für mich falsch aus (<HEAD><META http-equiv=X-UA-Compatible content=IE=9><MAIN></HEAD>).

    Auch wenn man den main-tag später einfügt,landet dieser immer im header.

    Verwende daher mal Testweise anstatt dem main tag '<div id="main">'.

    Der div tag wird nämlich korrekterweise in den bodytag geschrieben. Eventuell kommst du dann mit dem querySelector weiter.

    5 Mal editiert, zuletzt von Moombas (12. September 2022 um 14:46)

  • Und was sagt uns, dass dieses "htmlfile"-Objekt der dort dokumentierten API entspricht?
    Ich habe bisher keine Schnittstellenbeschreibung zum Objekt selbst gefunden.

    Wenn man ein Error-Event mit implementiert bekommt man als Fehlermeldung 0x80020006-"Unbekannter Name" - deutet für mich darauf hin, dass das Objekt gar keine Methode querySelector enthält.

    Ja, das funktioniert ja mit AHK.

    Dann zeig doch mal den funktionerenden AHK-Code

  • Und was sagt uns, dass dieses "htmlfile"-Objekt der dort dokumentierten API entspricht?
    Ich habe bisher keine Schnittstellenbeschreibung zum Objekt selbst gefunden.

    Wenn man ein Error-Event mit implementiert bekommt man als Fehlermeldung 0x80020006-"Unbekannter Name" - deutet für mich darauf hin, dass das Objekt gar keine Methode querySelector enthält.

    Richtig, zumindest nicht an dieser Stelle. Diese Vermutung habe ich bereits in Post #4 geäußert.

    Die Doku passt mit meinen Tests zusammen und dort hin gelangt bin ich über Recherche über einen Link von MS.

  • Dann zeig doch mal den funktionerenden AHK-Code

    Bitte sehr:

  • Anbei eine Vermutung:

    Wennn ich richtig bin gibt es den "main" tag erst mit html5, evtl. kann das autoit objekt damit nicht umkommen, denn das der main-start-tag im header vor dem schließenden head-tag und vor dem body-tag eingefügt wird, sieht für mich falsch aus (<HEAD><META http-equiv=X-UA-Compatible content=IE=9><MAIN></HEAD>).

    Auch wenn man den main-tag später einfügt,landet dieser immer im header.

    Nicht nur die Platzierung des <Main> Tags ist merkwürdig, es fehlen auch die Anführungszeichen bei http-equiv="X-UA-Compatible" und content="IE=9".

  • Moin,

    nach vielem Gegoogle und Ausprobieren habe ich Licht am Ende des Tunnels gefunden. Hilfreich war dabei die Eigenschaft documentMode des HTMLDocuments.

    AHK:

    AHK lädt anfangs ein Objekt mit Kompatibilität zum IE5. Das Meta-Tag "<meta http-equiv=""X-UA-Compatible"" content=""IE=9"">" schaltet ohne weitere Maßnahmen auf Kompatibilität mit IE9 um. Damit wird auch die querySelector() Methode erfolgreich ausgeführt.

    AU3:

    AHK lädt anfangs ein Objekt mit Kompatibilität zum IE8. Das Meta-Tag "<meta http-equiv=""X-UA-Compatible"" content=""IE=9"">" änderte in allen meinen Versuchen nichts daran. Für AU3 führt allerdings ein Eintrag in der Registrierung zum gewünschten Verhalten:

    Code
    HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION\AutoIt3.Exe DWORD: 0x2AF8 (11000)
    bzw. 
    HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION\AutoIt3_x64.Exe DWORD: 0x2AF8 (11000)

    Damit erzeugt AU3 auch ohne das Meta-Tag ein Objekt, das kompatibel mit dem IE11 ist und die Methode querySelector() ebenfalls unterstützt. Experimente mit den Werten 10000 (IE10) und 9000 (IE9) brachten keine Veränderung.