#AdditionalActions(Sleep2s,WaitAppear) #PywinautoExtExist/Wait #GetElementHotFixes #UIAMinimizeSpecificFix

dev-linux
Ivan Maslov 6 years ago
parent 81158f10d4
commit 7b0988d9b8

@ -301,6 +301,34 @@
dataType: "text" 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<lDataJSON.outputObject.length;i++) {
lHTMLData+='<p>'+
JSON.stringify(lDataJSON.outputObject[i])+
'</p>'
}
$(".openrpa-validate-result").html(lHTMLData)
}
if (lDataJSON.hasOwnProperty("Error")) {
mGlobal.ShowModal("GUI Error",lDataJSON.Error);
}
},
dataType: "text"
});
}
mGlobal.Test = function (inElementId) { mGlobal.Test = function (inElementId) {
//Подгрузка массива спецификаций //Подгрузка массива спецификаций
lSpecificationArray = mGlobal.GUIElement[inElementId].GUISelectorFull lSpecificationArray = mGlobal.GUIElement[inElementId].GUISelectorFull
@ -375,6 +403,30 @@
///Обновить визуализацию ///Обновить визуализацию
mGlobal.CodeList.fRender() 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 () { mGlobal.GUICodeListRun = function () {
@ -608,6 +660,9 @@
<div class="ui tiny header">Edit GUI selector</div> <div class="ui tiny header">Edit GUI selector</div>
<textarea style="width:100%; font-size:12pt" class="rpa-gui-selector" rows="6" cols="60"></textarea> <textarea style="width:100%; font-size:12pt" class="rpa-gui-selector" rows="6" cols="60"></textarea>
<button class="large ui blue button rpa-action-highlight" onclick="mGlobal.ElementHighlightNewGUISelectorString($('.rpa-gui-selector')[0].value);">Highlight element</button> <button class="large ui blue button rpa-action-highlight" onclick="mGlobal.ElementHighlightNewGUISelectorString($('.rpa-gui-selector')[0].value);">Highlight element</button>
<button class="large ui grey button rpa-action-validate" onclick="mGlobal.ElementValidateGUISelectorString($('.rpa-gui-selector')[0].value);">Validate element</button>
<div class="ui tiny header">Validate Result</div>
<div class="content openrpa-validate-result divided list" style="overflow:scroll; height: 100px;"></div>
</div> </div>
<div class="eight wide column"> <div class="eight wide column">
<div class="ui tiny header">Select action</div> <div class="ui tiny header">Select action</div>
@ -639,9 +694,10 @@
</div> </div>
<div class="row"> <div class="row">
<div class="eight wide column"> <div class="eight wide column">
<div class="ui tiny header">Code list run result</div> <div class="ui tiny header">Additional actions</div>
<div class="content gui-code-list-run-result"></div> <div class="content gui-code-list-run-result"></div>
<button class="large ui pink button" onclick="mGlobal.GUIActionWaitAddToList();">Wait element 60s: add to list</button>
<button class="large ui pink button" onclick="mGlobal.GUIActionSleep2sAddToList();">Sleep 2s: add to list</button>
</div> </div>
<div class="eight wide column"> <div class="eight wide column">
<div class="ui tiny header">Code list</div> <div class="ui tiny header">Code list</div>

@ -192,9 +192,9 @@ def PywinautoExtElementsGet (inSpecificationList,inElement=None):
if inElement is None: if inElement is None:
#сформировать спецификацию на получение элемента #сформировать спецификацию на получение элемента
lRootElementSpecification=[inSpecificationList[0]] lRootElementSpecification=[inSpecificationList[0]]
lChildrenList.append(GetControl(lRootElementSpecification)) lRootElement=GetControl(lRootElementSpecification)
if lChildrenList[0] is not None: if lRootElement is not None:
lChildrenList[0] = lChildrenList[0].wrapper_object() lChildrenList.append(lRootElement.wrapper_object())
#Елемент на вход поступил - выполнить его анализ #Елемент на вход поступил - выполнить его анализ
else: else:
#Получить список элементов #Получить список элементов
@ -263,6 +263,15 @@ def PywinautoExtElementsGet (inSpecificationList,inElement=None):
else: else:
lResultList.extend(lChildrenList) lResultList.extend(lChildrenList)
return lResultList 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":<Позиция элемента в родительском объекте>, #"index":<Позиция элемента в родительском объекте>,
@ -275,6 +284,31 @@ def PywinautoExtElementGet (inSpecificationList,inElement=None):
if len(lResultList)>0: if len(lResultList)>0:
lResult=lResultList[0] lResult=lResultList[0]
return lResult 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) inControlSpecificationArray=ElementSpecificationArraySearchPrepare(inControlSpecificationArray)
#Выполнить идентификацию объектов, если передан массив #Выполнить идентификацию объектов, если передан массив
lResultList=[]; lResultList=[];
lTempObject=None
if len(inControlSpecificationArray) > 0: if len(inControlSpecificationArray) > 0:
#Выполнить подключение к объекту #Выполнить подключение к объекту
lRPAApplication = pywinauto.Application(backend=mPywinautoActiveBackend) lRPAApplication = pywinauto.Application(backend=mPywinautoActiveBackend)
#Проверка разрядности #Проверка разрядности
lRPAApplication.connect(**inControlSpecificationArray[0]) try:
#lTempObject=lRPAApplication.window(**inControlSpecificationArray[0]) lRPAApplication.connect(**inControlSpecificationArray[0])
#Скорректировано из-за недопонимания структуры except Exception as e:
lTempObject=lRPAApplication PywinautoExtTryToRestore(inControlSpecificationArray)
#Нормализация массива для целей выборки объекта (удаление конфликтующих ключей) try:
inControlSpecificationArray=ElementSpecificationListNormalize(inControlSpecificationArray) lRPAApplication.connect(**inControlSpecificationArray[0])
#Циклическое прохождение к недрам объекта except Exception as e:
for lWindowSpecification in inControlSpecificationArray[0:]: lRPAApplication = None
lTempObject=lTempObject.window(**lWindowSpecification) 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 return lTempObject
#Получить массив свойств и методов у элемента #Получить массив свойств и методов у элемента
@ -1037,7 +1080,9 @@ def GeneralClipboardSet(inText):
win32clipboard.EmptyClipboard() win32clipboard.EmptyClipboard()
win32clipboard.SetClipboardText(inText) win32clipboard.SetClipboardText(inText)
win32clipboard.CloseClipboard() win32clipboard.CloseClipboard()
#Уснуть на 2 секунды
def GeneralSleep2s():
time.sleep(2)
#run() #run()
lText = "Bitness:" + str(struct.calcsize("P") * 8) lText = "Bitness:" + str(struct.calcsize("P") * 8)

Loading…
Cancel
Save