LoadRunner12_腳本中運行JavaScript
版權聲明:本文為博主原創文章,未經博主允許不得轉載。
【系統及軟件配置】
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