Python 2.7 pywinauto:如果应用程序名中有空格,如何访问应用程序菜单?

Python 2.7 pywinauto:如果应用程序名中有空格,如何访问应用程序菜单?,python-2.7,pywinauto,Python 2.7,Pywinauto,我有一个名为“Syntext Serna”xml编辑器的应用程序。我可以打开应用程序,但当我尝试访问它的菜单时,它会给我如下错误: Traceback (most recent call last): File "test.py", line 4, in <module> app.dlg.MenuSelect("Document->Open") File "c:\python27\lib\site-packages\pywinauto\application.py", line

我有一个名为“Syntext Serna”xml编辑器的应用程序。我可以打开应用程序,但当我尝试访问它的菜单时,它会给我如下错误:

Traceback (most recent call last):
File "test.py", line 4, in <module>
app.dlg.MenuSelect("Document->Open")
File "c:\python27\lib\site-packages\pywinauto\application.py", line 238, in __getattr__
ctrls = _resolve_control(self.criteria)
File "c:\python27\lib\site-packages\pywinauto\application.py", line 795, 
in _resolve_control
raise e.original_exception
pywinauto.findbestmatch.MatchError: Could not find 'dlg' in
'[u'Syntext Serna Free 4.3.0-3001QWidget', u'QWidget',
 u'Syntext Serna Free 4.3.0-3001']'
app.Syntext_Serna_Free_4_3_0_3001.menu_select('Document->Open')

我相信这背后的主要原因是,应用程序名称之间有空格。有什么解决方法吗?

dlg名称与真正的对话框标题相差太远。您需要更接近的名称,例如:

Traceback (most recent call last):
File "test.py", line 4, in <module>
app.dlg.MenuSelect("Document->Open")
File "c:\python27\lib\site-packages\pywinauto\application.py", line 238, in __getattr__
ctrls = _resolve_control(self.criteria)
File "c:\python27\lib\site-packages\pywinauto\application.py", line 795, 
in _resolve_control
raise e.original_exception
pywinauto.findbestmatch.MatchError: Could not find 'dlg' in
'[u'Syntext Serna Free 4.3.0-3001QWidget', u'QWidget',
 u'Syntext Serna Free 4.3.0-3001']'
app.Syntext_Serna_Free_4_3_0_3001.menu_select('Document->Open')
另一种将对话框名称与空格/破折号/等匹配的方法是使用键访问(这种方法也可以防止输入错误):

如果您需要精确的标题相等,只需直接创建WindowsSpecification对象(如果您有几个名称非常相似的对话框/控件,这是最可靠的匹配方法):


dlg名称与真实的对话框标题相差太远。您需要更接近的名称,例如:

Traceback (most recent call last):
File "test.py", line 4, in <module>
app.dlg.MenuSelect("Document->Open")
File "c:\python27\lib\site-packages\pywinauto\application.py", line 238, in __getattr__
ctrls = _resolve_control(self.criteria)
File "c:\python27\lib\site-packages\pywinauto\application.py", line 795, 
in _resolve_control
raise e.original_exception
pywinauto.findbestmatch.MatchError: Could not find 'dlg' in
'[u'Syntext Serna Free 4.3.0-3001QWidget', u'QWidget',
 u'Syntext Serna Free 4.3.0-3001']'
app.Syntext_Serna_Free_4_3_0_3001.menu_select('Document->Open')
另一种将对话框名称与空格/破折号/等匹配的方法是使用键访问(这种方法也可以防止输入错误):

如果您需要精确的标题相等,只需直接创建WindowsSpecification对象(如果您有几个名称非常相似的对话框/控件,这是最可靠的匹配方法):


dlg名称与真实的对话框标题相差太远。您需要更接近的名称,例如:

Traceback (most recent call last):
File "test.py", line 4, in <module>
app.dlg.MenuSelect("Document->Open")
File "c:\python27\lib\site-packages\pywinauto\application.py", line 238, in __getattr__
ctrls = _resolve_control(self.criteria)
File "c:\python27\lib\site-packages\pywinauto\application.py", line 795, 
in _resolve_control
raise e.original_exception
pywinauto.findbestmatch.MatchError: Could not find 'dlg' in
'[u'Syntext Serna Free 4.3.0-3001QWidget', u'QWidget',
 u'Syntext Serna Free 4.3.0-3001']'
app.Syntext_Serna_Free_4_3_0_3001.menu_select('Document->Open')
另一种将对话框名称与空格/破折号/等匹配的方法是使用键访问(这种方法也可以防止输入错误):

如果您需要精确的标题相等,只需直接创建WindowsSpecification对象(如果您有几个名称非常相似的对话框/控件,这是最可靠的匹配方法):


dlg名称与真实的对话框标题相差太远。您需要更接近的名称,例如:

Traceback (most recent call last):
File "test.py", line 4, in <module>
app.dlg.MenuSelect("Document->Open")
File "c:\python27\lib\site-packages\pywinauto\application.py", line 238, in __getattr__
ctrls = _resolve_control(self.criteria)
File "c:\python27\lib\site-packages\pywinauto\application.py", line 795, 
in _resolve_control
raise e.original_exception
pywinauto.findbestmatch.MatchError: Could not find 'dlg' in
'[u'Syntext Serna Free 4.3.0-3001QWidget', u'QWidget',
 u'Syntext Serna Free 4.3.0-3001']'
app.Syntext_Serna_Free_4_3_0_3001.menu_select('Document->Open')
另一种将对话框名称与空格/破折号/等匹配的方法是使用键访问(这种方法也可以防止输入错误):

如果您需要精确的标题相等,只需直接创建WindowsSpecification对象(如果您有几个名称非常相似的对话框/控件,这是最可靠的匹配方法):


谢谢你的回答。我已经尝试了你的解决方案(全部3个),但现在它给我运行时错误,因为“没有菜单”。我甚至在尝试访问菜单之前等待了5秒钟。有什么想法吗?请发布命令输出:
app['Syntext Serna Free 4.3.0-3001'].PrintControlIdentifiers()
app.Windows()
。有两种可能的情况:(1)另一个窗口包含菜单,(2)菜单栏与pywinauto不兼容(与Windows窗体可停靠菜单栏类似),因为您的对话框不是菜单的直接所有者/父级。您提到的命令的输出几乎为空。它只是“控件标识符”:。忽略输出中的引号。我认为您的第二个猜测是正确的,即菜单栏不兼容!!进一步研究后,我发现,我的应用程序是QT应用程序,因此“pywinauto”在这里不起作用。因此,我必须使用“pytest”来实现此目的。感谢您的回答。我尝试了您的解决方案(全部3个),但现在它给了我运行时错误“没有菜单”。我甚至在尝试访问菜单之前等待了5秒钟。有什么想法吗?请发布一个命令输出:
app['Syntext Serna Free 4.3.0-3001'].PrintControlIdentifiers()
app.Windows()
。有两种可能的情况:(1)另一个窗口包含菜单,(2)菜单栏与pywinauto(如Windows窗体可停靠菜单栏)不兼容,因为您的对话框不是菜单的直接所有者/父级。您提到的命令的输出几乎为空。它只是“控件标识符:“。忽略输出中的引号。我认为您的第二个猜测是正确的,即菜单栏不兼容!!进一步研究后,我发现,我的应用程序是QT应用程序,因此“pywinauto”在这里不起作用。因此,我必须使用“pytest”来实现此目的。感谢您的回答。我尝试了您的解决方案(全部3个),但现在它给了我运行时错误。”“没有菜单”。我甚至在尝试访问菜单之前等待了5秒钟。有什么想法吗?请发布一个命令输出:
app['Syntext Serna Free 4.3.0-3001'].PrintControlIdentifiers()
app.Windows()
。有两种可能的情况:(1)另一个窗口包含菜单,(2)菜单栏与pywinauto(如Windows窗体可停靠菜单栏)不兼容,因为您的对话框不是菜单的直接所有者/父级。您提到的命令的输出几乎为空。它只是“控件标识符:“。忽略输出中的引号。我认为您的第二个猜测是正确的,即菜单栏不兼容!!进一步研究后,我发现,我的应用程序是QT应用程序,因此“pywinauto”在这里不起作用。因此,我必须使用“pytest”来实现此目的。感谢您的回答。我尝试了您的解决方案(全部3个),但现在它给了我运行时错误。”“没有菜单”。我甚至在尝试访问菜单之前等待了5秒钟。有什么想法吗?请发布一个命令输出:
app['Syntext Serna Free 4.3.0-3001'].PrintControlIdentifiers()
app.Windows()
。有两种可能的情况:(1)另一个窗口包含菜单,(2)菜单栏与pywinauto(如Windows窗体可停靠菜单栏)不兼容,因为您的对话框不是菜单的直接所有者/父级。您提到的命令的输出几乎为空。它只是“控件标识符:“。忽略输出中的引号。我认为您的第二个猜测是正确的,即菜单栏不兼容!!进一步研究后,我发现,我的应用程序是一个QT应用程序,因此“pywinauto”在这里不起作用。因此,我必须使用“pytest”来实现此目的。