Absolute Screen-Koordinaten von iFrame-Elementen im Internetexplorer ermitteln

  • 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.

    Der Zugriff auf die Webseite an sich erfolgt dabei über

    Code
    1. Local $oIE = _IEAttach("", "instance", 1)


    Um in Frames lesen zu können, müsst ihr sie einzeln ermitteln. In meinem Fall ist es ein iFrame (isolatedWorkArea) im iFrame (contentAreaFrame)


    Code
    1. $oContentFrame = _IEFrameGetObjByName($oIE, "contentAreaFrame")
    2. $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

    Code
    1. $CoordsContentframe = _GetTagByAttr($oIE,'iframe',"name", "contentAreaFrame")
    2. $CoordsContentframe_yb = _IEPropertyGet($CoordsContentframe, 'browsery') ;relativ zum Browser/Frame
    3. $CoordsContentframe_xb = _IEPropertyGet($CoordsContentframe, 'browserx')
    4. $CoordsWorkingAreaFrame = _GetTagByAttr($oContentFrame,'iframe',"name", "isolatedWorkArea")
    5. $CoordsWorkingAreaFrame_yb = _IEPropertyGet($CoordsWorkingAreaFrame, 'browsery') ;relativ zum Browser/Frame
    6. $CoordsWorkingAreaFrame_xb = _IEPropertyGet($CoordsWorkingAreaFrame, 'browserx')


    Die Funktion _GetTagByAttr habe ich selbst entworfen


    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.

    Code
    1. $coordDiff_x = $IEDoc_x + $CoordsContentframe_xb + $CoordsWorkingAreaFrame_xb
    2. $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:

    Code
    1. ;Suchbutton finden
    2. $oSuche = _GetTagById($oWorkingAreaFrame,'a',"GHEMDGBJ.CompView.Suchen")
    3. $x = _IEPropertyGet($oSuche, 'browserx') + $coordDiff_x + (_IEPropertyGet($oSuche, 'width')/2)
    4. $y = _IEPropertyGet($oSuche, 'browsery') + $coordDiff_y + (_IEPropertyGet($oSuche, 'height')/2)
    5. MouseClick($MOUSE_CLICK_LEFT,$x,$y)


    Auch die Funktion _GetTagById ist von mir zur Verschlankung des Quellcodes


    Code
    1. Func _GetTagById($content,$tag,$id)
    2. $obj = _IETagNameGetCollection($content, $tag)
    3. For $o In $obj
    4. if $o.id =$id Then
    5. if (IsObj($o)) Then return $o
    6. EndIf
    7. Next
    8. return Null
    9. EndFunc

    Das war auch schon der ganze Zauber.

    Vielleicht bringt es euch ja weiter :)


    Viel Erfolg und ein schönes Wochenende!:rock: