NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • NGM 6
  • 매뉴얼

    NGM 6

    본 사이트의 컨텐츠는 저작권법의 보호를 받으므로 무단 복사, 게재, 배포 등을 금합니다.

    디자이너 엔지엠 RPA 프레임워크에서 스크립트 실행 로그 보기.

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 엔지엠 에디터나 플레이어는 간단한 옵션 조작으로 스크립트가 어떻게 진행되고, 결과로 어떤 값을 반환하는지 쉽게 알 수 있습니다. 하지만, 엔지엠 에디터와 플레이어를 사용하지 않는 개발 방법은 로그를 확인하기 어려운 부분이 있습니다. 물론, 예제나 매뉴얼을 보고 한번씩 따라해보면 쉽지만요^^; 항상 그렇듯이 이런것들은 콜럼버스의 달걀과 같은거죠~ 발상의 전환에 대해 이야기할 때 자주 인용되지만, 개발쪽에서는 이상하게도 생각하지 못한 노하우를 알려주면 하찮게 생각하는 경향이 있습니다. 겸손이 미덕이라는걸 잊지 말아야 겠습니다. 이 글은 프레임워크 관련 내용들을 학습한 닷넷 계열 개발자를 대상으로 작성되었습니다. 기초부터 천천히 따라하실분들은 매뉴얼 > 학습 카테고리에 C#과 디자이너의 내용을 처음부터 학습해보세요.

    rll6oP1.jpg

     

     

    에디터와 플레이어의 아웃풋 로그를 표시하려면 윈폼에 텍스트를 받아서 표시할 콘트롤이 필요합니다. 아래와 같이 RichTextBox를 하나 추가하세요. 이 내용을 이해하기 위해서는 이전에 작성한 [ 내 서비스에 엔지엠 매크로 추가하기 ]를 읽어봐야 합니다^^;

    0crqlb8.png

     

     

    아래 전체 코드를 붙여넣기 하세요.

    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 스크립트를 복사해 넣었다면 빌드 후 실행 해보세요.

    kPmEAo6.gif

     

     

    스크립트의 액션들이 실행되면서 로그를 기록하고 있습니다. 로그를 스크립트 플레이어로부터 받아오려면 아래 속성들을 카테고리별로 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();
        });
    }

     

    실행 해볼까요? 아래 동영상처럼 스크롤이 마지막으로 자동 이동되는걸 알 수 있습니다.

    yDcutG6.gif

     

     

    엔지엠 RPA의 프레임워크(Framework)를 사용해서 개발하는 분들이 소수이다보니 관련 기능들을 소개하는 매뉴얼 작성이 많이(?) 늦었습니다. 외부 모듈로 개발하거나 자체적으로 플레이어 서비스를 제공해야 한다면 프레임워크를 사용해서 서비스하는것도 하나의 좋은 방법이 될 수 있습니다. 엔지엠 에디터나 플레이어는 이미 많은 정보가 공개되어 있어서 사용에 제약(?)이 따르기도 합니다. 이런 제약으로부터 자유를 얻으려면 어느정도 추가적인 학습과 개발이 필연적으로 따라올 수 밖에 없습니다^^;

     

    개발자에게 후원하기

    MGtdv7r.png

     

    추천, 구독, 홍보 꼭~ 부탁드립니다.

    여러분의 후원이 빠른 귀농을 가능하게 해줍니다~ 답답한 도시를 벗어나 귀농하고 싶은 개발자~

    감사합니다~

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.