Jump to content

Recommended Posts

UI Automation is amazing, what bothered me immediately though, was the lack of functions in LarsJ's approach. This is UDF tries to wrap up his approach into functions. LarsJ put a ton of work into making simple examples and I was eventually able to follow along. I highly suggest reading through at least some of those examples before starting here.

When I was writing all of the functions, I started to notice more repetition and it started to remind me of the AutoIt window format of "TITLE:Window Name;CLASS:Window Class". I abstracted the functions one step further by parsing the simpler conditions from text, resulting in two methods to create them. See the examples file for more details.

I've been working on this for a few years and finally decided that it was good enough that it might be helpful for someone. There won't likely be too many more updates from me as I don't use it much anymore, but I'll be happy to accept pull-requests or suggestions :) 

The UDF is hosted on GitHub: https://github.com/seadoggie01/UI-SimpleWrappers

Edited by seadoggie01

All my code provided is Public Domain... but it may not work. ;) Use it, change it, break it, whatever you want.

Spoiler

My Humble Contributions:
Personal Function Documentation - A personal HelpFile for your functions
Acro.au3 UDF - Automating Acrobat Pro
ToDo Finder - Find #ToDo: lines in your scripts
UI-SimpleWrappers UDF - Use UI Automation more Simply-er
KeePass UDF - Automate KeePass, a password manager

Link to post
Share on other sites
  • seadoggie01 changed the title to UI-SimpleWrappers UDF

Great work, I was doing this myself when I was working on an automation project for work, I didn't get very far and basically only did what I needed with no documentation aside from the code itself.

Kudos for doing all the dirty work and making it a neat little package, I am sure a lot of people would find it very useful, maybe @LarsJ and @junkew could drop a mention of your UDF in their respective topics :)

By the way, you should consider applying a proper license to your code. By default copyright applies to anything you make, especially if it is a major part of something, I'd recommend something like the MIT license which requires credit but aside from that the end-user can do whatever they want.

EasyCodeIt - A cross-platform AutoIt implementation

DcodingTheWeb Forum - Follow for updates and Join for discussion

Link to post
Share on other sites

Nice to see more examples of using UIA.

We should merge it at a certain time 😉 

Some of the stuff you wrote is also in the UIAWrappers and simplespy tried to give simple code but you have to read the code so lack of documentation makes it hard although all is in the examples written around and in the lenghty thread.

I never came further then V0.70 and after that I have seen @LarsJ giving excelent examples and continued with the latest definitions for W8 and W10 with an excellent spying tool that gives bits and pieces of code generation.

As you said UIA automation is amazing but a challenging framework (just as webdriver or playwright or ....)

Link to post
Share on other sites

Haha.... I and @Danyfirex we did something similar.... WIP.

I post it here tomorrow.

Edited by mLipok

Signature beginning:
Please remember: "AutoIt"..... *  Wondering who uses AutoIt and what it can be used for ? * Forum Rules *
ADO.au3 UDF * POP3.au3 UDF * XML.au3 UDF * IE on Windows 11 for other useful stuff click the following button:

Spoiler

Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind. 

My contribution (my own projects): * Debenu Quick PDF Library - UDF * Debenu PDF Viewer SDK - UDF * Acrobat Reader - ActiveX Viewer * UDF for PDFCreator v1.x.x * XZip - UDF * AppCompatFlags UDF * CrowdinAPI UDF * _WinMergeCompare2Files() * _JavaExceptionAdd() * _IsBeta() * Writing DPI Awareness App - workaround * _AutoIt_RequiredVersion() * Chilkatsoft.au3 UDF * TeamViewer.au3 UDF * JavaManagement UDF * VIES over SOAP * WinSCP UDF * GHAPI UDF - modest begining - comunication with GitHub REST APIErrorLog.au3 UDF - A logging Library * Include Dependency Tree (Tool for analyzing script relations) *

My contribution to others projects or UDF based on  others projects: * _sql.au3 UDF  * POP3.au3 UDF *  RTF Printer - UDF * XML.au3 UDF * ADO.au3 UDF SMTP Mailer UDF * Dual Monitor resolution detection * * 2GUI on Dual Monitor System * _SciLexer.au3 UDF * SciTE - Lexer for console pane

Useful links: * Forum Rules * Forum etiquette *  Forum Information and FAQs * How to post code on the forum * AutoIt Online Documentation * AutoIt Online Beta Documentation * SciTE4AutoIt3 getting started * Convert text blocks to AutoIt code * Games made in Autoit * Programming related sites * Polish AutoIt Tutorial * DllCall Code Generator * 

Wiki: Expand your knowledge - AutoIt Wiki * Collection of User Defined Functions * How to use HelpFile * Good coding practices in AutoIt * 

OpenOffice/LibreOffice/XLS Related: WriterDemo.au3 * XLS/MDB from scratch with ADOX

IE Related:  * How to use IE.au3  UDF with  AutoIt v3.3.14.x * Why isn't Autoit able to click a Javascript Dialog? * Clicking javascript button with no ID * IE document >> save as MHT file * IETab Switcher (by LarsJ ) * HTML Entities * _IEquerySelectorAll() (by uncommon) * IE in TaskSchedulerIE Embedded Control Versioning (use IE9+ and HTML5 in a GUI) * PDF Related:How to get reference to PDF object embeded in IE * IE on Windows 11

I encourage you to read: * Global Vars * Best Coding Practices * Please explain code used in Help file for several File functions * OOP-like approach in AutoIt * UDF-Spec Questions *  EXAMPLE: How To Catch ConsoleWrite() output to a file or to CMD *

I also encourage you to check awesome @trancexx code:  * Create COM objects from modules without any demand on user to register anything. * Another COM object registering stuffOnHungApp handlerAvoid "AutoIt Error" message box in unknown errors  * HTML editor

winhttp.au3 related : * https://www.autoitscript.com/forum/topic/206771-winhttpau3-download-problem-youre-speaking-plain-http-to-an-ssl-enabled-server-port/

"Homo sum; humani nil a me alienum puto" - Publius Terentius Afer
"Program are meant to be read by humans and only incidentally for computers and execute" - Donald Knuth, "The Art of Computer Programming"
:naughty:  :ranting:, be  :) and       \\//_.

Anticipating Errors :  "Any program that accepts data from a user must include code to validate that data before sending it to the data store. You cannot rely on the data store, ...., or even your programming language to notify you of problems. You must check every byte entered by your users, making sure that data is the correct type for its field and that required fields are not empty."

Signature last update: 2022-03-07

Link to post
Share on other sites
14 hours ago, TheDcoder said:

you should consider applying a proper license

Ew, but I completely understand and it's updated :P

9 hours ago, junkew said:

We should merge it at a certain time 😉 

I'd be very happy to do that, especially as I was unable to get a few pieces working, like TreeViews and Conditional Arrays. And I'm sure you have some higher level functions that would make this entire thing a lot simpler... I just struggled to get your code working when I was getting started :)

And I'd be happy to merge with you too, @mLipok. Now I wish I'd posted this all a bit sooner!

All my code provided is Public Domain... but it may not work. ;) Use it, change it, break it, whatever you want.

Spoiler

My Humble Contributions:
Personal Function Documentation - A personal HelpFile for your functions
Acro.au3 UDF - Automating Acrobat Pro
ToDo Finder - Find #ToDo: lines in your scripts
UI-SimpleWrappers UDF - Use UI Automation more Simply-er
KeePass UDF - Automate KeePass, a password manager

Link to post
Share on other sites
On 12/3/2021 at 9:44 PM, mLipok said:

Haha.... I and @Danyfirex we did something similar.... WIP.

I post it here tomorrow.

As I said I had a need to do some stuff .
It was simple Click Yes/No/Cancel/Ok on NetFrameworks GUI.

Example:
 

Opt("MustDeclareVars", 1)
#AutoIt3Wrapper_UseX64=n ; If target application is running as 32 bit code
#AutoIt3Wrapper_Run_AU3Check=Y
#AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7

#include "UIASimple.au3"

_Test()

Func _Test()
    _Log_SetOutputFunction(__UIASimple_ConsoleWrite)
    Local $sTitle = "YOURS WINDOW TITLE TO FIND"
    Local $sText = "YOURS EXACT TEXT TO FIND IN THE WINDOW"
    If _UIASimple_WinExist($sTitle, $sText) Then
        _UIASimple_YesNo($sTitle, $sText, "Yes")
        MsgBox($MB_OK + $MB_TOPMOST + $MB_ICONINFORMATION, "Information #" & @ScriptLineNumber, "Exist" & @CRLF & $sTitle & @CRLF & $sText)
    Else
        MsgBox($MB_OK + $MB_TOPMOST + $MB_ICONINFORMATION, "Information #" & @ScriptLineNumber, "Not Exist" & @CRLF & $sTitle & @CRLF & $sText)
    EndIf

EndFunc   ;==>_Test


As I said I work on this project for my needs together with @Danyfirex so the real author of this UAISimple.au3 UDF is @Danyfirex

btw. it uses my ErrorLog.au3

UIASimple.au3

Edited by mLipok

Signature beginning:
Please remember: "AutoIt"..... *  Wondering who uses AutoIt and what it can be used for ? * Forum Rules *
ADO.au3 UDF * POP3.au3 UDF * XML.au3 UDF * IE on Windows 11 for other useful stuff click the following button:

Spoiler

Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind. 

My contribution (my own projects): * Debenu Quick PDF Library - UDF * Debenu PDF Viewer SDK - UDF * Acrobat Reader - ActiveX Viewer * UDF for PDFCreator v1.x.x * XZip - UDF * AppCompatFlags UDF * CrowdinAPI UDF * _WinMergeCompare2Files() * _JavaExceptionAdd() * _IsBeta() * Writing DPI Awareness App - workaround * _AutoIt_RequiredVersion() * Chilkatsoft.au3 UDF * TeamViewer.au3 UDF * JavaManagement UDF * VIES over SOAP * WinSCP UDF * GHAPI UDF - modest begining - comunication with GitHub REST APIErrorLog.au3 UDF - A logging Library * Include Dependency Tree (Tool for analyzing script relations) *

My contribution to others projects or UDF based on  others projects: * _sql.au3 UDF  * POP3.au3 UDF *  RTF Printer - UDF * XML.au3 UDF * ADO.au3 UDF SMTP Mailer UDF * Dual Monitor resolution detection * * 2GUI on Dual Monitor System * _SciLexer.au3 UDF * SciTE - Lexer for console pane

Useful links: * Forum Rules * Forum etiquette *  Forum Information and FAQs * How to post code on the forum * AutoIt Online Documentation * AutoIt Online Beta Documentation * SciTE4AutoIt3 getting started * Convert text blocks to AutoIt code * Games made in Autoit * Programming related sites * Polish AutoIt Tutorial * DllCall Code Generator * 

Wiki: Expand your knowledge - AutoIt Wiki * Collection of User Defined Functions * How to use HelpFile * Good coding practices in AutoIt * 

OpenOffice/LibreOffice/XLS Related: WriterDemo.au3 * XLS/MDB from scratch with ADOX

IE Related:  * How to use IE.au3  UDF with  AutoIt v3.3.14.x * Why isn't Autoit able to click a Javascript Dialog? * Clicking javascript button with no ID * IE document >> save as MHT file * IETab Switcher (by LarsJ ) * HTML Entities * _IEquerySelectorAll() (by uncommon) * IE in TaskSchedulerIE Embedded Control Versioning (use IE9+ and HTML5 in a GUI) * PDF Related:How to get reference to PDF object embeded in IE * IE on Windows 11

I encourage you to read: * Global Vars * Best Coding Practices * Please explain code used in Help file for several File functions * OOP-like approach in AutoIt * UDF-Spec Questions *  EXAMPLE: How To Catch ConsoleWrite() output to a file or to CMD *

I also encourage you to check awesome @trancexx code:  * Create COM objects from modules without any demand on user to register anything. * Another COM object registering stuffOnHungApp handlerAvoid "AutoIt Error" message box in unknown errors  * HTML editor

winhttp.au3 related : * https://www.autoitscript.com/forum/topic/206771-winhttpau3-download-problem-youre-speaking-plain-http-to-an-ssl-enabled-server-port/

"Homo sum; humani nil a me alienum puto" - Publius Terentius Afer
"Program are meant to be read by humans and only incidentally for computers and execute" - Donald Knuth, "The Art of Computer Programming"
:naughty:  :ranting:, be  :) and       \\//_.

Anticipating Errors :  "Any program that accepts data from a user must include code to validate that data before sending it to the data store. You cannot rely on the data store, ...., or even your programming language to notify you of problems. You must check every byte entered by your users, making sure that data is the correct type for its field and that required fields are not empty."

Signature last update: 2022-03-07

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
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By rmckay
      Hello,
      I'm trying to change the text in a TextBlock.  I stumbled onto the solution a couple of days ago but managed to delete the script.  I found an example in Stack Overflow written in C++ and the comments indicated that the proper way to change the text is using the "value" variables.  I've tried several combinations in AutoIt with no success 
      #AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7 #include "UIA_Constants.au3" ; Can be copied from UIASpy Includes folder Opt("MustDeclareVars", 1) HotKeySet('{ESC}', 'Quit') Example() Func Example() ; Create UI Automation object Local $oUIAutomation = ObjCreateInterface($sCLSID_CUIAutomation8, $sIID_IUIAutomation5, $dtag_IUIAutomation5) If Not IsObj($oUIAutomation) Then Return ConsoleWrite("$oUIAutomation ERR" & @CRLF) ConsoleWrite("$oUIAutomation OK" & @CRLF) ; Get Desktop element Local $pDesktop, $oDesktop $oUIAutomation.GetRootElement($pDesktop) $oDesktop = ObjCreateInterface($pDesktop, $sIID_IUIAutomationElement8, $dtag_IUIAutomationElement8) If Not IsObj($oDesktop) Then Return ConsoleWrite("$oDesktop ERR" & @CRLF) ConsoleWrite("$oDesktop OK" & @CRLF) ; --- Find window/control --- ConsoleWrite("--- Find window/control ---" & @CRLF) Local $pCondition0 $oUIAutomation.CreatePropertyCondition($UIA_ClassNamePropertyId, "TextBlock", $pCondition0) If Not $pCondition0 Then Return ConsoleWrite("$pCondition0 ERR" & @CRLF) ConsoleWrite("$pCondition0 OK" & @CRLF) Local $pText1, $oText1 $oDesktop.FindFirst($TreeScope_Descendants, $pCondition0, $pText1) $oText1 = ObjCreateInterface($pText1, $sIID_IUIAutomationElement8, $dtag_IUIAutomationElement8) If Not IsObj($oText1) Then Return ConsoleWrite("$oText1 ERR" & @CRLF) ConsoleWrite("$oText1 OK" & @CRLF) ; --- Control Pattern Properties --- ConsoleWrite("--- Control Pattern Properties ---" & @CRLF) Local $sLegacyIAccessibleName1 $oText1.GetCurrentPropertyValue($UIA_LegacyIAccessibleNamePropertyId, $sLegacyIAccessibleName1) ConsoleWrite("$sLegacyIAccessibleName1 = " & $sLegacyIAccessibleName1 & @CRLF) ; --- LegacyIAccessible Pattern (action) Object --- ConsoleWrite("--- LegacyIAccessible Pattern (action) Object ---" & @CRLF) Local $pLegacyIAccessiblePattern1, $oLegacyIAccessiblePattern1 $oText1.GetCurrentPattern($UIA_LegacyIAccessiblePatternId, $pLegacyIAccessiblePattern1) $oLegacyIAccessiblePattern1 = ObjCreateInterface($pLegacyIAccessiblePattern1, $sIID_IUIAutomationLegacyIAccessiblePattern, $dtag_IUIAutomationLegacyIAccessiblePattern) If Not IsObj($oLegacyIAccessiblePattern1) Then Return ConsoleWrite("$oLegacyIAccessiblePattern1 ERR" & @CRLF) ConsoleWrite("$oLegacyIAccessiblePattern1 OK" & @CRLF) ; --- LegacyIAccessible Pattern (action) Methods --- ConsoleWrite("--- LegacyIAccessible Pattern (action) Methods ---" & @CRLF) Local $iStr = "Test String" $oLegacyIAccessiblePattern1.SetValue($iStr) ConsoleWrite("$oLegacyIAccessiblePattern1.SetValue()" & @CRLF) While 1 WEnd EndFunc ;==>Example Func Quit() Exit EndFunc ;==>Quit $oUIAutomation OK $oDesktop OK --- Find window/control --- $pCondition0 OK $oText1 OK --- Control Pattern Properties --- $sLegacyIAccessibleName1 = 12/26/2019 11:38:15 PM --- LegacyIAccessible Pattern (action) Object --- $oLegacyIAccessiblePattern1 OK --- LegacyIAccessible Pattern (action) Methods --- $oLegacyIAccessiblePattern1.SetValue() This is the window I'm working with:

      and here is the UIASpy display

      The text in the TextBlock never changes and I've used $oLegacyIAccessiblePattern.CurrentValue($iCurrentValue) on several different attempts (not in script).  The output is always blank.  
      Thanks in advance
    • By rmckay
      Hello,
      I'm trying to use ui automation to control a 3rd party program called Ninja Trader.  It's a stock charting program.  It creates child charts that can be modified individually.  Each chart has a popup window to enable modifications to the respective chart.  I've nearly completed the automation project I've been working on for months (includes attempting to understand the ui automation process).  The last challenge is to activate the popup window.  It's accessed from the respective chart by right clicking on the chart.  I've tried the combination of each Element Properties (has/is info), Control Patterns (element actions), and Control Pattern Properties with all the Control Pattern Methods.  Most of those combinations give an error.  I assumed the combination of $UIA_IsLegacyIAccessiblePatternAvailablePropertyId  True (LegacyIAccessiblePattern) and      DoDefaultAction() would do something.  It doesn't get flagged as an error but it also doesn't do anything.  I've done the same drill with both "Menu: ContextMenu" and " Pane:ScrollIViewer" as the base for ObjCreateInterface.  I've included screen shots of the UIASpy results and a screen shot of the window with popup.  I assumed that I could modify code that worked with menus activated by right clicking on task bar icons.  I've not been able to locate code (maybe recognize it) that addresses the problem.   Any pointers as to what I'm missing will be greatly appreciated.
      Thanks in advance.
       



    • By toto22
      I'm working on a script that does Auto-Log in for me. it looks like this :
      #include "UIAWrappers.au3" If ProcessExists("Advanced Dashboard.exe") Then Else Run("C:\Program Files (x86)\Advanced Dashboard\Advanced Dashboard.exe") EndIf sleep(1000) Local $oP6=_UIA_getObjectByFindAll($UIA_oDesktop, "Title:=Advanced Dashboard", $treescope_children) Local $oP5=_UIA_getObjectByFindAll($oP6, "Title:=;controltype:=UIA_PaneControlTypeId;class:=WindowsForms10.Window.8.app.0.34f5582_r9_ad1", $treescope_children) Local $oP4=_UIA_getObjectByFindAll($oP5, "Title:=;controltype:=UIA_PaneControlTypeId;class:=Shell Embedding", $treescope_children) Local $oP3=_UIA_getObjectByFindAll($oP4, "Title:=;controltype:=UIA_PaneControlTypeId;class:=Shell DocObject View", $treescope_children) Local $oP2=_UIA_getObjectByFindAll($oP3, "controltype:=UIA_PaneControlTypeId;class:=Internet Explorer_Server", $treescope_children) _UIA_Action($oP2,"setfocus") Local $oP1=_UIA_getObjectByFindAll($oP2, "Title:=WebBroker Login;controltype:=UIA_PaneControlTypeId;class:=", $treescope_children) Local $oP0=_UIA_getObjectByFindAll($oP1, "Title:=;controltype:=UIA_GroupControlTypeId;class:=", $treescope_children) Local $oUIElement1=_UIA_getObjectByFindAll($oP0, "title:=Password;ControlType:=UIA_EditControlTypeId", $treescope_subtree) ;~_UIA_action($oUIElement,"highlight") _UIA_action($oUIElement1,"click") Send("*****") Local $oUIElement2=_UIA_getObjectByFindAll($oP0, "title:=Login;ControlType:=UIA_ButtonControlTypeId", $treescope_subtree) ;~_UIA_action($oUIElement,"highlight") _UIA_action($oUIElement2,"click") Is there a way to check if "$oUIElement1" exists before I enter my password?
      I want my script to wait for "$oUIElement1" object to be present in-order to to do a log-in and do not rely on Sleep(1000). Thank you in advance!
    • By 232showtime
      Good  day, its my first time creating script using UIA Wrappers. im kinda confused:
      #include "UIAWrappers.au3" $FrmClassName="TFrmMain" $Button1="Add" ;script is clicking all the button, if I use all the button name in this control->[CLASS:TBitBtn; INSTANCE:12] $Form=_UIA_getFirstObjectOfElement($UIA_oDesktop,"class:=" & $FrmClassName, $treescope_children) if isobj($Form) Then $Button2=_UIA_getFirstObjectOfElement($Form,"name:=" & $Button1, $treescope_subtree) $oInvokeP=_UIA_getpattern($Button2,$UIA_InvokePatternID) $oInvokeP.Invoke EndIf 
      but if I use the option name in [CLASS:TActionMainMenuBar; INSTANCE:1] it doesn't click any option in menu bar like "File", "View" or "Edit" and got error mesage
       
      #include "UIAWrappers.au3" $FrmClassName="TFrmMain" $Button1="File" ;doesnt click File, View or edit in menubar $Form=_UIA_getFirstObjectOfElement($UIA_oDesktop,"class:=" & $FrmClassName, $treescope_children) if isobj($Form) Then $Button2=_UIA_getFirstObjectOfElement($Form,"name:=" & $Button1, $treescope_subtree) $oInvokeP=_UIA_getpattern($Button2,$UIA_InvokePatternID) $oInvokeP.Invoke EndIf ;got error "C:\Program Files (x86)\AutoIt3\Include\UIAWrappers.au3" (514) : ==> Variable must be of type "Object".: $obj.getCurrentPattern($patternID, $pPattern) $obj^ ERROR ->09:03:47 AutoIt3.exe ended.rc:1
      +>09:03:47 AutoIt3Wrapper Finished.
      >Exit code: 1    Time: 1.383
       
       
       
       
    • By muchado
      I have found AutoIT to be very useful in automating some of the older programs that we use, but I am now trying to work out how to automate newer programs that use the Windows Forms - such as WindowsForms10.Window.8.app.0.2bf8098_r13_ad1
      I have read through the manual, but do not find anything on this there. I have also done some reading on the forum and have found material that looks useful, but I am not familiar with this and some of the threads look a little old. Please could someone update me on what the latest status is on this?
      Are there any plans to provide wrappers to the UI Automation controls, similar to those already provided for ListView, ComboBox, etc? How would I go about making a menu selection with such a system? If people are not using AutoIT for this kind of automation, then what are they using instead? Similar threads:
      '?do=embed' frameborder='0' data-embedContent>> - 2011 '?do=embed' frameborder='0' data-embedContent>> - 2008 '?do=embed' frameborder='0' data-embedContent>> - 2012 Other questions if you have time...
      What is the difference between MSAA mode and UI Automation? If I am using "Inspect.exe", how do I identify what information that I need to send a command to the control? Sorry - lots of questions - I am very much finding my way around this.
       
×
×
  • Create New...