From 15d8b52193e99099ec4b2b46f5850f4109df1404 Mon Sep 17 00:00:00 2001 From: Ivan Maslov Date: Sun, 2 Jun 2019 17:58:22 +0300 Subject: [PATCH] #Studio_OtcherActivities #Robot_WindowDialog #Studio_Fixes --- Robot/Robot.py | 2 +- Robot/Window.py | 13 ++++ Studio/Web/Index.xhtml | 137 +++++++++++++++++++++++++++++++++++------ 3 files changed, 131 insertions(+), 21 deletions(-) create mode 100644 Robot/Window.py diff --git a/Robot/Robot.py b/Robot/Robot.py index e6e1c8d1..f3e24398 100644 --- a/Robot/Robot.py +++ b/Robot/Robot.py @@ -95,7 +95,7 @@ def ActivityRun(inActivitySpecificationDict): #Подключить модуль для вызова lModule=importlib.import_module(inActivitySpecificationDict["ModuleName"]) #Найти функцию - lFunction=getattr(lModule,inActivitySpecificationDict["FunctionName"]) + lFunction=getattr(lModule,inActivitySpecificationDict["ActivityName"]) #Выполнить вызов и записать результат lResponseObject["Result"]=lFunction(*lArgumentList,**lArgumentDict) except Exception as e: diff --git a/Robot/Window.py b/Robot/Window.py new file mode 100644 index 00000000..8476bba7 --- /dev/null +++ b/Robot/Window.py @@ -0,0 +1,13 @@ +import ctypes +#################################### +#Info: Window module of the Robot app (OpenRPA - Robot) +#################################### +# WIndow Module - Show information dialog messages to user by the modal windows + +################ +###DialogYesNo +################ +#return 1 - Yes; 2 - No +def DialogYesNo(inTitle,inBody): + lResult = ctypes.windll.user32.MessageBoxW(0, inBody, inTitle, 1) + return lResult \ No newline at end of file diff --git a/Studio/Web/Index.xhtml b/Studio/Web/Index.xhtml index 5494bd2b..f853d15c 100644 --- a/Studio/Web/Index.xhtml +++ b/Studio/Web/Index.xhtml @@ -12,7 +12,14 @@ var mGlobal={} $(document) .ready(function() { - + ///////////////////////////////////////////////////////////////// + ///ПАРАМЕТРЫ + ///////////////////////////////////////////////////////////////// + mGlobal.Settings={} + mGlobal.Settings.mUIOTreeHeight=450 + + + mGlobal.GUIElement={} mGlobal.GenerateUniqueID=function(inPrefix="ID") { return inPrefix+Math.round(Math.random()*1000)+"-"+Math.round(Math.random()*10000)+"-"+Math.round(Math.random()*1000) @@ -32,6 +39,20 @@ document.execCommand('copy'); document.body.removeChild(el); }; + /////////////////////////// + ///Функция нормализации текстовой строки для HTML + /////////////////////////// + mGlobal.Tools={} + mGlobal.Tools.HTMLNormalizeStr=function(inString) + { + lResult=inString; + lResult=lResult.replace(/&/g,"&"); + lResult=lResult.replace(//g,">"); + lResult=lResult.replace(/"/g,"""); + lResult=lResult.replace(/'/g,"'"); + return lResult; + } ///Функция перезапуска студии mGlobal.Actions.fRestartStudioServer= function() { @@ -137,9 +158,11 @@ } ///Функция визуализации дерева - mGlobal.ElementTree.fRender = function(inElementsTreeDataArray) + mGlobal.ElementTree.fRender = function(inElementsTreeDataArray,inBackendString="-") { - var lHTMLList='
'; + var lHTMLList= + 'Backend: '+inBackendString+'\ +
'; ///Циклический обход списка for (var i = 0; i< inElementsTreeDataArray.length;i++) { ///Добавить HTML код позиции @@ -228,16 +251,21 @@ var lIconSelectOnClick=' onclick="mGlobal.TreeObjectInfoLoad(\''+lElementId+'\');" ' var lIconTestOnClick=' onclick="mGlobal.Test(\''+lElementId+'\');" ' var lIconUpOnClick=' onclick="mGlobal.Actions.fAutomationSearchMouseElementHierarchyRun(\''+lElementId+'\');" ' - + var lTitle=mGlobal.Tools.HTMLNormalizeStr(lResponseJSON.Result[i].title); + var lSettingBigTitleLength=300; + if (lTitle.length>lSettingBigTitleLength) + { + lTitle=lTitle.slice(0,lSettingBigTitleLength)+"..." + } lHTMLTree+='\
\ - \ - \ - \ - \ + \
\ -
'+lResponseJSON.Result[i].title+'
\ -
process_id:'+lResponseJSON.Result[i].process_id+'; handle:'+lSubItemHandleId+'; class_name: '+lResponseJSON.Result[i].class_name+'; RECT:L'+lResponseJSON.Result[i].rectangle.left+' T'+lResponseJSON.Result[i].rectangle.top+' R'+lResponseJSON.Result[i].rectangle.right+' B'+lResponseJSON.Result[i].rectangle.bottom+'
\ +
'+lTitle+'
\ +
process_id:'+lResponseJSON.Result[i].process_id+'; handle:'+lSubItemHandleId+'; class_name: '+lResponseJSON.Result[i].class_name+'; RECT:L'+lResponseJSON.Result[i].rectangle.left+' T'+lResponseJSON.Result[i].rectangle.top+' R'+lResponseJSON.Result[i].rectangle.right+' B'+lResponseJSON.Result[i].rectangle.bottom+'
\ + Highlight\ + Expand\ + Mouse search\
\
' //Добавить информацию об элементе в словарь JS @@ -260,7 +288,7 @@ mGlobal.TreeObjectInfoLoad =function (inElementId) { //Подгрузка массива спецификаций lSpecificationArray = mGlobal.GUIElement[inElementId].GUISelectorFull - var lHTMLList='
' + var lHTMLList='
' var lSpecificationArrayNew=[] for (i=0;i' var lResponseJSON = JSON.parse(lData) ///Ошибка if (lResponseJSON["ErrorFlag"]) { @@ -453,7 +481,7 @@ }) ; ///Показать ошибку, если таковая возникла - if (lDataJSONlDataJSON["ErrorFlag"]) { + if (lDataJSON["ErrorFlag"]) { mGlobal.ShowModal("GUI Error",lDataJSON.ErrorMessage+" \nTraceback: "+lDataJSON.ErrorTraceback); } }, @@ -513,7 +541,7 @@ var lDataJSON=JSON.parse(lData) $(".gui-code-list-run-result").html(lDataJSON.outputObject) ///Показать ошибку, если таковая возникла - if (lDataJSONlDataJSON["ErrorFlag"]) { + if (lDataJSON["ErrorFlag"]) { mGlobal.ShowModal("GUI Error",lDataJSON.ErrorMessage+" \nTraceback: "+lDataJSON.ErrorTraceback); } }, @@ -557,13 +585,62 @@ var lDataJSON=JSON.parse(lData) $(".gui-result").html(lDataJSON.Result) ///Показать ошибку, если таковая возникла - if (lDataJSONlDataJSON["ErrorFlag"]) { + if (lDataJSON["ErrorFlag"]) { mGlobal.ShowModal("GUI Error",lDataJSON.ErrorMessage+" \nTraceback: "+lDataJSON.ErrorTraceback); } }, dataType: "text" }); } + /////////////////////////////////////////////// + ////OtherActivity + /////////////////////////////////////////////// + ///Выполнить действие + mGlobal.OtherActivityRun = function () { + var lModuleName=$('.openrpa-other-activity-module-name-input')[0].value + var lActivityName=$('.openrpa-other-activity-activity-name-input')[0].value + var lArgumentList=$('.openrpa-other-activity-argument-list-input')[0].value + var lArgumentDict=$('.openrpa-other-activity-argument-dict-input')[0].value + ///Доп. обработка + if (lArgumentList=="") lArgumentList="[]" + if (lArgumentDict=="") lArgumentDict="{}" + ///Загрузка данных + $.ajax({ + type: "POST", + url: 'GUIAction', + data: '{"ModuleName":"'+lModuleName+'","ActivityName":"'+lActivityName+'","ArgumentList":'+lArgumentList+',"ArgumentDict":'+lArgumentDict+'}', + success: + function(lData,l2,l3) + { + var lDataJSON=JSON.parse(lData) + $(".gui-code-list-run-result").html(lData) + ///Показать ошибку, если таковая возникла + if (lDataJSON["ErrorFlag"]) { + mGlobal.ShowModal("GUI Error",lDataJSON.ErrorMessage+" \nTraceback: "+lDataJSON.ErrorTraceback); + } + }, + dataType: "text" + }); + } + ///Добавить действие в список на исполнение + mGlobal.OtherActivityCodeListAppend = function() { + var lModuleName=$('.openrpa-other-activity-module-name-input')[0].value + var lActivityName=$('.openrpa-other-activity-activity-name-input')[0].value + var lArgumentList=$('.openrpa-other-activity-argument-list-input')[0].value + var lArgumentDict=$('.openrpa-other-activity-argument-dict-input')[0].value + ///Доп. обработка + if (lArgumentList=="") lArgumentList="[]" + if (lArgumentDict=="") lArgumentDict="{}" + ///Сформировать строку спецификации действия + lActionSpecificationObject = {"ModuleName":lModuleName,"ActivityName":lActivityName,"ArgumentList":JSON.parse(lArgumentList),"ArgumentDict":JSON.parse(lArgumentDict)} + lActionSpecificationString = '{"ModuleName":"'+lModuleName+'","ActivityName":"'+lActivityName+'","ArgumentList":'+lArgumentList+',"ArgumentDict":'+lArgumentDict+'}' + ///Добавить в массив действий + mGlobal.ActionSpecificationList.push(lActionSpecificationObject) + ///Обновить визуализацию + mGlobal.CodeList.fRender() + + } + // fix main menu to page on passing $('.main.menu').visibility({ type: 'fixed' @@ -599,7 +676,7 @@ ///Очистить дерево mGlobal.ElementTree.fClear(); ///Прогрузить новое дерево - mGlobal.ElementTree.fRender(lResponseJSON.Result); + mGlobal.ElementTree.fRender(lResponseJSON.Result,$(".openrpa-value-backend")[0].value); ///Показать ошибку, если таковая возникла if (lResponseJSON["ErrorFlag"]) { mGlobal.ShowModal("GUI Error",lResponseJSON.ErrorMessage+" \nTraceback: "+lResponseJSON.ErrorTraceback); @@ -682,6 +759,7 @@ Restart Studio + Backend: win32 or uia

OpenRPA

@@ -715,7 +793,8 @@
-
Edit GUI selector
+
Edit GUI selector
+ [{depth_start: <1+>, depth_end: <1+>, index|ctrl_index: <0+>, title: <str>, rich_text: <str>, class_name: <str>, friendly_class_name: <str>, control_type: <str>}] @@ -752,10 +831,28 @@
-
Additional actions
+
Other activity
+ Sleep 3s + Show dialog YesNo +
Module name
+
+ +
+
Activity name
+
+ +
+
Argument list
+
+ +
+
Argument dict
+
+ +
+ +
- -
Code list