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

Adr*_*osu 6 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()
Run Code Online (Sandbox Code Playgroud)

回复:

    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']'
Run Code Online (Sandbox Code Playgroud)

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

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

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

Vas*_*bov 0

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

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

资源管理器应该与 一起运行app = Application(backend='uia').start("explorer.exe")click_input除了方法的 PEP8 名称(而不是等)之外,其他内容看起来几乎相同ClickInput

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

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

ListViewWrapper 最近是为 UIA 实现的。如有任何反馈,我们将不胜感激。


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

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

输出:

[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']
Run Code Online (Sandbox Code Playgroud)

稍后我将准备更详细的示例。