2
回答
同时启动多个进程,并分别获取窗口句柄的问题。
终于搞明白,存储TCO原来是这样算的>>>   

最近需要对程序在 windows平台上进行自动化模拟测试,主要是向程序内的输入框自动填写数据,并且模拟回车按键操作,并且延迟几秒,自动关闭程序。

因为选择用python来做测试脚本,我用到了pywin32,一切进展也比较顺利。但是因为我需要在很短的时间内启动10个程序。并且分别对每个程序都进行自动化模拟,所以导致大多数时候,无法正确的获取窗口句柄。



#获取窗体句柄
    def GetWhndl(self):
        whndl = win32gui.FindWindowEx(0, 0, None, self.clientTitle)
        return whndl

    #枚举窗体控件的回调函数
    def CallBack(self,hwnd, hwnds):
        if win32gui.IsWindowVisible(hwnd) and win32gui.IsWindowEnabled(hwnd):
            hwnds[win32gui.GetClassName(hwnd)] = hwnd
        return True

    #根据控件名获取句柄
    def GetControlHwnd(self,controlName):

        whndl = self.GetWhndl()
        hwnds = {}
        win32gui.EnumChildWindows(whndl, self.CallBack, hwnds)
        whndl = hwnds[controlName]
        return whndl

    #发送信息
    def SendString(self,hwnd,msg):

        for c in msg:
            if c == "\n":
                win32api.SendMessage(hwnd,win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)
                win32api.SendMessage(hwnd,win32con.WM_KEYUP, win32con.VK_RETURN, 0)
            else:

                win32api.SendMessage(hwnd, win32con.WM_CHAR, ord(c), 0)

以上是我用来获取窗口句柄以及SendMessage的代码.

#登录
    def Login(self,userName):
        
        print u'%s start login %s...' %(userName,datetime.datetime.now())

        #执行外部程序
        os.chdir(self.clientPath)
        subprocess.Popen('client.exe %s' %(userName), shell=True)
        self.clientTitle = userName
        time.sleep(5)
        #登录
        controlHwnd = self.GetControlHwnd('TA2Edit')
        self.SendString(controlHwnd,userName)
        time.sleep(2)
        self.SendString(controlHwnd,'\n')


        #获取聊天输入框句柄
        time.sleep(5)
        self.chatHwnd = self.GetControlHwnd('TA2Edit')
另外我用到了多线程每间隔2秒启动一个客户端,于是问题就来了,在同时启动不超过5个客户端的情况下,这个测试脚本工作正常,但是超过五个,获取输入框控件就会出问题了。

请有过类似经验的朋友指教。


举报
AlanShi
发帖于4年前 2回/1K+阅
顶部