Button ansprechen und IE warten lassen bis ein iFrame geladen ist.

  • Hallo,

    ich bin leider noch ein Neuling in AutoIT und kämpfe deswegen wahrscheinlich peinlicherweise an nem relativ schnell lösbaren Problem :(

    Ich will, dass AutoIT eine Seite im IE annavigiert und wartet bis dort alles komplett geladen ist. Das Problem ist, dass dort intern ein iFrame aufgerufen wird und der IE nicht meldet dass im Hintergrund ein Ladezyklus stattfindet.
    So wartet der IE bisher:

    Code
    $IE = _IECreate($portalURL_complete, 1, 1, 1)
    	$title = WinGetTitle("[active]")
    
    	WinWait($title)
    	If Not WinActive($title) Then WinActivate($title)
    	WinWaitActive($title)
    
    	_ClickOkButton($IE)


    Momentan überbrücke ich das mit einen Sleep von 20 Sekunden, aber da ich die Zeit des ladens messen muss, ist das eher suboptimal ;) Hat jemand vielleicht eine Idee wie man den IE solange warten lassen kann? Die Seite besitzt insgesamt 3 iframes. Das obere Drittel, die restlichen unteren 2 drittel und in dem unteren 2 drittel ist nochmal ein iframe. Alle nur per IDs identifizierbar.
    Der Button der noch angesprochen werden soll, ist nämlich genau in diesem noch zu ladenden iFrame zu finden. Ich bekomme immer einen Fehlerwert von 3 zurück (($_IEStatus_InvalidDataType) = Invalid Data Type)

    momentan spreche ich den Button nicht erfolgreich folgt an:

    Code
    Func _ClickOkButton($IE)
    	Sleep(20000)
    	$obj_iframe = _IEGetObjById($IE,"id_iframe2")
    	$obj_iframe2 = _IEGetObjById($obj_iframe,"Id_iframe3")
    	$button = _IEGetObjById($obj_iframe2, "Button_OK")
    	_IEAction($button, "click")
    
    	MsgBox(0, "Error", @error)
    
    EndFunc   ;==>_ClickOkButton

    Danke schonmal für die Hilfe
    Peter

  • Danke schonmal für die Antworten.
    Ich benutze die IE UDF nur funzt das alles nicht so ganz wie ichs mir vorstell, bin aber noch Anfänger.

    funkey:
    Danke, mit der Funktion wartet er, nur wartet er jetzt unendlich :(
    D.h. er springt nicht mal in die _ClickButton-Funktion :(

    @micneu:
    Es handelt sich um ein firmeninternes Portal.

  • Hi,

    das hab ich auch gerade ausprobiert, aber es bleibt bei dem Dauerwartezustand.
    Ich hab das Gefühl, dass des alles mit dem etwas verschachteltem iFrame-Zeugs zu tun hat und das der des einfach nicht sehen kann/will. Der ganze Inhalt wird über Javascript generiert wenn ich mir des so im Quelltext angugg (kann ich leider nicht posten, ich könnte sonst Ärger bekommen).
    Muss ich die iFrames auch nochmal extra ansprechen? Ich habs beim Button versucht (siehe 1. Post), aber weiß natürlich auch nicht, obs so richtig ist.

    Gruß
    Peter

  • Jetzt ist guter Rat teuer. Aber es gibt immer Bastellösungen :D

    Wenn sonst nichts hilft, dann:

    [autoit]

    While PixelGetColor($Button_Pos[0],$Button_Pos[1]) <> $Grau
    Sleep(10)
    WEnd

    [/autoit]

    Die Koordinaten müssen dann aber genau passen. Achtung - Absolut oder relativ. Also vllt mit WingetPos die IE-Position erhalten und dann die Koordinaten des Buttons hinzuzählen, oder das IE-Fenster immer maximiert öffnen.

  • Hm..das mit ner festen Position vorgeben ist glaub ich eher schlecht. Das Programm zieht sich URLs aus einer Access Datenbank, geht diese Nacheinander durch, um im Rahmen eines SLAs die Ladezeiten zu messen. Und das sollte schon auf verschiedenen Rechnern laufen, die auch unterschiedliche Auflösungen haben.

    Ich hab jetzt jedenfalls mal die Frames zählen lassen und er erkennt auf alle Fälle mal 3 Stück...und das sind auch alle.

    Code
    $oFrames = _IEFrameGetCollection($IE)
    MsgBox(0, "Frame Count:", @extended)

    Nur auf das Element des dritten Frames zugreifen läuft noch nicht so ganz. Ich denk mal, wenn ich dies endlich geschafft hat, sollte der Button dann auch endlich funktionieren ;)

  • Sorry für den Doppelpost.


    Also ich komm immernoch nicht auf den Dritten Frame...hab schon alles mögliche probiert (über Index z.B.)
    Es ist so, als ob dieser Frame einfach nicht existiert..aber in der Debugbar etc wird sie ja angezeigt..sehr komisch...

    Das war der letzte nicht erfolgreiche Versuch:

    Code
    $oMainFrame = _IEFrameGetCollection($IE)
    	$oSubIFrame = _IEFrameGetObjByName($oMainFrame, "Desktop-Innenbereich")
     	$oSubIFrame2 = _IEFrameGetObjByName($oSubIFrame,"isolatedWorkArea")
     	$oElem = _IEGetObjById($oSubIFrame,"BUTTON_OK")

    Ich häng mal ein Bild an, die Zeigt wo das iFrame zu finden ist, vllt hat ja jemand noch eine Idee :(