如何右键单击文件夹并使用pywinauto从上下文菜单中选择?

时间:2016-06-29 10:52:19

标签: python automation pywinauto

我正在为云同步桌面应用程序编写自动化测试。我面临的问题是我无法从窗口中选择子文件夹,右键单击文件夹时无法从上下文菜单中选择一个选项。

示例:

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()

响应:

    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']'

另外,当我查看SWAPY时,我找不到包含所有子文件夹的列表。

我有windows 10 x64,python 64bit。 python和cmd以管理员身份运行。我也试过Windows 7 x86和x64但没有成功。

@Vasily Ryabov,你能帮我举个例子吗?

2 个答案:

答案 0 :(得分:1)

继续vasiliy ryabov的回答。它可以通过pywinauto的最新UIA分支来完成。假设您打开了Video文件夹,并尝试右键单击名为My Home Videos的子文件夹。弹出上下文菜单时,我们只需单击Open菜单项:

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()

答案 1 :(得分:0)

(警告:对于pywinauto的UIA分支的早期测试;将在pywinauto 0.6.0之后替换答案)

如果您熟悉Git,只需克隆主要仓库,切换到UIA分支,使用pip install comtypes安装comtypes,然后按python setup.py install安装pywinauto(UIA分支)。

Explorer应与app = Application(backend='uia').start("explorer.exe")一起运行。其他方面看起来几乎相同,除了方法的PEP8名称(click_input而不是ClickInput等。)。

对于上下文菜单,您可以使用以下内容(因为MenuWrapper尚未为UIA做好准备)

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

最近为UIA实施了ListViewWrapper。任何反馈都表示赞赏。

EDIT1: 我可以获取文件列表(假设apps/MFC_Samples文件夹已打开):

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

输出:

[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']

我稍后会准备更详细的例子。