Jump to content
Sign in to follow this  

Recommended Posts

Hello everyone!

I'm trying to polish some of my functions now that I botched up my GUI and basic functions, and have a somewhat realiable code. I happen to have a few questions, to which I would like to get some insight from you.

I have an "old" problem with my script. While it works with the PDFCreator (1.7.1 but I think It just got updated a few days ago)  it sometimes seems to skip ControlSetText. I don't know why this happens but I developed a habbit of double up on it, which decresed the occurrence of these bugs but it's far from a solution, and it isnt even an elegant bandage on it. Anyidea why this could happen? In some other functions I used the click on the said coordinates twice then send Delete and type the name i want, that seems to work well.

Another problem is, that sometimes when I try to make the script to click on a button, it simply doesnt do that, or since everytime this button is the Save button  (in this example at least)  which is the highlighted button on the form I simply used Send("{ENTER}") but it doesnT perform on a 100% neither. Because of this I'm experimenting with the WinWaitActivate 's timeut function. I'm trying to make it so if the window that should pop up next isn't activateing, the script tries to click on the Save button again. When I tried to test it, I commented out the first Save button click to see how it works, and It basicly Jumped a "nameing syntax" ahead (sorry don't really know how else to say it) so instead of blablabla(1) it wrote blablabla(2) and tried to save like that. I think this is because of a logical error from my part, but can't seem to figure it out (Once I get it wrok I think I will write it as a different function and call it everytime i need it, that would make the code a bit more tidy)

Also a the beginning of the code I try to handle the possibility of the PDFCreator signaling that there is a new update to download, I tried to check for the MsgBox but it didn't work when a real update came while i was working and it stuck. Makeing things worst I'm not sure how to test it effectivly without actuaql software update, should I try to write a MsgBox for i myself? I don't think thats a dependable test of the script.

I would also like to check the Text from the textbox PDFCreator use for saving the PDFs, to see if it's at least something like it should be, I already have a solution for that, and I gonna check for it now but I think this is already a pretty impressive wall of text so thank you if you even read through it. I maybe ask other questions later. Ask anything and I try to provide what you asks for.

Thanks again

Code: 

ControlClick("Megerősítés", "Igen", "[CLASSNN:TBitBtn2]")
    Sleep(500)
    WinWaitActive("Információ", "Sikeres Topup feltöltés")
    WinKill("Információ", "Sikeres Topup feltöltés")
    Sleep(3000)
    If WinActivate("PDFCreator", "Újabb verzió érhető el:") Then ;PDF Creator new version handleing
        WinClose("PDFCreator", "Újabb verzió érhető el:")
    EndIf
    WinWaitActive("PDFCreator")
    Sleep(500)
    ControlFocus("PDFCreator", "", "ThunderRT6TextBox5")
    Sleep(1000)
    Local $date = "\" & ControlGetText("PDFCreator", "", "[CLASSNN:ThunderRT6TextBox5]")
    Local $TopUpdate = "TeszttTopUp_KP_Euro_sztornó_vásárlás" & ControlGetText("PDFCreator", "", "[CLASSNN:ThunderRT6TextBox5]")
    Local $TopUpdate2 = "TeszttTopUp_KP_Euro_számla_sztornó_vásárlás" & ControlGetText("PDFCreator", "", "[CLASSNN:ThunderRT6TextBox5]")
    Sleep(500)
    WinActivate("Folyószámla", "")
    ControlClick("Folyószámla", "", "[CLASSNN:TAdvBitBtn12]")
    WinActivate("Információ", "")
    Sleep(500)
    Local $Egyenleg = WinGetHandle("Információ", "")
    _ScreenCapture_CaptureWnd(@MyDocumentsDir & $date & "egyenleg.jpg", $Egyenleg)
    Sleep(400)
    WinKill("Információ")
    WinActivate("PDFCreator")
    Sleep(2000)
    ControlSetText("PDFCreator", "", "ThunderRT6TextBox6", $TopUpdate & "(1)")
    Sleep(500)
    ControlSetText("PDFCreator", "", "ThunderRT6TextBox6", $TopUpdate & "(1)")
    ControlClick("PDFCreator", "", "[CLASSNN:ThunderRT6CommandButton7]")
    Sleep(300)
    WinWaitActive("Mentés másként", "", 10)
    If WinWaitActive = 0 Then
        WinActivate("PDFCreator")
        ControlClick("PDFCreator", "", "[CLASSNN:ThunderRT6CommandButton7]")
        WinWaitActive("Mentés másként", "", 10)
    EndIf
    Sleep(300)
    Send("{ENTER}")
    WinWaitActive("PDFCreator","",10)
    If WinWaitActive("PDFCreator") = 0 Then
        ControlClick("Mentés Másként","","[CLASSNN:Button1]")
        WinWaitActive("PDFCreator","",10)
    EndIf
    Sleep(1000)
    ControlSetText("PDFCreator", "", "ThunderRT6TextBox6", $TopUpdate & "(2)")
    Sleep(1000)
    ControlSetText("PDFCreator", "", "ThunderRT6TextBox6", $TopUpdate & "(2)")
    ControlClick("PDFCreator", "", "[CLASSNN:ThunderRT6CommandButton7]")
    Sleep(300)
    WinWaitActive("Mentés másként", "", 10)
    If WinWaitActive = 0 Then
        WinActivate("PDFCreator")
        ControlClick("PDFCreator", "", "[CLASSNN:ThunderRT6CommandButton7]")
        WinWaitActive("Mentés másként", "", 10)
    EndIf
    Sleep(300)
    Send("{ENTER}")
    WinWaitActive("PDFCreator","",10)
    If WinWaitActive("PDFCreator") = 0 Then
        ControlClick("Mentés Másként","","[CLASSNN:Button1]")
        WinWaitActive("PDFCreator","",10)
    EndIf
    Sleep(1000)
    ControlSetText("PDFCreator", "", "ThunderRT6TextBox6", $TopUpdate2 & "(1)")
    Sleep(1000)
    ControlSetText("PDFCreator", "", "ThunderRT6TextBox6", $TopUpdate2 & "(1)")
    ControlClick("PDFCreator", "", "[CLASSNN:ThunderRT6CommandButton7]")
    Sleep(300)
    WinWaitActive("Mentés másként", "", 10)
    If WinWaitActive = 0 Then
        WinActivate("PDFCreator")
        ControlClick("PDFCreator", "", "[CLASSNN:ThunderRT6CommandButton7]")
        WinWaitActive("Mentés másként", "", 10)
    EndIf
    Sleep(300)
    Send("{ENTER}")
    WinWaitActive("PDFCreator","",10)
    If WinWaitActive("PDFCreator") = 0 Then
        ControlClick("Mentés Másként","","[CLASSNN:Button1]")
        WinWaitActive("PDFCreator","",10)
    EndIf
    Sleep(1000)
    ControlSetText("PDFCreator", "", "ThunderRT6TextBox6", $TopUpdate2 & "(2)")
    Sleep(1000)
    ControlSetText("PDFCreator", "", "ThunderRT6TextBox6", $TopUpdate2 & "(2)")
    ControlClick("PDFCreator", "", "[CLASSNN:ThunderRT6CommandButton7]")
    Sleep(300)
    WinWaitActive("Mentés másként", "", 10)
    If WinWaitActive = 0 Then
        WinActivate("PDFCreator")
        ControlClick("PDFCreator", "", "[CLASSNN:ThunderRT6CommandButton7]")
        WinWaitActive("Mentés másként", "", 10)
    EndIf
    Sleep(300)
    Send("{ENTER}")

    WinActivate("Folyószámla")
    ControlClick("Folyószámla", "Topup sztornó (utolsó)", "[CLASSNN:TAdvBitBtn13]") ; Miért van Befizetés ablak?
    
    WinActivate("Megerősítés")
    
    Send("{ENTER}")
    WinWaitActive("Megerősítés")
    ControlClick("Megerősítés", "", "[CLASSNN:TBitBtn1]")
    
    Sleep(500)
    WinWaitActive("PDFCreator","",10)
    If WinWaitActive("PDFCreator") = 0 Then
        ControlClick("Mentés Másként","","[CLASSNN:Button1]")
        WinWaitActive("PDFCreator","",10)
    EndIf

Share this post


Link to post
Share on other sites

The function itselfs is trying to automate some testing which was done by the users before, it hast to handle a lot of different windows as they popup reporting different "irrelevant things" or ask for extra conformation, so These are the different winwaitactive -> winkill same window. I think the code is hard to read for anyone else, I use tidyAutoIt but this doesn't prevent me to write very simplistic codes, sorry for that

Share this post


Link to post
Share on other sites

The best way to do debugging, especially on a complex script, is to set up value (variable etc) testing.

The three methods I use, are

[1] Msgbox

[2] Console in SciTE.

[3] Writing to file (txt or ini)

There are debug programs available too.

In many cases, you are the only one who is in a position to do an effective debug, especially where dependencies (etc) are involved.


Make sure brain is in gear before opening mouth!
Remember, what is not said, can be just as important as what is said.

Spoiler

What is the Secret Key? Life is like a Donut

If I put effort into communication, I expect you to read properly & fully, or just not comment.
Ignoring those who try to divert conversation with irrelevancies.
If I'm intent on insulting you or being rude, I will be obvious, not ambiguous about it.
I'm only big and bad, to those who have an over-active imagination.

I may have the Artistic Liesense ;) to disagree with you. TheSaint's Toolbox (be advised many downloads are not working due to ISP screwup with my storage)

userbar.png

Share this post


Link to post
Share on other sites

The script is not really large enough to prevent you from adding it to a new script one or more lines at a time and testing if the script works up to that point. If you run into a problem this way then ask on the forums.

One thing I see that is unnecessary is the sleep after the winwait. That's what winwait is for. That being said I too sometimes add a sleep after a winwait.


Get Scite to add a popup when you use a 3rd party UDF -> http://www.autoitscript.com/autoit3/scite/docs/SciTE4AutoIt3/user-calltip-manager.html

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By Yodavish
      My AutoIt script works fine, for the most part, however, if it goes idle for roughly 30 minutes, it will won't be able to send data to a 3rd party application window titled, "Case #". 
      The problem lies within the function "SendFusion", it's able to see the handle for the "WinActivate" and "WinWaitActivate" (I've also tried putting in 10 seconds in the WinWaitActivate as well, doesn't work). However, if we have been idle, it will always fail to send data afterward. On what I've tried so far:
      "Send" function with the data and a {ENTER} i.e. Send($CaseTxt & "{ENTER}"), this won't even hit the enter key  ControlSetText, tried passing the handle from WinActivate, using the title "Case #" that was copied directly from the Autoit Window Info, hard coding the title, Using CLASS:WindowsForms10... always returns a 0 ControlCommand (same as above) always returns a 0 ControlGetFocus always returns a 0 ControlFocus, always returns a 0 Creating a new and simple Au3 script that just sends data to "Case #", also fails NOTE: If I close the Au3 script and just scan the data directly into the "Case #" or even type it, it works fine with no issues. I'm confused as to why it would not work after a long idle period?
      Below are the essential parts of the script, I can provide the entire thing if needed. Any suggestions would be greatly appreciated!
      #include <AutoItConstants.au3> #include <GUIConstantsEx.au3> #include <MsgBoxConstants.au3> #include <Process.au3> #include <Misc.au3> #include <IE.au3> ;--------------------------------------------------------------- ; Only one instance can run ;--------------------------------------------------------------- If _Singleton("gross.exe", 1) = 0 Then MsgBox($MB_SYSTEMMODAL, "Warning", "Gross.exe is already running. Please exit the existing version first (check the icons in the lower right corner of your screen) before running it again.") Exit EndIf ;--------------------------------------------------------------- ; AutoIt Options ;--------------------------------------------------------------- Opt("GUIOnEventMode", 1) ; Change to OnEvent mode Opt("WinWaitDelay", 0) ; Alters how long a script should briefly pause after a successful window-related operation. Time in milliseconds to pause (default=250). Opt("WinTextMatchMode", 1) ; Alters the method that is used to match window text during search operations. 2 = Quick mode Opt("SendKeyDelay", 0) ; Alters the length of the brief pause in between sent keystrokes. A value of 0 removes the delay completely. Time in milliseconds to pause (default=5). if ($fusionWindowTitle="NONE" or $fusionCaseNumWinTitle="NONE" or $appWindowTitle="NONE" or $winActivateTimeout="NONE" or $winCloseTimeout="NONE" or $winWaitTimeout="NONE" or $pdfViewerWidth="NONE" or $pdfViewerHeight="NONE" or $pdfViewerLeft="NONE" or $pdfViewerWindowName="NONE" or $pdfViewerExeName="NONE" or $pdfUrl="NONE" or $pdfDownloadCommand="NONE") Then Msgbox(0,"ERROR", "gross.ini is missing or does not contain all settings. Please contact Help Desk with this information") Exit -1 EndIf ;--------------------------------------------------------------- ; application settings/constants ;--------------------------------------------------------------- Global Const $[VARIABLE] = IniRead("gross.ini", "default", "[TitleOfVariable]", "NONE") Global Const $[VARIABLE] = IniRead("gross.ini", "default", "[TitleOfVariable]", "NONE") Global Const $[VARIABLE] = IniRead("gross.ini", "default", "[TitleOfVariable]", "NONE") Global Const $[VARIABLE] = IniRead("gross.ini", "default", "[TitleOfVariable]", "NONE") ;--------------------------------------------------------------- ; create the main window ;--------------------------------------------------------------- Local $mainWindow = GUICreate($appWindowTitle, 380, 190) ; create the main GUI window GUISetOnEvent($GUI_EVENT_CLOSE, "handleCloseClick") ; when the click the windows close button call handleCloseClick() WinSetOnTop($appWindowTitle, '', 1) ; Sets main GUI always on top ;--------------------------------------------------------------- ; create the controls on the main window ;--------------------------------------------------------------- Local $okButton = GUICtrlCreateButton("OK", 160, 160, 54,24) ; create OK button GUICtrlSetOnEvent($okButton, "validateInput") ; when they click ok, call handleInputProcessRequest() GUICtrlCreateLabel("Scan Input", 10, 10) ; create a label Global $inputScan = GUICtrlCreateInput("", 10,134,358) ; create the input scan box GUICtrlSetOnEvent($inputScan, "validateInput") ; when they press enter in the scan input box, call handleInputProcessRequest() GUICtrlSetState($inputScan,$GUI_FOCUS) ; automatically sets focus on the input field GUISetState(@SW_SHOW) ; main GUI loop that runs at all times ;--------------------------------------------------------------- While 1 ;---------------------------------------------------------- ; If sumatraPDF active, resets focus back to GUI ;---------------------------------------------------------- If WinActive($pdfViewerWindowName) Then consoleWrite('While Loop sumatraPDF was active' & @CRLF) setMainWindow() ;---------------------------------------------------------- ; After data sent to ProTracker, check for mismatch ; save button to trigger the event handler when clicked ;---------------------------------------------------------- ElseIf WinActive($proTrackerWindowTitle) Then $ie = _IEAttach("ProTracker") $mismatchButton = _IEGetObjByName($ie, $proTrackerMisMatchButtonId) $oEvent = ObjEvent($mismatchButton, "mismatchButton_") If @error Then setMainWindow() ;--------------------------------------------------------------------- ; If Fusion is prompting for the case #, focus back to main GUI input ; If second GUI 'Unknown' detect do nothing ;--------------------------------------------------------------------- ElseIf WinExists($fusionWindowTitle) and WinExists($fusionCaseNumWinTitle) and Not WinActive($mainWindow) and Not WinExists('Unknown Input') Then setMainWindow() EndIF ;--------------------------------------------------------------------- ; Checks if $processFlag = Done, if so, shows PDF viewer and clears ; processFlag for next iteration ;--------------------------------------------------------------------- IF WinExists($pdfViewerWindowName) and $processFlag == 'Done' Then WinSetState ($pdfViewerWindowName, '', @SW_SHOW) $processFlag = '' setMainWindow() EndIF Sleep(100) ; Sleep to reduce CPU usage WEnd Func handleInputProcessRequest($input) $processFlag = True Local $hTimer = TimerInit() consoleWrite('> handleInputProcessRequest: ' & @CRLF) Local $idInput = identifyInput($input) ; Select a proccess to run based on id input Select Case $idInput = "container" ; regex that captures only the case number $caseTxt = StringUpper(StringRegExpReplace($strippedInputData, '\??(\w*\d*-\d*|\d*).*$','$1')) If WinExists($fusionWindowTitle) and WinExists($fusionCaseNumWinTitle) Then sendProTracker(StringUpper($strippedInputData)) sendFusion($caseTxt) ; gets pdf for sumatraPDF in seperate script, since that function is the slowest Run("viewPDF.exe " & $caseTxt) ;getSumatraPDF($caseTxt) $lastCaseNum = $caseTxt Else ; Checks to make sure the previous "Container" case num is the same ; to the current Container case num, before sending to ProTracker If($lastCaseNum <> $caseTxt) Then ; If not the same case number send alert sound SoundPlay("error.wav") Else sendProTracker($strippedInputData) EndIf EndIf Case $idInput = "user" sendProTracker($strippedInputData) Case $idInput = "cassette" sendProTracker(StringUpper($strippedInputData)) Case $idInput = "unknown" selectUnknown() EndSelect Local $fDiff = TimerDiff($hTimer) $processFlag = 'Done' consoleWrite('> handleInputProcessRequest Completed Total time: ' & $fDiff & ' ' &@CRLF&@CRLF&@CRLF) EndFunc Func sendFusion($caseTxt)     Local $hTimer = TimerInit()     consoleWrite('+ sendFusion initiated: ' & $caseTxt & @CRLF)     If $caseTxt = "" Then         MsgBox(0, "Error", "Not a valid case number")     Else         ;$fusionCaseNumWinTitle = "Case #"         $retVal1 = WinActivate($fusionCaseNumWinTitle, "")         consoleWrite("ReturnValue WinActivate " & $retVal1 & @CRLF)         $retVal2 = WinWaitActive($fusionCaseNumWinTitle,"",$winActivateTimeout)         consoleWrite("ReturnValue WinWaitActive: " & $retVal2 & @CRLF)         $retVal3 = ControlSetText($fusionCaseNumWinTitle, "", "", $caseTxt)         ;$retVal3 = ControlCommand($fusionCaseNumWinTitle, "", "", "EditPaste", $caseTxt)         consoleWrite("ReturnValue ControlSetText: " & $retVal3 & @CRLF)         ;Send($caseTxt & "{ENTER}")         WinWaitClose($fusionCaseNumWinTitle, "", $winCloseTimeout)         consoleWrite('+ sendFusion WinWaitClose: ' & @CRLF)     EndIf     Local $fDiff = TimerDiff($hTimer)     ConsoleWrite('+ sendFusion Completed Total time:' & $fDiff & ' ' & @CRLF) EndFunc
      Console logs from the SciTLE
      Window (x86) Info matches the correct handle for the WinActivate and WinWaitActivate

      Window Control (x86) Info, I've tried the CLASS, the ID, also I just noticed that the "handle" in "Control" and "Window" appear to be different as well.

       
      So far the only work-around is to close down the 3rd party application and the AutoIt script, re-open them and it works all completely fine. But this is a pain for the end-user since it's all touch screen and it slows down their workflow, which they can be extremely sensitive about.
       
    • By Rskm
      i have a code where the ControlSetText was working perfectly. now its not working. please see the video and snap attached. The snap show the way i have used window info. In the video,  when the dialogue box opens, it used to key in 'sea.runx' , but now its not working so... what could be the reason. the script used is as shown below - thanks
       
      WinActivate("SACS 5.3 V8i")
       winwaitactive("SACS 5.3 V8i")
      send("^r")
      winwaitactive("SACS Run Files")
      ControlSetText ("SACS Run Files","",1148,"sea.runx")
      SEND("{ENTER}")2018-03-22 at 00-02-47.mp4
       

    • By ur
      I need to set value to a text box to a desktop application.
       
      I am trying to do that with 
      ControlSetText($MartConfigWindow, "", "WindowsForms10.EDIT.app.0.378734a6", $dbserver)  
      where $MartConfigWindow has the window ID.
      And the text box field is having class as WindowsForms10.EDIT.app.0.378734a6
       
      THis code is working on one machine but on some machines, the last part of ID WindowsForms10.EDIT.app.0.378734a6, means 378734a6
      is changing.
       
      Is there anyway to handle this?
    • By zerothesavior
      I can't get this to work.
      ControlSetText("[CLASS:#32770]", "", "[CLASS:Edit; INSTANCE:3]", $sString) Am I doing something wrong? The string is not blank, I checked it with a message box.
      Here is the information from the window:
      >>>> Control <<<< Class: Edit Instance: 3 ClassnameNN: Edit3 Name: Advanced (Class): [CLASS:Edit; INSTANCE:3] ID: 1001 Text: Position: 47, 78 Size: 187, 14 ControlClick Coords: 112, 9 Style: 0x50000380 ExStyle: 0x00000000 Handle: 0x000000000021064A  
    • By Carm01
      All,
       
      I have windows 10 64 bit pro with the latest versions of scite and 3.3.14.2 installed. Not that it matters for this instance.
      My monitor resolution is 1920 x 1080 progressive with a refresh rate of 64 HZ ( more in a min on that )
      I have a Nvida gtx 960 card and an HP monitor
      Since moving to Windows 10 and this configuration ( latest drivers of course ) I am unable to see the " ControlSetText " being displayed under the standard 60HZ refresh rate in WIndows 10. On Windows 7 machines this is flawless and always had been. The ControlSetText is updated at an extremely fast rate. IF I change the resolution one notch lower in windows 10 the display displays the text like in Windows 7 60HZ refresh. IF I user the max resolution 1920 x 1080 @ 60 HZ nothing is displayed in Windows 10. IF I create a custom resolution profile and just change the refresh rate to 64HZ it displays normally in Windows 10.
      If I enable " GUIGetMsg() " it displays fine but processes very slow fyi
      I will place the relevant code below. I am wondering:
      1) what is the max refresh/update rate for ControlSetText ( fasted it can be updated )
      2) Could this be adjusted either in code without hampering processing speed
      3) Does this need to be addressed in AutoIT program itself as a bug ?
       
       
       
      #include <Array.au3> #include <File.au3> Local $aRetArray, $aArray local $sFilePath = @ScriptDir & "\info.txt" _FileReadToArray($sFilePath, $aRetArray) Local $aArray[UBound($aRetArray)] SplashTextOn("Percent Complete", "", 130, 40, -1, -1, 16, "") Local $a = 0 Local $hTimer = TimerInit() $bb = UBound($aRetArray) - 1 For $i = 1 To UBound($aRetArray) - 1 ; ;GUIGetMsg();prevent high cpu usage $line = $aRetArray[$i] If StringRight($line, 2) = " X" Then If $i = 1 Then $line1 = StringLen($line) - StringLen($aRetArray[$i]) $line2 = StringRight($line, $line1) $line3 = $aRetArray[$i] $line4 = $aRetArray[$i + 1] Else $line1 = StringLen($line) - StringLen($aRetArray[$i - 1]) $line2 = StringRight($line, $line1) $line3 = $aRetArray[$i - 1]; $line4 = $aRetArray[$i + 1]; EndIf $aArray[$a] = $i & "| " & $line3 & "| " & $line2 & "| " & $line4 $a = $a + 1 EndIf ControlSetText("Percent Complete", "", "Static1", Round((($i / $bb) * 100), 2)) Next Thanks in advance
×
×
  • Create New...