Frage: Viele werden mich schon wieder vergessen haben, ich war schon lange nicht mehr hier...
Und wie ihr wisst bringe ich immer mehr oder weniger schwere Probleme mit, wenn ich hier auftauche
Diesmal geht es um die "gleichzeitige" Ausführung von Befehlen im FF.
So soll in einem Tab1 eine URL geöffnet werden und wärend auf das Fertigladen gewartet wird soll in einen anderen Tab z.B. ein Formular ausgefüllt werden, aber erst um 12:00 abgeschickt werden(als Beispiel). Natürlich ist Tab1 währenddessen die Seite fertig geladen, nun kann dort eine neue Aktion ausgeführt werden...
Ich hoffe das Prinzip ist klar.
Die auszuführenden Funktionen werden in ein Zweispaltiges/-dimensionales Array geschrieben(siehe zweiter Spoiler), in die zweite Spalte kommt das Ausführungsdatum, wenn die nächste Aktion sofort ausgeführt werden soll, wird statt einer Zeit einfach nur ein | eingefügt, bei einer bestimmten Zeit kommt einfach das Datum noch davor(So: 2009/01/15 23:15:00|) .
Wenn die auszuführende Funktion auf das Fertigladen warten soll, dann wird aber nicht _FFLoadWait aufgerufen, weil das das Programm blockieren würde.
Stattdessen wird _FFSetGet($Socket, "document.getElementById('statusbar-icon').value") aufgerufen und wenn das nicht über/gleich einem Wert(100%) ist, dann soll zum nächsten Tab gesprungen werden. Wenn eine Funktion ausgeführt wurde, dann soll die Funktion aus dem Array entfernt werden und wieder geprüft werden, ob die nächste Funktion gleich wieder ausgeführt werden kann (dies ist der Fall, wenn in der zweiten Spalte die aktuelle Uhrzeit oder ein "|" steht).
Wenn das Element des Arrays leer ist (keine Funktionen mehr enthält), dann soll es sofort gelöscht werden (und der Tab geschlossen werden).
Die Schleife muss dann natürlich wieder ab dem gelöschten Index weiterlaufen.
Klingt komisch, ist aber eigentlich ganz einfach
Ich bin halt total festgefahren und komm einfach nicht raus...
Hier mal das Prinzip:
Spoiler anzeigen
#include <Array.au3>
#include <Date.au3>
;Array generieren
Dim $aBefehle[Random(1, 10, 1) + 1][2]
For $i = 1 To UBound($aBefehle) - 1
$x = Random(1, 10, 1)
$y = 1
For $i2 = 1 To $x
If Random(0, 1, 1) = 1 Then
$aBefehle[$i][0] &= "lw, " & $i & ", " & $i2 & "|" ;bei lw eine Runde warten
Else
$aBefehle[$i][0] &= $i & ", " & $i2 & "|"
EndIf
If Random(0, 1, 1) = 1 Then
$y = Random($y, 120, 1)
$aBefehle[$i][1] &= _DateAdd("s", $y, _NowCalc()) & "|" ;bestimmter Zeitpunkt
Else
$aBefehle[$i][1] &= "|" ;immer durchführbar
EndIf
Next
Next
$ilp = 1
_ArrayDisplay($aBefehle, UBound($aBefehle), -1, 0, ".", "|")
;Array anzeigen
While 1 ;läuft die ganze Zeit, bis keine Befehle mehr im Array
If UBound($aBefehle) = 1 Then ExitLoop
While 1
For $i = $ilp To UBound($aBefehle) - 1
While ((StringLeft($aBefehle[$i][1], 1) = "|") Or (_DateDiff("s", StringLeft($aBefehle[$i][1], StringInStr($aBefehle[$i][1], "|") - 1), _DateAdd("s", 1, _NowCalc())) = 0)) ;Raus, wenn Bedingung nicht erf?llt(Ladezustand)
If StringLeft($aBefehle[$i][0], 2) = "lw" Then ;"wenn nicht fertig geladen"
; im moment einfach nur einmal überspringen
$aBefehle[$i][0] = StringTrimLeft($aBefehle[$i][0], StringInStr($aBefehle[$i][0], "|")) ;später nur, wenn fertig geladen
$aBefehle[$i][1] = StringTrimLeft($aBefehle[$i][1], StringInStr($aBefehle[$i][1], "|")) ;später nur, wenn fertig geladen
;ContinueLoop
;Else
ContinueLoop (2)
EndIf
;hier wird der Befehl später ausgeführt
$aBefehle[$i][0] = StringTrimLeft($aBefehle[$i][0], StringInStr($aBefehle[$i][0], "|")) ;Befehl wird nach Ausführung gelöscht
$aBefehle[$i][1] = StringTrimLeft($aBefehle[$i][1], StringInStr($aBefehle[$i][1], "|")) ;Befehl wird nach Ausführung gelöscht
If $aBefehle[$i][0] = "" Then ; Wenn Element leer, dann löschen + in erste Schleife zur?ck; $ilp neu setzen; wieder For-Schleife
_ArrayDelete($aBefehle, $i)
$i2 = $i
ContinueLoop (3)
EndIf
WEnd
Next
ExitLoop (1) ;Wenn For-Schleife einmal durchlaufen, dann raus
WEnd
WEnd
_ArrayDisplay($aBefehle, UBound($aBefehle), -1, 0, ".", "|")
Und das haut nich hin
Spoiler anzeigen
#include <Array.au3>
#include <Date.au3>
#include "FF.au3"
Opt("TrayIconDebug",1)
$Socket = _FFConnect()
_FFTabAdd($Socket)
_FFTabAdd($Socket)
Dim $aBefehle[3][2] = [["", ""],[_WriteFFOpenURL("http://www.chip.de") & _WriteFFLoadWait(), _DateAdd("s", 5, _NowCalc()) & "||"],[_WriteFFOpenURL("http://www.google.de") & _WriteFFLoadWait() & _WriteFFOpenURL("http://www.computerbild.de") & _WriteFFLoadWait(), "||||"]]
While UBound($aBefehle) > 1
_DS_FFExecuteCommands($Socket, $aBefehle)
Sleep(100)
WEnd
Func _DS_FFExecuteCommands(ByRef $Socket, ByRef $aBefehle)
;MsgBox(0,"","",1)
Local $i, $aRegex
Local $i2 = 1
Local $RegExPattern = '(_FFAction)\(\$sAction = "(.*?)", \$sOption = "(.*?)", \$iDelay = ([+-]?\d*?)\)|(_FFClick)\(\$sObject = "(.*?)", \$iTabIndex = ([+-]?\d*?)\)|(_FFClickImage)\(\$vSearch = "(.*?)", \$sMode = "(.*?)", \$iTabIndex = ([+-]?\d*?)\)|(_FFClickImageBySize)\(\$iHeight = ([+-]?\d*?), \$iWidth = ([+-]?\d*?), \$sMode = "(.*?)", \$sTarget = "(.*?)", \$iTabIndex = ([+-]?\d*?)\)|(_FFClickLink)\(\$vSearch = "(.*?)", \$sMode = "(.*?)", \$iTabIndex = ([+-]?\d*?)\)|(_FFFrameLeave)\(\)|(_FFFrameEnter)\(\$vFrame = "(.*?)", \$sMode = "(.*?)", \$iTabIndex = ([+-]?\d*?)\)|(_FFFormCheckBox)\(\$sName = "(.*?)", \$bChecked = (True|False), \$iIndex = ([+-]?\d*?), \$sBMode = "(.*?)", \$vForm = "(.*?)", \$sMode = "(.*?)" , \$iTabIndex = ([+-]?\d*?)\)|(_FFFormRadioButton)\(\$vRadioButton = "(.*?)", \$iIndex = ([+-]?\d*?), \$sBMode = "(.*?)", \$vForm = "(.*?)", \$sMode = "(.*?)" , \$iTabIndex = ([+-]?\d*?)\)|(_FFFormReset)\(\$vForm = "(.*?)", \$sMode = "(.*?)", \$iTabIndex = ([+-]?\d*?)\)|(_FFFormSubmit)\(\$vForm = "(.*?)", \$sMode = "(.*?)", \$iTabIndex = ([+-]?\d*?)\)|(_FFGetValueById)\(\$sID = "(.*?)", \$iTabIndex = ([+-]?\d*?)\)|(_FFGetValueByName)\(\$sName = "(.*?)", \$iIndex = ([+-]?\d*?), \$iTabIndex = ([+-]?\d*?)\)|(_FFKeyPress)\(\$iKeyCode = ([+-]?\d*?), \$iTabIndex = ([+-]?\d*?)\)|(_FFLoadWait)\(\$iDelay = ([+-]?\d*?), \$iTimeOut = ([+-]?\d*?), \$iPercent = ([+-]?\d*?)\)|(_FFOpenURL)\(\$sURL = "(.*?)", \$iTabIndex = ([+-]?\d*?), \$bWait = (True|False)\)|(_FFSetGet)\(\$sArg = "(.*?)", \$iTimeOut = ([+-]?\d*?), \$iTabIndex = ([+-]?\d*?)\)|(_FFSetValueById)\(\$sID = "(.*?)", \$sValue = "(.*?)", \$iTabIndex = ([+-]?\d*?)\)|(_FFSetValueByName)\(\$sName = "(.*?)", \$sValue = "(.*?)", \$iIndex = ([+-]?\d*?), \$iTabIndex = ([+-]?\d*?)\)|(_FFTabAdd)\(\$sURL = "(.*?)", \$bSelect = (True|False)\)|(_FFTabClose)\(\$vTab = ([+-]?\d*?), \$sMode = "(.*?)"\)|(_FFTabCloseAll)\(\)|(_FFTabSelect)\(\$sMode = "(.*?)", \$vTab = ([+-]?\d*?)\)'
;While 1
For $i = $i2 To UBound($aBefehle) - 1
While StringLeft($aBefehle[$i][1], 1) = "|" Or _DateDiff("s", _NowCalc(), StringLeft($aBefehle[$i][1], StringInStr($aBefehle[$i][1], "|") - 1)) = 0
;MsgBox(0,"",'While StringLeft($aBefehle[$i][1], 1) = "|" Or _DateDiff("s", _NowCalc(), StringLeft($aBefehle[$i][1], StringInStr($aBefehle[$i][1], "|") - 1)) = 0',1)
_FFTabSelect($Socket, "index", $i)
Sleep(50)
$aRegex = StringRegExp(StringLeft($aBefehle[$i][0], StringInStr($aBefehle[$i][0], "|") - 1), $RegExPattern, 3)
For $iRegex = 0 To UBound($aRegex) - 1
If $aRegex[$iRegex] <> "" Then ExitLoop
Next
Switch $aRegex[$iRegex]
Case "_FFAction"
_FFAction($Socket, $aRegex[$iRegex + 1], $aRegex[$iRegex + 2], $aRegex[$iRegex + 3])
Case "_FFClick"
_FFClick($Socket, $aRegex[$iRegex + 1], $aRegex[$iRegex + 2])
Case "_FFClickImage"
_FFClickImage($Socket, $aRegex[$iRegex + 1], $aRegex[$iRegex + 2], $aRegex[$iRegex + 3])
Case "_FFClickImageBySize"
_FFClickImageBySize($Socket, $aRegex[$iRegex + 1], $aRegex[$iRegex + 2], $aRegex[$iRegex + 3], $aRegex[$iRegex + 4], $aRegex[$iRegex + 5])
Case "_FFClickLink"
_FFClickLink($Socket, $aRegex[$iRegex + 1], $aRegex[$iRegex + 2], $aRegex[$iRegex + 3])
Case "_FFFrameLeave"
_FFFrameLeave($Socket)
Case "_FFFrameEnter"
_FFFrameEnter($Socket, $aRegex[$iRegex + 1], $aRegex[$iRegex + 2], $aRegex[$iRegex + 3])
Case "_FFFormCheckBox"
_FFFormCheckBox($Socket, $aRegex[$iRegex + 1], $aRegex[$iRegex + 2], $aRegex[$iRegex + 3], $aRegex[$iRegex + 4], $aRegex[$iRegex + 5], $aRegex[$iRegex + 6], $aRegex[$iRegex + 7])
Case "_FFFormRadioButton"
_FFFormRadioButton($Socket, $aRegex[$iRegex + 1], $aRegex[$iRegex + 2], $aRegex[$iRegex + 3], $aRegex[$iRegex + 4], $aRegex[$iRegex + 5], $aRegex[$iRegex + 6])
Case "_FFFormReset"
_FFFormReset($Socket, $aRegex[$iRegex + 1], $aRegex[$iRegex + 2], $aRegex[$iRegex + 3])
Case "_FFFormSubmit"
_FFFormSubmit($Socket, $aRegex[$iRegex + 1], $aRegex[$iRegex + 2], $aRegex[$iRegex + 3])
Case "_FFGetValueById"
_FFGetValueById($Socket, $aRegex[$iRegex + 1], $aRegex[$iRegex + 2])
Case "_FFGetValueByName"
_FFGetValueByName($Socket, $aRegex[$iRegex + 1], $aRegex[$iRegex + 2], $aRegex[$iRegex + 3])
Case "_FFKeyPress"
_FFKeyPress($Socket, $aRegex[$iRegex + 1], $aRegex[$iRegex + 2])
Case "_FFLoadWait"
;~ _FFLoadWait($Socket, $aRegex[$iRegex + 1], $aRegex[$iRegex + 2], $aRegex[$iRegex + 3])
If _FFSetGet($Socket, "document.getElementById('statusbar-icon').value") < $aRegex[$iRegex + 3] Then
ContinueLoop (2)
EndIf
Case "_FFOpenURL"
_FFOpenURL($Socket, $aRegex[$iRegex + 1], $aRegex[$iRegex + 2], False)
Case "_FFSetGet"
_FFSetGet($Socket, $aRegex[$iRegex + 1], $aRegex[$iRegex + 2], $aRegex[$iRegex + 3])
Case "_FFSetValueById"
_FFSetValueById($Socket, $aRegex[$iRegex + 1], $aRegex[$iRegex + 2], $aRegex[$iRegex + 3])
Case "_FFSetValueByName"
_FFSetValueByName($Socket, $aRegex[$iRegex + 1], $aRegex[$iRegex + 2], $aRegex[$iRegex + 3], $aRegex[$iRegex + 4])
Case "_FFTabAdd"
_FFTabAdd($Socket, $aRegex[$iRegex + 1], $aRegex[$iRegex + 2])
Case "_FFTabClose"
_FFTabClose($Socket, $aRegex[$iRegex + 1], $aRegex[$iRegex + 2])
Case "_FFTabCloseAll"
_FFTabCloseAll($Socket)
Case "_FFTabSelect"
_FFTabSelect($Socket, $aRegex[$iRegex + 1], $aRegex[$iRegex + 2])
EndSwitch
$aBefehle[$i][0] = StringTrimLeft($aBefehle[$i][0], StringInStr($aBefehle[$i][0], "|"))
$aBefehle[$i][1] = StringTrimLeft($aBefehle[$i][1], StringInStr($aBefehle[$i][1], "|"))
;_ArrayDisplay($aBefehle,"",-1,0,"",",")
If $aBefehle[$i][0] = "" Then
_ArrayDelete($aBefehle, $i)
_FFTabClose($Socket, $i, "index")
$i2 = $i
;_ArrayDisplay($aBefehle,"Delete",-1,0,"",",")
ExitLoop (2)
EndIf
WEnd
Next
;WEnd
EndFunc ;==>_DS_FFExecuteCommands
Func _WriteFFAction($sAction, $sOption = "", $iDelay = 0)
Return '_FFAction($sAction = "' & $sAction & '", $sOption = "' & $sOption & '", $iDelay = ' & $iDelay & ')|'
EndFunc ;==>_WriteFFAction
Func _WriteFFClick($sObject, $iTabIndex = -1)
Return '_FFClick($sObject = "' & $sObject & '", $iTabIndex = ' & $iTabIndex & ')|'
EndFunc ;==>_WriteFFClick
Func _WriteFFClickImage($vSearch, $sMode = "src", $iTabIndex = -1)
Return '_FFClickImage($vSearch = "' & $vSearch & '", $sMode = "' & $sMode & '", $iTabIndex = ' & $iTabIndex & ')|'
EndFunc ;==>_WriteFFClickImage
Func _WriteFFClickImageBySize($iHeight, $iWidth, $sMode = "eq", $sTarget = "_blank", $iTabIndex = -1)
Return '_FFClickImageBySize($iHeight = ' & $iHeight & ', $iWidth = ' & $iWidth & ', $sMode = "' & $sMode & '", $sTarget = "' & $sTarget & '", $iTabIndex = ' & $iTabIndex & ')|'
EndFunc ;==>_WriteFFClickImageBySize
Func _WriteFFClickLink($vSearch, $sMode = "href", $iTabIndex = -1)
Return '_FFClickLink($vSearch = "' & $vSearch & '", $sMode = "' & $sMode & '", $iTabIndex = ' & $iTabIndex & ')|'
EndFunc ;==>_WriteFFClickLink
Func _WriteFFFrameLeave()
Return '_FFFrameLeave()|'
EndFunc ;==>_WriteFFFrameLeave
Func _WriteFFFrameEnter($vFrame, $sMode = "index", $iTabIndex = -1)
Return '_FFFrameEnter($vFrame = "' & $vFrame & '", $sMode = "' & $sMode & '", $iTabIndex = ' & $iTabIndex & ')|'
EndFunc ;==>_WriteFFFrameEnter
Func _WriteFFFormCheckBox($sName, $bChecked = True, $iIndex = 0, $sBMode = "index", $vForm = 0, $sMode = "index", $iTabIndex = -1)
Return '_FFFormCheckBox($sName = "' & $sName & '", $bChecked = ' & $bChecked & ', $iIndex = ' & $iIndex & ', $sBMode = "' & $sBMode & '", $vForm = "' & $vForm & '", $sMode = "' & $sMode & '" , $iTabIndex = ' & $iTabIndex & ')|'
EndFunc ;==>_WriteFFFormCheckBox
Func _WriteFFFormRadioButton($vRadioButton, $iIndex = 0, $sBMode = "index", $vForm = 0, $sMode = "index", $iTabIndex = -1)
Return '_FFFormRadioButton($vRadioButton = "' & $vRadioButton & '", $iIndex = ' & $iIndex & ', $sBMode = "' & $sBMode & '", $vForm = "' & $vForm & '", $sMode = "' & $sMode & '" , $iTabIndex = ' & $iTabIndex & ')|'
EndFunc ;==>_WriteFFFormRadioButton
Func _WriteFFFormReset($vForm, $sMode = "index", $iTabIndex = -1)
Return '_FFFormReset($vForm = "' & $vForm & '", $sMode = "' & $sMode & '", $iTabIndex = ' & $iTabIndex & ')|'
EndFunc ;==>_WriteFFFormReset
Func _WriteFFFormSubmit($vForm = 0, $sMode = "index", $iTabIndex = -1)
Return '_FFFormSubmit($vForm = "' & $vForm & '", $sMode = "' & $sMode & '", $iTabIndex = ' & $iTabIndex & ')|'
EndFunc ;==>_WriteFFFormSubmit
Func _WriteFFGetValueById($sID, $iTabIndex = -1)
Return '_FFGetValueById($sID = "' & $sID & '", $iTabIndex = ' & $iTabIndex & ')'
EndFunc ;==>_WriteFFGetValueById
Func _WriteFFGetValueByName($sName, $iIndex = 0, $iTabIndex = -1)
Return '_FFGetValueByName($sName = "' & $sName & '", $iIndex = ' & $iIndex & ', $iTabIndex = ' & $iTabIndex & ')|'
EndFunc ;==>_WriteFFGetValueByName
Func _WriteFFKeyPress($iKeyCode, $iTabIndex = -1)
Return '_FFKeyPress($iKeyCode = ' & $iKeyCode & ', $iTabIndex = ' & $iTabIndex & ')'
EndFunc ;==>_WriteFFKeyPress
Func _WriteFFLoadWait($iDelay = 0, $iTimeOut = 10000, $iPercent = 100)
Return '_FFLoadWait($iDelay = ' & $iDelay & ', $iTimeOut = ' & $iTimeOut & ', $iPercent = ' & $iPercent & ')|'
EndFunc ;==>_WriteFFLoadWait
Func _WriteFFOpenURL($sURL, $iTabIndex = -1, $bWait = False)
Return '_FFOpenURL($sURL = "' & $sURL & '", $iTabIndex = ' & $iTabIndex & ', $bWait = ' & $bWait & ')|'
EndFunc ;==>_WriteFFOpenURL
Func _WriteFFSetGet($sArg, $iTimeOut = 10000, $iTabIndex = -1)
Return '_FFSetGet($sArg = "' & $sArg & '", $iTimeOut = ' & $iTimeOut & ', $iTabIndex = ' & $iTabIndex & ')|'
EndFunc ;==>_WriteFFSetGet
Func _WriteFFSetValueById($sID, $sValue = "", $iTabIndex = -1)
Return '_FFSetValueById($sID = "' & $sID & '", $sValue = "' & $sValue & '", $iTabIndex = ' & $iTabIndex & ')|'
EndFunc ;==>_WriteFFSetValueById
Func _WriteFFSetValueByName($sName, $sValue = "", $iIndex = 0, $iTabIndex = -1)
Return '_FFSetValueByName($sName = "' & $sName & '", $sValue = "' & $sValue & '", $iIndex = ' & $iIndex & ', $iTabIndex = ' & $iTabIndex & ')|'
EndFunc ;==>_WriteFFSetValueByName
Func _WriteFFTabAdd($sURL = "about:blank", $bSelect = True)
Return '_FFTabAdd($sURL = "' & $sURL & '", $bSelect = ' & $bSelect & ')|'
EndFunc ;==>_WriteFFTabAdd
Func _WriteFFTabClose($vTab = -1, $sMode = "index")
Return '_FFTabClose($vTab = ' & $vTab & ', $sMode = "' & $sMode & '")|'
EndFunc ;==>_WriteFFTabClose
Func _WriteFFTabCloseAll()
Return '_FFTabCloseAll()'
EndFunc ;==>_WriteFFTabCloseAll
Func _WriteFFTabSelect($sMode = "index", $vTab = 0)
Return '_FFTabSelect($sMode = "' & $sMode & '", $vTab = ' & $vTab & ')|'
EndFunc ;==>_WriteFFTabSelect
Ich hoffe ihr könnt mir helfen
Hab mal ein überarbeitetes Beispiel angehängt...
Antwort:
Modifizierte FF.au3 (Integer-Funktion durch StringIsInt ersetzt)
Und viele viele Stunden
autoit.de/wcf/attachment/3946/ <-- modifizierte FF.au3 und Beispiel
Siehe Spoiler und Beispiel für Erklärung