標籤:rom pass reference 數值 jdk 著作權 function padding 傳遞
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
【系統及軟體配置】
LR版本:12.53
JDK版本:1.8
函數:web_js_run,該函數僅在LR12版本提供支援,LR11不支援JavaScript的運行。
LR配置:開啟了允許JavaScript運行:Replay→RunTime Settings→Preferences→Javascript→勾選“Enabe running JavaScript code”
【測試1】-----執行JavaScript內建對象。
web_js_run( "Code=alert(‘Hello world‘);", LAST); |
備忘: 該函數"Code="的等號前後不能有空格,否則該函數會報錯:argument (number 1) is unrecognized or misplaced [MsgId: MERR-26396]
運行結果:
【測試2】-----執行JavaScript內建對象的方法,並擷取傳回值。
web_js_run( "Code=new Date().getTime();", "ResultParam=timestamp", LAST); lr_output_message(lr_eval_string("{timestamp}")); |
運行結果:
【測試3】-----執行外部js檔案中的無參函數,並擷取傳回值。
web_js_run( "Code=getString()", "ResultParam=string1", SOURCES, "File=000.js", ENDITEM, LAST); lr_output_message(lr_eval_string("{string1}")); |
000.js內容如下:
function getString(){ var date = "This is LoadRunner12"; return date; } |
備忘:①File參數中的js檔案放在工作目錄下即可使用相對路徑;②電腦-組織-檔案夾和搜尋選項-取消“隱藏已知檔案的副檔名”,否則可能會出現找不到檔案的錯誤,測試使用的檔案屬性如下;
運行結果:
【測試4】執行外部js檔案中的有參函數且參數固定,並擷取傳回值。
web_js_run( "Code=getSum(1,2)", "ResultParam=sum", SOURCES, "File=000.js", ENDITEM, LAST); lr_output_message(lr_eval_string("{sum}")); |
000.js檔案的內容如下:
function getSum(arg1,arg2){ var date = arg1*1 + arg2*1; return date; } //若直接使用arg1+arg2,則Javscript會執行字串的相加; |
運行結果:
【測試5】執行外部js檔案中的有參函數且參數需要動態關聯,並擷取傳回值。
web_js_run( "Code=getSum(LR.getParam(‘Param‘),LR.getParam(‘Param‘))", "ResultParam=sum2", SOURCES, "File=000.js", ENDITEM, LAST); lr_output_message(lr_eval_string("{sum2}")); |
備忘:①使用LR.getParam()函數,作用是將LoadRunner的參數值提取出來,用為web_js_run函數運行時Code中的函數參數,傳遞給本地js檔案,類似於LoadRunner的lr_eval_string();
運行結果:
參數格式嘗試及結果:
| "Code=getSum({Param},{Param})", |
Error from JS Engine: ":0:SyntaxError: invalid object initializer " [MsgId: MERR-26000] |
| "Code=getSum(\"{Param}\",\"{Param}\")", |
Action.c(35): web_js_run started [MsgId: MMSG-26355] Action.c(35): web_js_run was successful [MsgId: MMSG-26392] Action.c(42): NaN |
【測試6】執行多個js函數,且函數的參數需要動態關聯,並需要擷取傳回值。
web_js_run( "Code=" "let rsaKey = new RSAKey();" "rsaKey.setPublic(b64tohex(LR.getParam(‘exponent‘)),b64tohex(LR.getParam(‘modulus‘)));" "hex2b64(rsaKey.encrypt(LR.getParam(‘password‘)));", // "ResultParam=NewPassword", SOURCES, "File=sec.min.js", ENDITEM, LAST); lr_output_message(lr_eval_string("{NewPassword}")); |
備忘:Code參數中連續執行了3條Javascript語句;
目前上面的語句還留有問題,雖指令碼未報錯,但NewPassword值為空白;
【測試7】函數一次定義多次使用
web_js_run( "Code=myFunc(1, 2);", "ResultParam=sum4", SOURCES, "Code=var myFunc=function(x,y) { return x*1+y*1; }", ENDITEM, LAST); lr_output_message(lr_eval_string("{sum4}")); web_js_run("Code=myFunc(3, 4);", "ResultParam=sum5", LAST); lr_output_message(lr_eval_string("{sum5}")); |
運行結果:
在這個例子中,myFunc()一次定義,多次使用,那麼我們就會問該函數的生命週期是什麼呢?多次迭代會產生多個該函數嗎?如果是,那麼重複定義造成的資源浪費怎麼處理呢?其實:LoadRunner在設計時已經考慮了這些,為此有一個函數web_js_reset,如下。
【擴充:web_js_reset】
作用:①清理web_js_run執行後,產生的“變數、函數”等內容,釋放其所在記憶體,否則之前定義過的函數和儲存的變數會一直存在,會消耗本地資源的記憶體;
備忘:如果在“Replay→RunTime Settings→Browser→Browser Emulation”中勾選了“simulate a new user on each iteration”,在開始新一次的迭代時,LoadRunner會自動執行web_js_reset。
LoadRunner12_指令碼中運行JavaScript