FF.au3 _FFConnect funktioniert kompiliert nicht

  • Hallo Community,

    bin ganz neu im Forum und recht neu im Thema AutoIT. Nun komme ich echt nicht weiter und hoffe hier auf Hilfe zu stoßen.

    Ziel: Script soll 3 Firefox fenster öffnen, sich anmelden, werte setzen, die Fenster an bestimme Stellen platzieren und sich beenden.

    Das Script habe ich kompiliert, local 100mal getestet und dann ca 30mal auf dem Rechner auf dem es auch laufen soll.
    Ergebnis: Funktioniert wunderbar.

    Problem1: 2 Wochen später funktioniert es nur noch bedingt. Es dauert viel länger als zuvor und er verhaut die einstellungen der Fensterposition.
    Problem2: Die .exe wollte ich auf einem dritten Rechner heute testen und er schafft den _FFConnect nicht mehr. Auf dem selber rechner das Script (.au3) funktioniert ohne probleme.

    Hier der Code:
    Da dies mein erstes Script war, entschuldigt bitte den nicht immer ganz sauberen code

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    #Include <FF.au3>
    #include <FFEx.au3>
    #include <Array.au3>

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

    ;- Variabeln
    ;------------------------------
    Dim $conf_arg[50];- configfile variable, siehe unten für beschreibung
    DIM $sdhwnd[3];-
    Dim $mozstr

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

    ;- HotKeys
    ;------------------------------
    HotKeySet("{ESC}", "Terminate");- Hotkey ESC, bei drücken funktionsaufruf Terminate. Beendet Script

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

    ;- Programm
    ;------------------------------

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

    $mozstr = _MozRepl_Detect();- Rückgabewert ob Installation von Add-ON vorhanden.
    If $mozstr <> 1 then;- Falls Add-on nicht installiert ist, script beenden. Installation von Addon vorher über die funktion gestartet
    exit 0
    Endif

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

    read_config();- Auslesen des Logfiles, Prüft ob Benutzername via INI vorgegeben ist.

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

    if $conf_arg[0] = "" Then;- Falls kein Benutzername in der Ini angegeben ist, inbux box mit nachfrage nach Benutzer
    $conf_arg[0] = InputBox("Security Check", "Enter the Username")
    EndIf
    $passwd = InputBox("Security Check", "Enter the password for " & $conf_arg[0], "", "*");- Passwortnachfrage für den Benutzer

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

    ff_open();- Funktionsaufruf zum öffnen der Fenster und Login
    ff_configure();- Configuriert die Fenster

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

    _FFDisConnect();- Disconnect vom Add-On

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

    ;- Funktionen
    ;-------------------------------

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

    Func ff_open()
    for $i = 0 to 2
    _FFStart()
    If _FFConnect(Default, Default, 5000) Then;- connect zum Addon
    _FFOpenURL("")
    _FFSetValue($conf_arg[0], "userName","name");-\
    _FFSetValue($passwd, "password","name");- > Login
    if $i <> 0 then _FFFormSubmit(0,"index","submit",False);-/
    $sdhwnd[$i] = WinGetHandle("[active]");- Speichert die Window handle nummer, zum identifizieren der jeweiligen fenster.
    if $i=0 then;- Beim ersten Fenster wird geprüft ob der Benutzername/PW korrekt ist, ansonsten wird der Anmeldevorgang / script abgebrochen.
    _FFFormSubmit(0,"index","submit")
    $sHTML = _FFReadHTML()
    $result = StringInStr($sHTML, "Invalid Password or Username")
    If $result <> 0 then
    MsgBox(0,"Passwort oder Benutzername Falsch","Passwort oder Benutzername Falsch. Bitte überprüfen Sie Ihre Eingaben und starten Sie das Programm neu.")
    Exit 0
    Else
    $result = StringInStr($sHTML, "already logged in with another")
    if $result <> 0 Then
    MsgBox(0,"Bereits eingeloggt","Sie sind bereits mit einem anderen User angemeldet. Bitte melden Sie sich erst aus und starten Sie das Programm neu.")
    Exit 0
    EndIf
    EndIf
    Endif
    Else
    MsgBox(64, "", "Can't connect to FireFox!")
    Exit 0
    EndIf
    next
    EndFunc

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

    Func ff_configure()
    $i = 0
    for $i = 0 to 2
    if $i = 0 Then ;(Erstes Fenster)
    local $width=512
    local $height=768
    local $posy="0"
    local $posx= 144
    local $url=""
    local $value="NOT IN ('')"
    local $fname="ContractElementShortName"
    ElseIf $i = 1 Then;(Zweites Fenster)
    local $width=512
    local $height= 768
    local $posy=512
    local $posx= 144
    local $url=""
    local $value=@YEAR & "-" & @MON & "-" & @MDAY
    local $value2=@YEAR + 1 & "-" & @MON & "-" & @MDAY
    local $fname="SPScheduledStartTime.From"
    local $tname="SPScheduledStartTime.To"
    ElseIf $i = 2 Then; (Drittes Fenster)
    local $width=1024
    local $height=599
    local $posy="0"
    local $posx= -215
    local $url=""
    EndIf

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

    WinActivate($sdhwnd[$i])
    sleep(100)

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

    If _FFConnect(Default, Default, 5000) Then
    If _FFLoadWait() Then
    _FFOpenURL("" & $url)
    if $i < 2 Then;- Einstellung der ersten 2 fenster
    siteload()
    sleep(1000)
    buttoncheck()
    _FFSetValue($value,$fname,"name")
    if $i = 1 then _FFSetValue($value2,$tname,"name")
    _FFClick("SubmitSelect","name")
    siteload()
    _FFCmd(')")
    siteload()
    sleep(500)
    ElseIf $i = 2 Then;- Einstellung des Dritte Fenster.
    siteload()
    buttoncheck()
    siteload()
    _FFCmd("')")
    siteload()

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

    EndIf
    EndIF
    EndIf

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

    WinMove($sdhwnd[$i], "", $posy, $posx, $width, $height)

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

    Next

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

    EndFunc

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

    Func siteload()
    ;###
    ;###
    ;###
    local $j
    Do
    $j = 0
    $sHTML = _FFReadHTML()
    $result = StringInStr($sHTML,"ListBeanName")
    if $result = 0 Then
    $j = 0
    $result2 = StringInStr($sHTML,"BITTE WARTEN")
    if $result2 > 0 then
    $j = 1

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

    EndIf
    Else
    $j = 1
    $result2 = StringInStr($sHTML,"BITTE WARTEN")
    if $result2 > 0 then
    $j = 1

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

    EndIf
    EndIf
    Until $j = 1

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

    EndFunc

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

    Func buttoncheck()
    ;###
    ;### Überprüft ob hfp-button aktiv ist und betätigt ihn ggf.
    ;###

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

    $result5 = "0"
    $checkHTML2 = "0"
    $checkHTML2 = _FFReadHTML()
    $result5 = StringInStr($checkHTML2, "hfp-button-show")
    sleep(100)
    if $result5 > 0 Then
    _FFClick("","id")
    EndIf
    EndFunc

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

    Func Terminate()
    Exit 0
    EndFunc

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

    Func _MozRepl_Detect($sProfile = "default", $bInstall = True , $sXPI = "http://repo.hyperstruct.net/mozrepl/1.0/mozrepl.xpi")

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

    If $sProfile = "" Then $sProfile = "default"
    Local $sIni_Path = @AppDataDir & "\Mozilla\Firefox\"
    Local $var = IniReadSectionNames($sIni_Path & "\profiles.ini")
    If @error Then
    MsgBox(4096, "", "Error occurred, probably no Firefox INI file.")
    Else
    For $i = 1 To $var[0]
    Local $Ini_ = IniRead($sIni_Path & "\profiles.ini", $var[$i], "Name", "Error")
    If $Ini_ = $sProfile Then
    Local $sPath_folder = IniRead($sIni_Path & "\profiles.ini", $var[$i], "Path", "Error") ;Profile dir
    ExitLoop
    EndIf
    Next
    EndIf

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

    If $bInstall Then
    Local $sHKLM = "HKEY_LOCAL_MACHINE\SOFTWARE\Mozilla\Mozilla Firefox"
    Local $sFFExe = RegRead($sHKLM & "\" & RegRead($sHKLM, "CurrentVersion") & "\Main", "PathToExe")
    Local $sCommand = StringFormat('"%s" "%s"',$sFFExe, $sXPI)
    EndIf

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

    If StringLeft($sPath_folder, 8) = "Profiles" Then
    If FileExists($sIni_Path & $sPath_folder & "\extensions\mozrepl@hyperstruct.net") Then
    Return 1
    Else
    If $bInstall Then Return Run($sCommand)
    Return 0
    EndIf
    Else
    If FileExists($sPath_folder & "\extensions\mozrepl@hyperstruct.net") Then
    Return 1
    Else
    If $bInstall Then Return Run($sCommand)
    Return 0
    EndIf
    EndIf
    EndFunc

    [/autoit]

    2 Mal editiert, zuletzt von Chuckwhalla (13. Januar 2011 um 12:30)

  • Hallo,

    wenn ich das genau überblicke verwendest Du _FFConnect merhmals hintereinander. Das bedeutet: Jedesmal wird eine neue Verbindung zu FF aufgebaut, das könnte evtl. Probleme machen, wenn man nicht genau das so möchte. Einmal _FFConnect bzw. _FFStart im ganzen Programm reicht normalerweise. Die Verbindung kann mit _FFIsConnected überprüft werden.
    Aber ob das Problem daher rührt ist schwer nachvollziehen.

    Tipp zur Fehlersuche:
    Im kompilierten Zustand gibt die FF.au3 Fehlermeldungen per "OutputDebugString" aus. Diese können dann z.B. damit:
    http://technet.microsoft.com/en-us/sysinternals/bb896647.aspx
    angesehen werden.

    Anstatt WinGetHandle würde ich _FFWindowGetHandle verwenden, das ist sicherer, falls man ein Anwender "dazwischenfunkt".

    Ein Performance Problem sehe ich auch: _FFReadHTML / _FFReadTEXT sind, je nach Seitengröße, sehr langsam. Um nur einen vorhandenen Text abzufragen ist _FFSearch wesentlich schneller, also anstatt:

    [autoit]

    $sHTML = _FFReadHTML()
    $result = StringInStr($sHTML, "Invalid Password or Username")
    If $result <> 0 then

    [/autoit]


    einfach nur:

    [autoit]

    If _FFSearch( "Invalid Password or Username") Then
    ...

    [/autoit]


    Nochwas für den Quelltext:
    Diesem mit Tidy behandelt, macht ihn wesentlich lesbarer.

    Viele Grüße
    Stilgar

  • Ich denke eher das es daran liegt, das du ja die FF.au3 includest wenn es auf nem anderen rechner ist, und die ff.au3 nicht vorhanden, klappt es nicht

    und die rechner wo es laufen soll müssen mozrepl haben als plugin in FF

  • Ich denke eher das es daran liegt, das du ja die FF.au3 includest wenn es auf nem anderen rechner ist, und die ff.au3 nicht vorhanden, klappt es nicht

    und die rechner wo es laufen soll müssen mozrepl haben als plugin in FF


    Wenn die FF.au3 nicht vorhanden wäre, würde das unkompilierte Skript auch nicht funktionieren.
    Ein fehlendes MozRepl-AddOn wird durch die verwendete Funktion _MozRepl_Detect() automatisch installiert.

    @ Chuckwhalla:
    Da Du FFEx.au3 verwendest kannst Du anstatt _MozRepl_Detect(), als Funktion in Dein Programm zu kopieren, gleich _FF_MozRepl_Detect() verwenden.

    Grüße
    Stilgar

  • Danke für die Antworten,

    werde mich mit den angesprochenen Punkten mal auseinander setzen.

    Das _FFConnect benutze ich mehrmals weil ich mehrere Fenster aufmache. Ich hatte probleme wenn ich mit dem ersten fenster ein connect gemacht hab
    und mit dem zweiten nicht expliziet, das es dann nicht funktionierte.
    _FFSearch hab ich wohl überlesen :) Danke für den tipp. Wobei es nicht auf performance ankommt sondern stabilität. 30 sekunden oder 2 minuten sind egal.
    20 minuten ist aber krass ... was ich mittlerweile hatte. Nach eine reboot des rechners lief es wieder schneller. Könnte wirklich sein das es zuviele connects sind
    und der disconnect nicht sauber ist.

    Da Du FFEx.au3 verwendest ... funktionen hatte ich nicht verwenden, hatte die provisorisch drinne, aber nicht benutzt. (vergessen rauszunehmen.) Werde mir aber
    _FF_MozRepl_Detect() angucken.

    Zum Tidy,

    der code ist viel leserlicher als hier. Einrücken habe ich auch sehr gut durchgezogen. Mir ist leider beim kopieren/editieren fürs forum ein fehler unterlaufen.