diff --git a/Index.xhtml b/Index.xhtml
index 8d6d1688..972832a4 100644
--- a/Index.xhtml
+++ b/Index.xhtml
@@ -301,6 +301,34 @@
dataType: "text"
});
}
+ mGlobal.ElementValidateGUISelectorString =function (inGUISelector) {
+ //Подгрузка массива спецификаций
+ lSpecificationArray = inGUISelector
+ ///Загрузка данных
+ $.ajax({
+ type: "POST",
+ url: 'GUIAction',
+ data: '{"functionName":"PywinautoExtElementsGetInfo","argsArray":['+lSpecificationArray+']}',
+ success:
+ function(lData,l2,l3)
+ {
+ lDataJSON=JSON.parse(lData);
+ if (Array.isArray(lDataJSON.outputObject)) {
+ lHTMLData=""
+ for (i=0;i'+
+ JSON.stringify(lDataJSON.outputObject[i])+
+ '
'
+ }
+ $(".openrpa-validate-result").html(lHTMLData)
+ }
+ if (lDataJSON.hasOwnProperty("Error")) {
+ mGlobal.ShowModal("GUI Error",lDataJSON.Error);
+ }
+ },
+ dataType: "text"
+ });
+ }
mGlobal.Test = function (inElementId) {
//Подгрузка массива спецификаций
lSpecificationArray = mGlobal.GUIElement[inElementId].GUISelectorFull
@@ -375,6 +403,30 @@
///Обновить визуализацию
mGlobal.CodeList.fRender()
+ }
+ ///Добавить действие ожидания в список на исполнение
+ mGlobal.GUIActionWaitAddToList = function() {
+ var lActionElementSpecification = $('.rpa-gui-selector')[0].value
+ var lActionArgumentList = $('.rpa-argument-list')[0].value
+ if (lActionArgumentList=="") lActionArgumentList="[]"
+ ///Сформировать строку спецификации действия
+ lActionSpecificationObject = {"functionName":"PywinautoExtElementWaitAppear","argsArray":[JSON.parse(lActionElementSpecification)]}
+ lActionSpecificationString = '{"functionName":"PywinautoExtElementWaitAppear","argsArray":['+lActionElementSpecification+']}'
+ ///Добавить в массив действий
+ mGlobal.ActionSpecificationList.push(lActionSpecificationObject)
+ ///Обновить визуализацию
+ mGlobal.CodeList.fRender()
+ }
+ ///Добавить действие сон 2 секунды в список на исполнение
+ mGlobal.GUIActionSleep2sAddToList = function() {
+ ///Сформировать строку спецификации действия
+ lActionSpecificationObject = {"functionName":"GeneralSleep2s","argsArray":[]}
+ lActionSpecificationString = '{"functionName":"GeneralSleep2s","argsArray":[]}'
+ ///Добавить в массив действий
+ mGlobal.ActionSpecificationList.push(lActionSpecificationObject)
+ ///Обновить визуализацию
+ mGlobal.CodeList.fRender()
+
}
///Выполнить список действий
mGlobal.GUICodeListRun = function () {
@@ -608,6 +660,9 @@
-
+
-
+
+
diff --git a/winGUI.py b/winGUI.py
index 5ffaa8e9..1e40dc66 100644
--- a/winGUI.py
+++ b/winGUI.py
@@ -192,9 +192,9 @@ def PywinautoExtElementsGet (inSpecificationList,inElement=None):
if inElement is None:
#сформировать спецификацию на получение элемента
lRootElementSpecification=[inSpecificationList[0]]
- lChildrenList.append(GetControl(lRootElementSpecification))
- if lChildrenList[0] is not None:
- lChildrenList[0] = lChildrenList[0].wrapper_object()
+ lRootElement=GetControl(lRootElementSpecification)
+ if lRootElement is not None:
+ lChildrenList.append(lRootElement.wrapper_object())
#Елемент на вход поступил - выполнить его анализ
else:
#Получить список элементов
@@ -263,6 +263,15 @@ def PywinautoExtElementsGet (inSpecificationList,inElement=None):
else:
lResultList.extend(lChildrenList)
return lResultList
+#Получить список информационных объектов, который удовлетворяет условиям
+def PywinautoExtElementsGetInfo (inSpecificationList,inElement=None):
+ #Получить родительский объект если на вход ничего не поступило
+ lResultList=PywinautoExtElementsGet(inSpecificationList,inElement)
+ lIterator = 0
+ for lItem in lResultList:
+ lResultList[lIterator]=ElementInfoExportObject(lResultList[lIterator].element_info)
+ lIterator = lIterator + 1
+ return lResultList
#Получить элемент через расширенный движок поиска
#[ {
#"index":<Позиция элемента в родительском объекте>,
@@ -275,6 +284,31 @@ def PywinautoExtElementGet (inSpecificationList,inElement=None):
if len(lResultList)>0:
lResult=lResultList[0]
return lResult
+#Проверить, существует ли объект
+def PywinautoExtElementExist (inSpecificationList):
+ #pdb.set_trace()
+ return len(PywinautoExtElementsGet(inSpecificationList))>0
+#Ожидать появления элемента
+def PywinautoExtElementWaitAppear(inSpecificationList,inTimeout=60):
+ lTimeoutSeconds = 0
+ while (not PywinautoExtElementExist(inSpecificationList) and inTimeout>lTimeoutSeconds):
+ lTimeoutSeconds = lTimeoutSeconds + 0.5
+ #Заснуть на полсекунды
+ time.sleep(0.5)
+ return PywinautoExtElementExist(inSpecificationList)
+#Функция, которая попытается восстановить окно, если оно есть, но свернуто (особенность uia backend - он не может прицепиться к окну, если оно свернуто)
+def PywinautoExtTryToRestore(inSpecificationList):
+ #pdb.set_trace()
+ try:
+ #Подготовка взодного массива
+ inControlSpecificationArray=ElementSpecificationArraySearchPrepare(inSpecificationList)
+ #Выполнить подключение к объекту
+ lRPAApplication = pywinauto.Application(backend="win32")
+ lRPAApplication.connect(**inSpecificationList[0])
+ lRPAApplication.top_window().restore()
+ except Exception:
+ True==False
+
################################
#Функция повторяющегося таймера
#############################
@@ -371,19 +405,28 @@ def GetControl(inControlSpecificationArray):
inControlSpecificationArray=ElementSpecificationArraySearchPrepare(inControlSpecificationArray)
#Выполнить идентификацию объектов, если передан массив
lResultList=[];
+ lTempObject=None
if len(inControlSpecificationArray) > 0:
#Выполнить подключение к объекту
lRPAApplication = pywinauto.Application(backend=mPywinautoActiveBackend)
#Проверка разрядности
- lRPAApplication.connect(**inControlSpecificationArray[0])
- #lTempObject=lRPAApplication.window(**inControlSpecificationArray[0])
- #Скорректировано из-за недопонимания структуры
- lTempObject=lRPAApplication
- #Нормализация массива для целей выборки объекта (удаление конфликтующих ключей)
- inControlSpecificationArray=ElementSpecificationListNormalize(inControlSpecificationArray)
- #Циклическое прохождение к недрам объекта
- for lWindowSpecification in inControlSpecificationArray[0:]:
- lTempObject=lTempObject.window(**lWindowSpecification)
+ try:
+ lRPAApplication.connect(**inControlSpecificationArray[0])
+ except Exception as e:
+ PywinautoExtTryToRestore(inControlSpecificationArray)
+ try:
+ lRPAApplication.connect(**inControlSpecificationArray[0])
+ except Exception as e:
+ lRPAApplication = None
+ if lRPAApplication is not None:
+ #lTempObject=lRPAApplication.window(**inControlSpecificationArray[0])
+ #Скорректировано из-за недопонимания структуры
+ lTempObject=lRPAApplication
+ #Нормализация массива для целей выборки объекта (удаление конфликтующих ключей)
+ inControlSpecificationArray=ElementSpecificationListNormalize(inControlSpecificationArray)
+ #Циклическое прохождение к недрам объекта
+ for lWindowSpecification in inControlSpecificationArray[0:]:
+ lTempObject=lTempObject.window(**lWindowSpecification)
return lTempObject
#Получить массив свойств и методов у элемента
@@ -1037,7 +1080,9 @@ def GeneralClipboardSet(inText):
win32clipboard.EmptyClipboard()
win32clipboard.SetClipboardText(inText)
win32clipboard.CloseClipboard()
-
+#Уснуть на 2 секунды
+def GeneralSleep2s():
+ time.sleep(2)
#run()
lText = "Bitness:" + str(struct.calcsize("P") * 8)