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
#Region Includes
#include <IE.au3>
#EndRegion Includes
Main()
Func Main()
Local $oIE = _IECreate("http://ff-au3-example.thorsten-willert.de/")
; "value" des zweiten Elementes mit dem Namen "zutat"
MsgBox(0, "", _IE_XPath($oIE, "//*[@name='zutat' and position()=2]", "value") )
; zweites Bild in dritter Tabelle und davon die "src"
MsgBox(0, "", _IE_XPath($oIE,"//table[3]/img[2]", "src") )
; das "value" des Eingabefeldes "Benutzername"
MsgBox(0, "", _IE_XPath($oIE,"//input[@id='user']", "value") )
; oder per Objekt:
Local $oObj = _IE_XPath($oIE,"//input[@id='user']" , "")
MsgBox(0, "", $oObj.value)
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,"")
Local $a = StringSplit($sXPath, "/")
Local $aTMP, $pos
Local $seg[$a[0] + 1], $ind[$a[0] + 1]
Local $sElement = $sIE & ".document", $sSel = "getElementsByTagName"
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
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,"")
Return $r
EndFunc ;==>_IE_XPath
!!!
- !!! 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