Jump to content

Can I use regular expression within the cssSelector string when using _WD_FindElement($sSession, $_WD_LOCATOR_ByCSSSelector?


Dmp
 Share

Recommended Posts

Hello SMEs...

The cssSelector string for each icon (usually 33 icons) that the automation needs to click on contains two numeric values that change each time the web page is loaded.

See cssSelector output image below code.

My guess is that the end-of-line numeric value differentiates each generated icon; I use an array for these values and pass each element to the _WD_FindElement function as a variable.

However, I still need to account for the numeric value in the middle of the locator text: "div.leaflet-marker-icon.marker-icon.vehicle-fr-available-10-min-icon..."

I really don't want to loop through a nested array to the one I already have in place; therefore, I was wondering if there is a method for a regular expression that would cover the 1 to 2 digit values used in this position of the cssSelector string, or is this a really bad method to use to click on the given icons and I should consider another solution?

The web page is not public, but I can say that it's a representation of a floor plan and the icons are vehicles in a few different states of occupancy, location and communication w/ the network. When each icon is clicked, a status windows pops up.

Local $iMax1
                ; Local $sData1 = "9,10,16,17"
                ; Local $sData1 = "24,21,22,23,7,8,9,10,1"
                Local $sData1 = "10,11,12,13,14,15,16,17,18,19,20,21,22,24,25,26,1,2,3,4,5,6,7,8,9,27,28,29,30,31,32,33"
                ; Local $sData1 = "2,10,20,40"

                Local $aDiv1 = StringSplit($sData1, ",")
                If IsArray($aDiv1) Then
                    _ArrayDisplay($aDiv1, "Numeric Array for Variable")
                    $iMax1 = UBound($aDiv1); UBound gets the array size

                    For $i = 1 to $iMax1 -1

                    Local $iElmnt = $aDiv1[$i]

                    Local $aElementFkInU = _WD_FindElement($sSession, $_WD_LOCATOR_ByCSSSelector, "div.ng-scope:nth-child(3) div.ng-scope div.leaflet-container.leaflet-retina.leaflet-fade-anim:nth-child(1) div.leaflet-map-pane div.leaflet-objects-pane div.leaflet-marker-pane > div.leaflet-marker-icon.marker-icon.vehicle-fr-inUse-2-min-icon.leaflet-zoom-animated.leaflet-clickable:nth-child(" & $iElmnt & ")", _
                        Default, True, BitOR($_WD_OPTION_Visible, $_WD_OPTION_Enabled))
                        _ArrayDisplay($aElementFkInU,"Vehicle-fr-inUse to Click")
                        _WD_ElementSelectAction($sSession, $aElementFkInU, 'click')
                        Sleep(3000)

                    Local $aElementFkA = _WD_FindElement($sSession, $_WD_LOCATOR_ByCSSSelector, "div.ng-scope:nth-child(3) div.ng-scope div.leaflet-container.leaflet-retina.leaflet-fade-anim:nth-child(1) div.leaflet-map-pane div.leaflet-objects-pane div.leaflet-marker-pane > div.leaflet-marker-icon.marker-icon.vehicle-fr-available-10-min-icon.leaflet-zoom-animated.leaflet-clickable:nth-child(" & $iElmnt & ")", _
                        Default, True, BitOR($_WD_OPTION_Visible, $_WD_OPTION_Enabled))
                        _ArrayDisplay($aElementFkA,"Vehicle-fr-available to Click")
                        _WD_ElementSelectAction($sSession, $aElementFkA, 'click')
                        Sleep(3000)

                        Local $aElementFkNoCom = _WD_FindElement($sSession, $_WD_LOCATOR_ByCSSSelector, "div.ng-scope:nth-child(3) div.ng-scope div.leaflet-container.leaflet-retina.leaflet-fade-anim:nth-child(1) div.leaflet-map-pane div.leaflet-objects-pane div.leaflet-marker-pane > div.leaflet-marker-icon.marker-icon.vehicle-fr-noComm-40-min-icon.leaflet-zoom-animated.leaflet-clickable:nth-child(" & $iElmnt & ")", _
                        Default, True, BitOR($_WD_OPTION_Visible, $_WD_OPTION_Enabled))
                        _ArrayDisplay($aElementFkNoCom,"Vehicle-fr-noComm- to Click")
                        _WD_ElementSelectAction($sSession, $aElementFkNoCom, 'click')
                        Sleep(3000)

                        Call("HiddenLegend")
                    Next
                EndIf

489423689_cssSelectorstring.thumb.PNG.68bf361bfad6d1155bfe91ea59e2dd16.PNG

Link to comment
Share on other sites

Hi @Dmp,

can you share the DOM of the webpage or at least the particular part of it? Maybe a screenshot of the WebDeveloperTools of your chosen browser?
I mean a view like this:
 

Spoiler

grafik.thumb.png.94cbab0d0e4195e41a321946068efb85.png


I would go with XPath as the selector approach and I am quite sure this could be more precise for your needs.

Which specific element(s) you want to get?

Best regards
Sven

________________
Stay innovative!

Edited by SOLVE-SMART

Stay innovative!

Spoiler

🌍 Au3Forums

🎲 AutoIt (en) Cheat Sheet

📊 AutoIt limits/defaults

💎 Code Katas: [...] (comming soon)

🎭 Collection of GitHub users with AutoIt projects

🐞 False-Positives

🔮 Me on GitHub

💬 Opinion about new forum sub category

📑 UDF wiki list

✂ VSCode-AutoItSnippets

📑 WebDriver FAQs

👨‍🏫 WebDriver Tutorial (coming soon)

Link to comment
Share on other sites

Hello Sven,

I'm using ChroPath; the reason for selecting to use cssSelector, rather than XPath, is because the cssSelector string has some definition of the status of the icon, such as "...inUse, or Available, or noComm, etc.; I'd like to make these distinctions in the order that the icons are clicked. In other words, I want to click on all the InUse icons first, then the Available ones, then the NoComm icons. The Xpath does not contain this bit of information, the Xpath is the same for all the vehicle icons w/ the exception of the end-of-line numeric values.  

DOM.txt

ChroPath.PNG

Link to comment
Share on other sites

Hi @Dmp,

as far as I can see the icons are all DIV elements with specific classes. I guess it's pretty easy to get your icons in your expected order, by:
 

//div[contains(@class, '-inUse-')]

//div[contains(@class, '-available-')]

//div[contains(@class, '-noComm-')]


Please enter these XPath expressions into ChroPath (as "Rel XPath") and tell me/us whether it match with your expectations or not 😁 .


Best regards
Sven

________________
Stay innovative!

Edited by SOLVE-SMART

Stay innovative!

Spoiler

🌍 Au3Forums

🎲 AutoIt (en) Cheat Sheet

📊 AutoIt limits/defaults

💎 Code Katas: [...] (comming soon)

🎭 Collection of GitHub users with AutoIt projects

🐞 False-Positives

🔮 Me on GitHub

💬 Opinion about new forum sub category

📑 UDF wiki list

✂ VSCode-AutoItSnippets

📑 WebDriver FAQs

👨‍🏫 WebDriver Tutorial (coming soon)

Link to comment
Share on other sites

Sven,

This did capture the inUse icons, plus one other, but it captured all of the inUse icons at one time because there are no values to make them unique, therefore clicking each one at a time is not possible.

 

Xpath.PNG

Link to comment
Share on other sites

Hi again,

you will receive a list (array) of identifiers of your found elements.

Func _findElements($sSelector)
    Return _WD_FindElement($sSession, $_WD_LOCATOR_ByXPath, $sSelector, Default, True)
EndFunc

Global $aListOfInUseElements = _findElements("//div[contains(@class, '-inUse-')]")

Then you loop through them with AutoIt and do your click actions by the WebDriver _WD_ElementAction function.
 

11 minutes ago, Dmp said:

Can I add the end-of-line unique numeric values to the Xpaths that you have proposed?

Yes you could, but you shoudn't. It is often a good approach to be more precise with the selector to get only you expected data from the DOM. Why? Because then you don't have to handle this later in AutoIt.

You have 5 elements as match but you just need 4, right? Which one is the bad one?

Best regards
Sven

________________
Stay innovative!

Stay innovative!

Spoiler

🌍 Au3Forums

🎲 AutoIt (en) Cheat Sheet

📊 AutoIt limits/defaults

💎 Code Katas: [...] (comming soon)

🎭 Collection of GitHub users with AutoIt projects

🐞 False-Positives

🔮 Me on GitHub

💬 Opinion about new forum sub category

📑 UDF wiki list

✂ VSCode-AutoItSnippets

📑 WebDriver FAQs

👨‍🏫 WebDriver Tutorial (coming soon)

Link to comment
Share on other sites

Sven,

Never mind my very dumb comment, after logging off the forum, I realized that the Xpath that  you suggested gives me the array that I was hoping for when I decided to use an array for the output of _WD_FindElement.  End of day/end of week and really burned out. I will remove my first array and use the _WD_FindElement array and let you know how I fare.

Link to comment
Share on other sites

Hi @Dmp,

[...] easy 😀 , don't worry to much.

5 minutes ago, Dmp said:

I will remove my first array and use the _WD_FindElement array and let you know how I fare.

Yes please let me know when you're need additional hints about XPath or element retrieving in general 😉 .

Best regards
Sven

________________
Stay innovative!

Stay innovative!

Spoiler

🌍 Au3Forums

🎲 AutoIt (en) Cheat Sheet

📊 AutoIt limits/defaults

💎 Code Katas: [...] (comming soon)

🎭 Collection of GitHub users with AutoIt projects

🐞 False-Positives

🔮 Me on GitHub

💬 Opinion about new forum sub category

📑 UDF wiki list

✂ VSCode-AutoItSnippets

📑 WebDriver FAQs

👨‍🏫 WebDriver Tutorial (coming soon)

Link to comment
Share on other sites

Hello Sven,

 

Unfortunately, I'm not having much luck w/ the Chropath "contains" statement.

I'm sure that I'm doing something wrong.

; Refresh Map page
    $sRfElement = _WD_FindElement($sSession, $_WD_LOCATOR_ByXPath, "//button[normalize-space()='Refresh']")
    _WD_ElementAction($sSession, $sRefElement, 'click'); click Refresh button

    ; Create array of In-Use Forklift icon locators via _WD_FindElement($sSession, $_WD_LOCATOR_ByXPath
    Local $aElementFkInU = _WD_FindElement($sSession, $_WD_LOCATOR_ByXPath, "//div[contains(@class, '-inUse-')]", Default, True, BitOR($_WD_OPTION_Visible, $_WD_OPTION_Enabled))

    If IsArray ($aElementFkInU) Then
        _ArrayDisplay($aElementFkInU,"Vehicle-fr-inUse to Click")
        MsgBox($MB_SYSTEMMODAL, "", "Found Forklifts in-use with Operators.", 8)
        $iMax1 = UBound($aElementFkInU); UBound gets the array size

        For $i = 1 To $iMax1 -1
            Local $sElmnt3 = $aElementFkInU[$i]
            MsgBox($MB_SYSTEMMODAL, "", "each element per icon: " & $sElmnt3, 10)
            _WD_ElementAction($sSession, $sElmnt3, 'click')
            Sleep(3000)
            Call("HiddenLegend")
        Next
    Else
        MsgBox($MB_SYSTEMMODAL, "", "No In Use Forlifts found.", 8)
        ; $sElmnt = ""
    EndIf

    ; Refresh Map page
    $sRfElement = _WD_FindElement($sSession, $_WD_LOCATOR_ByXPath, "//button[normalize-space()='Refresh']")
    _WD_ElementAction($sSession, $sRefElement, 'click'); click Refresh button


    ; Create array of Available Forklift icon locators via _WD_FindElement($sSession, $_WD_LOCATOR_ByXPath
    Local $aElementFkAvl = _WD_FindElement($sSession, $_WD_LOCATOR_ByXPath, "//div[contains(@class, '-available-')]", Default, True, BitOR($_WD_OPTION_Visible, $_WD_OPTION_Enabled))

    If IsArray ($aElementFkAvl) Then
        _ArrayDisplay($aElementFkAvl,"Vehicle-fr-inUse to Click")

        $iMax1 = UBound($aElementFkAvl); UBound gets the array size
        MsgBox($MB_SYSTEMMODAL, "", "Found Forklifts Available to use.", 8)

        For $i = 1 To $iMax1 -1
            Local $sElmnt4 = $aElementFkAvl[$i]
            MsgBox($MB_SYSTEMMODAL, "", "each element per icon: " & $sElmnt4, 10)
            _WD_ElementAction($sSession, $sElmnt4, 'click')
            Sleep(3000)
            Call("HiddenLegend")
        Next

    Else
        MsgBox($MB_SYSTEMMODAL, "", "No Alvailable Forlifts found.", 8)
    EndIf

 

Link to comment
Share on other sites

"C:\Program Files (x86)\AutoIt3\SciTE\..\AutoIt3.exe" "C:\Program Files (x86)\AutoIt3\SciTE\AutoIt3Wrapper\AutoIt3Wrapper.au3" /run /prod /ErrorStdOut /in "C:\Users\dpardo\Documents\Autoit\tst-timer\Forklift-icon-with-timer\VPro-tst-mix-updatedxx-dev-x-latest-x-x-12-9-Var4-updated-tst-5ver-SingleArrayNotFound.au3" /UserParams    
+>13:45:01 Starting AutoIt3Wrapper v.15.920.938.0 SciTE v.3.6.0.0   Keyboard:00000409  OS:WIN_10/  CPU:X64 OS:X64    Environment(Language:0409)
+>         SciTEDir => C:\Program Files (x86)\AutoIt3\SciTE   UserDir => C:\Program Files (x86)\AutoIt3\SciTE\AutoIt3Wrapper
>Running AU3Check (3.3.14.1)  from:C:\Program Files (x86)\AutoIt3  input:C:\Users\dpardo\Documents\Autoit\tst-timer\Forklift-icon-with-timer\VPro-tst-mix-updatedxx-dev-x-latest-x-x-12-9-Var4-updated-tst-5ver-SingleArrayNotFound.au3
+>13:45:02 AU3Check ended.rc:0
>Running:(3.3.14.1):C:\Program Files (x86)\AutoIt3\autoit3_x64.exe "C:\Users\dpardo\Documents\Autoit\tst-timer\Forklift-icon-with-timer\VPro-tst-mix-updatedxx-dev-x-latest-x-x-12-9-Var4-updated-tst-5ver-SingleArrayNotFound.au3"    
--> Press Ctrl+Alt+Break to Restart or Ctrl+Break to Stop
_WD_Startup: "C:\Program Files (x86)\AutoIt3\WebDriver-0.5.0.1\chromedriver.exe" --verbose --log-path="C:\Users\dpardo\Documents\Autoit\tst-timer\Forklift-icon-with-timer\chrome.log" 
Frames=0
TopWindow=True
__WD_Post ==> Element interaction issue: {"value":{"error":"element click intercepted","message":"element click intercepted: Element \u003Cbutton class=\"btn btn-primary ng-binding\" ng-click=\"refreshAllData()\">...\u003C/button> is not clickable at point (1807, 90). Other element would receive the click: \u003Cdiv ng-show=\"isSpinner\" class=\"containerSpinner\" loading-spinner=\"\">...\u003C/div>\n  (Session info: chrome=97.0.4692.99)","stacktrace":"Backtrace:\n\tOrdinal0 [0x00E96903+2517251]\n\tOrdinal0 [0x00E2F8E1+2095329]\n\tOrdinal0 [0x00D32848+1058888]\n\tOrdinal0 [0x00D63509+1258761]\n\tOrdinal0 [0x00D61868+1251432]\n\tOrdinal0 [0x00D5F65D+1242717]\n\tOrdinal0 [0x00D5E4A8+1238184]\n\tOrdinal0 [0x00D54037+1196087]\n\tOrdinal0 [0x00D764D3+1336531]\n\tOrdinal0 [0x00D53A36+1194550]\n\tOrdinal0 [0x00D765BA+1336762]\n\tOrdinal0 [0x00D85BBF+1399743]\n\tOrdinal0 [0x00D7639B+1336219]\n\tOrdinal0 [0x00D527A7+1189799]\n\tOrdinal0 [0x00D53609+1193481]\n\tGetHandleVerifier [0x01025904+1577972]\n\tGetHandleVerifier [0x010D0B97+2279047]\n\tGetHandleVerifier [0x00F26D09+534521]\n\tGetHandleVerifier [0x00F25DB9+530601]\n\tOrdinal0 [0x00E34FF9+2117625]\n\tOrdinal0 [0x00E398A8+2136232]\n\tOrdinal0 [0x00E399E2+2136546]\n\tOrdinal0 [0x00E43541+2176321]\n\tBaseThreadInitThunk [0x7721FA29+25]\n\tRtlGetAppContainerNamedObjectPath [0x773D7A9E+286]\n\tRtlGetAppContainerNamedObjectPath [0x773D7A6E+238]\n"}}
_WD_ElementAction ==> Element interaction issue: {"value":{"error":"element click intercepted","message":"element click intercepted: Element \u003Cbutton class=\"btn btn-primary ng-binding\" ng-click=\"refreshAllData()\">...\u003C/button> is not clickable at point (1807, 90). Other element would receive the click: \u003Cdiv ng-show=\"isSpinner\" class=\"containerSpinner\" loading-spinner=\"\">...\u003C/div>\n  (Session info: chrome=97.0.4692.99)","stacktrace":"Backtrace:\n\tOrdinal0 [0x00E96903+2517251]\n\tOrdinal0 [0x00E2F8E1+2095329]\n\tOrdinal0 [0x00D32848+1058888]\n\tOrdinal0 [0x00D63509+1258761]\n\tOrdinal0 [0x00D61868+1251432]\n\tOrdinal0 [0x00D5F65D+1242717]\n\tOrdinal0 [0x00D5E4A8+1238184]\n\tOrdinal0 [0x00D54037+1196087]\n\tOrdinal0 [0x00D764D3+1336531]\n\tOrdinal0 [0x00D53A36+1194550]\n\tOrdinal0 [0x00D765BA+1336762]\n\tOrdinal0 [0x00D85BBF+1399743]\n\tOrdinal0 [0x00D7639B+1336219]\n\tOrdinal0 [0x00D527A7+1189799]\n\tOrdinal0 [0x00D53609+1193481]\n\tGetHandleVerifier [0x01025904+1577972]\n\tGetHandleVerifier [0x010D0B97+2279047]\n\tGetHandleVerifier [0x00F26D09+534521]\n\tGetHandleVerifier [0x00F25DB9+530601]\n\tOrdinal0 [0x00E34FF9+2117625]\n\tOrdinal0 [0x00E398A8+2136232]\n\tOrdinal0 [0x00E399E2+2136546]\n\tOrdinal0 [0x00E43541+2176321]\n\tBaseThreadInitThunk [0x7721FA29+25]\n\tRtlGetAppContainerNamedObjectPath [0x773D7A9E+286]\n\tRtlGetAppContainerNamedObjectPath [0x773D7A6E+238]\n"}}
Frames=0
__WD_Post ==> No match: {"value":{"error":"no such element","message":"no such element: Unable to locate element: {\"method\":\"xpath\",\"selector\":\"//iframe[@id='iframeResult']\"}\n  (Session info: chrome=97.0.4692.99)","stacktrace":"Backtrace:\n\tOrdinal0 [0x00E96903+2517251]\n\tOrdinal0 [0x00E2F8E1+2095329]\n\tOrdinal0 [0x00D32848+1058888]\n\tOrdinal0 [0x00D5D448+1233992]\n\tOrdinal0 [0x00D5D63B+1234491]\n\tOrdinal0 [0x00D87812+1406994]\n\tOrdinal0 [0x00D7650A+1336586]\n\tOrdinal0 [0x00D85BBF+1399743]\n\tOrdinal0 [0x00D7639B+1336219]\n\tOrdinal0 [0x00D527A7+1189799]\n\tOrdinal0 [0x00D53609+1193481]\n\tGetHandleVerifier [0x01025904+1577972]\n\tGetHandleVerifier [0x010D0B97+2279047]\n\tGetHandleVerifier [0x00F26D09+534521]\n\tGetHandleVerifier [0x00F25DB9+530601]\n\tOrdinal0 [0x00E34FF9+2117625]\n\tOrdinal0 [0x00E398A8+2136232]\n\tOrdinal0 [0x00E399E2+2136546]\n\tOrdinal0 [0x00E43541+2176321]\n\tBaseThreadInitThunk [0x7721FA29+25]\n\tRtlGetAppContainerNamedObjectPath [0x773D7A9E+286]\n\tRtlGetAppContainerNamedObjectPath [0x773D7A6E+238]\n"}}
_WD_FindElement ==> No match: HTTP status = 404
__WD_Post ==> No match: {"value":{"error":"no such element","message":"no such element: Element_id length is invalid\n  (Session info: chrome=97.0.4692.99)","stacktrace":"Backtrace:\n\tOrdinal0 [0x00E96903+2517251]\n\tOrdinal0 [0x00E2F8E1+2095329]\n\tOrdinal0 [0x00D32848+1058888]\n\tOrdinal0 [0x00D5CBD1+1231825]\n\tOrdinal0 [0x00D5EE9F+1240735]\n\tOrdinal0 [0x00D86C68+1404008]\n\tOrdinal0 [0x00D764D3+1336531]\n\tOrdinal0 [0x00D85BBF+1399743]\n\tOrdinal0 [0x00D7639B+1336219]\n\tOrdinal0 [0x00D527A7+1189799]\n\tOrdinal0 [0x00D53609+1193481]\n\tGetHandleVerifier [0x01025904+1577972]\n\tGetHandleVerifier [0x010D0B97+2279047]\n\tGetHandleVerifier [0x00F26D09+534521]\n\tGetHandleVerifier [0x00F25DB9+530601]\n\tOrdinal0 [0x00E34FF9+2117625]\n\tOrdinal0 [0x00E398A8+2136232]\n\tOrdinal0 [0x00E399E2+2136546]\n\tOrdinal0 [0x00E43541+2176321]\n\tBaseThreadInitThunk [0x7721FA29+25]\n\tRtlGetAppContainerNamedObjectPath [0x773D7A9E+286]\n\tRtlGetAppContainerNamedObjectPath [0x773D7A6E+238]\n"}}
_WD_Window ==> No match: HTTP status = 404
_WD_FrameEnter ==> Webdriver Exception
_WD_FindElement ==> No match: HTTP status = 200
_WD_FindElement ==> No match: HTTP status = 200
+>13:46:42 AutoIt3.exe ended.rc:0
+>13:46:42 AutoIt3Wrapper Finished.
>Exit code: 0    Time: 101.6

 

Link to comment
Share on other sites

Hi @Dmp,

out of the log (console output) you posted your script fails even before it try to get your elements like -inUse- or later -available-.

Quote

element click intercepted [...] is not clickable at point [...] Other element would receive the click [...] loading-spinner

So I guess you have to wait a bit longer, because of the loading indicator (spinner) or better create a function to waitFor specific element or state of the site, then do the next step.

 

3 hours ago, Dmp said:

I'm not having much luck w/ the Chropath "contains" statement.

I don't believe ChroPath behaves incorrect, you selector have to be okay on the specific state (progress of you application).
I thought you could find your elements like you posted here by screenshot?

It's pretty hard to help without the application. Please try to provide as much screenshots and maybe the DOM again as a zip archive to give us a better chance 😉 .
 

Best regards
Sven

________________
Stay innovative!

Edited by SOLVE-SMART

Stay innovative!

Spoiler

🌍 Au3Forums

🎲 AutoIt (en) Cheat Sheet

📊 AutoIt limits/defaults

💎 Code Katas: [...] (comming soon)

🎭 Collection of GitHub users with AutoIt projects

🐞 False-Positives

🔮 Me on GitHub

💬 Opinion about new forum sub category

📑 UDF wiki list

✂ VSCode-AutoItSnippets

📑 WebDriver FAQs

👨‍🏫 WebDriver Tutorial (coming soon)

Link to comment
Share on other sites

If I try _WD_LoadWait, could the I use the $sElement optional parameter for the array element from "$aElementFkUnAvl = _WD_FindElement($sSession, $_WD_LOCATOR_ByXPath...," or is there a better UDF to use?

 

Link to comment
Share on other sites

Hi @Dmp,
 

45 minutes ago, Dmp said:

[...] or is there a better UDF to use [...]

There are other ways, but I am pretty sure that they are not less complex or would do the job more robust than WebDriver approach.
Please provide more information. Screenshots and DOM snapshots would be fine. Please also mark (in the Screenshots) what do you want to click or which texts do you want to achieve etc.

Maybe you could grant me/us access to the application in a way => then it would be straight forward I guess.

Best regards
Sven

________________
Stay innovative!

Stay innovative!

Spoiler

🌍 Au3Forums

🎲 AutoIt (en) Cheat Sheet

📊 AutoIt limits/defaults

💎 Code Katas: [...] (comming soon)

🎭 Collection of GitHub users with AutoIt projects

🐞 False-Positives

🔮 Me on GitHub

💬 Opinion about new forum sub category

📑 UDF wiki list

✂ VSCode-AutoItSnippets

📑 WebDriver FAQs

👨‍🏫 WebDriver Tutorial (coming soon)

Link to comment
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
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...