-
Content
+
diff --git a/Wiki/ENG_Guide/html/objects.inv b/Wiki/ENG_Guide/html/objects.inv
index 3f44f165..17d1623d 100644
Binary files a/Wiki/ENG_Guide/html/objects.inv and b/Wiki/ENG_Guide/html/objects.inv differ
diff --git a/Wiki/ENG_Guide/html/py-modindex.html b/Wiki/ENG_Guide/html/py-modindex.html
index 65729978..d92db568 100644
--- a/Wiki/ENG_Guide/html/py-modindex.html
+++ b/Wiki/ENG_Guide/html/py-modindex.html
@@ -110,7 +110,8 @@
1. Description
2. Defs
3. gSettings Template
-
4. How to start process
+
4. How to use
+
5. UAC - User Access Control
diff --git a/Wiki/ENG_Guide/html/search.html b/Wiki/ENG_Guide/html/search.html
index 0a37dc63..f30c58c1 100644
--- a/Wiki/ENG_Guide/html/search.html
+++ b/Wiki/ENG_Guide/html/search.html
@@ -110,7 +110,8 @@
1. Description
2. Defs
3. gSettings Template
-
4. How to start process
+
4. How to use
+
5. UAC - User Access Control
diff --git a/Wiki/ENG_Guide/html/searchindex.js b/Wiki/ENG_Guide/html/searchindex.js
index 6fff7139..8ea57f9a 100644
--- a/Wiki/ENG_Guide/html/searchindex.js
+++ b/Wiki/ENG_Guide/html/searchindex.js
@@ -1 +1 @@
-Search.setIndex({docnames:["01_HowToInstall","02_RoadMap","03_Copyrights_Contacts","Orchestrator/01_Orchestrator","Orchestrator/02_Defs","Orchestrator/03_gSettingsTemplate","Orchestrator/04_HowToStart","Robot/01_Robot","Robot/02_Defs","Robot/03_HowToUse","Robot/04_Dependencies","Studio/01_Studio","Studio/02_HowToUse","index"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,"sphinx.ext.todo":2,"sphinx.ext.viewcode":1,sphinx:56},filenames:["01_HowToInstall.rst","02_RoadMap.rst","03_Copyrights_Contacts.rst","Orchestrator\\01_Orchestrator.rst","Orchestrator\\02_Defs.rst","Orchestrator\\03_gSettingsTemplate.rst","Orchestrator\\04_HowToStart.rst","Robot\\01_Robot.rst","Robot\\02_Defs.rst","Robot\\03_HowToUse.rst","Robot\\04_Dependencies.rst","Studio\\01_Studio.rst","Studio\\02_HowToUse.rst","index.rst"],objects:{"pyOpenRPA.Orchestrator":{__Orchestrator__:[4,0,0,"-"]},"pyOpenRPA.Orchestrator.__Orchestrator__":{AgentActivityItemAdd:[4,1,1,""],AgentOSCMD:[4,1,1,""],AgentOSFileBinaryDataBase64StrCreate:[4,1,1,""],AgentOSFileBinaryDataBytesCreate:[4,1,1,""],AgentOSFileTextDataStrCreate:[4,1,1,""],GSettingsAutocleaner:[4,1,1,""],GSettingsKeyListValueAppend:[4,1,1,""],GSettingsKeyListValueGet:[4,1,1,""],GSettingsKeyListValueOperatorPlus:[4,1,1,""],GSettingsKeyListValueSet:[4,1,1,""],OSCMD:[4,1,1,""],OSCredentialsVerify:[4,1,1,""],OrchestratorRestart:[4,1,1,""],OrchestratorSessionSave:[4,1,1,""],ProcessIsStarted:[4,1,1,""],ProcessListGet:[4,1,1,""],ProcessStart:[4,1,1,""],ProcessStop:[4,1,1,""],ProcessorActivityItemAppend:[4,1,1,""],ProcessorActivityItemCreate:[4,1,1,""],ProcessorAliasDefCreate:[4,1,1,""],ProcessorAliasDefUpdate:[4,1,1,""],PythonStart:[4,1,1,""],RDPSessionCMDRun:[4,1,1,""],RDPSessionConnect:[4,1,1,""],RDPSessionDisconnect:[4,1,1,""],RDPSessionDublicatesResolve:[4,1,1,""],RDPSessionFileStoredRecieve:[4,1,1,""],RDPSessionFileStoredSend:[4,1,1,""],RDPSessionLogoff:[4,1,1,""],RDPSessionMonitorStop:[4,1,1,""],RDPSessionProcessStartIfNotRunning:[4,1,1,""],RDPSessionProcessStop:[4,1,1,""],RDPSessionReconnect:[4,1,1,""],RDPSessionResponsibilityCheck:[4,1,1,""],RDPTemplateCreate:[4,1,1,""],SchedulerActivityTimeAddWeekly:[4,1,1,""],UACKeyListCheck:[4,1,1,""],UACSuperTokenUpdate:[4,1,1,""],UACUpdate:[4,1,1,""],WebCPUpdate:[4,1,1,""],WebURLConnectDef:[4,1,1,""],WebURLConnectFile:[4,1,1,""],WebURLConnectFolder:[4,1,1,""],WebUserInfoGet:[4,1,1,""],WebUserIsSuperToken:[4,1,1,""],WebUserUACHierarchyGet:[4,1,1,""]},"pyOpenRPA.Robot":{UIDesktop:[8,0,0,"-"]},"pyOpenRPA.Robot.UIDesktop":{Get_OSBitnessInt:[8,1,1,""],PWASpecification_Get_PWAApplication:[8,1,1,""],PWASpecification_Get_UIO:[8,1,1,""],UIOSelectorSecs_WaitAppear_Bool:[8,1,1,""],UIOSelectorSecs_WaitDisappear_Bool:[8,1,1,""],UIOSelectorUIOActivity_Run_Dict:[8,1,1,""],UIOSelector_Exist_Bool:[8,1,1,""],UIOSelector_FocusHighlight:[8,1,1,""],UIOSelector_GetChildList_UIOList:[8,1,1,""],UIOSelector_Get_BitnessInt:[8,1,1,""],UIOSelector_Get_BitnessStr:[8,1,1,""],UIOSelector_Get_UIO:[8,1,1,""],UIOSelector_Get_UIOActivityList:[8,1,1,""],UIOSelector_Get_UIOInfo:[8,1,1,""],UIOSelector_Get_UIOList:[8,1,1,""],UIOSelector_Highlight:[8,1,1,""],UIOSelector_SafeOtherGet_Process:[8,1,1,""],UIOSelector_SearchChildByMouse_UIO:[8,1,1,""],UIOSelector_SearchChildByMouse_UIOTree:[8,1,1,""],UIOSelector_TryRestore_Dict:[8,1,1,""],UIOSelectorsSecs_WaitAppear_List:[8,1,1,""],UIOSelectorsSecs_WaitDisappear_List:[8,1,1,""]}},objnames:{"0":["py","module","Python module"],"1":["py","function","Python function"]},objtypes:{"0":"py:module","1":"py:function"},terms:{"0643":6,"100":5,"1050":[4,5],"120":5,"127":4,"1680":[4,5],"1680x1050":[4,5],"1992":6,"2008":0,"2012":0,"2019":13,"2020":1,"2021":1,"222":[3,5],"2999226":0,"300":5,"3389":[4,5],"3600":5,"3720":[0,9],"3720python":9,"4100115560661986":13,"412":4,"600":5,"640x480":[4,5],"722":2,"77767775":4,"77777sdfsdf77777dsfdfsf77777777":4,"8081":5,"906":2,"\u0432":[7,8,13],"\u0432\u0445\u043e\u0434\u043d\u043e\u0439":[7,8],"\u0432\u044b\u043a\u0438\u043d\u0443\u0442\u044c":[7,8],"\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c":[7,8],"\u0434\u0435\u043c\u043e\u043d\u0430":5,"\u0434\u0435\u043c\u043e\u043d\u0443":5,"\u043a":[5,7,8],"\u043a\u043e\u043d\u043d\u0435\u043a\u0442":[7,8],"\u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443":5,"\u043b\u043e\u0433\u0433\u0435\u0440\u0430":5,"\u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f":5,"\u043c\u043e\u0436\u043d\u043e":5,"\u043d\u0435":[7,8],"\u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u0438":[7,8],"\u043e\u0448\u0438\u0431\u043a\u0443":[7,8],"\u043f\u0435\u0440\u0435\u0439\u0442\u0438":13,"\u043f\u043e":5,"\u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430":5,"\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f":5,"\u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c":[7,8],"\u043f\u043e\u0440\u0442":5,"\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0443":[7,8],"\u043f\u0443\u0441\u0442\u043e\u0433\u043e":[7,8],"\u0440\u0430\u0437\u0434\u0435\u043b":13,"\u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435":5,"\u0441\u0435\u0440\u0432\u0435\u0440\u0430":5,"\u0441\u0435\u0442\u0435\u0432\u043e\u0435":5,"\u0441\u043b\u0443\u0447\u0430\u0435":[7,8],"\u0441\u043e\u0437\u0434\u0430\u0442\u044c":5,"\u0441\u043f\u0438\u0441\u043a\u0430":[7,8],"\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f":[7,8],"\u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u043e\u0432":13,"\u0444\u0430\u0439\u043b":5,"\u0444\u043b\u0430\u0433":[7,8],"\u0447\u0442\u043e":[7,8],"\u044d\u043b\u0435\u043c\u0435\u043d\u0442":[7,8],"case":[3,4,5,7,8,9],"class":[8,9],"default":[4,5,8,9,12],"float":[3,5,7,8],"function":[4,5,8,9],"import":[3,4,5,6,7,8,9],"int":[3,4,7,8,9],"new":[1,3,4,5,6],"return":[4,5,7,8,9],"switch":10,"true":[4,5,6,7,8],"try":[4,6,7,8],"var":4,Abs:5,Are:0,For:[0,1,6,8,9,12],Has:5,NOT:4,RUS:[1,13],The:[0,3],USEFUL:4,USe:5,Use:[2,4,6],Will:[4,5],__agentdictitemcreate__:5,__create__:5,__main__:6,__name__:6,__orchestrator__:13,__uacclientadmincreate__:[5,6],_sessionlast_rdplist:4,a2o:4,abil:[8,9],abl:13,about:[3,4,5],abs:4,absolut:[2,4,5,6,13],abspath:6,access:[4,5,6,13],accessus:5,action:[1,9,13],activ:[3,4,5,7,8,9,12],activitydict:5,activityitem:4,activityitemdict:4,activitylist:5,activitylistappendprocessorqueuebool:5,activitylistexecut:4,activitylistexecutebool:5,activitynam:9,activitytimelist:5,actual:[4,13],add:[4,5,6,9],addhandl:5,address:[4,5],admindict:[5,6],administr:4,after:[3,5,6,7,8,12],agent:13,agentactivityitemadd:4,agentdict:[4,5],agentkeydict:[5,6],agentkeystr:5,agentoscmd:4,agentosfilebinarydatabase64strcr:4,agentosfilebinarydatabytescr:4,agentosfiletextdatastrcr:4,algorithm:3,algorythm:[3,5,13],alia:[3,4,5],aliasdefdict:[3,4,5],all:[2,3,4,5,6,7,8,9,13],allow:[4,5,6,8,9,13],alreadi:[4,8,9],amd64:[0,9],analyz:13,ani:[0,3,4,9,12,13],anoth:[4,12],apach:2,app:[4,7,13],appear:[7,8],append:[3,4,5,9],appli:[3,5],applic:[3,4,5,7,8,9],approach:[8,9],architectur:13,archiv:[0,5],arg:[3,4,5],argdict:[3,4,5],arggset:[3,4,5],arglist:[3,4,5],arglogg:[3,4,5],argument:[1,4,5],argvaluestr:4,artifici:9,asctim:5,assert:9,associ:4,asweigart:2,async:3,asynchonu:3,attent:[3,4,6,8,9,12],attribut:[3,5,7,8,9],authent:5,authentif:4,authtoken:5,authtokensdict:5,auto:4,autoclean:[3,5],autom:[10,13],automat:[3,5,12],automationsearchmouseel:[7,8],avail:[4,5,8,9],b4ff:6,backend:[7,8,9],backward:[1,4],base64:4,base:[3,4,13],base_wrapp:[8,9],basic:[3,4,5,6],becaus:[3,4,8,9],been:[0,4,5,8,9,13],befor:5,beginwith:[4,5],below:[1,3,6,12],best:13,between:[3,4,5,6],big:[8,9,13],binari:4,bit:[2,4,7,8,9],block:5,bool:[3,4,5,8,9],boppreh:2,both:[4,9],branch:[0,1],browser:[5,12],bsd:2,build:6,built:0,busi:[3,4,9,13],button:5,cabinetwclass:9,cach:5,calcfram:[8,9],call:[3,4,6,7,8],callabl:4,can:[3,4,5,7,8,9,13],cancel:[7,8],cant:3,captur:13,central:3,chang:[5,13],check:[4,5,6,7,8,9,13],checkintervalsecfloat:5,checktasknam:5,child:[7,8,9],children:9,choos:[7,8],chrome:[9,13],class_nam:[8,9],class_name_r:[8,9],classif:9,claus:2,cleaner:4,clear:[4,5,9],click:[8,9],client:[4,5],clientrequesthandl:5,clipboard:4,close:[4,5,9],cmd:[4,5,12,13],cmdinputbool:[5,6],code:[3,8,9,12],collect:5,com:[0,2,9,10],comma:3,command:[4,5,9],commerci:13,common:9,commun:4,compani:13,compat:[1,4,8,9],compex:3,complet:[0,5],complex:3,compon:13,comput:[9,13],concept:13,condit:[7,8,9],config:6,configur:[4,5,6,13],congratul:13,connect:[4,5],connectioncountint:5,connectionfirstqueueitemcountint:5,consist:3,consol:[5,9,12,13],consolid:[3,13],contact:13,contain:[4,5,7,8,9,12],content:[1,4,5],continu:4,control:[3,4,5,6],control_typ:[8,9],control_type_r:[8,9],controlpanel:[5,6],controlpaneldict:5,controlpanelkeyallowedlist:5,controlpanelrefreshintervalsecfloat:5,convent:9,cooki:5,copi:9,copyright:13,core:[3,13],cp_test:6,cp_versioncheck:6,cpdict:5,cpkei:5,cpkeydict:[5,6],cpkeystr:5,creat:[2,3,4,5,6,13],credenti:4,crosscheck:4,css:10,ctrl_index:[8,9],current:[3,4,5,6,8,9],custom:[3,9],cv2:9,daemon:4,dai:4,data:5,datasetlast:5,date:1,datetim:[5,6],dear:13,decentr:3,decid:13,def:[3,5,6,7,13],defaliastest:[3,5],defnamestr:5,defsettingsupdatepathlist:5,del:6,depend:13,deploi:4,deprec:5,depth:[8,9],depth_end:[8,9],depth_start:[8,9],depth_stop:[8,9],depthbit:[4,5],descipt:[8,9],descript:[5,8,9,13],desktop:[3,4,5,6,13],desktopus:4,destin:[4,7,8],detail:3,detect:[5,7,8,9],determin:4,dev:[1,4],develop:[4,8,9,13],dict:[4,5,7,8,9,13],dictionari:[3,5],differ:3,directori:[4,9],disappear:[7,8],disc:4,disconnect:[4,5],distribut:13,divis:13,dll:13,doc:9,document:[7,8],docutil:[4,8],doe:12,doen:4,doesn:[7,8],domain:5,domainadstr:5,domainupperstr:4,don:4,dont:[4,5],doubl:12,download:0,dp0:9,draw:[7,8],drive:[4,5],driver:9,dsd:[3,5],dump:5,dumploglist:5,dumploglistcountint:5,dumploglisthashstr:5,dumploglistrefreshintervalsecfloat:5,duplic:4,durat:5,dynam:[8,9],each:[4,8,9],edit:13,editor:12,elem:9,element:[7,8,9],els:[4,5,6,7,8],empti:5,enabl:[8,9],encod:4,end:3,eng:[1,13],enterpris:13,env:5,enviro:9,environ:4,equal:[4,5],equalcas:[4,5],everi:[4,5],everydai:4,exact:9,exampl:[3,4,5,6,7],except:[0,4,6],exe:[0,4,5,8,9],execut:[3,4,5,11,13],executebool:5,exist:[4,5,7,8,9],expens:13,expir:4,explor:[9,12],express:[8,9],extens:[4,8,9],extra:4,extract:[8,9,13],facebook:2,fail:1,fals:[4,5,7,8],fast:13,featur:[3,4,5,13],feel:2,field:[4,5],file:[4,5],filehandl:5,filemanag:5,filemod:5,fileurl:5,fileurlfilepathdict:5,fileurlfilepathdict_help:5,fill:[4,5],find:[3,9,13],find_element_by_nam:9,find_window:[7,8,9],firefox:[9,13],first:[8,9,13],flag:[4,5],flagaccess:5,flagaccessdefrequestglobalauthent:5,flagcredentialsask:5,flagdonotexpir:5,flagforc:5,flagsessionisact:[4,5],flaguseallmonitor:[4,5],flexibl:3,focu:[7,8],folder:[4,6,9],follow:[0,12],forc:[4,5],forget:5,formatt:5,found:9,founder:13,framework:[7,8,9,10,13],free:[2,13],fridai:4,friendly_class_nam:[8,9],friendly_class_name_r:[8,9],from:[0,3,4,5,6,7,8,13],full:[4,5],fulli:9,fullscreen:[4,5],fullscreenbool:5,fullscreenrdpsessionkeystr:5,functional:6,further:4,garbag:4,gener:[4,5,13],get:[4,5,7,8,9],get_osbitnessint:[7,8],getcontrol:[7,8],getlogg:5,git:[0,4,5],github:2,gitlab:[0,9],give:[4,5],given:4,global:[4,13],goe:3,good:3,graphic:[9,13],great:13,group:13,gset:[3,6,13],gsettingsautoclean:4,gsettingsdict:4,gsettingskeylistvalueappend:4,gsettingskeylistvalueget:4,gsettingskeylistvalueoperatorplu:4,gsettingskeylistvalueset:4,gui:[3,4,7,8,9,10,13],guid:[1,5],gurbag:5,handl:5,handlebar:10,handler:5,hard:[4,5],has:[0,3,4,8,9],have:4,height:[4,5],help:[0,2,4,13],here:[8,9,13],hex:[4,5,8,9],hidden:4,hierarchi:[4,8,9,12],highlight:[7,8,9,12],hightlight:12,host:[4,5],hostnameupperstr:5,how:13,html:[4,8,9,12],htmlrenderdef:5,http:[0,2,3,4,5,8,9,10,13],human:4,identif:[4,9],identifi:9,ignor:[4,5],ignorebool:5,imag:13,imaslov:6,implement:[8,9],inactionnam:[7,8],inactivityitemdict:4,inactivitylist:4,inadisdefaultbool:[4,6],inadloginstr:[4,6],inadstr:[4,6],inaliasstr:4,inarg1str:4,inargdict:4,inarggset:4,inarggsettingsstr:4,inarglist:4,inargloggerstr:4,inargu:9,inargumentlist:[7,8],inbackend:[7,8],inbreaktriggerprocesswoexelist:4,incloseforcebool:4,includ:[7,8],incmdstr:4,incontenttypestr:4,incontrolspecificationarrai:[7,8],incpkeystr:4,indef:4,indefnamestr:4,indepthbitint:4,index:[3,4,5,7,8,9],indict:5,indomainstr:4,inel:[7,8],inelementspecif:[7,8],inencodingstr:4,infiledatabase64str:4,infiledatabyt:4,infiledatastr:4,infilepathstr:4,inflagforceclosebool:4,inflaggetabspathbool:4,inflagraiseexcept:[7,8],inflagwaitallinmo:[7,8],info:[4,5,6,8,9],infolderpathstr:4,inform:[3,4],infrastructur:13,ingset:[3,4,6],ingsettingsclientdict:5,inhashkeystr:5,inheightpxint:4,inherit:[8,9],inhostfilepathstr:4,inhostnamestr:4,inhoststr:[4,5],inhtmlrenderdef:4,init:[3,4,5,6],initdatetim:5,initi:4,injsinitgeneratordef:4,injsongeneratordef:4,inkeylist:4,inkeystr:5,inkwargumentobject:[7,8],inlogg:[4,5],inloginstr:[4,5],inmatchtypestr:4,inmethodstr:4,inmodestr:[3,4,5,6],inmodulepathstr:4,inpasswordstr:[4,5],inpathstr:4,inportint:4,inportstr:[4,5],inprocessnamewexestr:4,inprocessnamewoexelist:4,inprocessnamewoexestr:4,input:5,inrdpfilepathstr:4,inrdpsessionkeystr:[4,5],inrdptemplatedict:4,inrequest:4,inrolehierarchyalloweddict:[4,6],inrolekeylist:4,inrowcountint:5,inrunasyncbool:4,insert:6,inshareddrivelist:4,inspecificationlist:[7,8],inspecificationlistlist:[7,8],instal:13,instanc:[3,4,7,8,9],instopprocessnamewoexestr:4,insupertokenstr:[4,6],intellig:9,interact:[3,4],interest:4,interfac:[3,8,9,13],internet:12,interpret:3,interv:[4,5],intervalsecfloat:5,intimehhmmstr:4,inuioselector:[7,8],inurllist:[4,6],inurlstr:4,inusebothmonitorbool:4,inusernamestr:4,inuserstr:4,invalu:4,inwaitsec:[7,8],inweekdaylist:4,inwidthpxint:4,is_en:[8,9],is_vis:[8,9],islistenbool:5,isresponsiblebool:4,it4busi:2,item:[3,4,7,8,9],iter:5,ivan:13,ivanmaslov:2,join:6,jsinitgeneratordef:5,json:[3,4,5],jsongeneratordef:5,jsrender:10,jsview:10,just:9,kb2999226:0,keep:3,kei:[4,8,9],keyboard:[2,10,13],keystr:5,kill:4,killer:13,know:3,known:13,kwarg:3,lactivityitem:4,laliasstr:4,last:5,latest:[8,9],launch:4,left:3,len:5,let:13,level:[8,9,13],levelnam:5,lib:9,librari:[8,9],licens:13,lifetim:5,lifetimerequestsecfloat:5,lifetimesecfloat:5,light:3,like:[3,13],line:9,link:[3,4,5,13],linkedin:2,list:[3,4,5,7,8,9],listen:4,listenport:5,listenport_:5,listenurllist:5,listread:5,litem:9,load:5,local:[4,5],localhost:5,locat:4,log:[4,5,6,13],logger:[4,5,6],loggerdumploghandleradd:5,loggerhandlerdumploglist:5,login:[4,5,6],logoff:[4,5],logviewerbool:[5,6],lol:12,look:[3,4,5,12,13],lookmachinescreenshot:5,loop:9,low:9,lowercas:5,lprocessisstartedbool:4,lprocesslist:4,lpyopenrpasourcefolderpathstr:6,lrdpitemdict:4,lrdptemplatedict:4,lresult:5,lresultdict:[4,5],luacclientdict:6,lxml:10,machin:[0,4,5,6,13],machina:5,mail:2,main:[3,4,5,6,9],maintain:13,make:9,makedir:5,manag:4,mani:[3,7,8],manipul:[4,13],march:1,maslov:13,master:0,match:9,matchtyp:5,max:5,maxim:[7,8],maximum:[8,9],mayb:4,mechan:3,mega:3,megafind:2,memori:4,merg:4,messag:5,method:[5,8,9],methodmatchurl:5,methodmatchurlbeforelist:5,mhandlerdumploglist:5,microsoft:[0,8,9],minim:[7,8],miss:[8,9],mit:[2,13],mmstr:5,mode:12,model:[2,8,9],modul:[3,4,5,6],moduletocal:4,mondai:4,monei:13,monitor:4,more:[3,9],mous:13,mrobotlogg:5,mrobotloggerfh:5,mrobotloggerformatt:5,must:5,name:[3,4,5,6,7,8,9],namewoexestr:4,namewoexeupperstr:4,need:[0,2,3,4,5,7,8,9,13],nest:4,net:[4,8],never:4,newkeydict:4,newkeylist:4,newvalu:4,next:[8,9],non:13,none:[3,4,5,7,8],notat:[7,8,9],notepad:[4,5,7,8],noth:4,nothingbool:5,now:[4,5],nul:9,object:[3,4,5,7,8,9,13],occupi:4,ocr:9,octet:4,off:5,old:[4,5,6,7,8],one:[5,6],onli:[0,1,4,5,7,8,9],onlin:13,open:[12,13],opencv:[0,10,13],openrpa52zzz:6,openrpa:[0,5],openrpa_32:12,openrpa_64:12,openrpaorchestr:9,openrparesourceswpy32:9,openrparesourceswpy64:9,openrparobotdaemon:5,opensourc:13,oper:[0,4,6],opera:[9,13],option:[5,8,9],orc:5,orchestr:[5,6],orchestratormain:9,orchestratorrestart:4,orchestratorsessionsav:4,orchestratorstart:5,order:[3,9,12],org:[2,9],oscmd:4,oscredentialsverifi:4,other:[7,8,9,13],our:[8,9],out:4,outargu:9,outlin:[7,8],output:5,outstr:4,over:2,overwrit:5,own:[3,9,13],packag:[0,6,7],page:[4,5],page_sourc:9,pai:[3,6],panel:[4,5,6,12],paramet:[3,4,5,7,8],parent:[7,8,9,12],parti:13,pass:[4,5],password:[4,5],path:[4,5,6,9],paus:9,pdb:5,per:6,perfom:[9,13],perform:13,period:5,phone:3,pid:4,pil:10,pipupgrad:5,pixel:[4,5],plan:[1,4],platform:13,pleas:13,plu:4,port:[4,5],portabl:[0,9],possibl:13,post:[4,5],postfix:4,power:13,practic:13,prefer:2,previou:4,print:[6,9],process:[3,5,7,8,9,11,13],processdetaillist:4,processisstart:4,processlistget:4,processnam:4,processor:[5,13],processoractivityitemappend:4,processoractivityitemcr:4,processoraliasdefcr:4,processoraliasdefupd:4,processordict:5,processstart:[4,5],processstartifturnedoff:5,processstop:[4,5],processwoexelist:4,processwoexeupperlist:4,product:9,program:[4,5],progress:1,project:[3,13],properti:13,protocol:3,provid:[8,9],psutil:[6,10],pull:5,purpos:[1,2],pwa:[8,9],pwaspecif:[8,9],pwaspecification_get_pwaappl:[7,8],pwaspecification_get_uio:[7,8],pyautogui:[2,9,10,13],pycon:9,pymupdf:10,pyopenrpa:[0,1,2,3,5,6,8,9,11],pyopenrpadict:[5,6],pyrobot_cp:6,python:[0,3,5,7,8,10,12,13],pythonstart:4,pywin32:[2,10],pywinauto:[2,7,8,9,10],queue:[1,3,4,5,13],queuelist:5,r01:5,r01_integrationorderout:5,r01_orchestratortorobot:5,rais:4,rdp:[3,4,5],rdpactiv:5,rdpconfigurationdict:5,rdpkei:4,rdpkeydict:[5,6],rdpkeystr:5,rdplist:[4,5],rdpsession:13,rdpsessioncmdrun:4,rdpsessionconnect:[4,5],rdpsessiondisconnect:[4,5],rdpsessiondublicatesresolv:4,rdpsessionfilereciev:5,rdpsessionfilesend:5,rdpsessionfilestoredreciev:4,rdpsessionfilestoredsend:4,rdpsessionkei:5,rdpsessionkeystr:5,rdpsessionlogoff:[4,5],rdpsessionmonitorstop:4,rdpsessionprocessstart:5,rdpsessionprocessstartifnotrun:4,rdpsessionprocessstop:4,rdpsessionreconnect:[4,5],rdpsessionresponsibilitycheck:4,rdptemplatecr:4,read:5,readi:0,readthedoc:[8,9],reciev:[4,5],recognit:13,reconnect:4,reconnectbool:5,recurs:[8,9],reestr_otgruzok:5,refactor:1,refer:13,refresh:5,refreshsecond:5,regener:4,regular:[8,9],rel:[4,5,6],reliabl:13,rememb:5,remot:[4,5,13],render:12,renderfunct:5,renderrobotr01:5,report:5,reqir:3,request:[4,5,10],requesttimeoutsecfloat:5,requir:[4,13],resolut:[4,5],resourc:[0,9],respons:[4,5],responsecontenttyp:5,responsedefrequestglob:5,responsefilepath:5,responsefolderpath:5,responsibilitycheckintervalsec:5,restart:[4,5],restartorchestr:5,restartorchestratorbool:[5,6],restartorchestratorgitpullbool:[5,6],restartpcbool:[5,6],restor:[7,8],restrict:13,restructuredtext:[4,8],result:[4,5,7,8,9],returnbool:5,rich_text:[8,9],rich_text_r:[8,9],roadmap:13,robot:[3,4,5,6],robot_r01:5,robot_r01_help:5,robotlist:5,robotrdpact:[4,5],rolehierarchyalloweddict:5,root:[4,5],row:5,rpa:[4,5,13],rpatestdirtest:4,rst:[4,8],ruledomainuserdict:5,rulemethodmatchurlbeforelist:5,run:[0,4,5,6,7,8,13],russia:[2,13],russian:13,safe:[4,7,8],same:[7,8],save:4,schedul:[3,13],scheduleractivitytimeaddweekli:4,schedulerdict:5,scopesrcul:5,screen:[4,5,13],screenshot:[0,5,13],screenshotviewerbool:[5,6],script:[3,13],search:[4,13],sec:5,second:[4,5,7,8,9],section:4,see:[0,1,4,5,6,7,8],select:[7,8],selector:[7,8,9,12,13],selenium:[2,10,13],semant:[2,10],send:[4,5],send_kei:9,sent:4,sequenc:3,server:[0,3,5,12],serverdict:5,serverset:5,sesion:[4,5],session:[4,5],sessionguidstr:5,sessionhex:[4,5],sessionisignoredbool:[4,5],sessioniswindowexistbool:[4,5],sessioniswindowresponsiblebool:[4,5],set:[4,5,6,7,8,13],set_trac:5,setformatt:5,setlevel:5,settingstempl:[3,6],settingsupd:6,setup:5,sever:[3,9,13],share:4,shareddrivelist:[4,5],shell:[4,13],should:5,show:5,side:[4,5],signal:4,simplifi:9,sinc:13,singl:3,singleton:4,skype:2,sleep:9,socket:3,solut:[0,9,13],some:[3,4,5,13],sort:4,sourc:[3,4,6,7,8,13],sourceforg:[4,8],space:3,special:5,specif:[8,9],sphinx:3,standart:5,start:[0,4,5,8,9,12,13],statu:4,stdout:[5,6],stop:[4,8,9,13],storag:[5,13],store:5,str:[3,4,5,7,8,9],stream:4,streamhandl:5,strftime:5,string:[4,7,8],struct:5,structur:[3,4,5],studio:[3,11,12],subprocess:9,success:4,successfulli:[0,4,8,9,13],sundai:4,supertoken:[4,6],superus:6,supetoken:4,supplement:[8,9],support:[0,3,6,9,12,13],symbol:3,sync:3,sys:[5,6,9],system:13,tablet:3,technic:[3,5],technicalsessionguidcach:5,telegram:2,templat:[6,13],terminolog:[8,9],tesseract:10,test2:5,test:[4,5,6],testcontrolpanelkei:5,testdef:4,testdefalia:4,testdir:4,testdirtest:4,testrdp:5,text:[4,9,12],than:3,thank:[2,13],theori:13,thi:[4,5,8,9,13],thought:4,thread:[3,5],threadidint:5,thursdai:4,thx:[8,9],time:[4,5,9,13],timehh:5,titl:[7,8,9],title_r:[8,9],todo:4,token:4,tokendatetim:5,too:[4,5],tool:[3,9,12],top:[7,8],tor:13,track:4,transmiss:4,transmit:[3,4],tree:13,trigger:[4,5],ttt:[3,5],turn:5,turpl:3,tutori:1,txt:4,type:[4,5,6],uac:13,uackeylistcheck:4,uacsupertokenupd:[4,6],uacupd:[4,6],uia:[7,8,9],uidesktop:[1,7],uio:[7,12,13],uioactiv:[7,8,9],uioei:[8,9],uioinfo:[8,9],uioselector:7,uioselector_exist_bool:[7,8],uioselector_focushighlight:[7,8,9],uioselector_get_bitnessint:[7,8],uioselector_get_bitnessstr:[7,8],uioselector_get_uio:[7,8,9],uioselector_get_uioactivitylist:[7,8],uioselector_get_uioinfo:[7,8],uioselector_get_uiolist:[7,8],uioselector_getchildlist_uiolist:[7,8],uioselector_highlight:[7,8],uioselector_safeotherget_process:[7,8],uioselector_searchchildbymouse_uio:[7,8],uioselector_searchchildbymouse_uiotre:[7,8],uioselector_structure_exampl:[8,9],uioselector_tryrestore_dict:[7,8],uioselectorsecs_waitappear_bool:[7,8],uioselectorsecs_waitdisappear_bool:[7,8],uioselectorssecs_waitappear_list:[7,8],uioselectorssecs_waitdisappear_list:[7,8],uioselectoruioactivity_run_dict:[7,8],uiotre:[8,9],under:13,unicodelab:[0,2,9],univers:3,unzip:0,updat:[4,5],upper:5,url:[4,5],url_:5,urllist:5,usag:[4,9],use:[0,3,4,5,7,8,13],used:4,useful:[8,9],user:[3,4,5,6,8,9,13],user_99:4,user_pass_her:4,useradstr:5,usernam:[4,5],usernameupperstr:4,userupperstr:5,using:[4,8,9,13],utf:4,util:5,valu:[4,7,8],variant:4,ver:[8,9],verifi:4,version:[1,6,9,12],versioncheck:6,versionstr:5,video:9,viewer:[5,13],virtual:5,visibl:[8,9],vision:[9,13],vista:0,visual:13,vms:4,wai:[4,6,9,13],wait:[7,8,9,12],want:[3,5,12,13],warn:6,web:[3,5,13],webcpupd:4,webdriv:9,weburlconnectdef:4,weburlconnectfil:4,weburlconnectfold:4,webuserinfoget:4,webuserissupertoken:4,webuseruachierarchyget:4,wednesdai:4,week:4,weekdai:[4,5],weekdaylist:5,well:13,were:13,whatsapp:2,when:[3,4,5,6,7,8,12],where:[4,8,9,12],which:[3,4,5,7,8,9,13],who:5,why:3,width:[4,5],wiki:9,win32:[7,13],win32api:10,win:4,window:[0,4,5,7,8,10],winpython:2,without:[0,4,5,13],wmi:10,work:[4,5,9],workingdirectorypathstr:5,world:[2,13],wpy32:[0,9],wpy64:[0,9],wrapper:[7,8],write:[3,9,13],www:[2,9,10],x32:[0,10,12],x64:[0,10,12],xlsx:5,yandex:13,you:[0,2,3,4,5,7,8,9,13],your:[0,9],zip:0},titles:["1. How to install","2. Roadmap","3. Copyrights & Contacts","1. Description","2. Defs","3. gSettings Template","4. How to start process","1. Description","2. Defs","3. How to use","4. Dependencies","1. Description","2. How to use","Welcome to pyOpenRPA\u2019s wiki"],titleterms:{The:[8,9,12,13],Use:9,__orchestrator__:4,about:[9,13],access:[8,9],action:12,agent:4,app:[8,9],architectur:3,autom:[8,9],button:12,captur:9,check:0,choos:12,click:12,cmd:9,compon:[2,3],concept:3,configur:3,contact:2,content:[12,13],copyright:2,creat:9,ctrl:12,def:[4,8],definit:[8,9],depend:[2,10],descript:[3,7,11,12],desktop:[8,9],dict:3,dll:[8,9],donat:13,exampl:[8,9],execut:9,expand:12,extract:12,file:9,founder:2,from:9,global:3,group:4,gset:[4,5],gui:12,guid:13,has:13,hold:12,hover:12,how:[0,3,6,9,12],imag:9,instal:0,interest:12,ivan:2,kei:12,keyboard:9,licens:2,list:12,main:13,manipul:9,maslov:2,modul:[8,9],mous:[9,12],object:12,openrpa:[8,9],orchestr:[3,4,13],parti:2,practic:9,process:[4,6],processor:[3,4],progress:13,properti:12,pyopenrpa:[4,7,13],python:[4,9],rdpsession:4,recognit:9,refer:[3,4,8],requir:0,result:12,roadmap:1,robot:[7,8,9,13],rpa:9,run:12,schedul:4,screen:9,screenshot:12,script:9,search:12,second:12,select:12,selenium:9,set:3,shown:12,start:6,structur:[8,9,13],studio:[9,13],system:0,templat:5,theori:9,tool:13,tree:12,turn:12,tutori:13,uac:4,uidesktop:[8,9],uio:[8,9],uioselector:[8,9],use:[9,12],viewer:12,web:[4,9],welcom:13,what:[8,9],wiki:13,win32:[8,9],x32:9,x64:9,you:12}})
\ No newline at end of file
+Search.setIndex({docnames:["01_HowToInstall","02_RoadMap","03_Copyrights_Contacts","Orchestrator/01_Orchestrator","Orchestrator/02_Defs","Orchestrator/03_gSettingsTemplate","Orchestrator/04_HowToUse","Orchestrator/05_UAC","Robot/01_Robot","Robot/02_Defs","Robot/03_HowToUse","Robot/04_Dependencies","Studio/01_Studio","Studio/02_HowToUse","index"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,"sphinx.ext.todo":2,"sphinx.ext.viewcode":1,sphinx:56},filenames:["01_HowToInstall.rst","02_RoadMap.rst","03_Copyrights_Contacts.rst","Orchestrator\\01_Orchestrator.rst","Orchestrator\\02_Defs.rst","Orchestrator\\03_gSettingsTemplate.rst","Orchestrator\\04_HowToUse.rst","Orchestrator\\05_UAC.rst","Robot\\01_Robot.rst","Robot\\02_Defs.rst","Robot\\03_HowToUse.rst","Robot\\04_Dependencies.rst","Studio\\01_Studio.rst","Studio\\02_HowToUse.rst","index.rst"],objects:{"pyOpenRPA.Orchestrator":{__Orchestrator__:[4,0,0,"-"]},"pyOpenRPA.Orchestrator.__Orchestrator__":{AgentActivityItemAdd:[4,1,1,""],AgentOSCMD:[4,1,1,""],AgentOSFileBinaryDataBase64StrCreate:[4,1,1,""],AgentOSFileBinaryDataBytesCreate:[4,1,1,""],AgentOSFileTextDataStrCreate:[4,1,1,""],GSettingsAutocleaner:[4,1,1,""],GSettingsKeyListValueAppend:[4,1,1,""],GSettingsKeyListValueGet:[4,1,1,""],GSettingsKeyListValueOperatorPlus:[4,1,1,""],GSettingsKeyListValueSet:[4,1,1,""],OSCMD:[4,1,1,""],OSCredentialsVerify:[4,1,1,""],OrchestratorRestart:[4,1,1,""],OrchestratorSessionSave:[4,1,1,""],ProcessIsStarted:[4,1,1,""],ProcessListGet:[4,1,1,""],ProcessStart:[4,1,1,""],ProcessStop:[4,1,1,""],ProcessorActivityItemAppend:[4,1,1,""],ProcessorActivityItemCreate:[4,1,1,""],ProcessorAliasDefCreate:[4,1,1,""],ProcessorAliasDefUpdate:[4,1,1,""],PythonStart:[4,1,1,""],RDPSessionCMDRun:[4,1,1,""],RDPSessionConnect:[4,1,1,""],RDPSessionDisconnect:[4,1,1,""],RDPSessionDublicatesResolve:[4,1,1,""],RDPSessionFileStoredRecieve:[4,1,1,""],RDPSessionFileStoredSend:[4,1,1,""],RDPSessionLogoff:[4,1,1,""],RDPSessionMonitorStop:[4,1,1,""],RDPSessionProcessStartIfNotRunning:[4,1,1,""],RDPSessionProcessStop:[4,1,1,""],RDPSessionReconnect:[4,1,1,""],RDPSessionResponsibilityCheck:[4,1,1,""],RDPTemplateCreate:[4,1,1,""],SchedulerActivityTimeAddWeekly:[4,1,1,""],UACKeyListCheck:[4,1,1,""],UACSuperTokenUpdate:[4,1,1,""],UACUpdate:[4,1,1,""],WebCPUpdate:[4,1,1,""],WebURLConnectDef:[4,1,1,""],WebURLConnectFile:[4,1,1,""],WebURLConnectFolder:[4,1,1,""],WebUserInfoGet:[4,1,1,""],WebUserIsSuperToken:[4,1,1,""],WebUserUACHierarchyGet:[4,1,1,""]},"pyOpenRPA.Robot":{UIDesktop:[9,0,0,"-"]},"pyOpenRPA.Robot.UIDesktop":{Get_OSBitnessInt:[9,1,1,""],PWASpecification_Get_PWAApplication:[9,1,1,""],PWASpecification_Get_UIO:[9,1,1,""],UIOSelectorSecs_WaitAppear_Bool:[9,1,1,""],UIOSelectorSecs_WaitDisappear_Bool:[9,1,1,""],UIOSelectorUIOActivity_Run_Dict:[9,1,1,""],UIOSelector_Exist_Bool:[9,1,1,""],UIOSelector_FocusHighlight:[9,1,1,""],UIOSelector_GetChildList_UIOList:[9,1,1,""],UIOSelector_Get_BitnessInt:[9,1,1,""],UIOSelector_Get_BitnessStr:[9,1,1,""],UIOSelector_Get_UIO:[9,1,1,""],UIOSelector_Get_UIOActivityList:[9,1,1,""],UIOSelector_Get_UIOInfo:[9,1,1,""],UIOSelector_Get_UIOList:[9,1,1,""],UIOSelector_Highlight:[9,1,1,""],UIOSelector_SafeOtherGet_Process:[9,1,1,""],UIOSelector_SearchChildByMouse_UIO:[9,1,1,""],UIOSelector_SearchChildByMouse_UIOTree:[9,1,1,""],UIOSelector_TryRestore_Dict:[9,1,1,""],UIOSelectorsSecs_WaitAppear_List:[9,1,1,""],UIOSelectorsSecs_WaitDisappear_List:[9,1,1,""]}},objnames:{"0":["py","module","Python module"],"1":["py","function","Python function"]},objtypes:{"0":"py:module","1":"py:function"},terms:{"0643":6,"100":5,"1050":[4,5],"120":5,"127":4,"1680":[4,5],"1680x1050":[4,5],"1992":6,"2008":[0,14],"2012":0,"2019":14,"2020":1,"2021":1,"222":[3,5],"2999226":0,"300":5,"3389":[4,5],"3600":5,"3720":[0,10],"3720python":10,"3rd":14,"4100115560661986":14,"412":4,"509644":14,"515310":14,"600":5,"640x480":[4,5],"722":2,"77767775":4,"77777sdfsdf77777dsfdfsf77777777":4,"8081":5,"906":2,"\u0432":[8,9],"\u0432\u0445\u043e\u0434\u043d\u043e\u0439":[8,9],"\u0432\u044b\u043a\u0438\u043d\u0443\u0442\u044c":[8,9],"\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c":[8,9],"\u0434\u0435\u043c\u043e\u043d\u0430":5,"\u0434\u0435\u043c\u043e\u043d\u0443":5,"\u043a":[5,8,9],"\u043a\u043e\u043d\u043d\u0435\u043a\u0442":[8,9],"\u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443":5,"\u043b\u043e\u0433\u0433\u0435\u0440\u0430":5,"\u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f":5,"\u043c\u043e\u0436\u043d\u043e":5,"\u043d\u0435":[8,9],"\u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u0438":[8,9],"\u043e\u0448\u0438\u0431\u043a\u0443":[8,9],"\u043f\u043e":5,"\u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430":5,"\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f":5,"\u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c":[8,9],"\u043f\u043e\u0440\u0442":5,"\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0443":[8,9],"\u043f\u0443\u0441\u0442\u043e\u0433\u043e":[8,9],"\u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435":5,"\u0441\u0435\u0440\u0432\u0435\u0440\u0430":5,"\u0441\u0435\u0442\u0435\u0432\u043e\u0435":5,"\u0441\u043b\u0443\u0447\u0430\u0435":[8,9],"\u0441\u043e\u0437\u0434\u0430\u0442\u044c":5,"\u0441\u043f\u0438\u0441\u043a\u0430":[8,9],"\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f":[8,9],"\u0444\u0430\u0439\u043b":5,"\u0444\u043b\u0430\u0433":[8,9],"\u0447\u0442\u043e":[8,9],"\u044d\u043b\u0435\u043c\u0435\u043d\u0442":[8,9],"case":[3,4,5,8,9,10],"class":[9,10],"default":[4,5,9,10,13],"float":[3,5,8,9],"function":[2,4,5,9,10],"import":[3,4,5,6,8,9,10],"int":[3,4,8,9,10],"long":2,"new":[1,3,4,5,6],"return":[4,5,8,9,10],"switch":11,"true":[4,5,6,7,8,9],"try":[4,6,8,9],"var":4,Abs:5,Are:0,For:[0,1,6,9,10,13],Has:5,NOT:4,RUS:[1,14],The:[0,3],USEFUL:4,USe:[5,7],Use:[2,4,6],Will:[4,5],__agentdictitemcreate__:5,__create__:5,__main__:6,__name__:6,__orchestrator__:14,__uacclientadmincreate__:[5,6],_sessionlast_rdplist:4,a2o:4,abil:[9,10],abl:14,about:[2,3,4,5],abs:4,absolut:[2,4,5,6,14],abspath:6,access:[4,5,6,14],accessus:5,action:[1,10,14],activ:[3,4,5,7,8,9,10,13],activitydict:[5,7],activityitem:4,activityitemdict:4,activitylist:5,activitylistappendprocessorqueuebool:[5,7],activitylistexecut:4,activitylistexecutebool:[5,7],activitynam:10,activitytimelist:5,actual:[4,14],add:[4,5,6,10],addhandl:5,addit:14,address:[4,5],admin:7,admindict:[5,7],administr:4,after:[3,5,6,8,9,13],agentactivityitemadd:4,agentdict:[4,5],agentkeydict:[5,7],agentkeystr:[5,7],agentoscmd:4,agentosfilebinarydatabase64strcr:4,agentosfilebinarydatabytescr:4,agentosfiletextdatastrcr:4,algorithm:[3,14],algorythm:[3,5,14],alia:[3,4,5],aliasdefdict:[3,4,5],all:[2,3,4,5,6,7,8,9,10,14],allow:[4,5,6,7,9,10,14],alreadi:[4,9,10],amd64:[0,10],analyz:14,ani:[0,3,4,10,13,14],anoth:[4,13],apach:2,app:[4,8,14],appear:[8,9],append:[3,4,5,7,10],appli:[3,5],applic:[3,4,5,8,9,10],approach:[9,10],architectur:14,archiv:[0,5],arg:[3,4,5],argdict:[3,4,5],arggset:[3,4,5],arglist:[3,4,5],arglogg:[3,4,5],argument:[1,4,5],argvaluestr:4,articl:14,artifici:10,asctim:5,assert:10,associ:4,asweigart:2,async:3,asynchonu:3,attent:[3,4,6,9,10,13,14],attribut:[3,5,8,9,10],authent:5,authentif:4,authtoken:5,authtokensdict:5,auto:4,autoclean:[3,5],autom:[11,14],automat:[3,5,13],automationsearchmouseel:[8,9],avail:[4,5,6,9,10],b4ff:6,backend:[8,9,10],backward:[1,4],base64:4,base:[3,4,14],base_wrapp:[9,10],basic:[3,4,5,6],becaus:[3,4,9,10],been:[0,4,5,9,10,14],befor:5,beginwith:[4,5],below:[1,3,6,13,14],best:14,between:[3,4,5,6],big:[9,10,14],binari:4,bit:[2,4,8,9,10],block:5,bool:[3,4,5,9,10],boppreh:2,both:[4,10],box:6,branch:[0,1],browser:[5,13],bsd:2,bug:2,build:[2,6,14],built:0,busi:[3,4,10,14],button:[5,7],cabinetwclass:10,cach:5,calcfram:[9,10],call:[3,4,6,8,9],callabl:4,can:[3,4,5,6,7,8,9,10,14],cancel:[8,9],cant:3,captur:14,central:3,chang:[5,14],check:[4,5,6,8,9,10,14],checkintervalsecfloat:5,checktasknam:5,child:[8,9,10],children:10,choos:[8,9],chrome:10,class_nam:[9,10],class_name_r:[9,10],classif:10,claus:2,cleaner:4,clear:[4,5,10],click:[9,10],client:[4,5],clientrequesthandl:5,clipboard:4,close:[4,5,10],cmd:[4,5,7,13,14],cmdinputbool:[5,7],code:[3,9,10,13],collect:5,com:[0,2,10,11,14],come:14,comma:3,command:[4,5,10],commerci:14,common:10,commun:4,compact:2,compani:[2,14],compat:[1,4,9,10],compex:3,compil:14,complet:[0,5],complex:3,compon:14,comput:[10,14],concept:14,condit:[8,9,10],config:6,configur:[4,5,6,14],congratul:14,connect:[4,5],connectioncountint:5,connectionfirstqueueitemcountint:5,consist:3,consol:[5,10,13,14],consolid:[3,14],contact:14,contain:[4,5,8,9,10,13],content:[1,4,5],continu:4,control:[3,4,5,6,14],control_typ:[9,10],control_type_r:[9,10],controlpanel:[5,6],controlpaneldict:5,controlpanelkeyallowedlist:5,controlpanelrefreshintervalsecfloat:5,convent:10,cooki:5,copi:10,copyright:14,core:[3,14],cost:14,cp_test:6,cp_versioncheck:6,cpdict:5,cpkei:5,cpkeydict:[5,7],cpkeystr:[5,7],creat:[2,3,4,5,6,14],credenti:4,crosscheck:4,css:11,ctrl_index:[9,10],current:[3,4,5,6,7,9,10],custom:[3,7,10],cv2:10,daemon:4,dai:4,data:5,datasetlast:5,date:1,datetim:[5,6],deadlin:2,dear:14,decentr:3,decid:14,def:[3,5,6,7,8,14],defaliastest:[3,5],defnamestr:5,defsettingsupdatepathlist:5,depend:14,deploi:4,deprec:5,depth:[9,10],depth_end:[9,10],depth_start:[9,10],depth_stop:[9,10],depthbit:[4,5],descipt:[9,10],descript:[5,9,10,14],desktop:[3,4,5,14],desktopgui_habr:14,desktopus:4,destin:[4,8,9],detail:3,detect:[5,8,9,10],determin:4,dev:[1,4],develop:[4,9,10,14],dict:[4,5,8,9,10,14],dictionari:[3,5],differ:3,directori:[4,10],disappear:[8,9],disc:4,disconnect:[4,5],distribut:14,divis:14,dll:14,doc:[10,14],document:[8,9,14],docutil:[4,9],doe:13,doen:4,doesn:[8,9],domain:5,domainadstr:5,domainupperstr:4,don:[4,7],dont:[4,5,7],doubl:13,download:0,dp0:10,draw:[8,9],drive:[4,5],driver:10,dsd:[3,5],dump:5,dumploglist:5,dumploglistcountint:5,dumploglisthashstr:5,dumploglistrefreshintervalsecfloat:5,duplic:4,durat:5,dynam:[9,10],each:[4,9,10,14],edit:14,editor:13,elem:10,element:[8,9,10],els:[4,5,6,8,9],empti:[5,7],enabl:[9,10],encapsul:14,encod:4,end:3,eng:[1,14],eng_guid:14,enterpris:14,env:5,enviro:10,environ:4,equal:[4,5],equalcas:[4,5],everi:[4,5],everydai:4,exact:10,exampl:[3,4,5,8],except:[0,4,6],exe:[0,4,5,9,10],execut:[3,4,5,7,12,14],executebool:5,exist:[4,5,8,9,10],expens:14,expir:4,explor:[10,13],express:[9,10],extens:[4,9,10],extra:4,extract:[9,10,14],facebook:2,fail:1,fals:[4,5,8,9],fast:[2,14],featur:[3,4,5,7,14],feel:2,field:[4,5],file:[4,5],filehandl:5,filemanag:5,filemod:5,fileurl:5,fileurlfilepathdict:5,fileurlfilepathdict_help:5,fill:[4,5],find:[2,3,10],find_element_by_nam:10,find_window:[8,9,10],firefox:10,first:[9,10,14],flag:[4,5],flagaccess:5,flagaccessdefrequestglobalauthent:5,flagcredentialsask:5,flagdonotexpir:5,flagforc:5,flagsessionisact:[4,5],flaguseallmonitor:[4,5],flexibl:3,focu:[8,9],folder:[4,6,10,14],follow:[0,7,13,14],forc:[4,5,14],forget:5,formatt:5,found:10,founder:14,framework:[8,9,10,11,14],free:[2,14],fridai:4,friendly_class_nam:[9,10],friendly_class_name_r:[9,10],from:[0,3,4,5,6,8,9,14],full:[4,5],fulli:10,fullscreen:[4,5],fullscreenbool:[5,7],fullscreenrdpsessionkeystr:5,functional:6,further:4,garbag:4,gener:[4,5,14],get:[4,5,8,9,10,14],get_osbitnessint:[8,9],getcontrol:[8,9],getlogg:5,git:[0,4,5,7],github:2,gitlab:[0,2,10,14],give:[4,5,7],given:4,global:[4,14],goe:3,going:14,good:[3,14],graphic:[10,14],great:14,group:[7,14],gset:[3,6,14],gsettingsautoclean:4,gsettingsdict:4,gsettingskeylistvalueappend:4,gsettingskeylistvalueget:4,gsettingskeylistvalueoperatorplu:4,gsettingskeylistvalueset:4,gui:[3,4,8,9,10,11,14],guid:[1,5],gurbag:5,habr:14,handl:5,handlebar:11,handler:5,hard:[4,5],has:[0,2,3,4,7,9,10],have:4,height:[4,5],help:[0,2,4,14],here:[6,9,10,14],hex:[4,5,9,10],hidden:4,hierarchi:[4,9,10,13],highlight:[8,9,10,13],hightlight:13,homepag:2,host:[4,5],hostnameupperstr:5,how:14,html:[4,9,10,13,14],htmlrenderdef:5,http:[0,2,3,4,5,9,10,11,14],human:4,identif:[4,10],identifi:10,ignor:[4,5],ignorebool:[5,7],imag:14,imaslov:6,implement:[9,10],inactionnam:[8,9],inactivityitemdict:4,inactivitylist:4,inadisdefaultbool:[4,6],inadloginstr:[4,6],inadstr:[4,6],inaliasstr:4,inarg1str:4,inargdict:4,inarggset:4,inarggsettingsstr:4,inarglist:4,inargloggerstr:4,inargu:10,inargumentlist:[8,9],inbackend:[8,9],inbreaktriggerprocesswoexelist:4,incloseforcebool:4,includ:[8,9],incmdstr:4,incontenttypestr:4,incontrolspecificationarrai:[8,9],incpkeystr:4,indef:4,indefnamestr:4,indepthbitint:4,index:[3,4,5,8,9,10,14],indict:5,indomainstr:4,inel:[8,9],inelementspecif:[8,9],inencodingstr:4,infiledatabase64str:4,infiledatabyt:4,infiledatastr:4,infilepathstr:4,inflagforceclosebool:4,inflaggetabspathbool:4,inflagraiseexcept:[8,9],inflagwaitallinmo:[8,9],info:[4,5,6,9,10],infolderpathstr:4,inform:[3,4],infrastructur:14,ingset:[3,4,6],ingsettingsclientdict:5,inhashkeystr:5,inheightpxint:4,inherit:[9,10],inhostfilepathstr:4,inhostnamestr:4,inhoststr:[4,5],inhtmlrenderdef:4,init:[3,4,5,6],initdatetim:5,initi:4,injsinitgeneratordef:4,injsongeneratordef:4,inkeylist:4,inkeystr:5,inkwargumentobject:[8,9],inlogg:[4,5],inloginstr:[4,5],inmatchtypestr:4,inmethodstr:4,inmodestr:[3,4,5,6],inmodulepathstr:4,inpasswordstr:[4,5],inpathstr:4,inportint:4,inportstr:[4,5],inprocessnamewexestr:4,inprocessnamewoexelist:4,inprocessnamewoexestr:4,input:5,inrdpfilepathstr:4,inrdpsessionkeystr:[4,5],inrdptemplatedict:4,inrequest:4,inrolehierarchyalloweddict:[4,6],inrolekeylist:4,inrowcountint:5,inrunasyncbool:4,insert:6,inshareddrivelist:4,inspecificationlist:[8,9],inspecificationlistlist:[8,9],instal:14,instanc:[3,4,8,9,10],instopprocessnamewoexestr:4,insupertokenstr:[4,6],intellig:10,interact:[3,4],interest:4,interfac:[3,9,10,14],internet:13,interpret:3,interv:[4,5],intervalsecfloat:5,intimehhmmstr:4,inuioselector:[8,9],inurllist:[4,6],inurlstr:4,inusebothmonitorbool:4,inusernamestr:4,inuserstr:4,invalu:4,inwaitsec:[8,9],inweekdaylist:4,inwidthpxint:4,is_en:[9,10],is_vis:[9,10],islistenbool:5,isresponsiblebool:4,issu:2,it4busi:2,it4busin:2,item:[3,4,8,9,10],iter:5,ivan:14,ivanmaslov:2,join:6,jsinitgeneratordef:5,json:[3,4,5],jsongeneratordef:5,jsrender:11,jsview:11,just:10,kb2999226:0,keep:3,kei:[4,9,10],keyboard:[2,11,14],keystr:5,kill:4,killer:14,know:3,known:14,kwarg:3,lactivityitem:4,laliasstr:4,last:5,latest:[9,10],launch:4,left:3,len:5,less:14,let:14,level:[9,10,14],levelnam:5,lib:10,librari:[9,10],licens:14,lifetim:5,lifetimerequestsecfloat:5,lifetimesecfloat:5,light:3,like:[3,14],line:10,link:[3,4,5,14],linkedin:2,list:[3,4,5,8,9,10,14],listen:4,listenport:5,listenport_:5,listenurllist:5,listread:5,litem:10,littl:7,load:5,local:[4,5],localhost:5,locat:4,log:[4,5,6,7,14],logger:[4,5,6],loggerdumploghandleradd:5,loggerhandlerdumploglist:5,login:[4,5,6],logoff:[4,5],logout:14,logviewerbool:[5,7],lol:13,look:[3,4,5,7,13,14],lookmachinescreenshot:5,loop:10,low:10,lowercas:5,lprocessisstartedbool:4,lprocesslist:4,lpyopenrpasourcefolderpathstr:6,lrdpitemdict:4,lrdptemplatedict:4,lresult:5,lresultdict:[4,5],luacclientdict:6,lxml:11,mac:14,machin:[0,4,5,6,14],machina:5,mail:2,main:[3,4,5,6,10],maintain:14,make:10,makedir:5,manag:4,mani:[2,3,8,9,14],manipul:[4,7,14],march:1,markdown:14,maslov:14,master:[0,14],match:10,matchtyp:5,max:5,maxim:[8,9],maximum:[9,10],mayb:4,mechan:3,mega:[3,7],megafind:2,memori:4,merg:4,messag:5,method:[5,9,10],methodmatchurl:5,methodmatchurlbeforelist:5,methodolog:2,mhandlerdumploglist:5,microsoft:[0,9,10],minim:[8,9],miss:[9,10],mit:[2,14],mmstr:5,mode:13,model:[2,9,10],modul:[3,4,5,6],moduletocal:4,mondai:4,monei:14,monitor:4,more:[3,6,10],mous:14,mrobotlogg:5,mrobotloggerfh:5,mrobotloggerformatt:5,must:5,name:[3,4,5,6,8,9,10],namewoexestr:4,namewoexeupperstr:4,need:[0,2,3,4,5,6,7,8,9,10,14],nest:4,net:[4,9],never:4,newkeydict:4,newkeylist:4,newvalu:4,next:[9,10],non:14,none:[3,4,5,8,9],notat:[8,9,10],notepad:[4,5,8,9],noth:4,nothingbool:[5,7],now:[4,5],nul:10,object:[3,4,5,8,9,10,14],occupi:4,ocr:10,octet:4,off:[5,7],old:[4,5,6,8,9],one:[5,6,7],onli:[0,1,4,5,7,8,9,10,14],onlin:14,open:[13,14],opencv:[0,11,14],openrpa52zzz:6,openrpa:[0,5,14],openrpa_32:13,openrpa_64:13,openrpaorchestr:10,openrparesourceswpy32:10,openrparesourceswpy64:10,openrparobotdaemon:5,opensourc:14,oper:[0,4,6,14],opera:10,option:[5,7,9,10],orc:[5,7],orchestr:[5,6],orchestratormain:10,orchestratorrestart:4,orchestratorsessionsav:4,orchestratorstart:5,order:[3,10,13],org:[2,10],oscmd:4,oscredentialsverifi:4,other:[8,9,10,14],our:[9,10],out:4,outargu:10,outlin:[8,9],output:5,outstr:4,over:2,overwrit:5,own:[3,6,10,14],packag:[0,6,8,14],page:[4,5,7],page_sourc:10,pai:[3,6],paid:14,panel:[4,5,6,7,13],paramet:[3,4,5,8,9],parent:[8,9,10,13],parti:14,pass:[4,5],password:[4,5],path:[4,5,6,10],paus:10,pdb:5,pdf:14,per:6,perfom:[10,14],perform:14,period:5,phone:3,pid:4,pil:11,pipupgrad:5,pixel:[4,5],plan:[1,4],platform:14,pleas:14,plu:4,port:[4,5],portabl:[0,10],possibl:14,post:[4,5,14],postfix:4,power:14,practic:14,prefer:2,previou:4,print:[6,10],process:[3,5,6,8,9,10,12,14],processdetaillist:4,processisstart:4,processlistget:4,processnam:4,processor:[5,7,14],processoractivityitemappend:4,processoractivityitemcr:4,processoraliasdefcr:4,processoraliasdefupd:4,processordict:5,processstart:[4,5],processstartifturnedoff:5,processstop:[4,5],processwoexelist:4,processwoexeupperlist:4,product:10,program:[4,5],progress:1,project:[3,14],properti:[7,14],protocol:3,provid:[9,10,14],psutil:[6,11],pull:[5,7],purpos:[1,2],pwa:[9,10],pwaspecif:[9,10],pwaspecification_get_pwaappl:[8,9],pwaspecification_get_uio:[8,9],pyautogui:[2,10,11,14],pycon:10,pymupdf:11,pyopenrpa:[0,1,2,3,5,6,7,9,10,12],pyopenrpadict:[5,7],pyrobot_cp:6,python:[0,3,5,8,9,11,13,14],pythonstart:4,pywin32:[2,11],pywinauto:[2,8,9,10,11],queue:[1,3,4,5,7],queuelist:5,r01:5,r01_integrationorderout:5,r01_orchestratortorobot:5,rais:4,rdp:[3,4,5,7],rdpactiv:5,rdpconfigurationdict:5,rdpkei:4,rdpkeydict:[5,7],rdpkeystr:[5,7],rdplist:[4,5],rdpsession:14,rdpsessioncmdrun:4,rdpsessionconnect:[4,5],rdpsessiondisconnect:[4,5],rdpsessiondublicatesresolv:4,rdpsessionfilereciev:5,rdpsessionfilesend:5,rdpsessionfilestoredreciev:4,rdpsessionfilestoredsend:4,rdpsessionkei:5,rdpsessionkeystr:5,rdpsessionlogoff:[4,5],rdpsessionmonitorstop:4,rdpsessionprocessstart:5,rdpsessionprocessstartifnotrun:4,rdpsessionprocessstop:4,rdpsessionreconnect:[4,5],rdpsessionresponsibilitycheck:4,rdptemplatecr:4,read:5,readi:0,readm:14,readthedoc:[9,10],reciev:[4,5],recognit:14,reconnect:4,reconnectbool:[5,7],recurs:[9,10],reestr_otgruzok:5,refactor:1,refer:14,refresh:5,refreshsecond:5,regener:4,regular:[9,10],rel:[4,5,6],reliabl:[2,14],rememb:[5,7],remot:[4,5,14],render:13,renderfunct:5,renderrobotr01:5,report:5,reqir:3,request:[4,5,11],requesttimeoutsecfloat:5,requir:[4,14],resolut:[4,5],resourc:[0,10,14],respons:[4,5],responsecontenttyp:5,responsedefrequestglob:5,responsefilepath:5,responsefolderpath:5,responsibilitycheckintervalsec:5,restart:[4,5,7],restartorchestr:5,restartorchestratorbool:[5,7],restartorchestratorgitpullbool:[5,7],restartpcbool:[5,7],restor:[8,9],restrict:14,restructuredtext:[4,9],result:[4,5,7,8,9,10],returnbool:5,rich_text:[9,10],rich_text_r:[9,10],right:14,roadmap:14,robot:[3,4,5,6,7],robot_r01:5,robot_r01_help:5,robotlist:5,robotrdpact:[4,5],rolehierarchyalloweddict:5,root:[4,5],row:5,rpa:[4,5,14],rpatestdirtest:4,rst:[4,9],ruledomainuserdict:5,rulemethodmatchurlbeforelist:5,run:[0,4,5,6,8,9,14],rus_tutori:14,russia:[2,14],russian:14,safe:[4,8,9,14],same:[8,9],save:4,schedul:[3,14],scheduleractivitytimeaddweekli:4,schedulerdict:5,scopesrcul:5,screen:[4,5,14],screenshot:[0,5,7,14],screenshotviewerbool:[5,7],script:[3,14],search:[4,14],sec:5,second:[4,5,8,9,10],section:4,see:[0,1,4,5,6,8,9,14],select:[8,9],selector:[8,9,10,13,14],selenium:[2,11,14],semant:[2,11],send:[4,5,7,14],send_kei:10,sent:4,sequenc:3,server:[0,3,5,7,13,14],serverdict:5,serverset:5,sesion:[4,5],session:[4,5,14],sessionguidstr:5,sessionhex:[4,5],sessionisignoredbool:[4,5],sessioniswindowexistbool:[4,5],sessioniswindowresponsiblebool:[4,5],set:[4,5,6,7,8,9,14],set_trac:5,setformatt:5,setlevel:5,settingstempl:[3,6],settingsupd:6,setup:5,sever:[3,10,14],share:4,shareddrivelist:[4,5],shell:[4,14],should:5,show:[5,7],side:[4,5,7],signal:4,simplifi:10,sinc:14,singl:3,singleton:4,skype:2,sleep:10,socket:3,softwar:2,solut:[0,10,14],some:[2,3,4,5,7,14],soon:14,sorri:14,sort:4,sourc:[3,4,6,8,9,14],sourceforg:[4,9],space:3,special:5,specialist:2,specif:[9,10],sphinx:[3,14],standart:5,start:[0,4,5,6,9,10,13,14],statu:4,stdout:[5,6],stop:[4,9,10,14],storag:[5,14],store:5,str:[3,4,5,8,9,10],stream:4,streamhandl:5,strftime:5,string:[4,8,9],struct:5,structur:[3,4,5],studio:[3,12,13],subprocess:10,success:4,successfulli:[0,4,9,10,14],sundai:4,supertoken:[4,6],superus:6,supetoken:4,supplement:[9,10],support:[0,3,6,10,13,14],symbol:3,sync:3,sys:[5,6,10],system:14,tablet:3,task:2,technic:[3,5],technicalsessionguidcach:5,telegram:2,templat:[6,14],terminolog:[9,10],tesseract:11,test2:5,test:[4,5,6],testcontrolpanelkei:5,testdef:4,testdefalia:4,testdir:4,testdirtest:4,testrdp:5,text:[4,10,13],than:3,thank:[2,14],theori:14,thi:[4,5,7,9,10,14],thought:4,thread:[3,5,7],threadidint:5,thursdai:4,thx:[9,10],time:[4,5,10,14],timehh:5,titl:[8,9,10],title_r:[9,10],todo:4,token:4,tokendatetim:5,too:[4,5],tool:[3,10,13],top:[8,9],tor:14,track:4,transmiss:4,transmit:[3,4],tree:14,trigger:[4,5],ttt:[3,5],turn:[5,7],turpl:3,tutori:[1,14],txt:4,type:[4,5,6],uac:14,uackeylistcheck:4,uacsupertokenupd:[4,6],uacupd:[4,6],uia:[8,9,10],uidesktop:[1,8],uio:[8,13,14],uioactiv:[8,9,10],uioei:[9,10],uioinfo:[9,10],uioselector:8,uioselector_exist_bool:[8,9],uioselector_focushighlight:[8,9,10],uioselector_get_bitnessint:[8,9],uioselector_get_bitnessstr:[8,9],uioselector_get_uio:[8,9,10],uioselector_get_uioactivitylist:[8,9],uioselector_get_uioinfo:[8,9],uioselector_get_uiolist:[8,9],uioselector_getchildlist_uiolist:[8,9],uioselector_highlight:[8,9],uioselector_safeotherget_process:[8,9],uioselector_searchchildbymouse_uio:[8,9],uioselector_searchchildbymouse_uiotre:[8,9],uioselector_structure_exampl:[9,10],uioselector_tryrestore_dict:[8,9],uioselectorsecs_waitappear_bool:[8,9],uioselectorsecs_waitdisappear_bool:[8,9],uioselectorssecs_waitappear_list:[8,9],uioselectorssecs_waitdisappear_list:[8,9],uioselectoruioactivity_run_dict:[8,9],uiotre:[9,10],under:14,unicodelab:[0,2,10,14],univers:3,unix:14,unzip:0,updat:[4,5],upper:5,url:[4,5],url_:5,urllist:5,usag:[4,10],use:[0,3,4,5,7,8,9,14],used:4,useful:[9,10],user:[3,4,5,6,9,10,14],user_99:4,user_pass_her:4,useradstr:5,usernam:[4,5],usernameupperstr:4,userupperstr:5,using:[4,9,10,14],utf:4,util:[5,14],valu:[4,8,9],variant:4,ver:[9,10],veri:2,verifi:4,version:[1,6,10,13],versionstr:5,via:2,video:10,viewer:[5,7,14],virtual:5,visibl:[9,10],vision:[10,14],vista:0,visual:14,vms:4,wai:[4,6,10,14],wait:[8,9,10,13,14],want:[3,5,7,13,14],warn:6,web:[3,5,14],webcpupd:4,webdriv:10,webgui_habr:14,weburlconnectdef:4,weburlconnectfil:4,weburlconnectfold:4,webuserinfoget:4,webuserissupertoken:4,webuseruachierarchyget:4,wednesdai:4,week:4,weekdai:[4,5],weekdaylist:5,well:14,were:14,whatsapp:2,when:[3,4,5,6,8,9,13],where:[4,9,10,13],which:[2,3,4,5,8,9,10,14],who:5,why:3,width:[4,5],wiki:10,win32:[8,14],win32api:11,win:4,window:[0,4,5,8,9,11,14],winpython:2,without:[0,4,5,14],wmi:11,work:[4,5,7,10,14],workingdirectorypathstr:5,world:[2,14],wpy32:[0,10],wpy64:[0,10],wrapper:[8,9],write:[2,3,10,14],www:[2,10,11],x32:[0,11,13,14],x64:[0,11,13,14],xlsx:5,yandex:14,you:[0,2,3,4,5,6,7,8,9,10,14],your:[0,10],zip:0},titles:["1. How to install","2. Roadmap","3. Copyrights & Contacts","1. Description","2. Defs","3. gSettings Template","4. How to use","5. UAC - User Access Control","1. Description","2. Defs","3. How to use","4. Dependencies","1. Description","2. How to use","Welcome to pyOpenRPA\u2019s wiki"],titleterms:{The:[9,10,13,14],Use:10,__orchestrator__:4,about:[7,10,14],access:[7,9,10],action:13,agent:[4,14],app:[9,10],architectur:3,autom:[9,10],button:13,captur:10,check:0,choos:13,click:13,cmd:10,compon:[2,3],concept:3,configur:3,contact:2,content:[13,14],control:7,copyright:2,creat:10,ctrl:13,def:[4,9],definit:[9,10],depend:[2,11],descript:[3,8,12,13],desktop:[9,10],dict:[3,7],dll:[9,10],donat:14,exampl:[9,10],execut:10,expand:13,extract:13,file:10,founder:2,from:10,global:3,group:4,gset:[4,5],gui:13,guid:14,has:14,hold:13,hover:13,how:[0,3,6,10,13],imag:10,instal:0,interest:13,ivan:2,kei:13,keyboard:10,licens:2,list:13,main:14,manipul:10,maslov:2,modul:[9,10],mous:[10,13],object:13,openrpa:[9,10],orchestr:[3,4,7,14],parti:2,practic:10,process:4,processor:[3,4],properti:13,pyopenrpa:[4,8,14],python:[4,10],rdpsession:4,recognit:10,refer:[3,4,9],repo:14,requir:0,result:13,right:7,roadmap:1,robot:[8,9,10,14],rpa:10,run:13,schedul:4,screen:10,screenshot:13,script:10,search:13,second:13,select:13,selenium:10,set:3,shown:13,structur:[9,10,14],studio:[10,14],system:0,templat:5,theori:10,tool:14,tree:13,turn:13,uac:[4,7],uidesktop:[9,10],uio:[9,10],uioselector:[9,10],use:[6,10,13],user:7,viewer:13,web:[4,7,10],welcom:14,what:[9,10],wiki:14,win32:[9,10],x32:10,x64:10,you:13}})
\ No newline at end of file
diff --git a/Wiki/ENG_Guide/markdown/03_Copyrights_Contacts.md b/Wiki/ENG_Guide/markdown/03_Copyrights_Contacts.md
index 6af79196..4b6dc995 100644
--- a/Wiki/ENG_Guide/markdown/03_Copyrights_Contacts.md
+++ b/Wiki/ENG_Guide/markdown/03_Copyrights_Contacts.md
@@ -4,7 +4,16 @@ pyOpenRPA is created by Ivan Maslov (Russia).
Use it absolutely for free!
My purpose is to create #IT4Business models all over the world.
-If you need IT help feel free to contact me (prefer e-mail or skype).
+
+#IT4Business homepage - [https://www.facebook.com/RU.IT4Business](https://www.facebook.com/RU.IT4Business)
+
+#IT4Busines is the methodology which is created for build compact fast and reliable IT function in company.
+
+If you has many IT specialists, very long deadlines for the IT tasks, many bugs in IT software - #IT4Business is for you :)
+
+If you need some IT help - feel free to contact me (prefer e-mail or skype).
+
+If you will find some issue in pyOpenRPA - write about it to me via e-mail/skype/gitlab issue.
Thank you!
diff --git a/Wiki/ENG_Guide/markdown/Orchestrator/04_HowToStart.md b/Wiki/ENG_Guide/markdown/Orchestrator/04_HowToUse.md
similarity index 57%
rename from Wiki/ENG_Guide/markdown/Orchestrator/04_HowToStart.md
rename to Wiki/ENG_Guide/markdown/Orchestrator/04_HowToUse.md
index 3387a64b..fd6ae73f 100644
--- a/Wiki/ENG_Guide/markdown/Orchestrator/04_HowToStart.md
+++ b/Wiki/ENG_Guide/markdown/Orchestrator/04_HowToUse.md
@@ -1,6 +1,16 @@
-# 4. How to start process
+# 4. How to use
-Start configuration example
+You need to run orchestrator process?
+
+```
+if __name__ == "__main__": # New init way - allow run as module -m PyOpenRPA.Orchestrator
+ from pyOpenRPA import Orchestrator # Import orchestrator main
+ gSettings = SettingsTemplate.Create(inModeStr="BASIC") # Create GSettings with basic configuration - no more config is available from the box - you can create own
+ # Call the orchestrator main def
+ Orchestrator.Orchestrator(inGSettings=gSettings)
+```
+
+If you need more configurations - so you can see here:
```
import psutil, datetime, logging, os, sys # stdout from logging
@@ -8,21 +18,6 @@ import psutil, datetime, logging, os, sys # stdout from logging
# Config settings
lPyOpenRPASourceFolderPathStr = r"..\Sources" # Path for test pyOpenRPA package
-# INFO Relative/Absolute import see below - after settings init
-
-# Template for import CP - Control Panels
-# ATTENTION - Pay attention to CP names! Orchestrator is one for the all control panels per one machine
-
-## !!! For Absolute import !!!
-# sys.path.insert(0,os.path.abspath(os.path.join(r"..\ROBOT\Builds")))
-# import pyRobot_CP
-# pyRobot_CP.SettingsUpdate(inGSettings=gSettings)
-
-## !!! For Relative import !!!
-# sys.path.insert(0,os.path.abspath(os.path.join(r"..\ROBOT\Builds")))
-# from pyRobot_CP import ControlPanel
-# ControlPanel.SettingsUpdate(inGSettings=gSettings)
-
# Operations
if lPyOpenRPASourceFolderPathStr != "": sys.path.insert(0,os.path.abspath(os.path.join(lPyOpenRPASourceFolderPathStr))) # Path for test pyOpenRPA package
# Start import after config the pyOpenRPA folder
@@ -31,28 +26,36 @@ from pyOpenRPA.Orchestrator import SettingsTemplate # Import functionallity
if __name__ == "__main__": # New init way - allow run as module -m PyOpenRPA.Orchestrator
from pyOpenRPA import Orchestrator # Import orchestrator main
- gSettings = SettingsTemplate.Create(inModeStr="BASIC") # Create GSettings with basic configuration
+ gSettings = SettingsTemplate.Create(inModeStr="BASIC") # Create GSettings with basic configuration - no more config is available from the box - you can create own
# TEST Add User ND - Add Login ND to superuser of the Orchestrator
lUACClientDict = SettingsTemplate.__UACClientAdminCreate__()
- # del lUACClientDict["pyOpenRPADict"]["AdminDict"]["LogViewerBool"]
- # del lUACClientDict["pyOpenRPADict"]["AdminDict"]["CMDInputBool"]
- # del lUACClientDict["pyOpenRPADict"]["AdminDict"]["ScreenshotViewerBool"]
- # del lUACClientDict["pyOpenRPADict"]["AdminDict"]["RestartOrchestratorBool"]
- # del lUACClientDict["pyOpenRPADict"]["AdminDict"]["RestartOrchestratorGITPullBool"]
- # del lUACClientDict["pyOpenRPADict"]["AdminDict"]["RestartPCBool"]
- # del lUACClientDict["pyOpenRPADict"]["RDPKeyDict"]
- # del lUACClientDict["pyOpenRPADict"]["AgentKeyDict"]
- # del lUACClientDict["pyOpenRPADict"]["CPKeyDict"]
- #lUACClientDict["pyOpenRPADict"]["CPKeyDict"]["VersionCheck"]=True
- #lUACClientDict["pyOpenRPADict"]["CPKeyDict"]["TEST"]=True
- #lUACClientDict["pyOpenRPADict"]["AgentKeyDict"]["DESKTOP----;ND"]=True
Orchestrator.UACUpdate(inGSettings=gSettings, inADLoginStr="ND", inADStr="", inADIsDefaultBool=True, inURLList=[], inRoleHierarchyAllowedDict=lUACClientDict)
# TEST Add User IMaslov - Add Login IMaslov to superuser of the Orchestrator
Orchestrator.UACUpdate(inGSettings=gSettings, inADLoginStr="IMaslov", inADStr="", inADIsDefaultBool=True, inURLList=[])
# TEST Add Supertoken for the all access between robots
Orchestrator.UACSuperTokenUpdate(inGSettings=gSettings, inSuperTokenStr="1992-04-03-0643-ru-b4ff-openrpa52zzz")
+ # INFO Relative/Absolute import see below - after settings init
+ # Template for import CP - Control Panels
+ # ATTENTION - Pay attention to CP names! Orchestrator is one for the all control panels per one machine
+ ## !!! For Absolute import control panels !!!
+ # try:
+ # sys.path.insert(0,os.path.abspath(os.path.join(r"..\ROBOT\Builds")))
+ # import pyRobot_CP
+ # pyRobot_CP.SettingsUpdate(inGSettings=gSettings)
+ # except Exception as e:
+ # gSettings["Logger"].exception(f"Exception when init CP. See below.")
+
+ ## !!! For Relative import control panels !!!
+ # try:
+ # sys.path.insert(0,os.path.abspath(os.path.join(r"..\ROBOT\Builds")))
+ # from pyRobot_CP import ControlPanel
+ # ControlPanel.SettingsUpdate(inGSettings=gSettings)
+ # except Exception as e:
+ # gSettings["Logger"].exception(f"Exception when init CP. See below.")
+
+
## !!! For Relative import !!! CP Version Check
try:
sys.path.insert(0,os.path.abspath(os.path.join(r"")))
diff --git a/Wiki/ENG_Guide/markdown/Orchestrator/05_UAC.md b/Wiki/ENG_Guide/markdown/Orchestrator/05_UAC.md
new file mode 100644
index 00000000..a2d79227
--- /dev/null
+++ b/Wiki/ENG_Guide/markdown/Orchestrator/05_UAC.md
@@ -0,0 +1,49 @@
+# 5. UAC - User Access Control
+
+## About
+
+Orchestrator has mega feature - user access control (UAC). This feature allow you to manipulate access of the web UI for the all users!
+
+If you need to give admin rights - you don’t customize UAC dict.
+
+If you need to give some little rights for user only for one robot in orchestrator web panel - you can set the following properties in UAC dict.
+
+To work with UAC you can use defs `Orchestrator.UAC` group.
+
+## UAC Dict for Orchestrator WEB UI rights
+
+UAC Dict for pyOpenRPA Orchestrator WEB UI rights.
+
+```
+"pyOpenRPADict":{
+ "CPKeyDict":{ # Empty dict - all access
+ # "CPKeyStr"{
+ # }
+ },
+ "RDPKeyDict":{ # Empty dict - all access
+ #"RDPKeyStr"{
+ # "FullscreenBool": True,
+ # "IgnoreBool":True,
+ # "ReconnectBool": True
+ # "NothingBool": True # USe option if you dont want to give some access to the RDP controls
+ # }
+ },
+ "AgentKeyDict": { # Empty dict - all access
+ # "AgentKeyStr"{
+ # }
+ },
+ "AdminDict":{ # Empty dict - all access
+ "LogViewerBool":True, # Show log viewer on the web page
+ "CMDInputBool":True, # Execute CMD on the server side and result to the logs
+ "ScreenshotViewerBool":True, # Show button to look screenshots
+ "RestartOrchestratorBool": True, # Restart orchestrator activity
+ "RestartOrchestratorGITPullBool": True, # Turn off (RDP remember) orc + git pull + Turn on (rdp remember)
+ "RestartPCBool": True, # Send CMD to restart pc
+ "NothingBool":True # USe option if you dont want to give some access to the RDP controls
+ },
+ "ActivityDict": { # Empty dict - all access
+ "ActivityListExecuteBool": True, # Execute activity at the current thread
+ "ActivityListAppendProcessorQueueBool": True # Append activity to the processor queue
+ }
+}
+```
diff --git a/Wiki/ENG_Guide/markdown/Robot/03_HowToUse.md b/Wiki/ENG_Guide/markdown/Robot/03_HowToUse.md
index f1edbef6..c373af06 100644
--- a/Wiki/ENG_Guide/markdown/Robot/03_HowToUse.md
+++ b/Wiki/ENG_Guide/markdown/Robot/03_HowToUse.md
@@ -1,6 +1,6 @@
# 3. How to use
-The Robot tool is the main module for production process automation. It has no graphic/console interface. All low-level actions to OS are perfoming by the Robot tool in OpenRPA.
+The Robot tool is the main module for production process automation. It has no graphic/console interface. All low-level actions to OS are perfoming by the Robot tool in pyOpenRPA.
## How to execute RPA script
@@ -28,7 +28,7 @@ import keyboard #[Keyboard manipulation](https://gitlab.com/UnicodeLabs/OpenRPA/
### Execute python script
-The OpenRPA is fully portable solution. It contains own python enviroment both 32 and 64 bit versions. So, you can execute your python script in several ways:
+The pyOpenRPA is fully portable solution. It contains own python enviroment both 32 and 64 bit versions. So, you can execute your python script in several ways:
- Execute in python x32 (OpenRPAResourcesWPy32-3720python-3.7.2)
- Execute in python x64 (OpenRPAResourcesWPy64-3720python-3.7.2.amd64)
- Execute from .cmd file
diff --git a/Wiki/ENG_Guide/markdown/index.md b/Wiki/ENG_Guide/markdown/index.md
index 5d2de696..504fe65f 100644
--- a/Wiki/ENG_Guide/markdown/index.md
+++ b/Wiki/ENG_Guide/markdown/index.md
@@ -8,7 +8,9 @@ contain the root `toctree` directive. -->
![image](img/ModalGuide.png)
-*by Ivan Maslov (Russia)*
+*by Ivan Maslov (Russia)* - see 3. Copyrights & Contacts.
+
+! ATTENTION ! pyOpenRPA works only on MS Windows 7+/Server 2008+. Guys from Unix/Mac - sorry. We will come to you soon :)
## Donate
@@ -28,9 +30,37 @@ The pyOpenRPA is based on Python and using well known OpenSource solutions such
The pyOpenRPA is distributed under the MIT license which allows you to use it in any way you want and any time you need without any restrictions.
At the time of this writing the pyOpenRPA is successfully using in several big Russian companies. Companies in which it was decided to develop own RPA division with no dependencies on expensive licenses.
-## Structure
+## Repo structure
+
+The description of the each folder in GitLab repo is going below:
+
+
+* **Agent**: template build for the pyOpenRPA.Agent component
+
+
+* **Orchestrator**: template build for the pyOpenRPA.Orchestrator component
+
+
+* **Resources**: 3rd party resources which is needed to provide pyOpenRPA encapsulation from the Operating System (OS) dependencies.
+
+
+* **Robot**: template build for the robot
+
+
+* **Sources**: pyOpenRPA python package sources + sphinx sources
+
-### The pyOpenRPA has 3 main tools:
+* **Studio**: build for the pyOpenRPA.Studio which support Desktop UI (support x32 and x64 desktop UI apps)
+
+
+* **Utils**: many additional good tools for the python developer
+
+
+* **Wiki**: compiled wiki documentation
+
+## The pyOpenRPA structure
+
+### The pyOpenRPA has 4 main tools:
* Studio
@@ -41,9 +71,12 @@ At the time of this writing the pyOpenRPA is successfully using in several big R
* Orchestrator
+
+* Agent
+
### Studio
-Studio tool has been developed to help RPA-tors to create the robot algorythms.
+The pyOpenRPA.Studio tool has been developed to help RPA-tors to create the robot algorythms.
**Features**
@@ -64,7 +97,7 @@ Studio tool has been developed to help RPA-tors to create the robot algorythms.
### Robot
-The Robot tool is the core of any action execution in the pyOpenRPA. All action from algorythms are perfoming by the Robot tool. It looks like a console process without graphic user interface.
+The pyOpenRPA.Robot package is the core of any action execution in the pyOpenRPA. All action from algorythms are perfoming by the Robot tool. It looks like a console process without graphic user interface.
**Features**
@@ -88,12 +121,12 @@ The Robot tool is the core of any action execution in the pyOpenRPA. All action
### Orchestrator
-The Orchestrator tool has been developed to maintain robot infrastructure (2+ robots algorythm).
+The pyOpenRPA.Orchestrator package has been developed to maintain robot infrastructure (2+ robots algorythm).
**Features**
-* Start/Stop robot algorythm
+* Start/Stop robot algorithm
* Robot scheduler
@@ -107,32 +140,92 @@ The Orchestrator tool has been developed to maintain robot infrastructure (2+ ro
* Remote machine logs storage
-## Guide (in progress)
+### Agent
+
+The pyOpenRPA.Agent tool has been developed to maintain robot infrastructure (2+ robots algorythm).
+
+**Features**
+
+
+* Send CMD to the RPA GUI session (start/safe stop/force stop/logout)
-In wiki you can find:
-in QUEUE
+* Get screenshots from the RPA GUI session
-* Theory & practice: Web app access (Chrome, Firefox, Opera)
+* Get the list of the running processes
-* Theory & practice: Desktop app UI access (win32 and UI automation dlls)
+## Wiki structure
+In wiki you can use the following docs:
-* Theory & practice: Keyboard & mouse manipulation
+* ENG Guide HTML [
-* Theory & practice: Screen capture & image recognition
+```
+|OPEN GITLAB|
+```
-## Tutorials
+]([https://gitlab.com/UnicodeLabs/OpenRPA/-/tree/master/Wiki/ENG_Guide/html/index.html](https://gitlab.com/UnicodeLabs/OpenRPA/-/tree/master/Wiki/ENG_Guide/html/index.html))
-* [ENG] Content in progress
+* ENG Guide MarkDown [
+```
+|OPEN GITLAB|
+```
-* [RUS] Перейти в раздел туториалов
+]([https://gitlab.com/UnicodeLabs/OpenRPA/-/tree/master/Wiki/ENG_Guide/markdown/index.md](https://gitlab.com/UnicodeLabs/OpenRPA/-/tree/master/Wiki/ENG_Guide/markdown/index.md))
-## Content
+
+* ENG Guide PDF [
+
+```
+|WAIT|
+```
+
+]()
+
+
+* RUS Article: Less cost - no paid RPA [
+
+```
+|OPEN HABR|
+```
+
+]([https://habr.com/ru/post/509644/](https://habr.com/ru/post/509644/))
+
+
+* RUS Tutorial Desktop UI [
+
+```
+|OPEN HABR|
+```
+
+]([https://habr.com/ru/post/509644/](https://habr.com/ru/post/509644/)); [
+
+```
+|OPEN GITLAB|
+```
+
+]([https://gitlab.com/UnicodeLabs/OpenRPA/-/tree/master/Wiki/RUS_Tutorial/DesktopGUI_Habr/index.md](https://gitlab.com/UnicodeLabs/OpenRPA/-/tree/master/Wiki/RUS_Tutorial/DesktopGUI_Habr/index.md))
+
+
+* RUS Tutorial Web UI [
+
+```
+|OPEN HABR|
+```
+
+]([https://habr.com/ru/post/515310/](https://habr.com/ru/post/515310/)); [
+
+```
+|OPEN GITLAB|
+```
+
+]([https://gitlab.com/UnicodeLabs/OpenRPA/-/tree/master/Wiki/RUS_Tutorial/WebGUI_Habr/readme.md](https://gitlab.com/UnicodeLabs/OpenRPA/-/tree/master/Wiki/RUS_Tutorial/WebGUI_Habr/readme.md))
+
+## Guide content
* 1. How to install
@@ -276,4 +369,13 @@ in QUEUE
* 3. gSettings Template
-* 4. How to start process
+* 4. How to use
+
+
+* 5. UAC - User Access Control
+
+
+ * About
+
+
+ * UAC Dict for Orchestrator WEB UI rights
diff --git a/Wiki/RUS_Tutorial/README.md b/Wiki/RUS_Tutorial/README.md
index 83899a9e..4d373c37 100644
--- a/Wiki/RUS_Tutorial/README.md
+++ b/Wiki/RUS_Tutorial/README.md
@@ -1,11 +1,11 @@
# Навигация по статьям
-Так как [pyOpenRPA](https://gitlab.com/UnicodeLabs/OpenRPA) - это достаточно крупная RPA платформа: туториал будет составлен в виде серий статей, в которых будут освещаться ключевые технологии. А уже освоив эти технологии, у вас появится возможность углубиться в то, что вам нужно.
+Так как [pyOpenRPA](https://gitlab.com/UnicodeLabs/OpenRPA) - это крупная RPA платформа: туториал будет составлен в виде серий статей, в которых будут освещаться ключевые технологии. А уже освоив эти технологии, у вас появится возможность углубиться в то, что вам нужно.
**Ниже приведу планируемый перечень статей по этой тематике (для навигации):**
- [pyOpenRPA туториал. Управление оконными GUI приложениями](DesktopGUI_Habr/README.md)
-- pyOpenRPA туториал. Управление WEB приложениями (то, что мы смотрим в Chrome, Firefox, Opera)
+- [pyOpenRPA туториал. Управление WEB приложениями (то, что мы смотрим в Chrome, Firefox, Opera)](WebGUI_Habr/README.md)
- pyOpenRPA туториал. Управление клавиатурой & мышью
- pyOpenRPA туториал. Распознавание графических объектов на экране
diff --git a/Wiki/RUS_Tutorial/WebGUI_Habr/readme.md b/Wiki/RUS_Tutorial/WebGUI_Habr/readme.md
new file mode 100644
index 00000000..1258998a
--- /dev/null
+++ b/Wiki/RUS_Tutorial/WebGUI_Habr/readme.md
@@ -0,0 +1,503 @@
+Долгожданный туториал по управлению сторонними WEB приложениями с помощью pyOpenRPA. Во 2-й части мы разберем принципы роботизированного воздействия на HTML/JS. А также своими руками сделаем небольшого, но очень показательного робота.
+
+Этот робот будет полезен тем, для кого актуальна тема покупки/продажи недвижимости.
+
+![pyOpenRPA туториал. Управление WEB приложениями](https://habrastorage.org/webt/gt/rq/mo/gtrqmo2cvzjaajye98dlpvxo-_u.png)
+
+# Для тех, кто с нами впервые
+[pyOpenRPA](https://gitlab.com/UnicodeLabs/OpenRPA) - это open source [RPA платформа](https://ru.wikipedia.org/wiki/Robotic_process_automation), которая **в полной мере позволяет заменить топовые коммерческие RPA платформы**.
+
+Подробнее про то, чем же она полезна, можно [почитать здесь](https://habr.com/ru/post/506766/).
+
+# Навигация по туториалам pyOpenRPA
+Туториал сверстан в виде серии статей, в которых будут освещаться ключевые технологии, необходимые для RPA.
+
+Освоив эти технологии, у вас появится возможность углубиться в специфику той задачи, которая поставлена перед вами.
+
+**Перечень статей-туториалов (опубликованные и планируемые):**
+- [Отказываемся от платных RPA платформ и базируемся на OpenSource (pyOpenRPA)](https://habr.com/ru/post/506766/)
+- [pyOpenRPA туториал. Управление оконными GUI приложениями](https://habr.com/ru/post/509644/)
+- \>> [pyOpenRPA туториал. Управление WEB приложениями (то, что мы смотрим в Chrome, Firefox, Opera)](https://habr.com/ru/post/515310/)
+- pyOpenRPA туториал. Управление клавиатурой & мышью
+- pyOpenRPA туториал. Распознавание графических объектов на экране
+
+А теперь перейдем к самому туториалу.
+
+
+
+# Немного теории и терминов
+
+[Из википедии]
+
+Веб-приложение — клиент-серверное приложение, в котором клиент взаимодействует с веб-сервером при помощи браузера. Логика веб-приложения распределена между сервером и клиентом, хранение данных осуществляется, преимущественно, на сервере, обмен информацией происходит по сети. Одним из преимуществ такого подхода является тот факт, что клиенты не зависят от конкретной операционной системы пользователя, поэтому веб-приложения являются межплатформенными службами.
+
+Веб приложения стали широко использоваться в конце 1990-х — начале 2000-х годов.
+
+[Ссылка на источник](https://ru.wikipedia.org/wiki/%D0%92%D0%B5%D0%B1-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5)
+
+Ок, с выдержкой из вики все #КрутоУмно, но от этого не легче (для тех, кто в этой теме дилетант). Продемонстрирую устройство WEB приложения на примере "Что видим мы?"/"Что видит робот?". Для этого отправимся на сайт одной известной WEB площадки по объявлениям по недвижимости
+
+## Что видим мы?
+Мы видим красиво сверстанный сайт с интуитивно понятным интерфейсом, на котором можно найти интересные объявления о продаже/сдаче в аренду недвижимости.
+
+![Как мы видим WEB приложение](https://habrastorage.org/webt/af/sf/ku/afsfkuhlchm-prpeh_-hzrachmw.png)
+
+## Что видит робот?
+Робот видит огромную гипертекстовую разметку [HTML](https://ru.wikipedia.org/wiki/HTML) с примесью алгоритмического кода [JS](https://ru.wikipedia.org/wiki/JavaScript) и завернутого в каскадную таблицу стилей [CSS](https://ru.wikipedia.org/wiki/CSS). Увлекательно, правда? :)
+
+![Как робот видит WEB приложение](https://habrastorage.org/webt/gz/15/hy/gz15hycrdih3s9paxjsuocsnq6e.png)
+
+## Интерпретация
+WEB приложения - это **один из самых легко роботизируемых классов приложений**. Обилие инструментов + технологий позволяют реализовывать практически любую поставленную задачу в кооперации с ними.
+
+Управлять WEB страницей можно с помощью разных технологий адресации: CSS, XPath, id, class, attribute. Мы будем взаимодействовать со страницей с помощью CSS селекторов.
+
+
+
+# (По шагам) робот своими руками
+В этом туториале мы будем заниматься разработкой робота, который оперирует на одном из самых популярных порталов по объявлениям по недвижимости в РФ (тема одна из актуальных для многих).
+
+В качестве примера поставим себе следующую задачу: **Разработать робота, который будет извлекать список всех объявлений по ранее преднастроенному фильтру**. Все извлеченные объявления сохранить как датасет в файл .json со следующей структурой:
+```
+{
+ "SearchKeyStr": "МСК_Тверской", # Ключевое слово поиска
+ "SearchTitleStr": "Москва, район Тверской", # Заголовок поиска
+ "SearchURLStr": "https://www.cian.ru/cat.php?deal_type=sale&engine_version=2&in_polygon%5B1%5D=37.6166_55.7678%2C37.6147_55.7688%2C37.6114_55.7694%2C37.6085_55.7698%2C37.6057_55.77%2C37.6018_55.77%2C37.5987_55.77%2C37.5961_55.7688%2C37.5942_55.7677%2C37.5928_55.7663%2C37.5915_55.7647%2C37.5908_55.7631%2C37.5907_55.7616%2C37.5909_55.7595%2C37.5922_55.7577%2C37.5944_55.7563%2C37.5968_55.7555%2C37.6003_55.7547%2C37.603_55.7543%2C37.6055_55.7542%2C37.6087_55.7541%2C37.6113_55.7548%2C37.6135_55.756%2C37.6151_55.7574%2C37.6163_55.7589%2C37.6179_55.7606%2C37.6187_55.7621%2C37.619_55.7637%2C37.6194_55.7651%2C37.6193_55.7667%2C37.6178_55.7679%2C37.6153_55.7683%2C37.6166_55.7678&offer_type=flat&polygon_name%5B1%5D=%D0%9E%D0%B1%D0%BB%D0%B0%D1%81%D1%82%D1%8C+%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0&room1=1&room2=1", # URL of the CIAN search [str]
+ "SearchDatetimeStr": "2020-08-01 09:33:00.838081", # Дата, на которую была сформирована выгрузка
+ "SearchItems": { # Перечень извлеченных ценовых объявлений
+ "https://www.cian.ru/sale/flat/219924574/:": { # URL ссылка на ценовое объявление
+ "TitleStr": "3-комн. кв., 31,4 м², 5/8 этаж", # Заголовок ценового объявления
+ "PriceFloat": 10000000.0, # Стоимость общая
+ "PriceSqmFloat": 133333.0, # Стоимость на 1 кв. м.
+ "SqMFloat": 31.4, # Кол-во кв. м.
+ "FloorCurrentInt": 5, # Этаж лота по объявлению
+ "FloorTotalInt": 8, # Этажей в доме всего
+ "RoomCountInt": 3 # Кол-во комнат
+ }
+ }
+
+}
+```
+
+
+
+## Шаг 0. Подготовим проект для нового робота (развернем pyOpenRPA)
+В отличии от подавляющего большинства RPA платформ, в pyOpenRPA реализован принципиально иной подход по подключению к проекту, а именно: если в них структуру проекта определяет сама RPA платформа, то в pyOpenRPA структуру проекта определяете Вы и только Вы. Это дает больше гибкости и возможности по использованию этой RPA технологии в других направлениях (использовать pyOpenRPA как обычную библиотеку Python).
+
+**Доступно несколько вариантов загрузки [pyOpenRPA](https://gitlab.com/UnicodeLabs/OpenRPA):**
+- Вариант 1, простой. Скачать преднастроенную портативную версию с [GitLab страницы проекта](https://gitlab.com/UnicodeLabs/OpenRPA)
+- Вариант 2, сложный. Установить pyOpenRPA в свою версию интерпретатора Python 3 (pip install pyOpenRPA)
+
+Я рекомендую воспользоваться простым вариантом (вариант 1). Преднастроенная версия не требуется каких-либо настроек инфраструктуры. Здесь в лучших традициях pyOpenRPA реализован принцип, когда пользователь скачивает репозиторий, и у него уже все настроено из коробки - пользователю остается лишь писать скрипт робота. #Enjoy :)
+
+
+## Шаг 1. Создать проект робота
+Для того, чтобы начать проект робота, необходимо создать папку проекта. В дальнейшем я затрону тему организации папок проектов для промышленных программных роботов. Но на текущий момент не буду заострять внимание на этом, чтобы сконцентрироваться непосредственно на основном - на логике работы с WEB страницами.
+
+**Ниже приведу зависимости проекта от сторонних компонентов:**
+- Selenium WebDriver
+- Google Chrome или Mozilla Firefox или Internet Explorer
+- Python 3
+
+Если вы пошли по варианту 1 (см. шаг 0), то у Вас все эти компоненты уже будут развернуты и настроены внутри скачанного репозитория pyOpenRPA (#Удобно). Репозиторий pyOpenRPA уже содержит все необходимые portable версии требуемых программ (Google Chrome, Mozilla Firefox, Python3 32|64 и т.д.).
+
+Вы наверняка заметили, что в pyOpenRPA используется [Selenium](https://habr.com/ru/post/152653/). Этот компонент является одним из лучших отказоустойчивых компонентов по внедрению в WEB. Именно поэтому мы его и будем использовать в pyOpenRPA.
+
+**Создадим следующую структуру проекта:**
+- Репозиторий pyOpenRPA > Wiki > RUS_Tutorial > WebGUI_Habr:
+ - Файл "3. MonitoringCIAN_Run_64.py" - скрипт робота, который мониторит WEB площадку
+ - Файл "3. MonitoringCIAN_Run_64.cmd" - скрипт запуска робота с 1-го клика по аналогии с .exe файлами
+
+**Ниже приведу пример "3. MonitoringCIAN_Run_64.cmd" файла:**
+```
+cd %~dp0..\..\..\Sources
+..\Resources\WPy64-3720\python-3.7.2.amd64\python.exe "..\Wiki\RUS_Tutorial\WebGUI_Habr\3. MonitoringCIAN_Run_64.py"
+pause >nul
+```
+
+**Для инициализации Selenium WebDriver воспользуемся следующей функцией:**
+
+```
+##########################
+# Init the Chrome web driver
+###########################
+def WebDriverInit(inWebDriverFullPath, inChromeExeFullPath, inExtensionFullPathList):
+ # Set full path to exe of the chrome
+ lWebDriverChromeOptionsInstance = webdriver.ChromeOptions()
+ lWebDriverChromeOptionsInstance.binary_location = inChromeExeFullPath
+ # Add extensions
+ for lExtensionItemFullPath in inExtensionFullPathList:
+ lWebDriverChromeOptionsInstance.add_extension (lExtensionItemFullPath)
+ # Run chrome instance
+ lWebDriverInstance = None
+ if inWebDriverFullPath:
+ # Run with specified web driver path
+ lWebDriverInstance = webdriver.Chrome(executable_path = inWebDriverFullPath, options=lWebDriverChromeOptionsInstance)
+ else:
+ lWebDriverInstance = webdriver.Chrome(options = lWebDriverChromeOptionsInstance)
+ # Return the result
+ return lWebDriverInstance
+```
+
+
+## Шаг 2. Запустить WEB инструменты разработчика и сформировать CSS селекторы
+В нашем случае WEB инструменты разработчика мы будем использовать из Google Chrome, который предустановлен в репозитории pyOpenRPA (вариант 1 из шага 0).
+
+**Откроем Google Chrome и инструменты разработчика** (pyOpenRPA repo\\Resources\GoogleChromePortable\App\Chrome-bin\chrome.exe, после чего Ctrl + Shift + i)
+ ![Portable Google Chrome + Dev Tools](https://habrastorage.org/webt/2p/nq/pc/2pnqpcdew_gkdrsvc2rhya1wc8k.png)
+
+**Откроем в браузере сайт, который мы будем анализировать. Сформируем область поиска и отобразить обнаруженные ценовые предложения в виде списка.**
+
+ [Пример поискового запроса](https://www.cian.ru/cat.php?deal_type=sale&engine_version=2&in_polygon%5B1%5D=37.6166_55.7678%2C37.6147_55.7688%2C37.6114_55.7694%2C37.6085_55.7698%2C37.6057_55.77%2C37.6018_55.77%2C37.5987_55.77%2C37.5961_55.7688%2C37.5942_55.7677%2C37.5928_55.7663%2C37.5915_55.7647%2C37.5908_55.7631%2C37.5907_55.7616%2C37.5909_55.7595%2C37.5922_55.7577%2C37.5944_55.7563%2C37.5968_55.7555%2C37.6003_55.7547%2C37.603_55.7543%2C37.6055_55.7542%2C37.6087_55.7541%2C37.6113_55.7548%2C37.6135_55.756%2C37.6151_55.7574%2C37.6163_55.7589%2C37.6179_55.7606%2C37.6187_55.7621%2C37.619_55.7637%2C37.6194_55.7651%2C37.6193_55.7667%2C37.6178_55.7679%2C37.6153_55.7683%2C37.6166_55.7678&offer_type=flat&polygon_name%5B1%5D=%D0%9E%D0%B1%D0%BB%D0%B0%D1%81%D1%82%D1%8C+%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0&room1=1&room2=1)
+
+![Список ценовых предложений по фильтру](https://habrastorage.org/webt/qc/sp/po/qcspporaxqux_kcimoncngnjtcg.png)
+
+Для того, чтобы подобрать CSS селектор нам помогут инструменты разработчика Google Chrome. Подробнее узнать про устройство CSS селекторов можно [здесь по ссылке](https://learn.javascript.ru/css-selectors)
+Для проверки правильности CSS селектора я буду делать следующую проверку в инструментах разработчика на вкладке "Console". На картинке представлен пример того, как проводится проверки правильности CSS селектора для извлечения списка ценовых предложений.
+
+![Пример проверки CSS селектора](https://habrastorage.org/webt/o-/zy/x9/o-zyx9fqur5fq6mu1xedb7srskg.png)
+
+**Подберем CSS селектор для выборки списка ценовых предложений на странице.**
+
+При составлении селектора выяснилось, что в список объявлений встроены рекламные баннеры, которые не содержат информацию о ценовом предложении.
+
+И таких видов рекламных баннеров было обнаружено несколько видов:
+- div[data-name="BannerServicePlaceInternal"]
+- div[data-name="getBannerMarkup"]
+- div[data-name="AdFoxBannerTracker"]
+
+В связи с этим CSS селектор должен быть скорректирован таким образом, чтобы исключить из выборки такие виды баннеров. Ниже приведен готовый CSS селектор.
+
+- CSS селектор, Список ценовых предложений: div[data-name="Offers"] > div:not([data-name="BannerServicePlaceInternal"]):not([data-name="getBannerMarkup"]):not([data-name="AdFoxBannerTracker"])
+
+**Подберем CSS селекторы по извлечению параметров ценового предложения: Заголовок, Стоимость общая, URL ссылка на карточку.**
+
+- CSS селектор, Заголовок: div[data-name="TopTitle"],div[data-name="Title"]
+- CSS селектор, Стоимость общая: div[data-name="Price"] > div[class*="header"],div[data-name="TopPrice"] > div[class*="header"]
+- CSS селектор, URL ссылка на карточку: a[class*="--header--"]
+
+**Подберем CSS селектор для извлечения кнопки на следующую страницу.**
+
+- CSS селектор, Указатель на следующую страницу: div[data-name="Pagination"] li[class*="active"] + li a
+
+
+
+## Шаг 3. Обработать/преобразовать получаемые данные
+На предыдущем шаге мы успешно подобрали все необходимые CSS селекторы. Теперь нам нужно грамотно извлечь информацию, а потом и обработать ее.
+
+В результате обработки ценового предложения у нас будет сформирована структура следующего вида:
+```
+lOfferItemInfo = { # Item URL with https
+ "TitleStr": "3-комн. кв., 31,4 м², 5/8 этаж", # Offer title [str]
+ "PriceFloat": 10000000.0, # Price [float]
+ "PriceSqmFloat": 133333.0, # CALCULATED Price per square meters [float]
+ "SqMFloat": 31.4, # Square meters in flat [float]
+ "FloorCurrentInt": 5, # Current floor [int]
+ "FloorTotalInt": 8, # Current floor [int]
+ "RoomCountInt": 3 # Room couint [int]
+}
+```
+**Для начала получим список элементов ценовых предложений.**
+```
+lOfferListCSSStr = 'div[data-name="Offers"] > div:not([data-name="BannerServicePlaceInternal"]):not([data-name="getBannerMarkup"]):not([data-name="AdFoxBannerTracker"])'
+lOfferList = inWebDriver.find_elements_by_css_selector(css_selector=lOfferListCSSStr)
+```
+
+**Далее циклическая обработка каждого ценового предложения.**
+```
+for lOfferItem in lOfferList:
+```
+
+**Извлечем параметры из WEB страницы: Заголовок, Стоимость общая, URL на карточку.**
+```
+lTitleStr = lOfferItem.find_element_by_css_selector(css_selector='div[data-name="TopTitle"],div[data-name="Title"]').text # Extract title text
+lPriceStr = lOfferItem.find_element_by_css_selector(css_selector='div[data-name="Price"] > div[class*="header"],div[data-name="TopPrice"] > div[class*="header"]').text # Extract total price
+lURLStr = lOfferItem.find_element_by_css_selector(css_selector='a[class*="--header--"]').get_attribute("href") # Extract offer URL
+lOfferItemInfo["TitleStr"] = lTitleStr # set the title
+lPriceStr = lPriceStr.replace(" ","").replace("₽","") # Remove some extra symbols
+lOfferItemInfo["PriceFloat"] = round(float(lPriceStr),2) # Convert price to the float type
+```
+
+**Извлечем недостающие параметры алгоритмическим путем.**
+- Если в заголовке **содержится** слово "Апартаменты"
+```
+lREResult = re.search(r".*, (\d*,?\d*) м², (\d*)/(\d*) эта.", lTitleStr) # run the re
+lOfferItemInfo["RoomCountInt"] = 1 # Room count
+lSqmStr = lREResult.group(1)
+lSqmStr= lSqmStr.replace(",",".")
+lOfferItemInfo["SqMFloat"] = round(float(lSqmStr),2) # sqm count
+lOfferItemInfo["FloorCurrentInt"] = int(lREResult.group(2)) # Floor current
+lOfferItemInfo["FloorTotalInt"] = int(lREResult.group(3)) # Floor total
+lOfferItemInfo["PriceSqmFloat"] = round(lOfferItemInfo["PriceFloat"] / lOfferItemInfo["SqMFloat"],2) # Sqm per M
+```
+
+- Если в заголовке **не содержится** слово "Апартаменты"
+```
+lREResult = re.search(r".*(\d)-комн. .*, (\d*,?\d*) м², (\d*)/(\d*) эта.", lTitleStr) # run the re
+lOfferItemInfo["RoomCountInt"] = int(lREResult.group(1)) # Room count
+lSqmStr = lREResult.group(2)
+lSqmStr= lSqmStr.replace(",",".")
+lOfferItemInfo["SqMFloat"] = round(float(lSqmStr),2) # sqm count
+lOfferItemInfo["FloorCurrentInt"] = int(lREResult.group(3)) # Floor current
+lOfferItemInfo["FloorTotalInt"] = int(lREResult.group(4)) # Floor total
+lOfferItemInfo["PriceSqmFloat"] = round(lOfferItemInfo["PriceFloat"] / lOfferItemInfo["SqMFloat"],2) # Sqm per M
+```
+
+В примере выше применяется магия [регулярных выражений](https://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D0%B5_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F)
+
+Для подбора правильных регулярных выражений я пользуюсь [online валидаторами типа таких](https://www.google.com/search?q=online+regex&oq=online+reg&aqs=chrome.0.0l2j69i57j0l5.5699j0j7&sourceid=chrome&ie=UTF-8)
+
+**По окончанию обработки ценовых предложений выполним проверку на наличие указателя на следующую страницу, и (если такой указатель имеется) выполним переход на нее.**
+
+Выше (на шаге 2) мы уже находили CSS селектор указателя на следующую страницу. Нам нужно выполнить действие клика .click() по этому элементу.
+Но при тестировании выяснилось, что функция .click от Selenium отрабатывает некорректно для этой страницы (не происходит переключение). В связи с этим у нас есть уникальная возможность использовать функциональность JavaScript на самой странице через Selenium. А уже из JavaScript выяснилось, что функция нажатия по указателю страницы отрабатывает корректно. Для этого выполним следующую команду:
+```
+inWebDriver.execute_script("""document.querySelector('div[data-name="Pagination"] li[class*="active"] + li a').click()""")
+```
+
+После того как был отправлен сигнал на переключение страницы, необходимо дождаться ее загрузки. Только после появления новой страницы мы сможем перейти к обработке новых ценовых предложений.
+```
+# wait while preloader is active
+lDoWaitBool = True
+while lDoWaitBool:
+ lPreloaderCSS = inWebDriver.find_elements_by_css_selector(css_selector='div[class*="--preloadOverlay--"]') # So hard to catch the element :)
+ if len(lPreloaderCSS)>0: time.sleep(0.5) # preloader is here - wait
+ else: lDoWaitBool = False # Stop wait if preloader is dissappear
+```
+
+**Итоговую структуру сохраним в .json файл.**
+```
+# Check dir - create if not exists
+if not os.path.exists(os.path.join('Datasets',lResult['SearchKeyStr'])):
+ os.makedirs(os.path.join('Datasets',lResult['SearchKeyStr']))
+# Save result in file
+lFile = open(f"{os.path.join('Datasets',lResult['SearchKeyStr'],lDatetimeNowStr.replace(' ','_').replace('-','_').replace(':','_').replace('.','_'))}.json","w",encoding="utf-8")
+lFile.write(json.dumps(lResult))
+lFile.close()
+```
+
+## Шаг 4. Обработка нештатных ситуаций
+Этап тестирования - это один из самых важных этапов, который позволяет конвертировать вложенные усилия в реальный эффект. При тестировании кода на этом WEB приложении выяснилось, что могут происходить некоторые сбои. Ниже привожу те виды сбоев, которые встретились у меня:
+- Зависает ползунок загрузки при переключении на сл. страницу
+- При переключении на следующую страницу открывается совсем не следующая страница (иногда, но случалось :) )
+
+Но роботы не боятся таких проблем (на то они и роботы :) ).
+
+**Для каждого вида сбоя мы предусмотрим сценарий восстановления, который позволит роботы доделать свою работу до конца.**
+- Зависает ползунок загрузки при переключении на сл. страницу
+```
+# wait while preloader is active. If timeout - retry all job
+lTimeFromFLoat = time.time() # get current time in float (seconds)
+lDoWaitBool = True
+while lDoWaitBool:
+ lPreloaderCSS = inWebDriver.find_elements_by_css_selector(css_selector='div[class*="--preloadOverlay--"]')
+ if len(lPreloaderCSS)>0: time.sleep(0.5) # preloader is here - wait
+ else: lDoWaitBool = False # Stop wait if preloader is dissappear
+ if (time.time() - lTimeFromFLoat) > 15: # check if timeout is more than 15 seconds
+ lRetryJobBool = True # Loading error on page - do break, then retry the job
+ if inLogger: inLogger.warning(f"Ожидание загрузки страницы более {15} с., Робот повторит задание сначала")
+ break # break the loop
+if lRetryJobBool == True: # break the loop if RetryJobBool is true
+ break
+```
+
+- При переключении на следующую страницу открывается совсем не следующая страница (иногда, но случалось :) )
+```
+lPageNumberInt = int(inWebDriver.find_element_by_css_selector(css_selector='li[class*="--active--"] span').text) # Get the current page int from web and check with iterator (if not equal - retry all job)
+if lPageNumberInt == lPageCounterInt:
+ ... Код робота ...
+else:
+ lRetryJobBool = True
+ if inLogger: inLogger.warning(
+ f"Следующая страница по списку не была загружена. Была загружена страница: {lPageNumberInt}, Ожидалась страница: {lPageCounterInt}")
+```
+
+## Шаг 5. Консолидировать код в проекте робота
+**Соберем все блоки воедино.**
+
+Получим следующий пакет ([открыть на GitLab](https://gitlab.com/UnicodeLabs/OpenRPA/-/blob/master/Wiki/RUS_Tutorial/WebGUI_Habr/3.%20MonitoringCIAN_Run_64.py)):
+```
+# Init Chrome web driver with extensions (if applicable)
+# Import section
+from selenium import webdriver
+import time
+import re # Regexp to extract info from string
+import json
+import datetime
+import os
+import re
+import copy
+import logging
+# Store structure (.json)
+"""
+{
+ "SearchKeyStr": "МСК_Тверской",
+ "SearchTitleStr": "Москва, район Тверской", # Title of the search [str]
+ "SearchURLStr": "https://www.cian.ru/cat.php?deal_type=sale&engine_version=2&in_polygon%5B1%5D=37.6166_55.7678%2C37.6147_55.7688%2C37.6114_55.7694%2C37.6085_55.7698%2C37.6057_55.77%2C37.6018_55.77%2C37.5987_55.77%2C37.5961_55.7688%2C37.5942_55.7677%2C37.5928_55.7663%2C37.5915_55.7647%2C37.5908_55.7631%2C37.5907_55.7616%2C37.5909_55.7595%2C37.5922_55.7577%2C37.5944_55.7563%2C37.5968_55.7555%2C37.6003_55.7547%2C37.603_55.7543%2C37.6055_55.7542%2C37.6087_55.7541%2C37.6113_55.7548%2C37.6135_55.756%2C37.6151_55.7574%2C37.6163_55.7589%2C37.6179_55.7606%2C37.6187_55.7621%2C37.619_55.7637%2C37.6194_55.7651%2C37.6193_55.7667%2C37.6178_55.7679%2C37.6153_55.7683%2C37.6166_55.7678&offer_type=flat&polygon_name%5B1%5D=%D0%9E%D0%B1%D0%BB%D0%B0%D1%81%D1%82%D1%8C+%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0&room1=1&room2=1", # URL of the CIAN search [str]
+ "SearchDatetimeStr": "2020-08-01 09:33:00.838081", # Date of data extraction, [str]
+ "SearchItems": {
+ "https://www.cian.ru/sale/flat/219924574/:": { # Item URL with https
+ "TitleStr": "3-комн. кв., 31,4 м², 5/8 этаж", # Offer title [str]
+ "PriceFloat": 10000000.0, # Price [float]
+ "PriceSqmFloat": 133333.0, # CALCULATED Price per square meters [float]
+ "SqMFloat": 31.4, # Square meters in flat [float]
+ "FloorCurrentInt": 5, # Current floor [int]
+ "FloorTotalInt": 8, # Current floor [int]
+ "RoomCountInt": 3 # Room couint [int]
+ }
+ }
+
+}
+"""
+
+##########################
+# Init the Chrome web driver
+###########################
+gChromeExeFullPath = r'..\Resources\GoogleChromePortable\App\Chrome-bin\chrome.exe'
+gExtensionFullPathList = []
+gWebDriverFullPath = r'..\Resources\SeleniumWebDrivers\Chrome\chromedriver_win32 v84.0.4147.30\chromedriver.exe'
+def WebDriverInit(inWebDriverFullPath, inChromeExeFullPath, inExtensionFullPathList):
+ # Set full path to exe of the chrome
+ lWebDriverChromeOptionsInstance = webdriver.ChromeOptions()
+ lWebDriverChromeOptionsInstance.binary_location = inChromeExeFullPath
+ # Add extensions
+ for lExtensionItemFullPath in inExtensionFullPathList:
+ lWebDriverChromeOptionsInstance.add_extension (lExtensionItemFullPath)
+ # Run chrome instance
+ lWebDriverInstance = None
+ if inWebDriverFullPath:
+ # Run with specified web driver path
+ lWebDriverInstance = webdriver.Chrome(executable_path = inWebDriverFullPath, options=lWebDriverChromeOptionsInstance)
+ else:
+ lWebDriverInstance = webdriver.Chrome(options = lWebDriverChromeOptionsInstance)
+ # Return the result
+ return lWebDriverInstance
+
+from selenium.webdriver.common.by import By
+from selenium.webdriver.support.ui import WebDriverWait
+from selenium.webdriver.support import expected_conditions as EC
+
+# def to extract list of offers from one job
+def OffersByJobExtractDict(inLogger, inWebDriver, inJob):
+ # BUG 0 - if timeout - retry the job +
+ # BUG 1 - do mouse scroll to to emulate user activity - cian can hold the robot
+ # BUG 2 - check the page to retry job offer if page is not next +
+ # BUG 3 - RE fall on Апартаменты-студия, 85,6 м², 4/8 этаж +
+ lRetryJobBool = True # Init flag if some error is raised - retry
+ while lRetryJobBool:
+ lRetryJobBool = False # Set false until some another action will appear
+ lResult = copy.deepcopy(inJob) # do copy the structure
+ lFilterURLStr = lResult["SearchURLStr"]
+ inWebDriver.get(lFilterURLStr) # Open the URL
+ lDatetimeNowStr = str(datetime.datetime.now())
+ lResult.update({
+ "SearchDatetimeStr": lDatetimeNowStr, # Date of data extraction, [str]
+ "SearchItems": {} # prepare the result
+ })
+ # Get List of the page
+ lNextPageItemCSS = 'div[data-name="Pagination"] li[class*="active"] + li a'
+ lNextPageItem = inWebDriver.find_element_by_css_selector(lNextPageItemCSS)
+ lPageCounterInt = 1 # Init the page counter
+ while lNextPageItem:
+ lPageNumberInt = int(inWebDriver.find_element_by_css_selector(css_selector='li[class*="--active--"] span').text) # Get the current page int from web and check with iterator (if not equal - retry all job)
+ if lPageNumberInt == lPageCounterInt:
+ lOfferListCSSStr = 'div[data-name="Offers"] > div:not([data-name="BannerServicePlaceInternal"]):not([data-name="getBannerMarkup"]):not([data-name="AdFoxBannerTracker"])'
+ lOfferList = inWebDriver.find_elements_by_css_selector(css_selector=lOfferListCSSStr)
+ for lOfferItem in lOfferList: # Processing the item, extract info
+ lOfferItemInfo = { # Item URL with https
+ "TitleStr": "3-комн. кв., 31,4 м², 5/8 этаж", # Offer title [str]
+ "PriceFloat": 10000000.0, # Price [float]
+ "PriceSqmFloat": 133333.0, # CALCULATED Price per square meters [float]
+ "SqMFloat": 31.4, # Square meters in flat [float]
+ "FloorCurrentInt": 5, # Current floor [int]
+ "FloorTotalInt": 8, # Current floor [int]
+ "RoomCountInt": 3 # Room couint [int]
+ }
+ lTitleStr = lOfferItem.find_element_by_css_selector(css_selector='div[data-name="TopTitle"],div[data-name="Title"]').text # Extract title text
+ if inLogger: inLogger.info(f"Старт обработки предложения: {lTitleStr}")
+ lPriceStr = lOfferItem.find_element_by_css_selector(css_selector='div[data-name="Price"] > div[class*="header"],div[data-name="TopPrice"] > div[class*="header"]').text # Extract total price
+ lURLStr = lOfferItem.find_element_by_css_selector(css_selector='a[class*="--header--"]').get_attribute("href") # Extract offer URL
+ lOfferItemInfo["TitleStr"] = lTitleStr # set the title
+ lPriceStr = lPriceStr.replace(" ","").replace("₽","") # Remove some extra symbols
+ lOfferItemInfo["PriceFloat"] = round(float(lPriceStr),2) # Convert price to the float type
+ #Check if Апартаменты
+ if "АПАРТАМЕНТЫ" in lTitleStr.upper():
+ lREResult = re.search(r".*, (\d*,?\d*) м², (\d*)/(\d*) эта.", lTitleStr) # run the re
+ lOfferItemInfo["RoomCountInt"] = 1 # Room count
+ lSqmStr = lREResult.group(1)
+ lSqmStr= lSqmStr.replace(",",".")
+ lOfferItemInfo["SqMFloat"] = round(float(lSqmStr),2) # sqm count
+ lOfferItemInfo["FloorCurrentInt"] = int(lREResult.group(2)) # Floor current
+ lOfferItemInfo["FloorTotalInt"] = int(lREResult.group(3)) # Floor total
+ lOfferItemInfo["PriceSqmFloat"] = round(lOfferItemInfo["PriceFloat"] / lOfferItemInfo["SqMFloat"],2) # Sqm per M
+ else:
+ lREResult = re.search(r".*(\d)-комн. .*, (\d*,?\d*) м², (\d*)/(\d*) эта.", lTitleStr) # run the re
+ lOfferItemInfo["RoomCountInt"] = int(lREResult.group(1)) # Room count
+ lSqmStr = lREResult.group(2)
+ lSqmStr= lSqmStr.replace(",",".")
+ lOfferItemInfo["SqMFloat"] = round(float(lSqmStr),2) # sqm count
+ lOfferItemInfo["FloorCurrentInt"] = int(lREResult.group(3)) # Floor current
+ lOfferItemInfo["FloorTotalInt"] = int(lREResult.group(4)) # Floor total
+ lOfferItemInfo["PriceSqmFloat"] = round(lOfferItemInfo["PriceFloat"] / lOfferItemInfo["SqMFloat"],2) # Sqm per M
+ lResult['SearchItems'][lURLStr] = lOfferItemInfo # Set item in result dict
+ # Click next page item
+ lNextPageItem = None
+ lNextPageList = inWebDriver.find_elements_by_css_selector(lNextPageItemCSS)
+ if len(lNextPageList)>0:
+ lNextPageItem = lNextPageList[0]
+ try:
+ #lNextPageItem = WebDriverWait(lWebDriver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'div[data-name="Pagination"]')))
+ #lNextPageItem.click()
+ inWebDriver.execute_script("""document.querySelector('div[data-name="Pagination"] li[class*="active"] + li a').click()""")
+ except Exception as e:
+ print(e)
+ time.sleep(0.5) # some init operations
+ # wait while preloader is active. If timeout - retry all job
+ lTimeFromFLoat = time.time() # get current time in float (seconds)
+ lDoWaitBool = True
+ while lDoWaitBool:
+ lPreloaderCSS = inWebDriver.find_elements_by_css_selector(css_selector='div[class*="--preloadOverlay--"]')
+ if len(lPreloaderCSS)>0: time.sleep(0.5) # preloader is here - wait
+ else: lDoWaitBool = False # Stop wait if preloader is dissappear
+ if (time.time() - lTimeFromFLoat) > 15: # check if timeout is more than 15 seconds
+ lRetryJobBool = True # Loading error on page - do break, then retry the job
+ if inLogger: inLogger.warning(f"Ожидание загрузки страницы более {15} с., Робот повторит задание сначала")
+ break # break the loop
+ if lRetryJobBool == True: # break the loop if RetryJobBool is true
+ break
+ lPageCounterInt = lPageCounterInt + 1 # Increment the page counter
+ else:
+ lRetryJobBool = True
+ if inLogger: inLogger.warning(
+ f"Следующая страница по списку не была загружена. Была загружена страница: {lPageNumberInt}, Ожидалась страница: {lPageCounterInt}")
+ if lRetryJobBool == False: # break the loop if RetryJobBool is true
+ # Check dir - create if not exists
+ if not os.path.exists(os.path.join('Datasets',lResult['SearchKeyStr'])):
+ os.makedirs(os.path.join('Datasets',lResult['SearchKeyStr']))
+ # Save result in file
+ lFile = open(f"{os.path.join('Datasets',lResult['SearchKeyStr'],lDatetimeNowStr.replace(' ','_').replace('-','_').replace(':','_').replace('.','_'))}.json","w",encoding="utf-8")
+ lFile.write(json.dumps(lResult))
+ lFile.close()
+
+# Инициализировать Google Chrome with selenium web driver
+lWebDriver = WebDriverInit(inWebDriverFullPath = gWebDriverFullPath, inChromeExeFullPath = gChromeExeFullPath, inExtensionFullPathList = gExtensionFullPathList)
+lFilterURLStr = "https://www.cian.ru/cat.php?deal_type=sale&engine_version=2&in_polygon%5B1%5D=37.6166_55.7678%2C37.6147_55.7688%2C37.6114_55.7694%2C37.6085_55.7698%2C37.6057_55.77%2C37.6018_55.77%2C37.5987_55.77%2C37.5961_55.7688%2C37.5942_55.7677%2C37.5928_55.7663%2C37.5915_55.7647%2C37.5908_55.7631%2C37.5907_55.7616%2C37.5909_55.7595%2C37.5922_55.7577%2C37.5944_55.7563%2C37.5968_55.7555%2C37.6003_55.7547%2C37.603_55.7543%2C37.6055_55.7542%2C37.6087_55.7541%2C37.6113_55.7548%2C37.6135_55.756%2C37.6151_55.7574%2C37.6163_55.7589%2C37.6179_55.7606%2C37.6187_55.7621%2C37.619_55.7637%2C37.6194_55.7651%2C37.6193_55.7667%2C37.6178_55.7679%2C37.6153_55.7683%2C37.6166_55.7678&offer_type=flat&polygon_name%5B1%5D=%D0%9E%D0%B1%D0%BB%D0%B0%D1%81%D1%82%D1%8C+%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0&room1=1&room2=1"
+lJobItem = {
+ "SearchKeyStr": "МСК_Тверской",
+ "SearchTitleStr": "Москва, район Тверской", # Title of the search [str]
+ "SearchURLStr": lFilterURLStr,
+ # URL of the CIAN search [str]
+}
+OffersByJobExtractDict(inLogger = logging, inWebDriver = lWebDriver, inJob = lJobItem)
+```
+
+
+# Подведем итоги
+Уважаемые роботизаторы.
+
+Мы успешно преодолели вторую серию туториалов по созданию роботов в WEB приложениях с помощью open source pyOpenRPA. Готовый проект робота Вы можете найти в репозитории pyOpenRPA [по ссылочке](https://gitlab.com/UnicodeLabs/OpenRPA/-/tree/master/Wiki/RUS_Tutorial/WebGUI_Habr).
+В нашем аресенале уже имеются изученные технологии упраления Desktop и WEB приложениями. В следующей статье-туториале мы остановимся на особенностях роботизированного управления мышью и клавиатурой.
+
+Пишите комменты, внедряйте бесплатных роботов, будьте счастливы :)
+
+**До скорых публикаций!**
\ No newline at end of file