Virtual Bot Script
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(0, GetParamArray("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