【问题标题】:How to right click on a folder and select from context menu using pywinauto?如何右键单击文件夹并使用 pywinauto 从上下文菜单中选择?
【发布时间】:2016-11-01 00:52:15
【问题描述】:

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

例子:

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 64 位。 python 和 cmd 以管理员身份运行。我也在 Windows 7 x86 和 x64 上尝试过,但没有成功。

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

【问题讨论】:

  • 我也试过 print_control_identifiers() 并且没有 FolderView
  • pywinauto 0.5.4 不支持文件夹列表视图。但是 GitHub 上的 UIA 分支能够处理这个问题。我现在没有explorer.exe 的例子。但它在路线图上。如果您想在 0.6.0 版本之前尝试新功能,请告诉我。 0.6.0 没有确切的日期,但我希望能在今年夏天完成。
  • 嘿瓦西里,谢谢你的回复。我真的很想在发布之前测试和尝试新功能。我们如何进行?
  • pywinauto 0.6.0 已发布。 The main repo readme 现在包含工作 explorer.exe 示例。

标签: python automation pywinauto


【解决方案1】:

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

如果你熟悉 Git,只需克隆主 repo,切换到 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()`

ListViewWrapper 是最近为 UIA 实现的。感谢您提供任何反馈。


编辑1: 我可以获取文件列表(假设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']

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

【讨论】:

  • 运行 python setup.py install 后,我收到以下错误:文件“C:\pywinauto-64-UIA\pywinauto\controls\common_controls.py”,第 923 行,在 TreeViewWrapper UIA_TreeControlTypeId] NameError:名称“UIA_TreeControlTypeId”未定义
  • 我已经卸载了 python 并删除了所有依赖项,然后安装了 Python 64bit、comtypes、pillow 和 Python for Windows Extensions(我有一个错误:没有名为 win32api 的模块)。
  • 你可以用C:\Python27_x64\Scripts\pip.exe install pypiwin32安装pyWin32扩展,其他的也一样。从来没有遇到过第一个问题。我需要更多信息来重现它。
【解决方案2】:

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

【讨论】:

  • 访问上下文菜单的另一种方式:explorer.PopupMenu["Open"].set_focus().click_input() 而不是 dsk.Context.Open.click_input()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多