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


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



1. 버튼으로 최대 활성화를 하여 기능으로 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 : 에러 발생 시 중지 여부
  • Maximum Run Time : 수행 시간 임계치 (임계치 초과 시 실패)


  • 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