_IE_XPath (sehr einfache [Pseudo] XPath Abfragen für IE)

  • Hier nun mal eine kleine Funktion für die "Konkurrenz":

    Einfachste (Pseudo) XPath-Abfragen für den Internet-Explorer.
    "Pseudo" deshalb, da der IE dies nicht unterstützt und folgende Funktion die Abfragen einfach in JavaScript umformt.

    Beispiel und Funktion:

    Spoiler anzeigen
    [autoit]

    #Region Includes
    #include <IE.au3>
    #EndRegion Includes

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

    Main()
    Func Main()
    Local $oIE = _IECreate("http://ff-au3-example.thorsten-willert.de/")

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

    ; "value" des zweiten Elementes mit dem Namen "zutat"
    MsgBox(0, "", _IE_XPath($oIE, "//*[@name='zutat' and position()=2]", "value") )

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

    ; zweites Bild in dritter Tabelle und davon die "src"
    MsgBox(0, "", _IE_XPath($oIE,"//table[3]/img[2]", "src") )

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

    ; das "value" des Eingabefeldes "Benutzername"
    MsgBox(0, "", _IE_XPath($oIE,"//input[@id='user']", "value") )

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

    ; oder per Objekt:
    Local $oObj = _IE_XPath($oIE,"//input[@id='user']" , "")
    MsgBox(0, "", $oObj.value)

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

    EndFunc ;==>Main

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

    ; #FUNCTION# ===================================================================
    ; Name ..........: _IE_XPath
    ; Description ...:
    ; AutoIt Version : V3.3.0.0
    ; Syntax ........: _IE_XPath($oIE, $sXPath[, $sAttribute = "innerText"[, $sIE = "$oIE"]])
    ; Parameter(s): .: $oIExp - IE-object
    ; $sXPath - supported: [n] index 1-n
    ; supported @attributes: name | id
    ; supported functions: position()
    ; $sAttribute - Optional: (Default = "innerText") :
    ; $sIE - Optional: (Default = "$oIE") : This must be the IE-object as string!!!
    ; Return Value ..: Success - string or object
    ; Failure - empty string
    ; @ERROR - 1 : No IE-Object
    ; 2 : Attribute not supported
    ; 3 : Error executing statement
    ; Author(s) .....: Thorsten Willert
    ; Date ..........: Tue Feb 16 21:00:33 CET 2011
    ; Version .......: 0.2
    ; ==============================================================================
    Func _IE_XPath(ByRef $oIExp, $sXPath, $sAttribute = "innerText", $sIE = "$oIE")
    Local $oIE = $oIExp

    If Not Execute( "IsObj(" & $sIE & ")" ) Then Return SetError(1,0,"")

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

    Local $a = StringSplit($sXPath, "/")
    Local $aTMP, $pos
    Local $seg[$a[0] + 1], $ind[$a[0] + 1]
    Local $sElement = $sIE & ".document", $sSel = "getElementsByTagName"

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

    For $i = 1 To $a[0]
    $ind[$i] = 0
    $seg[$i] = StringRegExpReplace($a[$i], '(.*?)\[.*?\]', '$1')
    If StringInStr($a[$i], "[") Then
    $ind[$i] = Int( StringRegExpReplace($a[$i], '.*?\[\s*(\d+)\s*\]', '$1') - 1 )
    EndIf
    If StringInStr($a[$i], "@") Then
    $pos = StringRegExpReplace($a[$i], '.*?\[.*?position\s*\(\)\s*=\s*(\d+).*?\]', '$1') -1
    $aTMP = StringRegExp($a[$i], '.*?@(\w+)\s*=\s*(''|")(\w+)\2', 3)
    Switch $aTMP[0]
    Case "id"
    $sSel = "getElementById"
    $sElement &= StringFormat(".%s('%s')", $sSel, $aTMP[2])
    Case "name"
    $sSel = "getElementsByName"
    $sElement &= StringFormat(".%s('%s').item(%s)", $sSel, $aTMP[2], $pos)
    Case Else
    Return SetError(2,0,"")
    EndSwitch
    Else
    If $seg[$i] Then $sElement &= StringFormat(".%s('%s').item(%s)", $sSel, $seg[$i], $ind[$i])
    EndIf

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

    Next

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

    If $sAttribute Then $sElement &= "." & $sAttribute

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

    ConsoleWrite("_IE_XPath: " & $sElement & @CRLF)

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

    Local $r = Execute($sElement)
    If @error Then Return SetError(3,0,"")

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

    Return $r
    EndFunc ;==>_IE_XPath

    [/autoit]

    !!!
    - !!! Der letzte (optionale) Parameter benötigt den Namen der IE-Objekt-Variablen als String
    - der Index [1-n] jeden Elements kann angegeben werden
    - es wird nur ein Attribut (+position() ) pro Node richtig auswertet
    - XPath-Funktionen werden, außer "position()", nicht unterstützt

    6 Mal editiert, zuletzt von Stilgar (16. Februar 2011 um 21:09)

  • SEuBo:
    Viel mehr wird es vermutlich nicht werden. So eine Programmiersprache wie Xpath per AutoIt mal eben nach JavaScript umformen dürfte "etwas" viel Aufwand sein ...

    Update:
    - Die Attribute Name und Id können nun ebenfalls verwendet werden (siehe Beispiel)
    - Wird dem Parameter $sAttribute ein leerer String übergeben wird das Objekt zurückgegeben
    - Als Standard wird nun der "innerText" des angegebenen Pfades zurückgegeben

  • Nochmal ein Update:

    - die XPath-Funktion position() kann nun ebenfalls verwendet werden, z.B.:
    //*[@name='zutat' and position()=2]
    wobei momentan immer von einem "and" ausgegangen wird.
    - bessere Fehlerauswertung

  • Kleines Mini-Update:
    Nur Funktionsaufruf hat sich geändert, damit er besser zu den restlichen IE-Funktionen paßt.
    !!! Der letzte (optionale) Parameter benötigt den Namen der IE-Objekt-Variablen als String z.B:

    Spoiler anzeigen
    [autoit]


    Local $oIE = _IECreate("http://ff-au3-example.thorsten-willert.de/")
    MsgBox(0, "", _IE_XPath($oIE, "//*[@name='zutat' and position()=2]", "value", "$oIE") ) ; default = "$oIE"

    [/autoit]


    außer jemandem fällt eine bessere Methode ein um an den Namen der Variablen zu kommen, die als Parameter übergeben wurde, bzw. wie man auf das Execute unten in der Funktion verzichten kann ...

    Grüße
    Stilgar

  • Hmm, ich versuche den Link "Registrieren" auf Yahoo zu klicken, aber irgendwie geht das nicht. :/

    [autoit]

    Local $oIE = _IECreate("http://de.yahoo.com/")
    $oLink = _IE_XPath($oIE, "/html/body/div[3]/div/div/div/div[2]/ul/li/div/div/ul/li[2]/a", "")
    _IEAction($oLink, "click")

    [/autoit]