디자이너

상황: 앱의 메뉴들 중 하위 메뉴를 클릭하고 싶습니다. 하위 메뉴를 열기 위해 상위 메뉴를 누르면 대상 UI 객체로 지정되어 원하는 메뉴를 선택할 수 없습니다.

해결 방법: 앱의 메뉴 하위 항목이나 컨텍스트 메뉴와 같이 이전 단계의 UI 객체를 클릭한 후 대상 UI 객체를 선택해야 하는 경우, 이전 단계에 클릭한 UI 객체가 대상 UI 객체로 지정되는 문제가 발생합니다. 또는 지정하려는 UI 객체가 화면에 없어서 마우스를 이용해 해당 화면으로 이동해야 하는 경우에도 동일한 문제가 발생합니다. 이러한 경우에는 키보드의 Ctrl 키를 눌러 대상 지정을 일시 중지할 수 있습니다. 대상 UI 객체를 선택할 수 있는 상태가 되면 다시 Ctrl 키를 눌러 대상 지정을 다시 시작할 수 있습니다.

상황: 대상 UI 객체를 테스트할 때 오류가 발생합니다.

해결 방법: Name, Value 등 편집 가능한 속성 값은 스크립트 생성 시 스크립트 코드와 동일하게 처리됩니다. 따라서 일반 문자열인 경우 따옴표 안에 입력해야 하며, 변수를 사용할 경우에는 따옴표 없이 입력이 가능합니다. 위 화면의 경우 Name 속성에 변수가 지정된 경우에 발생하는 오류입니다. 변수의 값은 실행 시점에 결정되므로, 시나리오 작성 단계의 테스트 시점에는 변수의 값을 사용할 수 없습니다. 또는 문자열 입력 시 따옴표가 누락된 경우, 해당 입력 값이 변수 또는 스크립트 구문으로 인식되어 오류가 발생할 수 있습니다.

상황: 대상 UI 객체를 찾지 못합니다.

해결 방법: 속성 화면에서 대상 UI 객체의 Name, Value 값과 Check Name, Check Value, Check Size 항목을 확인하세요. 레코딩 시점과 수행 시점의 대상 UI 객체 정보가 다른 경우 대상 UI 객체를 발견하지 못할 수 있습니다.
Chrome 브라우저 등 일부 앱, Flash를 이용한 웹 사이트 등 대상 UI가 객체 정보를 정상적으로 제공하지 않는 경우가 있습니다. 이 경우 ImageRecognition 라이브러리를 이용하여 이미지 인식 방식으로 대상 UI를 지정할 수 있습니다.

상황: 각각의 UI 객체를 단독으로 수행하는 경우에는 잘 동작하는데, 여러 개의 UI 객체를 연달아 사용하면 정상적으로 동작하지 않습니다.

해결 방법: 콤보 박스 항목이나 컨텍스트 메뉴 등 일부 UI 객체는 포커스를 설정하면 화면에서 사라질 수 있습니다. 이러한 경우에는 Focus Before 항목을 False로 설정한 후 재시도하세요.
화면이 변경되는 시점에는 UI 객체 정보를 정상적으로 얻지 못할 수 있습니다. 특히 새로운 윈도우 화면으로 전환되는 경우에는 오류가 발생할 가능성이 높아집니다. 이 경우 각 스텝 사이에 Delay 라이브러리를 추가해 수행 속도를 조정하세요.

상황: 다른 작업을 호출하면 오류가 발생합니다.

해결 방법: 호출하려는 작업의 속성 화면에서 Input, Output 항목을 확인한 후 오류가 발생한 RunTask의 속성 화면에서 Input, Output 항목을 확인하세요. 대상 작업의 Input, Output 변수와 RunTask의 Input, Output 속성이 일치해야 합니다. 작업의 Input, Output 변수가 변경되는 경우에는 해당 작업을 호출하는 RunTask에도 변경해야 합니다.
호출하려는 작업이 저장되어 있는지 확인하세요. 저장되지 않은 작업은 수정하기 전의 스크립트를 사용하여 실행됩니다.

상황: RPA 프로세스를 실행할 때마다 V3에서 에러 메시지가 발생합니다.

해결 방법: V3는 클라우드 진단으로 EXE 프로그램이 서명(Signing)되어 있지 않거나, 다수 PC에서의 실행이 확인되지 않으면 차단 메시지를 띄웁니다. V3 환경 설정의 '검사 예외 설정 메뉴'에 Bot.exe, Designer.exe를 포함시켜 보세요. 또는 V3 환경 설정의 '고급 설정' 메뉴에서 '클라우드 진단 사용'을 선택 해제(UnCheck)해 보세요.

상황: 디자이너 활성화 오류(Designer Activation Error)가 발생합니다.

  1. 현상

  1. 에러 원인

  1. 해결 방안

상황: Excel 포맷을 만들어서 저장한 뒤, 그 포맷에 맞게 데이터를 입력 및 업데이트하는 작업을 자동화하고 싶습니다. RESOURCES에 파일을 추가했는데, RESOURCES 폴더 주소는 어떻게 되나요?

해결 방법: 리소스에 추가 하게 되면 해당 파일의 폴더 주소는 Global.ResourcesDir + 파일경로로 참조할 수 있습니다. 실제 경로는 Project 경로\Resources\파일명입니다.

상황: 에러가 발생하면 OnError 이벤트에서 다시 해당 작업(Task)을 수행하는 것은 됩니다. 문제는 다시 수행했을 때 에러가 발생하면 곧바로 예외 처리(Exception)하여 멈춥니다.

해결 방법: 현재로서는 재수행 후에도 오류가 발생하는 경우에는 처리할 수 있는 방법이 없습니다.
재수행이 가능하도록 개선하여 차기 버전에 반영할 수 있도록 하겠습니다.
(무한 반복 방지를 위해 Retry는 10회까지만 허용)

상황: [RetryTask] 오류 테스크 재실행 라이브러리 사용법이 궁금합니다.

  1. 해결 방법:

  2. 작업(Task)의 OnError 속성에 에러 핸들러를 등록한 후, 에러 핸들러에 RetryTask 추가

  3. Start Step & No./ID

    ErrorStep: 에러가 발생한 스텝을 기준으로 No./ID 에 지정한 수를 더한 위치에서 재실행 (No./ID 가 1이면 에러가 발생한 다음 스텝부터. -1 이면 에러가 발생한 스텝의 한 스텝 앞 부터 실행)

    StepNo: 지정한 스텝번호부터 재실행(No./ID 에 3 을 지정하면 3번 스텝부터 실행)

    StepID: 지정한 ID에 해당하는 스텝부터 실행 (ID는 스크립트 뷰에서 STEP() 라인을 통해 확인 가능하나 일부 특수한 경우를 위한 예비 기능이기 때문에 사용은 권장하지 않습니다.)

  4. Task Name : 재실행할 작업(Task)의 이름. 기본값으로 에러 핸들러의 변수 senderName가 지정됩니다.

  5. Output (주의)

    변수를 지정하지 않으면 RetryTask 후 즉시 리턴되어, RetryTask 이후는 동작하지 않습니다.

    변수를 지정하는 경우, 에러 핸들러가 종료될 때 TerminateFlow를 추가하고 Result에 해당 변수를 설정하여 작업(Task)의 결과가 정상적으로 반환되도록 작성해야 합니다.

  6. 기타 제약사항 및 주의 사항

    재실행 시 유지되는 데이터는 this, Global 등 관리되는 객체에 국한되며, ExecuteScript 등에서 코드로 작성된 지역변수는 유지되지 않습니다. 따라서, 재실행 시 중간부터 재실행하는 경우 지정한 위치 이전에 설정한 지역변수를 사용하면 오류가 발생합니다.

    오류가 발생한 스텝부터 다시 실행하도록 하는 경우, 동일 위치에서 동일한 오류가 계속 발생하는 경우 오류와 재시도가 무한 반복되는 문제가 발생할 수 있습니다. 재시도하기 전에 재시도 가능한 상태인지를 확인하도록 구성해야 합니다.

상황: 하위 작업(Task)에서 에러 발생 시, 상위 프로세스(Process) 쪽에 에러 핸들러를 등록해 처리하면 에러를 처리한 이후에 다음 스탭을 못 찾는 문제가 있습니다. 각 하위 작업(Task)들도 모두 에러 핸들러를 등록해야 하나요?

해결 방법: 에러 핸들러를 등록하면 try-catch 문이 작성됩니다. 예외 처리(catch)되지 않은 오류는 상위 작업(Task)으로 전달되므로 하위 작업(Task)에도 필요한 경우 에러 핸들러를 등록해야 합니다.
에러를 처리한 이후, 다음 스텝을 이어서 진행하시려면 에러 핸들러에서 RetryTask 라이브러리를 추가하면 됩니다. 속성(Properties)에서 Start Step에 ErrorStep을 지정하고 No./ID에 1을 입력하면 오류가 발생한 다음 스텝부터 이어서 진행됩니다. 단, 작업(Task)의 스크립트가 초기화되어 실행되므로 작업(Task) 내에서 생성한 지역변수의 경우에는 더 이상 값이 유효하지 않으므로 주의해야 합니다.(작업(Task)의 멤버 변수(this.VarName)의 값은 유지됩니다.)

상황: 아키텍처에 관해서 Client ↔ Server 구조로 만들어진 이유가 무엇인지 궁금합니다. 그리고 Server 는 본사 이외에 다른 곳에 설치가 가능한가요?

해결 방법: RPA 는 단순히 디자이너 PC 1대에서만 시나리오를 만들고 수행하기 위해 만들어진 것이 아니라, 디자이너에서 만든 시나리오를 서버에 올리고 서버에서 봇 PC를 선택하여 수행을 하기도 합니다.
프로세스 플로우를 사용하면 단순 프로세스 외에 더 많은 역할도 수행 가능합니다. A 사용자가 만든 시나리오를 B 사용자도 사용할 수 있는 등 서버를 통해 시나리오 및 자산도 공유할 수 있습니다. 일정 관리도 가능하며 주기적인 프로세스 수행도 할 수 있습니다. 서버는 타 사업부 또는 고객사 등에 설치할 수 있습니다.

상황: 디자이너에서 서버로 배포(Publish) 시 아래와 같은 메시지가 나오며 중단됩니다. Unexpected Error: => '', hexadecimal value 0x06, is an invalid character. Line 1, position 21640.

  1. 해결 방법:

  2. '', hexadecimal value 0x06, is an invalid 오류

    Value에 UI상에는 표시되지 않는 값()이 포함되어 있어 XML 처리 과정에서 문제가 발생한 오류입니다. 타깃을 재설정하더라도 동일한 문제가 발생하면, 해당 타깃이 처리할 수 없는 값을 포함하고 있는 경우입니다. 이런 경우에는 우측 속성에서 Value를 삭제하고 Check Value를 False로 설정하여 Value 속성이 적용되지 않도록 해야 합니다.

  3. '패딩이 올바르지 않습니다' 오류

    내용 중에 작성이 완료되지 않은 SetText가 있으면 발생합니다. 시나리오 작성이 완료되지 않았거나 가져올(Import) 때 SetText에 입력한 암호화 데이터가 초기화되어 발생하는 경우가 많습니다. (배포(Publish)/가져오기(Import) 기능을 통하지 않고 서로 다른 PC 간에 직접 파일을 공유하는 경우, 시나리오의 내용 중 암호화된 데이터가 삭제됩니다.)

  4. 500 Internel 오류

    삭제된 Asset을 사용하는 경우와 같이 프로젝트에서 사용하는 Asset 값이 없는 경우 오류가 발생할 수 있습니다.

상황: 프로젝트를 Publish 실행하면 "Unexpected Error:=>Value cannot be null. Parameter name: CipherText" 팝업이 발생합니다. 무엇을 점검해야 하나요?

해결 방법: Disable된 SendMail 라이브러리에 Password 항목이 입력되지 않았고, SendMail 라이브러리를 삭제한 후 Publish 완료되었습니다.

상황: 확장자가 .exe 파일 추가 시 'Executable file can not be added' 라는 메시지가 표시되고 추가되지 않는데 어떻게 해야 하나요?

해결 방법: 솔루션의 보안성 검토 시 실행 파일을 서버로 업로드하는 것을 제한하도록 요청 받아 .exe 파일은 서버로 업로드할 수 없습니다. 불편하시더라도 확장자를 변경하여 등록하시고, 시나리오에서는 실행 시 .exe 확장자 사본을 생성하여 실행하는 방식으로 사용해야 합니다.

상황: Win7, Win10 모두에 RPA 설치 및 사용이 가능한 것 같은데, 혹시 권장하는 것이 있나요?

해결 방법: RPA는 Win7, Win10에서 사용 가능합니다. 다만 Win7에서 작성한 스크립트 일부는 Win10에서 정상 수행되지 않을 가능성이 크며, 그 반대도 동일합니다.
그러므로, Win7에서 수행할 스크립트는 Win7에서, Win10에서 수행할 스크립트는 Win10에서 개발하는 것이 상대적으로 정상 수행 성공률을 높일 수 있습니다.

상황: 배열 출력하는 방법

해결 방법: 
스크립트 엔진의 내장 객체인 Bot.ToString()함수를 이용하세요.
아래와 같이 배열과 2차원 배열을 문자열로 변환하여 반환합니다.
var data_list = ['a', 'b', 'c'];
var data_list2 = [['a', 'b'], ['b', 'c']];
MsgBox(Bot.ToString(data_list));
MsgBox(Bot.ToString(data_list2));
MsgBox(Bot.ToString(data_list2[0]));

상황: ExecuteScript에서 XMLHttpRequest 함수를 사용할 수 있는 방법이 있나요?

XMLHttpReqeust는 웹 브라우저의 javascript에서 제공하는 기능으로 RPA에서는 사용할 수 없습니다.
  1. C#에서 제공하는 HttpClient 클래스를 엔진에 등록한 후 사용해 보세요.

    ExecuteScript에서 아래와 같이 작성하시면 Http request를 수행할 수 있습니다.

Bot.AddHostType('HttpClient', 'System.Net.Http.HttpClient');
var client = new HttpClient();
var response = client.GetAsync('http://www.google.com').Result;
MsgBox(response);
  1. HttpClient와 관련한 자세한 내용은 MSDN을 참조하세요.

상황: function을 만들어서 사용하려면 어떤 라이브러리를 이용해야 하나요?

ExecuteScript를 사용하거나,
프로젝트 폴더 하위의 Libraries 폴더에 js 파일을 생성하여 function을 구현하면 ExecuteLibrary에서 사용할 수 있습니다.

아래와 같은 형태로 스크립트를 작성해야 합니다.
Script.파일명 = new function(){
    this.함수명 = function(파라미터 목록){
    }
}

상황: 봇 객체가 지원하는 내장 함수는 어떤 것이 있나요?

ex2) Bot.AddHostType(SSHobj', 'Sample.MyClass.SSH', 'c:\\sample.dll');

MyClass.SampleMethod();

내장 함수

설명 및 예시

- AddHostType

(name, typeName,

assemblyName=null)

ex1) Bot.AddHostType('File', 'System.IO.File');

File.Copy(p1, p2);

- Bot.CharToInt,

- Bot.IntToChar

char ↔ int 변환에 사용합니다.

ex)

var code = Bot.CharToInt('A');

MsgBox(Bot.IntToChar(code+1) == 'B');

- Bot.CreateObject


(typeNameOrProgID)

C# 객체타입명 혹은 COM ProgID를 이용해 객체를 생성합니다.

ex)

// JScript 의 FileSystemObject 생성, 파일 크기 얻기

var type = System.Type.GetTypeFromProgID('Scripting.FileSystemObject');

var fso = System.Activator.CreateInstance(type);

var f = fso.GetFile('d:\\test.js');

MsgBox(f.Size);

- Bot.IsEmpty(obj)

null 이거나 빈 문자열인 경우 true를 반환합니다.

obj가 문자열 타입이 아닌 경우에도 문자열로 변환한 후 검사합니다.

- Bot.GetCount(obj)

개수 확인을 위한 변수 혹은 함수명을 모르는 경우 사용할 수 있습니다.

ex)

obj.length, obj.Length, obj.Count,

obj.getLength(), obj.GetLength(),

obj.getCount(), obj.GetCount(),

obj.Count(), obj.Length()

- Bot.IsNull(obj)

객체의 null, Null, Undefined인 경우 true를 반환합니다.

- Bot.ToString(obj)

문자열 변환을 수행합니다.

1차원 배열과 2차원 배열의 문자열을 출력할 수 있습니다.

- GetObjectInfo(obj)

객체의 멤버 변수, 함수 정보를 출력합니다.

-GetProgressInfo(taskName)

-GetLastRunStepID(taskName)

-GetLastRunStepNo(taskName)

주어진 작업(Task)의 마지막 수행 단계 정보를 반환합니다.

오류 보고 시 오류 발생 지점 정보를 위해 사용할 수 있습니다.

ToXml(xmlString)

주어진 xml 포맷의 문자열을 파싱하여 XmlDocument 객체를 반환합니다.

상황: 크롬브라우저에서 객체 지정을 하려고 하는데 페이지 전체가 하나로 지정되는 경우

해결 방법: 

객체를 지정하려는 웹 페이지가 하나의 이미지와 같은 형태로 구성된 사이트인 경우 개별 객체 인식이 불가능합니다. 혹은 해당 PC에 설치된 보안 프로그램 혹은 기업의 사내 보안 정책에 의해 크롬 브라우저의 객체 인식 기능이 비활성화된 경우일 수 있습니다. 이러한 경우에는 다음과 같이 크롬 브라우저 바로 가기 속성의 대상 경로에 --force-renderer-accessibility 옵션을 추가하여 객체 인식 기능을 강제 활성화할 수 있으며, 경우에 따라 사내 보안 담당자에 문의가 필요할 수 있습니다.