From d7a5afca331811bc2faef71e573dd5e2c4c5060e Mon Sep 17 00:00:00 2001 From: Ivan Maslov Date: Sun, 2 Jun 2019 23:11:29 +0300 Subject: [PATCH] #Robot_AddedGUIPython_64 #GUI_BitnessCheck --- Robot/GUI.py | 54 +++++++++++++++++++++++++++++++++++- Robot/JSONNormalize.py | 12 +++++++- Robot/ProcessCommunicator.py | 2 ++ Robot/Robot.py | 23 +++++++++++++-- Studio/Web/Index.xhtml | 2 +- 5 files changed, 87 insertions(+), 6 deletions(-) diff --git a/Robot/GUI.py b/Robot/GUI.py index 4d3bd7a2..0d6942ed 100644 --- a/Robot/GUI.py +++ b/Robot/GUI.py @@ -197,6 +197,23 @@ def UIOSelector_Get_UIO (inSpecificationList,inElement=None): lResult=lResultList[0] return lResult +################################################################################################# +#Get process bitness (32 or 64) +#inSpecificationList - UIOSelector +#old name - None +#return None (if Process not found), int 32, or int 64 +def UIOSelector_Get_BitnessInt (inSpecificationList): + lResult=None + #pdb.set_trace() + #Получить объект Application (Для проверки разрядности) + lRootElement=PWASpecification_Get_PWAApplication(inSpecificationList) + if lRootElement is not None: + if lRootElement.is64bit(): + lResult=64 + else: + lResult=32 + return lResult + ################################################################################################## #inControlSpecificationArray - List of dict, dict in pywinauto.find_windows notation #Backend selection - attribute "backend" ("win32" || "uia") in 1-st list element @@ -237,6 +254,41 @@ def PWASpecification_Get_UIO(inControlSpecificationArray): for lWindowSpecification in inControlSpecificationArray[0:]: lTempObject=lTempObject.window(**lWindowSpecification) return lTempObject +################################################################################################## +#inControlSpecificationArray - List of dict, dict in pywinauto.find_windows notation +#Backend selection - attribute "backend" ("win32" || "uia") in 1-st list element +#return process application object +#old name - None +def PWASpecification_Get_PWAApplication(inControlSpecificationArray): + #Определение backend + lBackend=mDefaultPywinautoBackend + #pdb.set_trace() + if "backend" in inControlSpecificationArray[0]: + lBackend=inControlSpecificationArray[0]["backend"] + inControlSpecificationArray[0].pop("backend") + #Подготовка входного массива + inControlSpecificationOriginArray=inControlSpecificationArray + inControlSpecificationArray=UIOSelector_SearchProcessNormalize_UIOSelector(inControlSpecificationArray) + #Выполнить идентификацию объектов, если передан массив + lResultList=[]; + lTempObject=None + if len(inControlSpecificationArray) > 0: + #Выполнить подключение к объекту + lRPAApplication = pywinauto.Application(backend=lBackend) + #Проверка разрядности + try: + lRPAApplication.connect(**inControlSpecificationArray[0]) + except Exception as e: + UIOSelector_TryRestore_Dict(inControlSpecificationArray) + try: + lRPAApplication.connect(**inControlSpecificationArray[0]) + except Exception as e: + lRPAApplication = None + if lRPAApplication is not None: + #lTempObject=lRPAApplication.window(**inControlSpecificationArray[0]) + #Скорректировано из-за недопонимания структуры + lTempObject=lRPAApplication + return lTempObject ########################################################################################################### #inElementSpecificationList = UIOSelector (see description on the top of the document) @@ -945,7 +997,7 @@ if not mFlagIsDebug: lJSONInput = ProcessCommunicator.ProcessParentReadWaitObject() lProcessResponse["ActivitySpecificationDict"]=lJSONInput #Выполнить вызов функции - lProcessResponse["Result"]=JSONNormalize.JSONNormalizeDictList(locals()[lJSONInput['ActivityName']](*lJSONInput['ArgumentList'],**lJSONInput['ArgumentDict'])) + lProcessResponse["Result"]=JSONNormalize.JSONNormalizeDictListStrInt(locals()[lJSONInput['ActivityName']](*lJSONInput['ArgumentList'],**lJSONInput['ArgumentDict'])) except Exception as e: #Установить флаг ошибки lProcessResponse["ErrorFlag"]=True diff --git a/Robot/JSONNormalize.py b/Robot/JSONNormalize.py index 651c1a4d..6224ce1d 100644 --- a/Robot/JSONNormalize.py +++ b/Robot/JSONNormalize.py @@ -65,5 +65,15 @@ def JSONNormalizeDictList(inDictList): if type(inDictList) is list: lResult=JSONNormalizeList(inDictList) return lResult; - +def JSONNormalizeDictListStrInt(inDictListStrInt): + lResult=None + if type(inDictListStrInt) is dict: + lResult=JSONNormalizeDict(inDictListStrInt) + if type(inDictListStrInt) is list: + lResult=JSONNormalizeList(inDictListStrInt) + if type(inDictListStrInt) is str: + lResult=inDictListStrInt + if type(inDictListStrInt) is int: + lResult=inDictListStrInt + return lResult; diff --git a/Robot/ProcessCommunicator.py b/Robot/ProcessCommunicator.py index 9f1dfdd6..582a1f9a 100644 --- a/Robot/ProcessCommunicator.py +++ b/Robot/ProcessCommunicator.py @@ -4,6 +4,7 @@ import zlib import sys import os import JSONNormalize +import pdb ############################################ ####Межпроцессное взаимодействие ############################################ @@ -78,6 +79,7 @@ def ProcessChildSendString(lProcess,lString): #ProcessChildReadWaitString def ProcessChildReadWaitString(lProcess): #Ожидаем ответ от процесса + #pdb.set_trace() lResult = lProcess.stdout.readline() #Обработка спец символов #print(b'NewLine: '+lResult) diff --git a/Robot/Robot.py b/Robot/Robot.py index f3e24398..159b0f35 100644 --- a/Robot/Robot.py +++ b/Robot/Robot.py @@ -9,6 +9,7 @@ import traceback import logging import sys import datetime +import struct #Создать файл логирования # add filemode="w" to overwrite if not os.path.exists("Reports"): @@ -61,8 +62,11 @@ logging.basicConfig(filename="Reports\ReportRobotRun_"+datetime.datetime.now().s #Start childprocess - GUI Module 32 bit mProcessGUI_x32 = subprocess.Popen(['..\\Resources\\WPy32-3720\\python-3.7.2\\python.exe','..\\Robot\\GUI.py','release'],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE) #Start childprocess - GUI Module 64 bit - uncomment after WPy64 installation -#mProcessGUI_x64 = subprocess.Popen(['..\\Resources\\WPy64-3720\\python-3.7.2\\python.exe','GUI.py'],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE) - +lProcessBitnessStr = str(struct.calcsize("P") * 8) +#start 64 if system support 64 +mProcessGUI_x64= None +if (struct.calcsize("P") * 8) == 64: + mProcessGUI_x64 = subprocess.Popen(['..\\Resources\\WPy64-3720\\python-3.7.2.amd64\\python.exe','GUI.py'],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE) #################### #Section: Activity @@ -76,10 +80,23 @@ def ActivityRun(inActivitySpecificationDict): if "ArgumentDict" not in inActivitySpecificationDict: inActivitySpecificationDict["ArgumentDict"]={} #TODO: Доделать определение разрядности (32 и 64) + ###################################################### + #Выполнить проверку разрядности через UIOSelector_Get_BitnessInt #Отправить запрос в дочерний процесс, который отвечает за работу с Windows окнами - ProcessCommunicator.ProcessChildSendObject(mProcessGUI_x32,inActivitySpecificationDict) + ProcessCommunicator.ProcessChildSendObject(mProcessGUI_x32,{"ModuleName":"GUI","ActivityName":"UIOSelector_Get_BitnessInt","ArgumentList":inActivitySpecificationDict["ArgumentList"],"ArgumentDict":inActivitySpecificationDict["ArgumentDict"]}) #Получить ответ от дочернего процесса lResponseObject=ProcessCommunicator.ProcessChildReadWaitObject(mProcessGUI_x32) + #pdb.set_trace() + if lResponseObject["Result"]==64: + #Отправить запрос в дочерний процесс, который отвечает за работу с Windows окнами + ProcessCommunicator.ProcessChildSendObject(mProcessGUI_x64,inActivitySpecificationDict) + #Получить ответ от дочернего процесса + lResponseObject=ProcessCommunicator.ProcessChildReadWaitObject(mProcessGUI_x64) + elif lResponseObject["Result"]==32: + #Отправить запрос в дочерний процесс, который отвечает за работу с Windows окнами + ProcessCommunicator.ProcessChildSendObject(mProcessGUI_x32,inActivitySpecificationDict) + #Получить ответ от дочернего процесса + lResponseObject=ProcessCommunicator.ProcessChildReadWaitObject(mProcessGUI_x32) #Вернуть результат #Остальные модули подключать и выполнять здесь else: diff --git a/Studio/Web/Index.xhtml b/Studio/Web/Index.xhtml index f853d15c..f9c5f415 100644 --- a/Studio/Web/Index.xhtml +++ b/Studio/Web/Index.xhtml @@ -614,7 +614,7 @@ { var lDataJSON=JSON.parse(lData) $(".gui-code-list-run-result").html(lData) - ///Показать ошибку, если таковая возникла + ///Показать ошибку, если таковая возникл а if (lDataJSON["ErrorFlag"]) { mGlobal.ShowModal("GUI Error",lDataJSON.ErrorMessage+" \nTraceback: "+lDataJSON.ErrorTraceback); }