1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Mail1q2w

Beiträge von Mail1q2w

  • Absolute Screen-Koordinaten von iFrame-Elementen im Internetexplorer ermitteln

    • Mail1q2w
    • 21. Juni 2019 um 10:30

    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.

    Code
    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

    Code
    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
    $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

    Code
    $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

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

    Code
    $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:

    Code
    ;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

    Code
    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!:rock:

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™