python - 如何使用 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,所以不能用它来获取更多信息。
有人可以帮我吗?
解决方案
我似乎已经弄清楚如何从下拉菜单中选择复制表。我在 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 中!
推荐阅读
- java - 提交表单时,提交日期/时间的 Spring 为空
- java - 如何在 Apache Flink 中注册 java.util.List 类型
- qt - 强制 qt 不在模型上调用 data() 函数
- zap - 在詹金斯自由风格工作中未使用 ZAP 生成测试报告
- xcode - 为什么 Xcode 大小几乎翻了一番?
- python - ValueError:使用序列设置数组元素。在 session.run
- wordpress - 更改网址后无法打开 WordPress 网站
- html - 删除 Chrome 中的输入历史记录
- javascript - HERE 地图 API 是否有放大/缩小事件?
- css - 如何缩放 SVG 以适应其中的动态内容