Interaktion mit zwei Internet Explorer Fenstern

  • Hallo,
    ich bin absoluter Autoit Anfänger und schreibe gerade ein Tool für die Arbeit.
    Das Tool soll sich im Intranet in zwei Gates einloggen, pro Gate ein Internet Explorer Fenster,
    und von den Gates aus sollen Anwendungen gestartet werden die dort verlinkt sind.

    Das Einloggen in die Gates funktioniert schon und ich kann auch ohne Probleme im Gate,
    welches zuerst aufgerufen wird, die Programme starten, jedoch hab ich das Problem, wenn ich
    Programme im zweiten Gate starten will, versucht er das immer im ersten Explorer Fenster
    wo ja das erste Gate geöffnet ist.

    Die Explorer Fenster anhand der Titel zu unterscheiden geht leider nicht, da die beide gleich heißen.
    Hab schon versucht, die IE anhand der Prozess ID zu unterscheiden, das geht aber ja dann schief,
    sobald ein weiterer IE geöffnet wird.
    Auch hab ich schon versucht, die Quellcodes der Gate-Seiten nach den jeweiligen Benutzernamen
    zu durchsuchen, hab ich aber auch nicht so richtig hinbekommen, da der Quellcode im zweiten Gate
    gesperrt ist.
    Dann ist mir eingefallen, das ich den IE ja auch Variablen zuweisen könnte um die Programme und
    den Login Prozess über die Variablen zu steuern.
    Die Idee gefällt mir bis jetzt am besten, aber ich bekomm das nicht so richtig hin...

    Nun zu meiner Frage: Könnt ihr mir Tipps geben, wie ich die Variablen Zuordnung machen kann,
    oder gibt es evtl noch einen anderen Lösungsansatz zu meinem Problem?

    Danke im vorraus und viele Grüße
    Herr Bert

    Einmal editiert, zuletzt von Herr Bert (2. Juli 2013 um 13:40)

  • Hallo,
    hier einmal der Code:

    Spoiler anzeigen
    [autoit][/autoit]


    Hab die Links etc rausgenommen, da der Zugriff eh nur hier im Intranet möglich ist.
    MfG

    Einmal editiert, zuletzt von Herr Bert (2. Juli 2013 um 13:37)

  • Niemand eine Idee?

    Ist es evtl möglich die URL der Seiten zu durchsuchen und je nachdem, ob eine Zeichenfolge in der URL vorkommt, das jeweilige IE Fenster anzusprechen?

    Edit: Habs gefunden, aber kann es sein das _IEAttach sich mit https Seiten beißt?

    Edit: Oder liegts an der .aspx Endung? Ich hab keine Ahnung, andere https Seiten gehen ohne Probleme...

    2 Mal editiert, zuletzt von Herr Bert (21. Juni 2013 um 13:53)

  • Also mal 2 Sachen die mir auffallen:


    1. Du verwendest _IEAttach(). Wozu? Wenn ich mich recht an die IE Automatisierung erinnere wird bei IEAttach kein neues Fenster erzeugt, sondern ein weiterer Tab im IE geöffnet. Das macht schonmal in sofern Schwierigkeiten, weil die IE Funktionen keine Möglichkeit zum Tabwechsel bereitstellen. Du könntest auch einfach ein erneutes _IEcreate() verwenden und dir somit wirklich ein zweites unabhängiges Fenster erzeugen, welches du auch über einen anderen Variablennamen ansprechen kannst.

    2. Ich sehe in deinem Script ungewöhnliche viele send(), sleep() und window-Funktionen. Die Ausnahme bildet die erste Funktion, welche oberflächlich betrachtet durchdacht ist und weitmöglichst auf die IE Funktionen zugreift. Send() ist extrem unzuverlässig, selbst wenn man mit Blockinput manuelle Eingaben unterbindet. Die send Befehle können prinzipiell überall landen, da reicht es schon wenn ein anderes Fenster im falschen Moment den Focus bekommt. Außerdem muss man mit Sonderzeichen in Verbindung mit send() aufpassen. Ich rate jedenfalls davon ab. Die IE Funktionen bieten alles was man zur Webseiten automatisierung benötigt, ich sehe keinen Grund hier auf send() zurückzugreifen. Sofern damit aufpoppende Authentifizierungsfenster einer mit ".htaccess" geschützten Seite automatisiert werden sollen kann man das auch über eine entsprechend vorbereiteten URL nach dem Schema "user:pw@url" lösen.

  • Hallo,
    erstmal danke für deine Antwort.

    _IEAttach() benutz ich um ein bestimmtes IE Fenster anzusprechen, Tabwechsel benötige ich bei meiner Anwendung gar nicht.
    Das ich die beiden Browserfenster Variablen zuweisen kann versuche ich umzusetzen, klappt aber nicht so wirklich, vor allem,
    da ich ja das eine Fenster aus dem anderen heraus öffne...

    Kannst du mir eine Alternative zu Send() geben wenn die so unzuverlässig ist? Mit den Authentifizierungsfenster habe ich kein
    Problem, das funktioniert schon wie ich es haben will. Das Problem ist ja nur, das ich das zweite Browserfenster nicht ansprechen
    kann um dort Befehle abzusetzen. Es wird bei meinen Befehlen immer das erste Browserfenster angesprochen. Wenn ich den
    Zugriff über die URL machen möchte bekomme ich immer ein NoMatch...

    Hoffe auf weitere Tipps :)

    Viele Grüße
    Herr Bert

  • Ich frage mich was dies hier soll??

    [autoit]

    If WinGetTitle("Kennwort ändern", "") Then

    [/autoit]


    Und warum ist oben bei den Buttons soviel Platz zwischen den Parametern?

    Was ist denn der Unterschied zwischen den beiden "Gates"?

  • Zitat

    Ich frage mich was dies hier soll??

    [autoit]

    If WinGetTitle("Kennwort ändern", "") Then

    [/autoit]

    Naja, dort wird halt abgefragt ob nach der Anmeldung um eine Kennwortänderung gebeten wird.
    Wenn ja übernimmt das Tool diesen Prozess, wenn nein wird mit dem Programmablauf fortgefahren.

    Zitat

    Und warum ist oben bei den Buttons soviel Platz zwischen den Parametern?

    Wegen der Lesbarkeit.

    Zitat

    Was ist denn der Unterschied zwischen den beiden "Gates"?

    Die Programme die über das Tool aufgerufen werden können befinden sich teilweise auf Gate 1 und
    teilweise auf Gate 2.

  • Dafür nimmt man eigentlich WinExists.

    gibt es denn einen optischen Unterschied zwischen Gate 1 und 2?

  • Optische Unterschiede gibt es so gut wie nicht, die URL ist anders, der Titel und der grundsätzliche Seitenaufbau ist gleich.

    Wie meinst du das mit WinExists? Die Fenster sind ja da, ich muss es nur hinbekommen das dazwischen unterschieden werden
    kann um den Zugriff auf Fenster 1 und 2 zu gewährleisten.

  • Wenn die URL anders ist musst du _IEAttach auf URL stellen und nicht Title.
    Ich meine WinExists anstatt WinGetTitle.

  • Ja, den Aufruf über die URL zu machen hab ich schon probiert, auf anderen Seiten geht das auch ohne
    Probleme, auf der Gate-Seite geht es nicht. Warum auch immer... -_-
    Deswegen der Versuch das über Variablen zu lösen.

    Ok, ich werde an der Stelle mal WinExist einbauen.

    Danke dir.

  • Dann mach es mit dem dritten Parameter. Der eine _IEAttach hat 1 und der andere dann 2.

  • Ich mach es so:

    [autoit]

    $oIE = _IEAttach("Fenstertitel","Title",2)

    [/autoit]


    Und bekomme IE.au3 V2.4-0 Warning from function _IEAttach, $_IEStatus_NoMatch - obwohl alles gleich bleibt...
    Beim ersten Fenster funktioniert es.

  • Steht doch oben ;)

    Mittlerweile denke ich aber das es am IE Fenster liegt, da es über eine Citrix Umgebung gestartet wird.
    Die Befehle funktionieren ja alle mit dem ersten Fenster.
    Ich versuch schon die ganze Zeit das über Variablenzuweisung zu lösen, aber da hab ich keine Erfahrung mit...

  • Achja...

    [autoit]

    _IECreate( " Intranet Adresse Gate 1 ", 0, 1, 1, 1 )

    [/autoit]


    Du weißt schon das _IECreate eine URL möchte und kein Titel??
    Genauso _IENavigate.
    Vielleicht solltest du dir erstmal die Hilfe verinnerlichen.

  • Ja das weiß ich schon, aber wie schon in meinem zweiten Beitrag geschrieben habe, wurden die URLs
    aus dem Code entfernt weil der Zugriff eh nur hier im Intranet möglich ist. Das was da jetzt steht sind
    alles Platzhalter :)

    In die Hilfe guck ich schon oft rein, keine Bange ;)

  • Ok. Ist ja egal ob man darauf jetzt zugreifen kann oder nicht. Es war ein wenig verwirrend
    Öffnet sich denn das Fenster zu Gate 2 selber?
    Weil du in dem Fenster von Gate 1 zu Gate 2 laden willst.

    [autoit]

    $oIE = _IEAttach(" Titel Gate 1 Intranetseite ")
    _IENavigate($oIE, " Link zu Gate 2 ", 0)

    [/autoit]

    Kleiner Tipp am Rande.
    Die GUI würde ich so machen. Dann ist es einfacher für die weitere Verarbeitung.

    Spoiler anzeigen
    [autoit]

    #include <IE.au3>
    #include <Crypt.au3>
    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Global $cLogin, $acTool[12], $cEditLogin, $iMsg

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    If Not FileExists(@ScriptDir & "\pwd.ini") Then Set_Pwd()

    [/autoit] [autoit][/autoit] [autoit]

    #Region ### START Koda GUI section ### Form=
    GUICreate("AGH", 365, 480)
    $cLogin = GUICtrlCreateButton("Einloggen in Gate 1 und 2", 20, 25, 320, 25)
    GUICtrlCreateGroup("Gate 1", 20, 75, 150, 345)
    $acTool[0] = GUICtrlCreateButton("Tool 1", 30, 100, 130, 25, 0)
    $acTool[1] = GUICtrlCreateButton("Tool 2", 30, 135, 130, 25, 0)
    $acTool[2] = GUICtrlCreateButton("Tool 3", 30, 170, 130, 25, 0)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUICtrlCreateGroup("Gate 2", 190, 75, 150, 345)
    For $i = 3 To UBound($acTool) - 1
    $acTool[$i] = GUICtrlCreateButton("Tool " & $i + 1, 200, 100 + (($i - 3) * 35), 130, 25)
    Next
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $cEditLogin = GUICtrlCreateButton("Login Daten bearbeiten", 20, 435, 320, 25)
    GUISetState()
    #EndRegion ### END Koda GUI section ###

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    $iMsg = GUIGetMsg()
    Switch $iMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $cLogin
    GATE_1_LOGIN ()
    Case $acTool[0] To $acTool[2] ; Hier kommen die Tools hin von Gate 1, wenn due Funktionen Tool_x heißen sollen, dann einfach mit Call weitermachen
    MsgBox(0, "", "Tool " & $iMsg - $acTool[0] + 1)
    Case $acTool[3] To $acTool[11] ; Hier kommen die Tools hin von Gate 2
    MsgBox(0, "", "Tool " & $iMsg - $acTool[3] + 4)
    EndSwitch
    WEnd

    [/autoit]


    Somit wird der Code nicht so ellenlang.

  • Ja, Gate 2 wird über einen Link aus Gate 1 heraus aufgerufen.

    Danke für den Tipp mit der GUI, das werd ich mir mal genauer anschauen.