LR手動關聯參數化問題總結
所謂的關聯就是把腳本中某些寫死的代碼(hard-coded)數據,轉變成截取自服務器所送的、動態的、每次都不一樣的數據。
一般情況下,比較聰明的服務器在每個瀏覽器第一次跟它要數據時,都會在數據中夾帶一個唯一的辨識碼,接下來就會利用這個辨識碼來辨識跟它要數據的是不是同一個瀏覽器,一般稱這個辨識碼為SessionID。對于每個新的請求,服務器都會產生新的SessionID給瀏覽器。這也就是執行腳本會失敗的原因,因為VuGen還是用舊的Session ID向服務器要數據,服務器發現這個Session ID是失效的或者它根本不認識這個Session ID,當然就不會傳送正確的網頁數據給VuGen了。
要對付這種服務器,必須想辦法找出這個Session ID到底是什么、位于何處,然后把它擷取下來,放到某個參數中,并且取代腳本中有用到Session ID的部分,這樣就可以成功騙過服務器,正確地完成整個交易了。
一、什么地方需要關聯
凡是腳本每次執行時都必須獲得唯一標識的地方都需要關聯。假如腳本需要關聯,如果不做關聯是不會執行通過的,也就是說會有錯誤消息發生。不過很遺憾,并沒有任何特定的錯誤消息是和關聯有關系的。會出現什么錯誤消息,與系統實際的錯誤處理機制有關。錯誤消息有可能會提醒用戶要重新登錄,但是也有可能直接就顯示HTTP 404的錯誤消息。
二、如何做關聯
關聯會用到下列的函數:
1、web_reg_save_param;
2、web_create_html_param;
3、web_create_html_param_ex;
其中,web_reg_save_param的語法為:
web_reg_save_param ( "Parameter Name" , < list of Attributes >, LAST );
web_create_html_param和web_create_html_param_ex這兩個函數主要是保留以兼容以前舊版本。建議使用web_reg_save_param函數。
那么,如何找出要關聯數據呢?簡單地說,每一次執行時都會變動的值,就有可能需要做關聯。VuGen提供兩種方式幫助用戶找出需要做關聯的值:自動關聯和手動關聯。
自動關聯一般情況下比較簡單,在此就不進行說明了,下面主要是總結手動關聯時的一些方法以及出現的一些問題的解決方式。
三、手動關聯總結
1、正常情況下的手動關聯:web_reg_save_param("SessionId","LB=value=\"","RB=\">",LAST);
LR:所需截取字符串的左邊界
RB:所需截取字符串的右邊界
如果左右邊界中存在各種特殊字符,如雙引號等,則需先用\進行轉義
一般情況下,如果所截字符串的左右邊界比較唯一的話,可以直接用上面的方式進行獲取,無需設置別的屬性了。
(“LAST”是固定的。。。)
2、如果進行關聯后,有報錯信息,提示參數化未成功,有可能是以下幾方面的原因:
1)左右邊界取值不正確,可以進入Generation log中,查看在關聯的參數左右邊界是否正確
2)關聯函數的位置放置錯誤
可以將log設置成輸出Extended log。
設置方法為:Vuser->Run-time Settings->Log屬性中,選中Extended log 并選中下面三個日志。
在輸出的日志中找到所要關聯化的參數第一次的輸出位置(注意是response返回的值,不是request中的),對照左側的腳本行數,將關聯函數放在此行數之前,即可。
3、關聯沒問題,運行時無報錯,可就是得不到參數的值,可以從Extended log中找到原因。
將Replay Log中的日志改為輸出Extended log->Parameter substitution日志,再重新運行一次,便可看到所關聯參數的變化情況。
有一次我在錄制了Flex協議的腳本后,將JSessionId做好手動關聯,運行無任何錯誤,可是將JSessionId打印時卻得不到任何值,一直找不到原因,后來通過這種日志輸出,看到了JSessionId的一個數據變化的過程,得知由于flex編碼中含有十六進制數,在我需要截取的參數前,有一串"\\x04\\x00\\x06",在獲取參數時由于這一串數的影響無法獲取到我所需要的值,所以后來就將web_reg_save_param函數中一個屬性SaveOffset設置為4才得到了所需的字符串。
SaveOffset的用法為:當找到符合的動態數據時,從第幾個字符開始才開始存儲到參數中。此屬性值不可為負數,其默認值為0。
4、另外一種設置方法可以使左右邊界簡單化
針對jsp頁面中,如果要獲取form中的某個屬性的值,如下面這段代碼:
<form method="post" name="frmLogout">
<div align="left">
<br>
業務號:
<input type="text" name="serviceId" size="100" maxlength="20"
value="">
<br>
XML數據:
<textarea name="data" rows="10" cols="100"></textarea>
<br>
<input type="submit" name="submit" value="提交"
onclick="dosubmit(1)">
<input type="submit" name="submit" value="取消"
onclick="dosubmit(2)">
<br>
sessionId:
<input type="text" name="sessionId" size="100" maxlength="20"
value="af0616ae-cbe7-412d-8965-1d33ba55fc3b">
<br>
</div>
</form>
想要截取到sessionId的value值,如果直接用左右邊界截取,由于程序中的太多的value,所以需要截取左邊界為name="sessionId" size="100" maxlength="20" value=",
由于此邊界的內容顯示時有換行,所以如果以上面那一段內容作為左邊界的話可能會有截取不成功的情況,所以在這種情況下,我們可以采取以下方式:
web_reg_save_param("SessionId","LB=value=\"","RB=\">","ORD=5",LAST);
ORD可以定位整個數據中取第幾個值
利用ORD屬性,在左邊界出現的第5次時再進行截取。如果不確定自己所要截取的這段字符串是在第幾次出現,那么可以先將ORD設置為ALL,然后通過Extended log->Parameter subsitution日志,可以看到所有左右邊界一致的截取的字符串數組,再確認自己所需截取的字符串是在這個數組中的第幾個位置,將ORD設置為幾即可。
5、如果某個參數關聯成功,可是運行時卻發現還會報錯,那么可以考慮一下是不是因為有別的值跟你所截取的這個參數相關聯,隨著那個值的變化,你所截取的這個參數也會進行某一方面的變化,那樣的話就需要將那個變化的值同樣進行參數化。
6、如何打印出參數值
解決方法:利用lr_eval_string與lr_output_message這兩個函數來打印出參數值。
例:lr_output_message("SessionId=%s",lr_eval_string("{ParameterName}"));
打印參數值這段代碼所放的位置一定是在已經獲取到參數值后,才可打印出來。
四、參數說明:
ParamName:存放動態數據的參數名稱。
list of Attributes:其他屬性,包含 “Notfound”、“LB”、“RB”、“RelFrameID”、“Search”、“ORD”、“SaveOffset”、“Convert”以及“SaveLen”。
下面將詳細說明每個屬性值的意義:
1、Notfound:指定當找不到要找的動態數據時該怎么處理。
當指定Notfound=error時,表示著找不到動態數據時,就發出一個錯誤消息。此為該屬性的默認值。
當指定Notfound=warning時,表示當找不到動態數據時,不發出錯誤消息,只發出警告,腳本也會繼續執行下去不會中斷。在對腳本出錯時,可以如此設置。
2、LB:動態數據的左邊界字符串。此屬性是必須要有的,而且區分大小寫。
3、RB:動態數據的右邊界字符串。此屬性是必須要有的,而且區分大小寫。
4、RelFrameID:相對于URL而言,欲搜尋的網頁的Frame。此屬性可以是All或是數字,而且可有可無。
5、Search:搜尋的范圍,其值可以是Headers(只搜尋headers)、Body(只搜尋body部分,不搜尋header)、Noresource(只搜尋body部分,不搜尋header與resource)或是All(搜尋全部范圍,此為默認值),此屬性可有可無。
6、ORD:指明從第幾次出現的左邊界開始才是要擷取的數據,默認值是1。假如該屬性值為All,則所有找到符合的數據會存儲在數組中。此屬性可有可無。
7、SaveOffset:當找到符合的動態數據時,從第幾個字符開始才開始存儲到參數中。此屬性值不可為負數,其默認值為0。
8、Convert:轉換數據格式。當指定該屬性值為HTML_TO_URL時,意味著將HTML-encoded數據轉成URL-encoded數據格式。如果是HTML_TO_TEXT,表示將HTML-encoded數據轉成純文字數據格式。
9、SaveLen:當找到匹配項后,偏移量之后的幾個字元存儲到參數中。此參數可有可無,默認值是-1,表示一直到結尾的整個字符串都存入參數中。
五、轉義字符總結
在做手動關聯時,取邊界值的時候,會經常用到轉義字符,現將轉義字符整理如下:
\b 退格
\f 換頁
\n 換行
\r 回車
\t 水平制表
\v 垂直制表
\\ 反斜杠
\? 問號字符
\' 單引號字符
\" 雙引號字符
\0 空字符
天貓 軟件自動化測試開發