Virtual Bot Script 이벤트는 백그라운드로 업무를 수행합니다.


  • 세션을 유지 시킬 수도 있으며, 웹서비스 기반의 업무는 모두 지원 가능합니다. 
  • 백그라운드 스크립트이기 때문에 이벤트는 하나로 생성되며, UI 처리 스크립트와 동시 수행이 가능합니다.



1. 버튼으로 최대 활성화를 하여 기능으로 Recoding Setting 설정을 하고 Virtual Bot Script를 생성합니다.



브라우저를 실행 시켜 레코딩할 URL을 입력합니다. 


  • URL Filtering, Content Type Filtering을 설정할 수 있으며, 웹디버깅 툴에서 저장한 녹화 파일을 Import 할 수 있습니다.
  • Data Filtering으로 non-html 관련은 제외 할 것인지를 선택합니다.




http Recording 툴바가 보이면 레코딩이 시작되며, Record의 Count가 올라갑니다.


이제 브라우저에서 원하는 업무를 시뮬레이션 하면 그대로 Virtual Bot Script가 저장됩니다.





프로세스별 레코딩된 목록 중 원하는 부분을 선택합니다. 도메인 분류로 대상 도메인 및 관련된 URL을 선택합니다.




검증 및 플레이 시 옵션을 조절 할 수 있습니다.


  • User Agent : 접속하는 Client의 종류를 변경 할 수 있습니다.(모바일, PC, 등)
  • SSL Setting : SSL 인증 옵션을 선택할 수 있습니다.





  • Virtual Bot Script는 자체 내장 함수가 있으며 CheckMATE 함수 및 변수를 같은 Editor에 혼합,공유 할 수도 있습니다. 
  • Virtual Bot Script 내장 함수는 아래 예제 참고사항을 참고하시면 됩니다.






2. Event Properties


  • Event Name : 이벤트 표기명
  • Stop If Error : 에러 발생 시 중지 여부
  • Use Screenshot Log : 스크린샷 기록 여부


  • Session Space ID : 세션 ID 설정





[Virtual Bot Script 자체 내장 함수]


Virtual Bot Script는 Symation사의 성능/부하 테스트 도구인 RunningMATE와 사용법이 동일합니다.




1. FindData_Example.cs


    string str = "전역변수선언"// partial class에 변수 선언 시 해당 프로젝트 내 Begin, Action, End , Recoding----.cs 에서 전역변수로 사용 가능
                                // this.선언변수명; 형태로 사용 가능 ex) string output = this.str; PrintLog(output);
    string str_num = "456";     // string 변수에 문자열 456 할당     
            
                                
    public void AutoScript() // 1. AutoScript(임의지정가능) Method 생성 후 C# 문법 및 Running Mate 함수 사용 가능.
    {
        string a = "stringTest중입니다."// C# 함수 String 예제
        int b = 1234// C# 함수 int 예제
        
        PrintLog(Convert.ToString(b)); // int 형 변수를 출력할 경우, C#에서 제공하는 Convert 함수 또는 변수 앞에 "int형 변수 출력:" + b 와 같이
                                       // message형 string을 덧붙여서 사용 가능
        PrintLog("Int형 string으로 형변환 : "+b.ToString());
        using (new Transaction(this"TestPage_Main")) // RM 트랜젝션 선언 및 할당
        {
            
            BaseLibHttp B = new BaseLibHttp(); // RM 펑션 리스트 호출을 위한 변수 생성 후 B. 으로 자동 완성 호출하여 함수 리스트 확인 가능
                                               //this. 형태로도 RM에서 제공하는 함수 리스트 확인 가능
                                               
            /* 함수 예졔 - FindData (Response body에서 문자열 검증) */

            FindData("자녀보호 프로그램"); // FindData 선언 및 검증 대상 문자열
            Request("http://www.momi.co.kr/Momi5/index.asp" // 검증 대상 URL
                    , REC(7)
            );
            
            FindData("자녀보호 프로그램"); // 하단 Request URL에 대한 Response body에서 유니크한 문자열이 1개만 있을 경우 사용
            Request("http://www.momi.co.kr/Momi5/index.asp"
                    , REC(7)
            );

            FindData("ASP.NET", findWhere.HEADERS); // Response Header에서 해당 문자열 검색, Default 값은 BODY임.
            Request("http://www.momi.co.kr/Momi5/index.asp"
                    , REC(7)
            );

            FindData("<meta"">"); // Response body에서 left 문자열, right 문자열 지정하여 사이에 속한 문자열 검색
            Request("http://www.momi.co.kr/Momi5/index.asp"
                    , REC(7)
            );
            
            FindData("<meta"">""Type"); // Response body에서 left 문자열, right 문자열 지정하여 사이에 속한 문자열 중 
                                            // Type 이라는 문자가 포함된 문자열 검색
            Request("http://www.momi.co.kr/Momi5/index.asp"
                    , REC(7)
            );
            
            /* FindData 성공 실패 여부 확인법 */
            
            /*하단 ParameterView 탭에서 REC Number와 매핑되는 Request를 찾은 후 
              FINDDATA_RESULT Key 의 Value 값이 1일 경우 성공/ 0일 경우 실패 */
            
            /* 성공 시 Transaction이 정상적으로 성공 처리 후 Out 처리되며, 실패 시 실패 처리 후 Out됨. 
               실패 시 Replay Log에 "Message:Exception has been thrown by the target of an invocation.Response에 검색단어가 없습니다."
               와 같은 에러 발생 */
        }


    }




2. FindDataSave_Example.cs


using (new Transaction(this"FindDataSave_Example")) // RM 트랜젝션 선언 및 할당
        {
        
            BaseLibHttp B = new BaseLibHttp(); // RM 펑션 리스트 호출을 위한 변수 생성 후 B. 으로 자동 완성 호출하여 함수 리스트 확인 가능
                                               //this. 형태로도 RM에서 제공하는 함수 리스트 확인 가능
                                               
            /* 함수 예졔 - FindDataSave (Response Data에서 특정 문자열 변수로 치환) 
               함수 형식 - 함수명 FindDataSave( 까지 입력 후 CTRL+SPACE 버튼 누를 시 함수 문법 설명이 나오며 방향키 위 아래로 모든 형식 확인 가능함. 
               FindDataSave 함수는 FindData와 달리 검색 범위가 Header, Body 포함한 모든 영역을 대상으로 함. 
            
            /* 1. 대상 문자열이 복수인 경우에 사용 */
                
                // 하단 Request에 대한 Response Data에서 LB 값 : <td><a href=" , RB 값 : " target="_top" 을 기준으로 필수포함단어 없이 pURL이라는 ArrayList 생성
                FindDataSave("pURL""<td><a href=\"""\" target=\"_top\""""true); 
                Request("http://192.168.1.16:8080/ksm/_third/user/frame.jsp?View=sitemap&No=1"
                    , REC(21)
                    , "Upgrade-Insecure-Requests: 1"
                );
                // 하단 Request에 대한 Response Data에서 LB 값 : <td><a href=" , RB 값 : " target="_top" 을 기준으로 필수포함단어 frame.jsp 문자열 포함하여  pURL2라는 ArrayList 생성
                FindDataSave("pURL2""<td><a href=\"""\" target=\"_top\"""frame.jsp"true); 
                Request("http://192.168.1.16:8080/ksm/_third/user/frame.jsp?View=sitemap&No=1"
                    , REC(21)
                    , "Upgrade-Insecure-Requests: 1"
                );
                // 하단 Request에 대한 Response Data에서 LB 값 : <td><a href=" , RB 값 : " target="_top" 을 기준으로 필수포함단어 없이 ArrayList 중 Order No 0번째 선택하여 pURL3이라는 변수 생성
                FindDataSave("pURL3""<td><a href=\"""\" target=\"_top\""""0);
                Request("http://192.168.1.16:8080/ksm/_third/user/frame.jsp?View=sitemap&No=1"
                    , REC(21)
                    , "Upgrade-Insecure-Requests: 1"
                );
                // 하단 Request에 대한 Response Data에서 LB 값 : <td><a href=" , RB 값 : " target="_top" 을 기준으로 필수포함단어 fream.jsp 문자열 포함하는 ArrayList 중 Order No 선택하여 pURL4라는 변수 생성
                FindDataSave("pURL4""<td><a href=\"""\" target=\"_top\"""frame.jsp"0);
                Request("http://192.168.1.16:8080/ksm/_third/user/frame.jsp?View=sitemap&No=1"
                    , REC(21)
                    , "Upgrade-Insecure-Requests: 1"
                );
            /* 2. 대상 문자열이 단수인 경우에 사용 */
                
                // 하단 Request에 대한 Response Data에서 LB 값 : <td><a href=" , RB 값 : " target="_top" 을 기준으로 필수포함단어 없이  pURL5라는 변수 생성
                FindDataSave("pURL5""<td><a href=\"""\" target=\"_top\""""); //검색값이 복수라면 첫 번째 값을 가져옴
                Request("http://192.168.1.16:8080/ksm/_third/user/frame.jsp?View=sitemap&No=1"
                    , REC(21)
                    , "Upgrade-Insecure-Requests: 1"
                );
                // 하단 Request에 대한 Response Data에서 LB 값 : <td><a href=" , RB 값 : " target="_top" 을 기준으로 필수포함단어 frame.jsp 문자열 포함하여  pURL6이라는 변수 생성
                FindDataSave("pURL6""<td><a href=\"""\" target=\"_top\"""frame.jsp"); //검색값이 복수라면 첫 번째 값을 가져옴
                Request("http://192.168.1.16:8080/ksm/_third/user/frame.jsp?View=sitemap&No=1"
                        , REC(21)
                        , "Upgrade-Insecure-Requests: 1"
                );
            
            /* 3. 위에서 선언된 ArrayList의 값 중 한 개의 값만 Random하게 사용하고 싶은 경우 아래와 같이 C#의 Random 함수를 이용한다 */
                 Random rd = new Random(); // 3-1. Random 함수 선언
                int nR = rd.Next(0GetParamArray("pURL").Length-1); // 3-2. 위에서 선언된 ArrayList pURL의 0번째에서 전체 갯수 중
                                                                     // Random Next 문법으로 int형 변수 nR에 숫자 input
                PrintLog("Random Number is : " + nR.ToString()); // 3-3. int형 변수 nR의 값을 To.String()으로 치환해 출력 ( PrintLog 함수는 String 형태만을 지원하므로 int형의 경우 형변환 필요 )
            
                Request("http://192.168.1.16:8080/ksm/_third/user/"+GetParamArray("pURL")[nR]
                        , REC(22)
                        , "Upgrade-Insecure-Requests: 1"
                );    
                
            /* 4. 위에서 선언된 ArrayList의 모든 값을 이용한 Request를 날릴 경우 아래와 같이 C#의 For 반복문을 이용한다 */
                for (int i = 0; i < GetParamArray("pURL").Length; i++){                //4-1. GetParamArray("변수명").length 함수를 이용하여 ArrayList의 길이만큼 반복문 실행
                        Request("http://192.168.1.16:8080/ksm/_third/user/"+GetParamArray("pURL")[i] //4-2. 문자열이 아닌 변수이므로 넣고자 하는 위치에 + GetParamArray("변수명")[i]과 같이 + 부호를 이용하여 i번째 ArrayList 선언
                            , REC(22)
                            , "Upgrade-Insecure-Requests: 1"
                    );                
                }
            
            /* FindDataSave 성공 실패 여부 확인법 */
            
            /*하단 ParameterView 탭에서 REC Number와 매핑되는 Request를 찾은 후 
              Key 값과 지정한 변수명의 일치 여부 및 Value 값 확인 */
            
            /* 성공 시 Value 값 출력되며, 
               실패 시 값이 출력되지 않으므로, LB와 RB의 값, Order No 지정, 필수포함단어 등 함수 형식 확인 후 재 시도 필요. */
            
        }




3. AddHeader_Example.cs


using (new Transaction(this"AddHeader_Example"))// RM 트랜젝션 선언 및 할당
        {
            BaseLibHttp B = new BaseLibHttp(); // RM 펑션 리스트 호출을 위한 변수 생성 후 B. 으로 자동 완성 호출하여 함수 리스트 확인 가능
            //this. 형태로도 RM에서 제공하는 함수 리스트 확인 가능
            
            /* 함수 예졔 - AddHeader (Request Header에 임의값 지정)
               함수 형식 - 함수명 AddHeader( 까지 입력 후 CTRL+SPACE 버튼 누를 시 함수 문법 설명이 나오며 방향키 위 아래로 모든 형식 확인 가능함. */
            
            
            //Request("http://192.168.1.16:7001/DemoWeb/student.jsp"
            //        , REC(23)
            //        , "Upgrade-Insecure-Requests: 1"
            //);
            
            // 필요한 Header Name, Value의 값을 아래와 같이 세팅하여 사용
            //해당 함수 하위로 모든 Request의 Header에 공통 적용
            AddHeaderList("Referer""http://addheader.test"); //AddHeader의 Header 리스트와
            RemoveHeaderList("Accept-Language");               //RemoveHeader의 Header 리스트는 별개로 취급
            
            InputData(@"id={New_File/a}"); // InputData에 csv 파일의 테스트 데이터 이용할 경우 "" 쌍따옴표 내에서는 { }를 붙이고
            //InputData(@"id="+this.GetParam("New_File/a")); + this.GetParam을 이용할 경우 { } 제외한다.
            InputData(@"&msg_conf=<LotteCard><jobnm>SVC_STUDENT </jobnm></LotteCard>");
            InputData(@"&name=");
            InputData(@"&residentId=");
            Request("http://192.168.1.16:7001/DemoWeb/student.jsp?flag=all"
                    , POSTDATA
                    , REC(24)
                    , "Origin: http://192.168.1.16:7001"
                    , "Upgrade-Insecure-Requests: 1"
                   );
            
            // 상위 Request 호출 후 하단의 Request 호출 시 AddHeader나 RemoveHeader 값을 수정 원할 경우
            //AddHeaderListClear();        // 해당 함수로 모든 AddHeader 리스트 삭제 또는
            AddHeaderListClear("Referer"); // 특정 Header 값만 제외
            
            //RemoveHeaderListClear();          // 해당 함수로 모든 RemoveHeader 리스트 삭제 또는
            RemoveHeaderListClear("Accept-Language"); // RemoveHeaderList를 통해 제외된 Header Name 중 선언한 Header 값 재추가
            Request("http://192.168.1.16:7001/DemoWeb/student.jsp"
                    , REC(23)
                    , "Upgrade-Insecure-Requests: 1"
                   );
            
            //제거된 Header 리스트 재사용 원할 경우 다시 선언하여 사용
            AddHeaderList("Referer""http://addheader.test"); // 위에서 제외한 인자값 다시 추가
            RemoveHeaderList("Accept-Language");                       // 위에서 재추가한 인자값 다시 제외
            Request("http://192.168.1.16:7001/DemoWeb/professor.jsp"
                    , "Upgrade-Insecure-Requests: 1"
                   );
            
            /* AddHeader_Example 성공 실패 여부 확인법 */
            
            /* 스크립트 1바퀴 Play 후 우측 DataView(Play) 창에서 Header 탭의 Header Name , Data로 Header 추가 또는 변경하여 보냈는지 확인  */
            
            
        }




4. Encode_Decode_Example.cs


/* Base64 인코딩 변환 함수 전역변수 선언 */
     public string Base64Encoding(string EncodingText, System.Text.Encoding oEncoding = null)
    {
        if (oEncoding == null)
            oEncoding = System.Text.Encoding.GetEncoding("UTF-8");
            //oEncoding = System.Text.Encoding.GetEncoding("UNICODE");
            //oEncoding = System.Text.Encoding.GetEncoding("euc-kr");

        byte[] arr = oEncoding.GetBytes(EncodingText);
        return System.Convert.ToBase64String(arr);
    }

     /* Base64 디코딩 변환 함수 전역변수 선언 */
    public string Base64Decoding(string DecodingText, System.Text.Encoding oEncoding = null)
    {
        if (oEncoding == null)
            oEncoding = System.Text.Encoding.GetEncoding("UTF-8");
            //oEncoding = System.Text.Encoding.GetEncoding("UNICODE");
            //oEncoding = System.Text.Encoding.GetEncoding("euc-kr");
                        
                            
        byte[] arr = System.Convert.FromBase64String(DecodingText);
        return oEncoding.GetString(arr);
    }
    
    public void AutoScript4()
    {
            //1. Base64Encoding&Decoding - C# 함수로 Method 작성하여 직접 변환 예제
            
            string s = "암호화"// << 변환 대상 문자열 "암호화"를 string 변수 s로 저장한다
            //string s = this.GetParam("New_File/a"); csv 파일 이용할 경우 예제
            s = this.Base64Encoding(s); // base64Encoding 함수를 이용하여 변환 후 
            
            PrintLog(s);                //출력한다
            
            s = this.Base64Decoding(s); // base64Decoding 함수를 이용하여 변환 후 
            
            PrintLog(s);                //출력한다

            
            
            //2. Base64Encoding&Decoding - RM 제공 함수로 변환
            
            string se = "암호화"// << 변환 대상 문자열 "암호화"를 string 변수 se로 저장한다
            //string se = this.GetParam("New_File/a"); csv 파일 이용할 경우 예제
            se = this.Base64Encode(se, Encoding.GetEncoding("UTF-8")); // 테스트 사이트의 Char-Set에 따른 GetEncoding 직접 설정 또는 
            PrintLog("RM Base64Encode 활용하여 직접 GetEncoding : " + se);

            string ses = "암호화"// << 변환 대상 문자열 "암호화"를 string 변수 ses로 저장한다            
            ses = this.Base64Encode(ses); //  RM의 Play Option에서 Default Text Encoding 에 따른 자동 변환. **** 해당 옵션 체크 해제 시 윈도우 기본 Text Encoding을 따라 변환함. ***
            PrintLog("RM Base64Encode 활용하여 Play Option의 Default Text Encoding : " + ses);                //출력한다
            
            se = this.Base64Decode(se, Encoding.GetEncoding("UTF-8")); // 테스트 사이트의 Char-Set에 따른 GetEncoding 직접 설정 또는 
            PrintLog("RM Base64Decode 활용하여 직접 GetEncoding : " + se);    

            ses = this.Base64Decode(ses); //  RM의 Play Option에서 Default Text Encoding 에 따른 자동 변환. **** 해당 옵션 체크 해제 시 윈도우 기본 Text Encoding을 따라 변환함. ***
            PrintLog("RM Base64Decode 활용하여 Play Option의 Default Text Encoding : " + ses);                //출력한다
            
            //3. HtmlEncode %23%34%55 와 같은 형태의 문자열을 변환한다.
            
            string str_en = HtmlEncode(this.GetParam("New_File/a")); // 파라미터 파일을 가져올 경우 this.getParam을 이용
            PrintLog("HTML 인코딩 변환 출력 : " + str_en);
            
            str_en = HtmlDecode(str_en);
            PrintLog("HTML 디코딩 변환 출력 : " + str_en);    
            

    }




5. Real_Test_Example.cs


Tran_In("Real_test_Example");
        
        Request("http://192.168.1.16:7001/DemoWeb/student.jsp"
                , REC(26)
               );
        
        /*1. Response Body Gregory Search. Go to Step 1-1. IF문으로 분기 처리 예제 확인*/
        FindData("Gregory"); //문자열 검증 선언
        FindDataSave("professor""<td align=\"center\" nowrap>""</td>"""true);
        InputData(@"id=");
        InputData(@"&msg_conf=" + this.HtmlEncode("<LotteCard><jobnm>SVC_PROFESSO</jobnm></LotteCard>"));
        InputData(@"&name=");
        Request("http://192.168.1.16:7001/DemoWeb/professor.jsp?flag=all"
                , POSTDATA
                , REC(27)
               );
        
        string resultCd01 = this.GetParam("FINDDATA_RESULT");
        
        /* 
                Random rd = new Random(); // 3-1. Random 함수 선언
                int nR = rd.Next(0, GetParamArray("professor").Length-1); // 3-2. 위에서 선언된 ArrayList pURL의 0번째에서 그 길이만큼 중 Random Next 문법으로 int형 변수 nR에 숫자 input
                PrintLog("Random Number is : " + nR.ToString()); // 3-3. int형 변수 nR의 값을 To.String()으로 치환해 출력 ( PrintLog 함수는 String 형태만을 지원하므로 int형의 경우 형변환 필요 )
         */
        FindData(GetParamArray("professor")[3]); //문자열 검증 선언
        InputData(@"id=");
        InputData(@"&msg_conf=<LotteCard><jobnm>SVC_PROFESSO</jobnm></LotteCard>");
        InputData(@"&name="+GetParamArray("professor")[3]);
        Request("http://192.168.1.16:7001/DemoWeb/professor.jsp"
                , POSTDATA
                ,"Accept: text/html, application/xhtml+xml, */*"
                ,"Referer: http://192.168.1.16:7001/DemoWeb/professor.jsp"
                ,"Accept-Language: ko-KR"
                ,"Content-Type: application/x-www-form-urlencoded"
                ,"User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko"
                ,"Accept-Encoding: gzip, deflate"
                ,"Host: 192.168.1.16:7001"
                ,"Connection: Keep-Alive"
                ,"Pragma: no-cache"
               );
        
        
        
        string resultCd02 = this.GetParam("FINDDATA_RESULT");
        /*1-1. Runtime option의 에러 발생시 동작 중단 체크 해제 후 수행*/
        if(resultCd01 == "1" && resultCd02 == "1" )
        {
            PrintLog("트랜젝션 처리 완료 ! Result Count : " + this.GetParam("FINDDATA_RESULT")+" vs professor Name = "+GetParamArray("professor")[3]);
            Tran_Out("Real_test_Example");
            
        }else{
            RaiseError("트랜젝션 처리 실패 ! Result Count : " + this.GetParam("FINDDATA_RESULT"));
        }

Created with the Personal Edition of HelpNDoc: Easily create CHM Help documents