There’s been posted a request for more accurate method to get a window or control. Actually, getting a window by process name or window title may be considered by many as totally unreliable.
The application under test may be a page in the browser (several pages and browser instances are not rare these days), an MDI child, a frame. Simply, several instances of a GUI application can be running at the same time.
All these reasons led to adding new ways of getting windows.
Task: demonstrate how to get the window you’ll be using in tests by its process Id, window handle or process object.
Requirements: provide the reader with ready-to-run examples.
Solution: along with Get-UIAWindows -p (ProcessName) and -n (Name), the version 0.6.7 introduces new parameters for the Get-UIAWindow cmdlet.
- -ProcessId or -pid
Get-UIAWindow -pid (Get-Process -Name mmc).Id
- -Process or -p or -InputObject
Get-UIAWindow -p (Get-Process -Name mmc)
Earlier, many should do the following in order to start a process and get its handle:
Start-Process C:\Windows\system32\mmc.exe -Wait:$false Get-UIAWindow -pn mmc -Seconds 10
the code says to start a process and seek for its window for no more than ten seconds.
Now, we are definitely more sure about what process we are going to get. We simply pipeline it to a cmdlet:
Start-Process C:\Windows\System32\mmc.exe -PassThru | Get-UIAWindow -Seconds 10
The sample provided hooks the same window that we ran in it.
One more requested feature is to handle windows and control by its handle. Whence the handle can be taken?
One way is to get the property:
(Start-Process C:\Windows\System32\mmc.exe -PassThru | Get-UIAWindow -Seconds 10).Current.NativeWindowhandle (Start-Process C:\Windows\System32\mmc.exe -PassThru | Get-UIAWindow -Seconds 10 | Get-UIATree).Current.NativeWindowhandle
the other is to pipeline the handle out from the control:
PS C:\Users\apetrov1> Start-Process C:\Windows\System32\mmc.exe -PassThru | Get-UIAWindow -Seconds 10 | Read-UIAControlNativeWindowHandle Start-Process C:\Windows\System32\mmc.exe -PassThru | Get-UIAWindow -Seconds 10 | Get-UIATree | Read-UIAControlNativeWindowHandle
After you’ve got the handle, you are free to use it until it’s being disposed by the operating system:
Get-UIAControlFromHandle -Handle 67856 | Get-UIATreeItem -Name 'Console Root'
Task: export data from the data grid to a text file. As an example, use the Registry editor.
Task #2: provide a field for learning the module.
Requirements: just do it. Navigate through the Registry, find the values and export them to a file.
Solution: run the following code to get to the node:
Get-UIAWindow -Name 'Registry Editor' | ` Get-UIATreeItem -Name HKEY_LOCAL_MACHINE | ` Invoke-UIATreeItemExpand | ` Get-UIATreeItem -Name SOFTWARE | ` Invoke-UIATreeItemExpand | ` Get-UIATreeItem -Name Microsoft | ` Invoke-UIATreeItemExpand | ` Get-UIATreeItem -Name Windows | ` Invoke-UIATreeItemExpand | ` Get-UIATreeItem -Name CurrentVersion | ` Set-UIAFocus;
After the node is active, we’ll export the values:
Get-UIADataGrid | ` ConvertFrom-UIADataGrid | ` Out-File "$($Env:TEMP)\export.txt";
All the values are already in the file.
ConvertFrom- cmdlets provide standard capabilities as do standard Convert cmdlets from Microsoft. For instance, you can pipeline to the Select-String cmdlet if you need check that a particular value(s) is in the grid.
To find out what was exported to the file, run the following:
Get-Content -Path "$($Env:TEMP)\export.txt" | ` ConvertFrom-Csv;
Homework: try to export datagrid data from another key in the Registry editor or from the Services snap-in.