디자이너 엔지엠 RPA 프레임워크에서 스크립트 실행 로그 보기.
페이지 정보
본문
안녕하세요. 엔지엠소프트웨어입니다. 엔지엠 에디터나 플레이어는 간단한 옵션 조작으로 스크립트가 어떻게 진행되고, 결과로 어떤 값을 반환하는지 쉽게 알 수 있습니다. 하지만, 엔지엠 에디터와 플레이어를 사용하지 않는 개발 방법은 로그를 확인하기 어려운 부분이 있습니다. 물론, 예제나 매뉴얼을 보고 한번씩 따라해보면 쉽지만요^^; 항상 그렇듯이 이런것들은 콜럼버스의 달걀과 같은거죠~ 발상의 전환에 대해 이야기할 때 자주 인용되지만, 개발쪽에서는 이상하게도 생각하지 못한 노하우를 알려주면 하찮게 생각하는 경향이 있습니다. 겸손이 미덕이라는걸 잊지 말아야 겠습니다. 이 글은 프레임워크 관련 내용들을 학습한 닷넷 계열 개발자를 대상으로 작성되었습니다. 기초부터 천천히 따라하실분들은 매뉴얼 > 학습 카테고리에 C#과 디자이너의 내용을 처음부터 학습해보세요.
에디터와 플레이어의 아웃풋 로그를 표시하려면 윈폼에 텍스트를 받아서 표시할 콘트롤이 필요합니다. 아래와 같이 RichTextBox를 하나 추가하세요. 이 내용을 이해하기 위해서는 이전에 작성한 [ 내 서비스에 엔지엠 매크로 추가하기 ]를 읽어봐야 합니다^^;
아래 전체 코드를 붙여넣기 하세요.
using System;
using System.IO;
using System.Windows.Forms;
namespace FrameworkTest
{
public partial class Form1 : Form
{
private Designer.Component.ScriptView sv = null;
public Form1()
{
InitializeComponent();
// isBackground 파라메터를 false로 명시하지 않으면 뷰를 생성하지 않고 백그라운드로 실행됩니다.
sv = new Designer.Component.ScriptView(
new Designer.ComponentDefault.MainView(),
Path.Combine(GetDefaultScriptPath(),
"웹테스트.ngs"), false);
// 로그를 보려면 Output을 활성화 해야 합니다.
sv.MainView.IsOutput = true;
// 액션에서 로그를 기록할 카테고리를 설정합니다.
sv.MainView.ShowApplicationOutput = true;
sv.MainView.ShowConditionOutput = true;
sv.MainView.ShowDebugOutput = true;
sv.MainView.ShowDefaultOutput = true;
sv.MainView.ShowFunctionOutput = true;
sv.MainView.ShowHardwareOutput = true;
sv.MainView.ShowKeyboardOutput = true;
sv.MainView.ShowMemoryOutput = true;
sv.MainView.ShowMouseOutput = true;
sv.MainView.ShowTimeOutput = true;
(sv.MainView as NGM.Interface.IExternalView).LogReceived += Form1_LogReceived;
}
private void Form1_LogReceived(object sender, NGM.Events.LogWriteArgs e)
{
richTextBox1.Invoke((Action)delegate
{
richTextBox1.AppendText($"{e.Message}{Environment.NewLine}");
});
}
private string GetDefaultScriptPath()
{
// 기본 폴더 위치를 만듭니다.
return Path.Combine(
Environment.GetFolderPath(
Environment.SpecialFolder.MyDocuments), "NGM6", "Script");
}
private void button1_Click(object sender, System.EventArgs e)
{
try
{
// 스크립트를 실행합니다.
sv.Play();
}
catch (Exception ex)
{
// 실행중에 에러가 발생하면 사용자에게 메시지를 표시합니다.
MessageBox.Show(ex.Message);
}
}
}
}
실행하기 전 내문서 > NGM6 > Script 폴더에 [ 이 글 ]에 첨부되어 있는 스크립트 파일을 복사해둬야 합니다. 웹테스트.ngs 스크립트를 복사해 넣었다면 빌드 후 실행 해보세요.
스크립트의 액션들이 실행되면서 로그를 기록하고 있습니다. 로그를 스크립트 플레이어로부터 받아오려면 아래 속성들을 카테고리별로 true로 선택해야 합니다. 액션들은 각각의 카테고리를 가지고 있으며, 이 카테고리는 에디터의 보기 메뉴에서 확인할 수 있습니다.
// 로그를 보려면 Output을 활성화 해야 합니다.
sv.MainView.IsOutput = true;
// 액션에서 로그를 기록할 카테고리를 설정합니다.
sv.MainView.ShowApplicationOutput = true;
sv.MainView.ShowConditionOutput = true;
sv.MainView.ShowDebugOutput = true;
sv.MainView.ShowDefaultOutput = true;
sv.MainView.ShowFunctionOutput = true;
sv.MainView.ShowHardwareOutput = true;
sv.MainView.ShowKeyboardOutput = true;
sv.MainView.ShowMemoryOutput = true;
sv.MainView.ShowMouseOutput = true;
sv.MainView.ShowTimeOutput = true;
프레임워크는 디자이너보다 더 Raw 레벨의 코딩 작업입니다. 디자이너는 엔지엠에서 제공하는 콘트롤을 이용하여 편의 기능을 사용할 수 있죠? 하지만, 프레임워크는 엔지엠에서 제공하는 함수만 사용할 수 있습니다. 콘트롤은 GUI를 제공하고, 콘트롤에 포함된 함수만 사용할 수 있기 때문에 적용하기가 상대적으로 쉽습니다. 대신 자유도는 프레임워크보다 떨어집니다. 기본적으로 디자이너 틀에 갇혀서 개발해야 하기 때문입니다. 아래는 이벤트 핸들러를 연결해서 아웃풋 로그를 처리하는 방법입니다.
// 기본 생성자에서 한번만 사용하세요.
(sv.MainView as NGM.Interface.IExternalView).LogReceived += Form1_LogReceived;
이 이벤트 핸들러는 외부(External)에서만 사용 가능합니다. 그렇기 때문에 NGM.Interface.IExternalView를 상속받아서 구현된 뷰만 쓸 수 있습니다. 에디터와 플레이어는 NGM.Interface.IMainView를 상속받아서 구현해야 합니다. 이외에도 좀 더 파워풀한 스크립트 플레이어를 개발하기 위한 인터페이스도 존재합니다. 매니저는 인터페이스가 맞으면 메모리에 로딩하고 엔진은 이를 실행할 수 있습니다. 자 이제 이벤트를 받아서 처리할 이벤트 처리기를 추가해줍니다. 탭키를 2번 누르면 자동으로 추가됩니다.
private void Form1_LogReceived(object sender, NGM.Events.LogWriteArgs e)
{
richTextBox1.Invoke((Action)delegate
{
richTextBox1.AppendText($"{e.Message}{Environment.NewLine}");
});
}
코드는 간단하지만, richTextBox1을 Invoke해줘야 합니다. 그렇지 않으면 UI thread와 Script player thread에서 Cross thread exception이 발생하게 됩니다. BeginInvoke를 사용하면 비동기로 메시지를 받을 수 있습니다. LogWriteArgs는 액션의 아이디와 설명을 가져올수도 있습니다. 개발자가 액션에 입력한 아이디와 설명글입니다. 또한, 메시지는 시스템에서 만들어진 내용입니다. 마지막으로 리치텍스트박스가 자동으로 스크롤되도록 코드를 변경해줍니다.
private void Form1_LogReceived(object sender, NGM.Events.LogWriteArgs e)
{
richTextBox1.Invoke((Action)delegate
{
richTextBox1.AppendText($"{e.Message}{Environment.NewLine}");
// 캐럿이 위치한 곳으로 스크롤 해줍니다.
richTextBox1.ScrollToCaret();
});
}
실행 해볼까요? 아래 동영상처럼 스크롤이 마지막으로 자동 이동되는걸 알 수 있습니다.
엔지엠 RPA의 프레임워크(Framework)를 사용해서 개발하는 분들이 소수이다보니 관련 기능들을 소개하는 매뉴얼 작성이 많이(?) 늦었습니다. 외부 모듈로 개발하거나 자체적으로 플레이어 서비스를 제공해야 한다면 프레임워크를 사용해서 서비스하는것도 하나의 좋은 방법이 될 수 있습니다. 엔지엠 에디터나 플레이어는 이미 많은 정보가 공개되어 있어서 사용에 제약(?)이 따르기도 합니다. 이런 제약으로부터 자유를 얻으려면 어느정도 추가적인 학습과 개발이 필연적으로 따라올 수 밖에 없습니다^^;
개발자에게 후원하기
추천, 구독, 홍보 꼭~ 부탁드립니다.
여러분의 후원이 빠른 귀농을 가능하게 해줍니다~ 답답한 도시를 벗어나 귀농하고 싶은 개발자~
감사합니다~
- 이전글엔지엠 RPA의 프레임워크 개발시 액션 실행 정보를 이벤트로 받아보기. 21.06.12
- 다음글내 제품에 엔지엠 자동화 스크립트 로직을 추가하는 방법. 21.06.11
댓글목록
등록된 댓글이 없습니다.