LR中點鼠標做關聯(winsock協議)-Zee

 

 
今天寫一下winsock的關聯操作。
以前看過一個文檔。在英文版的講winsock的,其中講到關聯。大致操作是:
1,錄製。
2,回放。這裏是失敗。
3,到data.ws裏找需要關聯的數據。
4,按F7,打開EBCDIC translation對話框。
5,查找數據的位置及偏移量。
6,到腳本中寫函數用:lrs_save_param, lrs_save_param_ex, lrs_save_searched_string,這三個函數。
 
Notes:winsock的關聯函數要寫到需要關聯的代碼行的下面。
 
說明一下這幾個函數:
Lrs_save_param:
int lrs_save_param ( char *s_desc,char *buf_desc, char *param_name, int offset, int param_len);

這個函數保存buffer中的數據到一個參數裏。這個函數是用來在腳本中做關聯的。
前兩個參數是爲了指定特定的參數。
在指定活動的socketbuffer之後,需要指定一個參數來保存數據。指定偏移量來顯示buffer中數據的偏移量和數據的長度。
保存了參數之後,可以在腳本和數據文件使用它,代替所有需要替代的值。替換時要用選項中的定義的符號來引用。
注意:要從buffer中保存一個編碼過的數據到參數中,要用lrs_save_param_ex函數。
lrs_save_param_ex
int lrs_save_param_ex ( char *s_desc, char *type, char *buff, int offset, int length, char *encoding, char *param );

 
 
下面說不用這麼麻煩的操作的,直接點幾下就可以了。
 
1         錄製腳本
這個沒什麼說的吧。選擇協議winsock,這要是也不懂,我建議你去看十遍手冊。
我這裏錄製到的腳本如下:

       lrs_create_socket("socket0", "TCP", "LocalHost=0", "RemoteHost=192.168.1.114:5560", LrsLastArg);
       lrs_send("socket0", "buf0", LrsLastArg);
       lrs_receive("socket0", "buf1", LrsLastArg);
       lrs_create_socket("socket1", "TCP", "LocalHost=0", "RemoteHost=192.168.1.114:5560", LrsLastArg);
       lrs_send("socket1", "buf2", LrsLastArg);
       lrs_receive("socket1", "buf3", LrsLastArg);
相應的data.ws如下:

;WSRData 2 1
 
send buf0 50
       "OPERTYPE(LOGIN)ACCOUNTNAME(admin)PASSWORD(admin)"
 
recv buf1 155
       "DATALEN{{155}}000000USERID{{90}}USERNAME{{DMS"
       "/xcf/xb5/xcd/xb3"
       "WEB"
       "/xb2/xe9/xd1/xaf/xd5/xca/xbb/xa7"
       "}}USERDESCRIBE{{"
       "/xba/xfe/xd6/xdd/xb5/xe7/xc1/xa6/xbe/xd6"
       "//DMS"
       "/xcf/xb5/xcd/xb3"
       "WEB"
       "/xb2/xe9/xd1/xaf/xd5/xca/xbb/xa7"
       "}}DEPARTNAME{{"
       "/xce/xb4/xd6/xaa"
       "}}ADMIN{{0}}CLIENTSESSIONID{{2}}"
 
send buf2 53
       "CLIENTSESSIONID(2)OPERTYPE(INITDEPARTLIST)"
 
recv buf3 683
       "DATALEN{{683}}000000XMLDATA{{<?xml version=/"1.0/" encoding=/"GB2312/"?>/n"
       "<!DOCTYPE DepartList>/n"
       "<DepartList>/n"
       ………………………………………………………………………………………………
這裏就省略了些數據。反正也看着也暈乎乎的。
這裏說明一下,我這裏是用GIS系統,需要sessionID關聯的。我這上面的代碼很簡單,在buf1中有一個sessionID,在buf2中send時就用到了它。
2         回放一下
在不關聯時回放是一定會有問題的。我回放的結果是:

Virtual User Script started
Starting action vuser_init.
Ending action vuser_init.
Running Vuser...
Starting iteration 1.
Starting action Action.
Action.c(4): lrs_create_socket(socket0, TCP, ...)
Action.c(6): lrs_send(socket0, buf0)
Action.c(8): lrs_receive(socket0, buf1)
Action.c(11): lrs_create_socket(socket1, TCP, ...)
Action.c(13): lrs_send(socket1, buf2)
Action.c(15): lrs_receive(socket1, buf3)
Action.c(15): Mismatch (expected 683 bytes, 42 bytes actually received)
Action.c(17): lrs_create_socket(socket2, TCP, ...)
Action.c(19): lrs_send(socket2, buf4)
Action.c(21): lrs_receive(socket2, buf5)
Action.c(21): Mismatch (expected 34143 bytes, 42 bytes actually received)
Action.c(23): lrs_create_socket(socket3, TCP, ...)
Action.c(25): lrs_send(socket3, buf6)
Action.c(27): lrs_receive(socket3, buf7)
Action.c(27): Mismatch (expected 100 bytes, 42 bytes actually received)
Action.c(29): lrs_create_socket(socket4, TCP, ...)
Action.c(31): lrs_send(socket4, buf8)
Action.c(33): lrs_receive(socket4, buf9)
Action.c(33): Mismatch (expected 134 bytes, 42 bytes actually received)
Action.c(35): lrs_send(socket4, buf10)
Action.c(38): lrs_receive(socket4, buf11)
Action.c(38): Mismatch (expected 17520 bytes, 42 bytes actually received)
Action.c(41): lrs_create_socket(socket5, TCP, ...)
Action.c(43): lrs_send(socket5, buf12)
Action.c(45): lrs_receive(socket5, buf13)
Ending action Action.
Ending iteration 1.
Ending Vuser...
Starting action vuser_end.
Ending action vuser_end.
Vuser Terminated.
主要來看一下藍色的部分,因爲沒有關聯,服務器是返回了42字節的數據,但是和錄製時的數據是不同的。所以會mismatch。這裏可以在LOG把Mismatch的值打印出來,不過太長了,我就不打印了。^@^。
3         轉到樹視圖做關聯
選擇buf1看到數據:

DATALEN{{155}}000000USERID{{90}}USERNAME{{DMS/xcf/xb5/xcd/xb3WEB/xb2/xe9/xd1/xaf/xd5/xca/xbb/xa7}}USERDESCRIBE{{/xba/xfe/xd6/xdd/xb5/xe7/xc1/xa6/xbe/xd6//DMS/xcf/xb5/xcd/xb3WEB/xb2/xe9/xd1/xaf/xd5/xca/xbb/xa7}}DEPARTNAME{{/xce/xb4/xd6/xaa}}ADMIN{{0}}CLIENTSESSIONID{{2}}
選擇CLIENTSESSIONID{{2}}中的2.右擊後選擇:create parameter。在彈出窗口中。看到默認的是用lrs_save_param,這個函數只能關聯固定長度的數據。如果是固定的話,到這裏點擊一下OK,就關聯成功了。LR會自動生成語句並且提示檢查其他的需要關聯的地方。彈出一個窗口提示。
而我這裏的sessionID是動態的值。所以需要選擇:extract parameter data using boundaries複選框。這時生成的語句是這樣的:

lrs_save_searched_string( "socket0", LRS_LAST_RECEIVED, "Parameter3", NULL, NULL, -1, 152, 1 );
左右邊界是NULL空的,這裏點擊left的瀏覽,彈出選擇左邊界的窗口,用鼠標選擇:SESSIONID{{,點擊Done。
再點擊right的瀏覽,選擇}}。
就確定了左右邊界了。
這裏的語句如下:

lrs_save_searched_string("socket0",LRS_LAST_RECEIVED,"Parameter4","LB/BIN=SESSIONID{{", "RB/BIN=}}", 1, 0, -1);
一路小跑點OK。
彈出提示是否替換所有符合左右邊界的值。
點擊yes。LR會自動搜索所有需要關聯的地方並替換。
再轉到腳本視圖,看到腳本如下:

 lrs_create_socket("socket0", "TCP", "LocalHost=0", "RemoteHost=192.168.1.114:5560", LrsLastArg);
       lrs_send("socket0", "buf0", LrsLastArg);
       lrs_receive("socket0", "buf1", LrsLastArg);  
   lrs_save_searched_string("socket0", LRS_LAST_RECEIVED, "Parameter1", "LB/BIN=SESSIONID{{", "RB/BIN=}}", 1, 0, -1);
    lr_output_message("小樣還抓不到你!你不就是: %s嘛!",lr_eval_string("{Parameter1}"));       lrs_create_socket("socket1", "TCP", "LocalHost=0", "RemoteHost=192.168.1.114:5560", LrsLastArg);
       lrs_send("socket1", "buf2", LrsLastArg);
       lrs_receive("socket1", "buf3", LrsLastArg);
看藍色部分。後面一句輸出是我加上去的。
這樣就關聯成功了。
4         再次回放
看到LOG如下:

Virtual User Script started
Starting action vuser_init.
Ending action vuser_init.
Running Vuser...
Starting iteration 1.
Starting action Action.
Action.c(4): lrs_create_socket(socket0, TCP, ...)
Action.c(6): lrs_send(socket0, buf0)
Action.c(8): lrs_receive(socket0, buf1)
Action.c(10): lrs_save_searched_string(socket0, get_last_received_buffer, Parameter1, LB/BIN=SESSIONID{{, RB/BIN=}}, 1, 0, -1)
Action.c(12): 小樣還抓不到你!你不就是: 8嘛!
Action.c(14): lrs_create_socket(socket1, TCP, ...)
Action.c(16): lrs_send(socket1, buf2)
Action.c(18): lrs_receive(socket1, buf3)
Action.c(20): lrs_create_socket(socket2, TCP, ...)
Action.c(22): lrs_send(socket2, buf4)
Action.c(24): lrs_receive(socket2, buf5)
Action.c(26): lrs_create_socket(socket3, TCP, ...)
Action.c(28): lrs_send(socket3, buf6)
Action.c(30): lrs_receive(socket3, buf7)
Action.c(32): lrs_create_socket(socket4, TCP, ...)
Action.c(34): lrs_send(socket4, buf8)
Action.c(36): lrs_receive(socket4, buf9)
Action.c(38): lrs_send(socket4, buf10)
Action.c(41): lrs_receive(socket4, buf11)
Action.c(44): lrs_create_socket(socket5, TCP, ...)
Action.c(46): lrs_send(socket5, buf12)
Action.c(48): lrs_receive(socket5, buf13)
Ending action Action.
Ending iteration 1.
Ending Vuser...
Starting action vuser_end.
Ending action vuser_end.
Vuser Terminated.
看,輸出了:
Action.c(12): 小樣還抓不到你!你不就是: 8嘛!
 
 
 
完。
 

 [Z1]這裏還沒寫完。還有另一個函數解釋。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章