首页 > 解决方案 > 如何使用 pywinauto 从上下文菜单中选择菜单项?

问题描述

我正在使用 pbixrefresher 自动刷新 PBI 报告,它可以正常工作,但是我还需要将数据表保存为 csv 文件,方法是将表复制到 excel 中,然后保存为 csv,因为表太大而无法导出作为 PBI 中的 csv(大约 60k 行)。我可以让 pywinauto 转到 PBI 中的数据视图,并且由于这里的一些帮助,我得到了下拉菜单(上下文菜单或弹出菜单)。我可以将菜单向下切换到所需的选项,但是当我使用 click_input('left') 时没有任何反应。菜单仍然显示并且不采取任何行动。代码如下:

import time
import os
from pywinauto.application import Application
from pywinauto import timings


timings.after_clickinput_wait = 1
WORKBOOK = "C:/BBSDMthly/DA_AgentList.pbix"
PROCNAME = "PBIDesktop.exe"
os.system('start "" "' + WORKBOOK + '"')
app = Application(backend = 'uia').connect(path = PROCNAME)
win = app.window(title = 'DA_AgentList - Power BI Desktop')
time.sleep(5)
win.wait("enabled", timeout = 300)
win.Save.wait("enabled", timeout = 300)
win.set_focus()
win.Data.click_input()
win.Save.wait("enabled", timeout = 300)
win.wait("enabled", timeout = 300)
win.click_input(button = 'right')
win.Save.wait("enabled", timeout = 300)
win.wait("enabled", timeout = 300)
win.set_focus()
win.type_keys("{VK_TAB 7}")
win.click_input(button='left')

我已经搜索了有关此的其他查询,并找到了几个但我尝试过的选项都没有工作。例如,我试过:

app.PopupMenu.wait('visible', timeout=15).menu().get_menu_path('Copy table')[0].click_input()

返回:

`文件“C:\Program Files\Anaconda3\lib\site-packages\pywinauto\timings.py”,第 375 行,在 wait_until 中引发错误

TimeoutError:超时`

我也试过:

app.ContextMenu.child_window(title="Copy table", control_type="MenuItem").click_input()

它返回了一个 MatchError:

MatchError: Could not find 'ContextMenu' in 'dict_keys(['DA_AgentList - Power BI DesktopDialog', 'Dialog', 'DA_AgentList - Power BI Desktop'])'

我也试过: app.top_window().menu.item_by_path('Copy table')[0].click_input()

返回 MatchError: Could not find 'Copy table' in 'dict_keys(['System'])'

我尝试使用 print_control_identifiers 获取有关下拉菜单的更多信息,但返回的内容似乎与它无关。不幸的是,我没有 inspect.exe,所以不能用它来获取更多信息。

有人可以帮我吗?

标签: pythonpowerbipywinauto

解决方案


我似乎已经弄清楚如何从下拉菜单中选择复制表。我在 GitHub 上发现 inspect.exe 是一个独立的文件,因此在没有任何管理员权限问题的情况下成功获取了它。使用 inspect.exe 我得到了复制表的坐标并使用下面的代码单击按钮:

win.click_input(coords=(754,306))
win.Save.wait("enabled", timeout = 300)
win.wait("enabled", timeout = 300)
win.set_focus()

这已经工作了好几次,所以似乎解决了我的问题。现在我需要做的就是弄清楚如何将数据粘贴到 Excel 中!


推荐阅读