Hallo zusammen.
Ich habe folgende Voraussetzungen:
Ich habe 2 Skripte, die unterschiedliche Dinge tun. Das eine Skript führt den Prozess einer Angebotsschreibung in unserem firmeninternen Portal durch und misst die Ladezeiten, welche dann in ein Logfile geschrieben werden. Das andere Skript macht das ähnlich nur den Prozess einer Bestellung.
Jedes Skript für sich läuft einwandfrei. Nun habe ich (ich vermute) ein Problem mit der Fensterzuordnung zu von Skript zu Browserfenster, wenn sie gleichzeitig laufen. Das ganze soll parallel und in einer While schleife laufen, um eine dauerhafte Überwachung zu gewährleisten und im Anschluss entsprechende Auswertungen machen zu können. Eine weitere Vermutung ist, dass wenn ein Skript gerade den Browser öffnet (und lädt) das 2. Skript irgendwie dazwischen fuscht.
Ich versuche mal alles notwendige anzuhängen.
Versucht habe ich schon anstatt IECreate es über ShellExecute und das Handles des Fensters zu lösen. Aber da liegt das Problem in der WinWait Methode meiner Meinung nach.
Das 1. Skript
Spoiler anzeigen
#include <Test_IE.au3>
; Read the config.ini
$INI=@ScriptDir&"\AngebotSnagViewConfig.ini"
$host=IniRead ( $INI, "base", "host", "default" )
$service1=IniRead ( $INI, "base", "service1", "default" )
$service2=IniRead ( $INI, "base", "service2", "default" )
$service3=IniRead ( $INI, "base", "service3", "default" )
$service4=IniRead ( $INI, "base", "service4", "default" )
$cmd01 = @ScriptDir&"\"& IniRead ( $INI, "base", "cmd01", "default" )
$logWarn=IniRead ( $INI, "check", "logWarning", "default" )
$logCrit=IniRead ( $INI, "check", "logCritical", "default" )
$serviceWarn=IniRead ( $INI, "check", "serviceWarn", "default" )
$serviceCrit=IniRead ( $INI, "check", "serviceCrit", "default" )
$hidden=IniRead ( $INI, "run", "hidden", "true" )
; Variablen
$user = ""
$pwd = ""
$server = ""
$anwendung = ""
$oIE_ANG = ""
While @HOUR < 20
;URL und Server wählen
For $i = 1 to 4 step 1
if $i = 1 Then
$url = "http://sp280w05.viessmann.com:10040/wps/portal"
$server = "WP_1_1"
Endif
if $i = 2 Then
$url = "http://sp280w05.viessmann.com:10046/wps/portal"
$server = "WP_1_2"
Endif
if $i = 3 Then
$url = "http://sp281w05.viessmann.com:10040/wps/portal"
$server = "WP_2_1"
Endif
if $i = 4 Then
$url = "http://sp281w05.viessmann.com:10046/wps/portal"
$server = "WP_2_2"
Endif
;Angebotsschreibung: Prozess durchführen
$anwendung = "ANG"
$oIE_ANG = _PortalLogin($user, $pwd, $url, $hidden)
$serviceTimeBegin = TimerInit()
_IELinkClickByTextContains($oIE_ANG, "Vertrieb", "Reiter Vertrieb")
_IELinkClickByTextContains($oIE_ANG, "Angebote", "Seite Angebot")
_IELinkClickByTextContains($oIE_ANG, "Meine Angebotsentwürfe", "Öffnen ""Meine Angebotsentwürfe""")
_IELinkClickByTextContains($oIE_ANG, "0051234500", "Auswahl des Angebotsentwurfs")
_IELinkClickByTextContains($oIE_ANG, "Weiter", "Verkaufshinweis anzeigen")
_IELinkClickByTextContains($oIE_ANG, "Weiter", "Angebotspositionen anzeigen")
_IELinkClickByTextContains($oIE_ANG, "Aktualisieren", "Angebotspositionen aktualisieren")
_IELinkClickByTextContains($oIE_ANG, "Weiter", "Druckeinstellungen anzeigen")
_IELinkClickByTextContains($oIE_ANG, "Textbaustein auswählen", "Auswahl für Textbausteine öffnen")
_IELinkClickByTextContains($oIE_ANG, "Suchen", "Textbausteine suchen")
_IELinkClickByTextContains($oIE_ANG, "Abgasberechnung", "Auswahl eines Textbausteins")
$serviceTime = Round(TimerDiff($serviceTimeBegin)/1000, 2)
_PortalLogout($oIE_ANG)
;Returncode und Warn/Crit festlegen
if $serviceTime >= $serviceCrit Then
$output = StringFormat("%s%s%s", "CRITICAL-",$serviceTime,"s")
$returncode = "2"
ElseIf $serviceTime >= $serviceWarn Then
$output = StringFormat("%s%s%s", "WARNING-",$serviceTime,"s")
$returncode = "1"
ElseIf $serviceTime < $serviceWarn Then
$output = StringFormat("%s%s%s", "OK-",$serviceTime,"s")
$returncode = "0"
EndIf
; Submit Value to SNAG-View
;service1
If $i = 1 Then
$performance = "time="&$serviceTime&"s;"&$serviceWarn&";"&$serviceCrit&";0"
$cmdrun01 = $cmd01 & " " & $host & " " & $service1 & " " & $returncode & " " & $output& " " & $performance
EndIf
;service2
If $i = 2 Then
$performance = "time="&$serviceTime&"s;"&$serviceWarn&";"&$serviceCrit&";0"
$cmdrun01 = $cmd01 & " " & $host & " " & $service2 & " " & $returncode & " " & $output& " " & $performance
EndIf
;service3
If $i = 3 Then
$performance = "time="&$serviceTime&"s;"&$serviceWarn&";"&$serviceCrit&";0"
$cmdrun01 = $cmd01 & " " & $host & " " & $service3 & " " & $returncode & " " & $output& " " & $performance
EndIf
;service4
If $i = 4 Then
$performance = "time="&$serviceTime&"s;"&$serviceWarn&";"&$serviceCrit&";0"
$cmdrun01 = $cmd01 & " " & $host & " " & $service4 & " " & $returncode & " " & $output& " " & $performance
EndIf
Run($cmdrun01)
sleep (5000)
Next
Wend
Exit
Das 2. Skript
Spoiler anzeigen
#include <Test_IE.au3>
; Read the config.ini
$INI=@ScriptDir&"\OBSSnagViewConfig.ini"
$host=IniRead ( $INI, "base", "host", "default" )
$service1=IniRead ( $INI, "base", "service1", "default" )
$service2=IniRead ( $INI, "base", "service2", "default" )
$service3=IniRead ( $INI, "base", "service3", "default" )
$service4=IniRead ( $INI, "base", "service4", "default" )
$cmd01 = @ScriptDir&"\"& IniRead ( $INI, "base", "cmd01", "default" )
$logWarn=IniRead ( $INI, "check", "logWarning", "default" )
$logCrit=IniRead ( $INI, "check", "logCritical", "default" )
$serviceWarn=IniRead ( $INI, "check", "serviceWarn", "default" )
$serviceCrit=IniRead ( $INI, "check", "serviceCrit", "default" )
$hidden=IniRead ( $INI, "run", "hidden", "true" )
; Variablen
$user = ""
$pwd = ""
$server = ""
$anwendung = ""
$oIE_OBS = ""
While @HOUR < 20
;URL und Server wählen
For $i = 1 to 4 step 1
if $i = 1 Then
$url = "http://sp280w05.viessmann.com:10040/wps/portal"
$server = "WP_1_1"
Endif
if $i = 2 Then
$url = "http://sp280w05.viessmann.com:10046/wps/portal"
$server = "WP_1_2"
Endif
if $i = 3 Then
$url = "http://sp281w05.viessmann.com:10040/wps/portal"
$server = "WP_2_1"
Endif
if $i = 4 Then
$url = "http://sp281w05.viessmann.com:10046/wps/portal"
$server = "WP_2_2"
Endif
;OBS: Prozess durchführen
$anwendung = "OBS"
$oIE_OBS = _PortalLogin($user, $pwd, $url, $hidden)
$serviceTimeBegin = TimerInit()
_IELinkClickByTextContains($oIE_OBS, "Vertrieb", "Reiter Vertrieb")
_IELinkClickByTextContains($oIE_OBS, "Bestellung", "Seite Bestellung")
_OBSKundenlogin($oIE_OBS, "", "", "")
_IELinkClickByTextContains($oIE_OBS, "Bestellerfassung", "Bestellerfassung öffnen")
_IELinkClickByTextContains($oIE_OBS, "Import Musterwarenkorb", "Musterwarenkorb importieren")
_IELinkClickByTextContains($oIE_OBS, "PortalUeberwachung", "Musterwarenkorb auswählen")
_IELinkClickByTextContains($oIE_OBS, "In Warenkorb übernehmen", "Musterwarenkorb in Warenkorb übernehmen")
_IELinkClickByTextContains($oIE_OBS, "Warenkorb", "Warenkorb öffnen")
_IELinkClickByTextContains($oIE_OBS, "Warenkorb bestellen", "Warenkorb bestellen")
$oForms = _IEFormGetCollection ($oIE_OBS, 0)
$o_commission = _IEFormElementGetObjByNameContains($oForms, "commission")
_IEFormElementSetValue($o_commission, "1")
_IELinkClickByTextContains($oIE_OBS, "Weiter", "Bestellvorgang Weiter")
_IELinkClickByTextContains($oIE_OBS, "Ergänzende Angaben", "Ergänzende Angaben Weiter")
$serviceTime = Round(TimerDiff($serviceTimeBegin)/1000, 2)
_PortalLogout($oIE_OBS)
;Returncode und Warn/Crit festlegen
if $serviceTime >= $serviceCrit Then
$output = StringFormat("%s%s%s", "CRITICAL-",$serviceTime,"s")
$returncode = "2"
ElseIf $serviceTime >= $serviceWarn Then
$output = StringFormat("%s%s%s", "WARNING-",$serviceTime,"s")
$returncode = "1"
ElseIf $serviceTime < $serviceWarn Then
$output = StringFormat("%s%s%s", "OK-",$serviceTime,"s")
$returncode = "0"
EndIf
; Submit Value to SNAG-View
;service1
If $i = 1 Then
$performance = "time="&$serviceTime&"s;"&$serviceWarn&";"&$serviceCrit&";0"
$cmdrun01 = $cmd01 & " " & $host & " " & $service1 & " " & $returncode & " " & $output& " " & $performance
EndIf
;service2
If $i = 2 Then
$performance = "time="&$serviceTime&"s;"&$serviceWarn&";"&$serviceCrit&";0"
$cmdrun01 = $cmd01 & " " & $host & " " & $service2 & " " & $returncode & " " & $output& " " & $performance
EndIf
;service3
If $i = 3 Then
$performance = "time="&$serviceTime&"s;"&$serviceWarn&";"&$serviceCrit&";0"
$cmdrun01 = $cmd01 & " " & $host & " " & $service3 & " " & $returncode & " " & $output& " " & $performance
EndIf
;service4
If $i = 4 Then
$performance = "time="&$serviceTime&"s;"&$serviceWarn&";"&$serviceCrit&";0"
$cmdrun01 = $cmd01 & " " & $host & " " & $service4 & " " & $returncode & " " & $output& " " & $performance
EndIf
Run($cmdrun01)
sleep (5000)
Next
Wend
Exit
;-- Functions --
Func _OBSKundenlogin($oIE_OBS, $customer, $role, $orgUnit)
$oForms = _IEFormGetCollection ($oIE_OBS, 0)
$o_customer = _IEFormElementGetObjByNameContains($oForms, "customer")
$o_role = _IEFormElementGetObjByNameContains($oForms, "role")
$o_orgUnit = _IEFormElementGetObjByNameContains($oForms, "orgUnit")
_IEFormElementSetValue($o_customer, $customer )
_IEFormElementSetValue($o_role, $role )
_IEFormElementSetValue($o_orgUnit, $orgUnit )
_IELinkClickByTextContains($oIE_OBS, "Weiter", "OBS Login")
If StringInStr(_IEBodyReadText($oIE_OBS),"Aus Ihrer letzten Bestellsystem-Anmeldung existiert noch ein gefüllter Warenkorb.") > 0 Then _IELinkClickByTextContains($oIE_OBS, "Neuen Warenkorb anlegen", "OBS Login neuer Warenkorb anlegen")
EndFunc
Die in der Test_IE.au3 selbst geschriebenen Methoden:
Spoiler anzeigen
; Angepasst
#include <Date.au3>
Func _IELinkClickByTextContains(ByRef $o_object, $s_linkText, $s_logText = "", $i_index = 0, $f_wait = 1, $f_log = 1)
If Not IsObj($o_object) Then
__IEErrorNotify("Error", "_IELinkClickByTextContains", "$_IEStatus_InvalidDataType")
SetError($_IEStatus_InvalidDataType, 1)
Return 0
EndIf
;
Local $found = 0, $link, $linktext, $links = $o_object.document.links
$i_index = Number($i_index)
For $link In $links
$linktext = $link.outerText & "" ; Append empty string to prevent problem with no outerText (image) links
If StringInStr($linktext, $s_linkText) Then
if ($found = $i_index) Then
$link.click
If $f_wait Then
If $f_log Then
$begin = TimerInit()
If _IELoadWait($o_object) Then
_LogInFile(@ScriptDir, @ScriptName, "_IELinkClickByTextContains: " & $s_linktext & ";" & $s_logText , TimerDiff($begin))
Else
_LogInFile(@ScriptDir, @ScriptName, "_IELinkClickByTextContains: " & $s_linktext & ";" & $s_logText, TimerDiff($begin))
_IEQuit($o_object)
EndIf
Else
_IELoadWait($o_object)
EndIf
SetError(@error)
Return -1
EndIf
SetError($_IEStatus_Success)
Return -1
EndIf
$found = $found + 1
EndIf
Next
__IEErrorNotify("Warning", "_IELinkClickByTextContains", "$_IEStatus_NoMatch")
SetError($_IEStatus_NoMatch) ; Could be caused by parameter 2, 3 or both
Return 0
EndFunc ;==>_IELinkClickByText
Func _IEFormElementGetObjByNameContains(ByRef $o_object, $s_Name, $i_index = 0)
If Not IsObj($o_object) Then
__IEErrorNotify("Error", "_IEFormElementGetObjByNameContains", "$_IEStatus_InvalidDataType")
SetError($_IEStatus_InvalidDataType, 1)
Return 0
EndIf
;
If Not __IEIsObjType($o_object, "form") Then
__IEErrorNotify("Error", "_IEFormElementGetObjByNameContains", "$_IEStatus_InvalidObjectType")
SetError($_IEStatus_InvalidObjectType, 1)
Return 0
EndIf
;----- Get Fullname out of containing Name
For $item in $o_object.document.forms.item
If StringInStr($item.name, $s_Name) Then $s_Name = $item.name
Next
;-----
;----- Determine valid collection length
Local $o_col, $i_length = 0
$o_col = $o_object.elements.item ($s_Name)
If IsObj($o_col) Then
If __IEIsObjType($o_col, "elementcollection") Then
$i_length = $o_col.length
Else
$i_length = 1
EndIf
EndIf
;-----
$i_index = Number($i_index)
If $i_index = -1 Then
SetError($_IEStatus_Success)
SetExtended($i_length)
Return $o_object.elements.item ($s_Name)
Else
If IsObj($o_object.elements.item ($s_Name, $i_index)) Then
SetError($_IEStatus_Success)
SetExtended($i_length)
Return $o_object.elements.item ($s_Name, $i_index)
Else
__IEErrorNotify("Warning", "_IEFormElementGetObjByNameContains", "$_IEStatus_NoMatch")
SetError($_IEStatus_NoMatch) ; Could be caused by parameter 2, 3 or both
Return 0
EndIf
EndIf
EndFunc ;==>_IEFormElementGetObjByNameContains
Func _PortalLogin($user = "", $pwd = "", $url = "http://sportal.viessmann.com/wps/myportal", $hidden = "false")
Opt("WinTitleMatchMode", 2)
If $hidden = "true" then
$oIE = _IECreate($url, 0, 0)
;ShellExecute("iexplore.exe", $url, "","", @SW_HIDE)
;WinWait("")
;$oIE = _IEAttach(WinGetHandle("[active]"), "HWND")
else
$oIE = _IECreate($url)
;ShellExecute("iexplore.exe", $url)
;WinWait("")
;$oIE = _IEAttach(WinGetHandle("[active]"), "HWND")
endif
_IELinkClickByTextContains($oIE, "... treten Sie ein!", "Einstiegsseite laden")
$oForms = _IEFormGetCollection ($oIE, 0)
if _IEFormElementGetObjByNameContains($oForms, "wps.portlets.userid") <> 0 Then
$o_user = _IEFormElementGetObjByNameContains($oForms, "wps.portlets.userid")
Else
$o_user = _IEFormElementGetObjByNameContains($oForms, "username")
EndIf
$o_pwd = _IEFormElementGetObjByNameContains($oForms, "password")
_IEFormElementSetValue($o_user, $user)
_IEFormElementSetValue($o_pwd, $pwd )
_IEFormSubmit($oForms, 1)
Return $oIE
EndFunc
Func _PortalLogout(ByRef $oIE)
_IELinkClickByTextContains($oIE, "Abmelden", "Portalabmeldung")
_IEQuit($oIE)
EndFunc
Func _LogInFile ($scriptdir, $scriptname, $logtext, $logtime)
$output = ""
DirCreate($scriptdir&"\log\")
DirCreate($scriptdir&"\log\"&$scriptname&"\" & @YEAR &"_"& @MON &"_"& @MDAY)
$dir = $scriptdir&"\log\"&$scriptname&"\" & @YEAR &"_"& @MON &"_"& @MDAY & "\"
$logtime = Round($logtime/1000, 2)
$filename = $dir & "log.txt"
$file = FileOpen($filename, 1)
; Status anhand der Antwortzeit setzen
if $logtime >= $logCrit Then
$output = StringFormat("%s%s%s", "CRITICAL;",$logtime,"s")
ElseIf $logtime >= $logWarn Then
$output = StringFormat("%s%s%s", "WARNING;",$logtime,"s")
ElseIf $logtime < $logWarn Then
$output = StringFormat("%s%s%s", "OK;",$logtime,"s")
EndIf
;Text der ins das Logfile geschrieben wird
$filetext = $server&";"&$anwendung&";"&_DateTimeFormat(_NowCalc(), 2)& ";" & _DateTimeFormat(_NowCalc(), 3) & ";" & $logtext & ";" &$output& @CRLF
FileWrite($file, $filetext)
FileClose($file)
EndFunc
Func _BAPILogInFile ($scriptdir, $scriptname, $logtext, $logtime)
$output = ""
DirCreate($scriptdir&"\log\")
DirCreate($scriptdir&"\log\"&$scriptname&"\" & @YEAR &"_"& @MON &"_"& @MDAY)
$dir = $scriptdir&"\log\"&$scriptname&"\" & @YEAR &"_"& @MON &"_"& @MDAY & "\"
$logtime = Round($logtime/1000, 2)
$filename = $dir & "log.txt"
$file = FileOpen($filename, 1)
; Status anhand der Antwortzeit setzen
if $logtime >= 10000 Then
$output = StringFormat("%s%s%s", "CRITICAL;",$logtime,"ms")
ElseIf $logtime >= 5000 Then
$output = StringFormat("%s%s%s", "WARNING;",$logtime,"ms")
ElseIf $logtime < 5000 Then
$output = StringFormat("%s%s%s", "OK;",$logtime,"ms")
EndIf
$filetext = $server&";"&$anwendung&";"&_DateTimeFormat(_NowCalc(), 2)& ";" & _DateTimeFormat(_NowCalc(), 3) & ";" & $logtext & ";" &$output& @CRLF
FileWrite( $file, $filetext)
FileClose($file)
EndFunc
Config.ini
Spoiler anzeigen
[base]
host=Roboter_Portal
service1=Angebot_1_1
service2=Angebot_1_2
service3=Angebot_2_1
service4=Angebot_2_2
cmd01=submit.cmd
[check]
in Sekunden
logWarning=5
logCritical=10
serviceWarn=30
serviceCrit=45
[run]
hidden=false
Über Tipps, Anregungen und Hilfen würde ich mich freuen
Gruß GreS