Pywinauto-双击的替代方法

时间:2018-11-05 18:17:37

标签: python pywinauto

目前,我正在使用Pywinauto和Behave来测试桌面应用程序,并且遇到了麻烦。 在自动化的某一点上,我需要使用双击,目前我已按如下方式进行操作:

@step("User selects {row} in Multi payment window")
def step_impl(context, row):
    """
    :param row: that we are going to fill.
    :type context: behave.runner.Context
    """
    tries = 5
    for i in range(tries):
        try:
            context.popup[str(row)].click_input(button='left', double=True)
        except:
            if i < tries - 1:  # i is zero indexed
                continue
        else:
            break

它完美地工作!但是如果我不在场或机器打开,这会导致问题,因为我使用的是 click_input(),所以我尝试使用 click(double = True),但是它似乎无法单击它,我能做些什么来解决这个问题?

这是运行print_control_identifiers()的结果,我要双击的项目是第0行和第1行,它们是自定义项目。

print_control_identifiers

1 个答案:

答案 0 :(得分:1)

这是非常底层的,并试图模拟winapi双击。可能还有更多惯用的方法可以做到这一点。

请参见代码here和事件实际顺序的说明here

  

双击鼠标左键实际上会产生四个消息序列:WM_LBUTTONDOWN,WM_LBUTTONUP,WM_LBUTTONDBLCLK和WM_LBUTTONUP。

我使用app.windows()[0].handle提取窗口句柄,然后从HwndWrapper中创建HwndWrapper(handle),然后调用HwndWrapper.double_click

from pywinauto import Application
from pywinauto.controls.hwndwrapper import HwndWrapper

app = Application(backend='uia').start(r'MFCApplication1.exe')
HwndWrapper(app.windows()[0].handle).double_click()
app.kill()

然后包装器重新生成序列。

即使您的窗口不可见,此方法也可以使用。