Hallo liebe Community,
ich habe den Anwendunsfall, eine Automatisierung zu schreiben, bei der ich in SAP (Web) automatisiere und dort die Elemente teils klicken muss, welche sich in iFrames befinden. Da ich zu dem Thema keine guten Lösungen gefunden habe, möchte ich euch hier Hilfestellung bieten
Zuerst ist es notwendig, die Koordinaten des Beginns des HTML-Dokuments im InternetExplorer zu ermitteln. Dafür müsst ihr das Handle des IE bestimmen und dort das entsprechende Control suchen. Beim Start des IE ist es immer die Instanz 1 - andere Tabs haben andere Instanzen.
Local $hWnd = WinGetHandle("[CLASS:IEFrame]")
If @error Then
MsgBox($MB_SYSTEMMODAL, "", "An error occurred when trying to retrieve the window handle of Internet Explorer")
Exit
EndIf
Local $docPos = ControlGetPos($hWnd, "", "[CLASS:Internet Explorer_Server; INSTANCE:1]")
If @error Then
MsgBox($MB_SYSTEMMODAL, "", "An error occurred when trying to retrieve the document position of Internet Explorer")
Exit
EndIf
$IEDoc_x = $docPos[0] ;
$IEDoc_y = $docPos[1] ;
Alles anzeigen
Der Zugriff auf die Webseite an sich erfolgt dabei über
Um in Frames lesen zu können, müsst ihr sie einzeln ermitteln. In meinem Fall ist es ein iFrame (isolatedWorkArea) im iFrame (contentAreaFrame)
$oContentFrame = _IEFrameGetObjByName($oIE, "contentAreaFrame")
$oWorkingAreaFrame = _IEFrameGetObjByName($oContentFrame, "isolatedWorkArea")
Wichtig ist nun, dass man die relativen Koordinaten der Frames in der Webseite ermittelt. So ermittel ich erst x und y vom übergeordneten Frame, der in Bezug auf die ganze Seite steht und dann x und y des zweiten Frames, welcher in Bezug auf den ersten Frame steht
$CoordsContentframe = _GetTagByAttr($oIE,'iframe',"name", "contentAreaFrame")
$CoordsContentframe_yb = _IEPropertyGet($CoordsContentframe, 'browsery') ;relativ zum Browser/Frame
$CoordsContentframe_xb = _IEPropertyGet($CoordsContentframe, 'browserx')
$CoordsWorkingAreaFrame = _GetTagByAttr($oContentFrame,'iframe',"name", "isolatedWorkArea")
$CoordsWorkingAreaFrame_yb = _IEPropertyGet($CoordsWorkingAreaFrame, 'browsery') ;relativ zum Browser/Frame
$CoordsWorkingAreaFrame_xb = _IEPropertyGet($CoordsWorkingAreaFrame, 'browserx')
Die Funktion _GetTagByAttr habe ich selbst entworfen
Func _GetTagByAttr($content,$tag,$attrName, $attrValue)
$obj = _IETagNameGetCollection($content, $tag)
For $o In $obj
$val = $o.GetAttribute($attrName)
if (StringInStr($val,$attrValue)>0) Then
if (IsObj($o)) Then return $o
EndIf
Next
return null
EndFunc
Alles anzeigen
Nun muss eine Summe der Koordinaten ermittelt werden, welche auf die von AutoIt erkannten relativen Koordinaten im Frame summiert werden, um absolute Koordinaten auf dem Screen zu erhalten. Diese bestehen aus dem Teil des Browsers, welcher nicht HTML ist + die relativen Entfernungen der Frames.
Mein Anwendungsfall bezieht sich auf Objekte in dem zweiten Frame, weshalb ich die Werte von bis Frame 1 und von Frame 1 bis Frame 2 verwende.
$coordDiff_x = $IEDoc_x + $CoordsContentframe_xb + $CoordsWorkingAreaFrame_xb
$coordDiff_y = $IEDoc_y + $CoordsContentframe_yb + $CoordsWorkingAreaFrame_yb
Um nun die Screen-Koordinaten zu ermitteln, muss man die relativen Koordinaten des zu klickenden Objektes suchen und im Anschluss noch die Hälfte der Breite bzw. die Hälfte der Höhe addieren, damit man in der MItte des Objekts klickt und nicht in der oberen linken Ecke.
Im Beispiel ermittle ich einen Suchbutton und möchte ihn danach klicken:
;Suchbutton finden
$oSuche = _GetTagById($oWorkingAreaFrame,'a',"GHEMDGBJ.CompView.Suchen")
$x = _IEPropertyGet($oSuche, 'browserx') + $coordDiff_x + (_IEPropertyGet($oSuche, 'width')/2)
$y = _IEPropertyGet($oSuche, 'browsery') + $coordDiff_y + (_IEPropertyGet($oSuche, 'height')/2)
MouseClick($MOUSE_CLICK_LEFT,$x,$y)
Auch die Funktion _GetTagById ist von mir zur Verschlankung des Quellcodes
Func _GetTagById($content,$tag,$id)
$obj = _IETagNameGetCollection($content, $tag)
For $o In $obj
if $o.id =$id Then
if (IsObj($o)) Then return $o
EndIf
Next
return Null
EndFunc
Das war auch schon der ganze Zauber.
Vielleicht bringt es euch ja weiter
Viel Erfolg und ein schönes Wochenende!