5

I'm writing automation tests for a cloud syncing desktop application. The problem I'm facing is that I cannot select a sub-folder from a window and I cannot select an option from context menu when right-click on a folder.

Example:

import pywinauto

pywinauto.Application().Start(r'explorer.exe')
explorer = pywinauto.Application().Connect(path='explorer.exe')
NewWindow = explorer.Window_(top_level_only=True, active_only=True, class_name='CabinetWClass')
NewWindow.AddressBandRoot.ClickInput()
NewWindow.TypeKeys(r'Program Files{ENTER}', with_spaces=True, set_foreground=False)
ProgramFiles = explorer.Window_(top_level_only=True, active_only=True, title='Program Files', class_name='CabinetWClass')
explorer.WaitCPUUsageLower(threshold=5)
item = ProgramFiles.FolderView.GetItem('7-Zip')
item.EnsureVisible()
item.RightClickInput()

response:

    item = ProgramFiles.FolderView.GetItem('7-Zip')
  File "C:\Python27\lib\site-packages\pywinauto\application.py", line 243, in __getattr__
    ctrls = _resolve_control(self.criteria)
  File "C:\Python27\lib\site-packages\pywinauto\application.py", line 758, in _resolve_control
    raise e.original_exception
pywinauto.findbestmatch.MatchError: Could not find 'FolderView' in '[u'', u'ShellView', u'ShellViewSHELLDLL_DefView', 'Progress', u'UIRibbonCommandBar', u'24', u'25', u'20', u'21', u'22', u'23', u'WorkerW', u'0', u'ScrollBar', u'4', u'8', 'TreeView', u'DirectUIHWND', u'Address band toolbarToolbar', u'SHELLDLL_DefView', u'Namespace Tree ControlNamespaceTreeControl', u'UniversalSearchBand', u'WorkerW1', u'WorkerW0', u'Program FilesShellTabWindowClass', u'Tree ViewTreeView', u'3', u'7', u'NamespaceTreeControl', u'NUIPane', u'Search Box', u'CtrlNotifySink0', u'CtrlNotifySink1', u'CtrlNotifySink2', u'CtrlNotifySink3', u'Navigation buttons', u'Program Files', u'Address Band Root', u'SeparatorBand2', u'Navigation buttonsToolbar', u'Up band toolbarToolbar', u'WorkerW2', u'DUIViewWndClassName', u'UIRibbonCommandBarDock', u'Namespace Tree Control', u'2', u'6', u'ShellTabWindowClass', u'ReBarAddress', 'Toolbar3', u'RibbonUIRibbonWorkPane', u'Toolbar1', u'Toolbar0', 'Toolbar5', 'Toolbar4', u'Up band toolbar', u'11', u'10', u'13', u'12', u'15', u'14', u'17', u'16', u'19', u'18', u'UIRibbonDockTopUIRibbonCommandBarDock', u'UIRibbonDockTop', u'DirectUIHWND1', u'DirectUIHWND0', u'DirectUIHWND3', u'DirectUIHWND2', u'Address: C:\\Program FilesToolbar', u'Address: C:\\Program Files', u'Breadcrumb Parent', u'SearchEditBoxWrapperClass', u'UpBand', u'CtrlNotifySink', u'TravelBand', u'1', u'5', u'9', 'Toolbar', 'ReBar', u'NetUIHWND', u'Address band toolbar', u'SeparatorBand0', u'SeparatorBand1', u'RibbonUIRibbonCommandBar', u'Ribbon2', u'Ribbon1', u'Ribbon0', 'Toolbar2', u'Tree View', u'UIRibbonWorkPane', u'ReBar0', u'ReBar1', 'ReBar2', u'SeparatorBand', u'Ribbon']'

Also, when I look on SWAPY, I cannot find a list with all sub-folders.

I have windows 10 x64, python 64bit. The python and cmd are running as administrator. I have also tried on Windows 7 x86 and x64 without success.

@Vasily Ryabov, can you help me with an example?

Adrian Rosu
  • 51
  • 1
  • 2
  • Also I've tried with print_control_identifiers() and there was no FolderView – Adrian Rosu Jun 29 '16 at 12:07
  • pywinauto 0.5.4 doesn't support folder list view. But UIA branch on GitHub is able to deal with that. I have no example with `explorer.exe` right now. But it's on the roadmap. If you wish to try new functionality before the 0.6.0 release, please let me know. There is no exact date for 0.6.0 but I hope to finish it this summer. – Vasily Ryabov Jun 29 '16 at 12:58
  • Hey Vasily, thank you for reply. I really want to test and try the new functionalities before release. How we proceed? – Adrian Rosu Jun 29 '16 at 13:23
  • pywinauto 0.6.0 is out. [The main repo readme](https://github.com/pywinauto/pywinauto/blob/master/README.md) contains working `explorer.exe` example now. – Vasily Ryabov Nov 11 '16 at 20:42

2 Answers2

2

To continue vasiliy ryabov's answer. It can be accomplished with the latest UIA branch of pywinauto. Let's say you have a Video folder opened and you try to right click on a sub-folder called My Home Videos. When a context menu is popped up we just click on Open menu item:

dsk = pywinauto.Desktop(backend='uia')
explorer = pywinauto.Application().Connect(path='explorer.exe')

# chain actions: set focus and right click after that
explorer.Video.MyHomeVideos.set_focus().click_input(button='right')

# Here we get to the popup menu
dsk.Context.Open.click_input()
vitswd
  • 449
  • 1
  • 5
  • 8
  • 1
    Another way to access context menu: `explorer.PopupMenu["Open"].set_focus().click_input()` instead of `dsk.Context.Open.click_input()` – Oscar Albert Feb 21 '20 at 02:44
0

(WARNING: for early testing of UIA branch of pywinauto; will replace the answer after pywinauto 0.6.0 is out)

If you're familiar with Git, just clone the main repo, switch to UIA branch, install comtypes with pip install comtypes and then install pywinauto (UIA branch) by python setup.py install.

Explorer should be run with app = Application(backend='uia').start("explorer.exe"). Other things would look almost the same except PEP8 names for methods (click_input instead of ClickInput etc.).

For the context menu you can use the following (because MenuWrapper is not ready for UIA)

app2 = Application(backend='native').connect(process=app.process)
app2.PopupMenu.Wait('visible', timeout=15).Menu().GetMenuPath("item name")[0].Click()`

ListViewWrapper is implemented for UIA very recently. Any feedback is appreciated.


EDIT1: I could take list of files so (assume apps/MFC_Samples folder is open):

explorer = pywinauto.Application(backend='uia').connect(path='explorer.exe')
explorer.MFC_Samples.ItemsView.children_texts()[1:]

Output:

[u'x64', u'BCDialogMenu.exe', u'CmnCtrl1.exe', u'CmnCtrl2.exe', u'CmnCtrl3.exe',
u'CtrlTest.exe', u'mfc100u.dll', u'RebarTest.exe', u'RowList.exe', u'TrayMenu.exe']

I'll prepare more detailed example later.

Vasily Ryabov
  • 9,386
  • 6
  • 25
  • 78
  • After running python setup.py install I received the following error: File "C:\pywinauto-64-UIA\pywinauto\controls\common_controls.py", line 923, in TreeViewWrapper UIA_TreeControlTypeId] NameError: name 'UIA_TreeControlTypeId' is not defined – Adrian Rosu Jun 30 '16 at 08:53
  • I have uninstalled python and removed all dependencies, then installed Python 64bit, comtypes, pillow and Python for Windows Extensions (i had an error : No module named win32api). – Adrian Rosu Jun 30 '16 at 09:00
  • You can install pyWin32 extensions with `C:\Python27_x64\Scripts\pip.exe install pypiwin32`, the same for others. Never met the first problem. I need more info to reproduce it. – Vasily Ryabov Jul 01 '16 at 14:56