http://www.ltesting.net/html/23/category-catid-123.html SilkPerformer学习网站
SilkPerformer7.2参数化范例
*****股份有限公司
2006年9月
关于本文档
文档信息
文档名称 SilkPerformer7.2参数化范例
作者 测试组
说明 本文档提供給*****内部项目组使用
文件名称 SilkPerformer7.2参数化范例.doc
修订历史 (REVISION HISTORY)
Rev Section Type Date Author Remarks
1.0 全部 创建 2006-9-25 Zhangsx
目的与范围
对SilkPerformer的参数化的方法和过程进行阐述,以便灵活的运用测试脚本
适用的对象
本文档仅适用于*****股份有限公司的管理者,测试者阅读。
SilkPerformer7.2参数化范例
范例介绍:
在本实验中我们将介绍如何使用SilkPerformer 提供的功能进行参数化
实验目标:
学会如何使用SilkPerformer对脚本进行参数化
参数化的分类
一、常量(有两种方式实现)
1) 在测试脚本的全局变量定义部分(dclparam)加上如下代码: const cpara :="this is constvalue"; //定义一个常量可以是整型、布尔型、浮点型或字符串类型,或者在一个事务过程中定义常量,定义的方法相同,只是他们的作用域不同而已,全局的在当前脚本中所有的事务中都能被引用,而局部常量只能在定义他所在的事务中才可以使用,其他事务中不能引用。
2) 通过点击Script->create new parameter, 弹出参数化的向导,如下图所示
选择常量的数据类型后点“下一步”
进入如下画面
输入常量名与值后点击完成,常量参数化结束,只要在要用到该值得地方用name替换即可,生成的脚本参见附表。
二、变量
1) 变量的定义与常量的定义类似,通过var来定义,只要在脚本中加入如下代码:var bValue2: boolean;//定义了一个变量,变量也可以是全局或局部的,与常量的差别就是变量在引用过程中可以被改变而常量不能。
2) 通过点击Script->create new parameter, 弹出参数化的向导,定义随机变量,如下图所示。
点击Next >进入如下画面
选择随机变量的数据类型之后点“下一步”,进入如下画面
为随机变量命名,限定随机取值的范围后,点击“下一步”,进入如下画面
选择运用类型后,点击完成,结束随机变量参数化过程。
三、从文件中读取
(一) 、Parameter from Random varia
1) 在测试过程中有许多地方需要批量的数据,而且必须保证每个用户所使用的数值都是唯一的,有的是因为数据库中主健约束的原因,有的是为了保证数据一致性,系统控制不允许进行并发操作(例如:终端业务系统在理赔流转中,一但一个任务被接收了,就不允许其他用户再次接收处理了),首先选择需要参数化的值右击鼠标,在弹出菜单中选择Customize Value
2) 弹出如下对话框
这里有三种参数类型供选择:Constant value—将参数化一个常量;Parameter from Random Varia—指从一个随机变量中取值(例如设定最大值最小值,在这个范围内随机取值);Parameter from Multi-column datafile—从数据文件中取值(有多列值,可选取读取文件中的某列),在这里我们选择第二个,点next >
3) 进入如下画面
选择参数化变量的类型,有字符串,整型,浮点型等,在这里我们选择从文件中读取即String from file,点击下一步
4) 进入如下画面定义变量名称及变量的值
Order单选钮决定了取值时的规则是随机的还是顺序的,可以点击Show Preview查看添加的代码,保存后点击“下一步”
5) 进入如下画面
选择运用的类型:有三个共选择:
Per usage—每个用户每使用一次时重新获取一个随机值,若取数规则是顺序的(sequential),则所有虚拟用户都从第一个值开始取,循环取值。例如数据文件中有值依次为:a1,a2,a3,三个虚拟用户:Vu1,Vu2,Vu3并发时运行一次Tmain,取得值都是a1,第二次都是a2
Per Transaction—每运行一次Tmain重新获取一个随机值,一个用户可以获取不同值,取数方式与 Per usage的相同
Per Test—每个用户在一个压力测试期内只随机取一次值,只对应一值,若取数规则是顺序的(sequential),则所有虚拟用户始终取的是第一个值。例如数据文件中有值依次为:a1,a2,a3,三个虚拟用户:Vu1,Vu2,Vu3并发时运行始终都取a1
点击完成,完成参数化向导,生成的代码参见附表。
即使是这样也不能达到我们的要求,因为多个用户并发操作时还是有可能取到同一值的,接下来介绍一下第三种参数化类型:
(二) 、Parameter from Multi-column datafile
1) 首先选择需要参数化的值右击鼠标,在弹出菜单中选择Customize Value
2) 进入如下画面
选择Parameter from Multi-column点next >
3) 进入如下画面
4) 在此可以新建一个数据文件,给参数命名,给数据文件填充值选择其中的一列点击下一步(注意:只有选中某列后下一步Button才可用)
5) 进入如下画面
在此可以选择取值时是随机的(Random)还是顺序(sequential)以及运用类型:
Per Transaction—每执行一次Tmain重新取一次值,例如:若取数规则是顺序的(sequential)则运行一次Tmain则重新取一次值(这种方式循环取值可保证并发取值时的唯一性),数据文件有值a1,a2,a3,a4三个虚拟用户并发:Vu1,Vu2,Vu3,都运行一个Tmain分别是a1,a2,a3,都运行第二个Tmain时,Vu1,Vu2,Vu3对应的取值是a4,a1,a2。
Per Test—每一次测试每个用户只取一个值,例如:若取数规则是顺序的则每一次测试每个用户只取一个值,按照取值顺序,顺序取值,若数据文件中的值得数目<并发用户数,则并发取值时不能保证唯一性,需保证数据文件中的值得数目>并发用户数,数据文件有值:a1,a2,a3,a4 三个虚拟用户并发:Vu1,Vu2,Vu3,在一个压力测试期内Vu1始终取a1,Vu2始终取a2,Vu3始终取a3
点击完成,完成此次参数化,生成脚本参见附表,往往不仅要控制并发时取数不冲突,而且还要确保每一个值只能被一个用户使用(在很多客户的应用中不允许同一个用户登录多次,例如Itest,那么如果需要在登录这个业务点上加压的话,就必需对登录的用户名和密码进行参数化。但是仅仅做了参数化还是不够的,因为如果让SilkPerformer的脚本在执行过程中自己去随机的取用户名和密码或循环取值时,还是有可能会取到同一个用户名和密码,这样就冲突了,所以还必需要添加一些限制。),除了上述的Per Test运行模式可以达到这种效果之外,还可以通过silkperformer提供的函数来实现:
FileCSVLoadGlobal(hfile, csvFile, ","); //导入参数化文件
FileGetRow(hfile, GetUserId()); //根据虚拟用户的ID来取参数化的数据
sAccountName:=FileGetCol (hfile, 1, 10);//取数据的第一列
sPassword:=FileGetCol (hfile, 2, 10); //取数据的第二列
如果在第二行里面使用FileGetRndRow(hfile)函数,随机的在参数化文件里取数的话,当并发量大的时候,难免会造成取数冲突。所以在这里,用了GetUserId()来制定了哪一个虚拟用户用哪一个用户名和密码登录,这样就不存在冲突的问题了。
SilkPerformer使用点滴
一、录制时脚本为空的解决办法
使用SilkPerformer最常见的问题是在用录制时,录制不上内容,Functions数始终为0,脚本为空。
1检查注册表中的Key: HKEY_LOCAL_MACHINE | SOFTWARE | Microsoft | Windows NT | CurrentVersion | Windows | AppInit_DLLs ,其值应为:qaphooks.dll。如果在qaphooks.dll后面有逗号或者空格,必须删除逗号或空格。
2检查注册表中的Key: HKEY_CURRENT_USER | SOFTWARE | Microsoft | Windows | CurrentVersion | Explorer | BrowseNewProcess,其值应为:yes。
3检查注册表中的Key: HKEY_LOCAL_MACHINE | SOFTWARE | Microsoft | Windows | CurrentVersion | Explorer | BrowseNewProcess,其值应为:yes。
4如果修改注册表的上述项后,function还一直为0,再检查SilkPerformer的profile或proxy设置:
1)打开SilkPerformer,选择Settings | System | Recorder | Application Profiles ;
2)编辑您所使用的neterm或浏览器设置;
3)在protocol selection区内,确保Tcp/ip或Web的checkbox是选中的,然后选择“Web Settings”按钮;
4)确保Winsock的选项是Wsock32.dll或W2_32.dll。
二、录制时脚本为空的解决办法与Oracle、LoadRunner端口冲突的解决办法
在装了Oracle或LoadRunner的机器上安装SilkPerformer,会造成SilkPerformer与Oracle、LoadRunner通信端口冲突,如下图所示:
Oracle XDB(XML数据库)Http服务的默认端口是8080,而SilkPerformer脚本记录器的http协议监听端口也默认的是8080。
解决此端口冲突的方法有两种,一是更改Oracle XDB Http服务的端口;另一种方法就是更改SilkPerformer脚本记录器的Http协议监听端口。下面就简要介绍如何更改SilkPerformer脚本记录器的http协议监听端口。
1)打开SilkPerformer,选择Settings | System | Recorder | Proxies ;
2)选择HTTP协议,点“Edit”按钮编辑其设置;
3)把“listen port”编辑框中默认的8080,改为其它端口值就可以了,如18080。
安装了LoadRunner的机器会占用端口1080,而SilkPerformer脚本记录器的Socks协议监听端口也默认的是1080。解决此端口冲突的方法与上面相同。
三、插入数据的问题
在压力测试中,用户测试用例中经常会有增加数据这样的业务。所以对插入数据的主键要进行必要的定制,不然加压时插入同一条数据,肯定是会出错的。但是插入数据的主键值又分为两种,一种是服务器端自动生成的,一种是客户端自己输入的。对于后一种就必需对数据进行处理。
在silkPerformer中有几个函数可以帮助我们处理这样的业务:
GlobalVarSet(in sVariable : string,
in nValue : number,
in nTimeout : number optional): boolean;
这个函数用来设定一个全局变量的值。
GlobalVarInc(in sVariable : string,
in nInc : number,
out nValue : number,
in nTimeout : number optional) : boolean;
此函数用来给这个全局变量递增。
GlobalVarGet(in sVariable : string,
out nValue : number,
in nTimeout : number optional) : boolean;
这个函数用于从全局变量中取数值。
GlobalVarSet("CustID1", 40000);
GlobalVarInc("CustID1",1,nCustID);
sCustID : = "2300" + string(nCustID);
从上面三行代码,我们可以看到,把主键的值sCustID不断的递增了,从而保证主键的唯一。
四、参数化选择Tmain、Tinit的区别
Tmain只保证每次执行Tmain时重新取的数据不冲突,可循环取,而Tinit每个虚拟用户只运行一次,而且当数据文件中的值足够多时还能能保证一个值在一个压力测试期内只能被一个虚拟用户使用,通常我们选Tinit,但一定要保证虚拟用户数<数据文件中值的个数,否则在用FileGetRow(hfile, GetUserId())进行参数化时就会报错 ,在满足这个条件下,选择Parameter from Multi-column datafile与per Test就能保证没个值只被一个虚拟用户使用。本质上per Test 、Per Usage、Per tran,他们的区别在代码中能体现,决定于取值时的变量/参数是在init中赋值的,还是在Tmain中赋值的。
附表
参数化脚本范例:
//----------------------------------------------------------------------
// 功能根据同一保单号生成报案人名称不同的报案
//粗体部分为参数化添加的代码
//----------------------------------------------------------------------
benchmark SilkPerformerRecorder
use "WebAPI.bdh"
use "kernel.bdh"
dclparam//定义参数
pegistnametran1 : string;
paa1 : string;
pegistnameperuser1 : string;
registnamefiletran : string;
psRegistpert : string;
psRegistrandomtran : string;
sAccountName : string;
studentcount : RndUniN (1000..1010);
dcluser//定义虚拟用户
user
VUser
transactions
TInit : begin;
TMain : 1;
TShutdown : end;
var//定义变量
registnamefiletran1 : number;
hRegistpert1 : number;
hRegistrandomtran1 : number;
hfile : number;
hWeb0 : number;
nCount: number;
dclrand//定义随机变量
registname : RndStream("registname.rnd", 6);//per usageseq
registnametran : RndStream("registname.rnd", 6);//per transctionseq tinit
registnameRandom : RndFile ("registname.rnd", 6);//PerUsageRandom
aaa : RndStream("registname.rnd", 6);//per transctionseq tmain
registnameperuser : RndStream("registname.rnd", 6);//per user
dcltrans //定义事务
transaction TInit
begin
if GetUserID() = 1 then
GlobalVarSet("global counter", 1);//设定初始值为1
end;
GlobalWaitFor("All", ALL_USERS);//等待并发用户数>=ALL_USERS后才往下执行
FileCSVLoadGlobal(hRegistpert1, "registpert.csv", ",");//加载数据文件
FileGetNextRow(hRegistpert1);//获取下一行
psRegistpert := FileGetCol(hRegistpert1, 1, STRING_COMPLETE);//pertest
pegistnameperuser1 := registnameperuser;
pegistnametran1 := registnametran;//pertransaction
FileCSVLoadGlobal(registnamefiletran1, "registname.csv", ",");//per tranaction
FileCSVLoadGlobal(hRegistrandomtran1, "registrandomtran.csv", ",");
FileCSVLoadGlobal(hfile, "registrandomtran.csv", ",");//导入参数化文件
ptudentcount1 := studentcount;
end TInit;
transaction TMain
begin
paa1 := aaa;
WebTcpipConnect(hWeb0, "192.168.60.15", 23);
WebTcpipRecvExact(hWeb0, NULL, 3);
WebTcpipSendBin(hWeb0, "\hFFFB25");
WebTcpipRecvExact(hWeb0, NULL, 10);
WebTcpipSendBin(hWeb0, "\hFFFA25000000FFF0");
WebTcpipRecvExact(hWeb0, NULL, 15);
WebTcpipSendBin(hWeb0, "\hFFFB18FFFC20FFFC23FFFC27FFFC24");
WebTcpipRecvExact(hWeb0, NULL, 6);
WebTcpipSendBin(hWeb0, "\hFFFA18007674313030FFF0");
WebTcpipRecvExact(hWeb0, NULL, 15);
WebTcpipSendBin(hWeb0,
"\hFFFD03FFFC01FFFB1FFFFA1F00500018"
"\hFFF0FFFE05FFFC21");
WebTcpipRecvExact(hWeb0, NULL, 62);
WebTcpipSendBin(hWeb0, "\hFFFD016C");
WebTcpipRecvExact(hWeb0, NULL, 1);
WebTcpipSend(hWeb0, "lastship");
WebTcpipRecvExact(hWeb0, NULL, 1);
WebTcpipSend(hWeb0, "\r");
WebTcpipRecvExact(hWeb0, NULL, 2);
WebTcpipRecvExact(hWeb0, NULL, 9);
WebTcpipSend(hWeb0, "zhaz217\r");
WebTcpipRecvExact(hWeb0, NULL, 2);
WebTcpipRecvExact(hWeb0, NULL, 621);
WebTcpipSend(hWeb0, "c");
WebTcpipRecvExact(hWeb0, NULL, 1);
WebTcpipSend(hWeb0, "d");
WebTcpipRecvExact(hWeb0, NULL, 1);
WebTcpipSend(hWeb0, " ");
WebTcpipRecvExact(hWeb0, NULL, 1);
WebTcpipSend(hWeb0, "u");
WebTcpipRecvExact(hWeb0, NULL, 1);
WebTcpipSend(hWeb0, "i");
WebTcpipRecvExact(hWeb0, NULL, 1);
WebTcpipSend(hWeb0, "\r");
WebTcpipRecvExact(hWeb0, NULL, 1);
WebTcpipRecvExact(hWeb0, NULL, 27);
WebTcpipSend(hWeb0, "prp_main.4ge");
WebTcpipRecvExact(hWeb0, NULL, 1);
WebTcpipSend(hWeb0, "\r");
WebTcpipRecvExact(hWeb0, NULL, 1);
WebTcpipRecvExact(hWeb0, NULL, 157);
WebTcpipRecvExact(hWeb0, NULL, 28);
WebTcpipRecvExact(hWeb0, NULL, 36);
WebTcpipRecvExact(hWeb0, NULL, 128);
WebTcpipRecvExact(hWeb0, NULL, 586);
WebTcpipSend(hWeb0, "1101000002");
WebTcpipRecvExact(hWeb0, NULL, 1);
WebTcpipSend(hWeb0, "\r");
WebTcpipRecvExact(hWeb0, NULL, 27);
WebTcpipRecvExact(hWeb0, NULL, ;
WebTcpipSend(hWeb0, "\r");
WebTcpipRecvExact(hWeb0, NULL, 26);
WebTcpipRecvExact(hWeb0, NULL, 1123);
WebTcpipSend(hWeb0, "11010000");
WebTcpipRecvExact(hWeb0, NULL, 3);
WebTcpipRecvExact(hWeb0, NULL, ;
ThinkTime(44.4);
WebTcpipSend(hWeb0, "\r");
WebTcpipRecvExact(hWeb0, NULL, 1);
WebTcpipRecvExact(hWeb0, NULL, 56);
WebTcpipSend(hWeb0, "q");
WebTcpipRecvExact(hWeb0, NULL, 18);
WebTcpipRecvExact(hWeb0, NULL, 9);
WebTcpipSend(hWeb0, "a");
WebTcpipRecvExact(hWeb0, NULL, 1);
WebTcpipSend(hWeb0, "a");
WebTcpipRecvExact(hWeb0, NULL, 4);
WebTcpipRecvExact(hWeb0, NULL, 62);
WebTcpipSend(hWeb0, "a");
WebTcpipRecvExact(hWeb0, NULL, 18);
WebTcpipRecvExact(hWeb0, NULL, ;
WebTcpipSend(hWeb0, "\r");
WebTcpipRecvExact(hWeb0, NULL, 16);
WebTcpipRecvExact(hWeb0, NULL, ;
WebTcpipSend(hWeb0, "4");
WebTcpipRecvExact(hWeb0, NULL, 3);
WebTcpipSend(hWeb0, "\r");
WebTcpipRecvExact(hWeb0, NULL, 14);
WebTcpipRecvExact(hWeb0, NULL, 37);
WebTcpipSend(hWeb0, "a");
WebTcpipRecvExact(hWeb0, NULL, 68);
WebTcpipRecvExact(hWeb0, NULL, 1300);
WebTcpipSend(hWeb0, "4");
WebTcpipRecvExact(hWeb0, NULL, 4);
WebTcpipRecvExact(hWeb0, NULL, 89);
WebTcpipRecvExact(hWeb0, NULL, 1061);
WebTcpipSend(hWeb0, "2");
WebTcpipRecvExact(hWeb0, NULL, 122);
WebTcpipRecvExact(hWeb0, NULL, 1408);
WebTcpipSend(hWeb0, "1");
WebTcpipRecvExact(hWeb0, NULL, 128);
WebTcpipRecvExact(hWeb0, NULL, 1182);
WebTcpipSend(hWeb0, "1");
WebTcpipRecvExact(hWeb0, NULL, 128);
WebTcpipRecvExact(hWeb0, NULL, 1763);
WebTcpipRecvExact(hWeb0, NULL, 174);
WebTcpipSend(hWeb0, "a");
WebTcpipRecvExact(hWeb0, NULL, 7);
WebTcpipRecvExact(hWeb0, NULL, 771);
WebTcpipSend(hWeb0, "\r");
WebTcpipRecvExact(hWeb0, NULL, 128);
WebTcpipRecvExact(hWeb0, NULL, 1891);
WebTcpipRecvExact(hWeb0, NULL, 591);
WebTcpipSend(hWeb0, "PQAA200611010000000005");
WebTcpipRecvExact(hWeb0, NULL, 23);
WebTcpipRecvExact(hWeb0, NULL, 460);
WebTcpipSend(hWeb0, "\r");
WebTcpipRecvExact(hWeb0, NULL, 1);
WebTcpipRecvExact(hWeb0, NULL, 56);
WebTcpipRecvExact(hWeb0, NULL, 1);
WebTcpipRecvExact(hWeb0, NULL, 65);
WebTcpipRecvExact(hWeb0, NULL, 38);
WebTcpipSend(hWeb0, "y");
WebTcpipRecvExact(hWeb0, NULL, 92);
WebTcpipRecvExact(hWeb0, NULL, 9);
WebTcpipSend(hWeb0, "\r");
WebTcpipRecvExact(hWeb0, NULL, 46);
WebTcpipRecvExact(hWeb0, NULL, 388);
WebTcpipSend(hWeb0, "\r");
WebTcpipRecvExact(hWeb0, NULL, 7);
WebTcpipRecvExact(hWeb0, NULL, 44);
WebTcpipSend(hWeb0, "\r");
WebTcpipRecvExact(hWeb0, NULL, 7);
WebTcpipRecvExact(hWeb0, NULL, 7);
//
//
//此处参数化
/GlobalVarInc("global counter", 1, nCount);//设定增长值为1
FileGetNextRow(registnamefiletran1);//获取文件中的下一行
registnamefiletran:=FileGetCol(registnamefiletran1,2, TRING_COMPLETE);//pertest
FileGetRndRow(hRegistrandomtran1);//随机获取文件中的某一行
psRegistrandomtran := FileGetCol(hRegistrandomtran1, 1, STRING_COMPLETE);//获取某一列值
FileGetRow(hfile,GetUserId()) ; //根据虚拟用户的ID来取参数化的数据
sAccountName:= FileGetCol(hfile, 1, STRING_COMPLETE);//取数据的第一列
WebTcpipSend(hWeb0, sAccountName);//SaccountName可用前面定义的 pegistnametran1 、 paa1 、 registnameperuser1 、 registnamefiletran、 psRegistpert、 psRegistrandomtran及dclrand中定义的随机变量及String(nCount) 、string(ptudentcount1)替换
Print(pegistnametran1, OPT_DISPLAY_ALL, TEXT_RED);
WebTcpipRecvExact(hWeb0, NULL, 23);//
WebTcpipSend(hWeb0, "\r");
WebTcpipRecvExact(hWeb0, NULL, 23);
WebTcpipSendBin(hWeb0, "\h0F");
WebTcpipRecvExact(hWeb0, NULL, 1);
WebTcpipRecvExact(hWeb0, NULL, 1822);
WebTcpipRecvExact(hWeb0, NULL, 598);
WebTcpipSend(hWeb0, "\r");
WebTcpipRecvExact(hWeb0, NULL, 94);
WebTcpipRecvExact(hWeb0, NULL, 1996);
WebTcpipRecvExact(hWeb0, NULL, 102);
WebTcpipSend(hWeb0, "\r");
WebTcpipRecvExact(hWeb0, NULL, 43);
WebTcpipRecvExact(hWeb0, NULL, 23);
WebTcpipSend(hWeb0, "0");
WebTcpipRecvExact(hWeb0, NULL, 23);
WebTcpipSend(hWeb0, "1");
WebTcpipRecvExact(hWeb0, NULL, 23);
WebTcpipSend(hWeb0, "2");
WebTcpipRecvExact(hWeb0, NULL, 23);
WebTcpipSend(hWeb0, "3");
WebTcpipRecvExact(hWeb0, NULL, 23);
WebTcpipSend(hWeb0, "4");
WebTcpipRecvExact(hWeb0, NULL, 23);
WebTcpipSend(hWeb0, "5");
WebTcpipRecvExact(hWeb0, NULL, 23);
WebTcpipSend(hWeb0, "6");
WebTcpipRecvExact(hWeb0, NULL, 23);
ThinkTime(4.6);
WebTcpipSend(hWeb0, "\r");
WebTcpipRecvExact(hWeb0, NULL, ;
WebTcpipSend(hWeb0, "z");
WebTcpipRecvExact(hWeb0, NULL, 23);
WebTcpipSend(hWeb0, "h");
WebTcpipRecvExact(hWeb0, NULL, 23);
WebTcpipSend(hWeb0, "a");
WebTcpipRecvExact(hWeb0, NULL, 23);
WebTcpipSend(hWeb0, "n");
WebTcpipRecvExact(hWeb0, NULL, 23);
WebTcpipSend(hWeb0, "g");
WebTcpipRecvExact(hWeb0, NULL, 23);
WebTcpipSend(hWeb0, "1");
WebTcpipRecvExact(hWeb0, NULL, 23);
WebTcpipSend(hWeb0, "\r");
WebTcpipRecvExact(hWeb0, NULL, 40);
WebTcpipRecvExact(hWeb0, NULL, 48);
WebTcpipSend(hWeb0, "\r");
WebTcpipRecvExact(hWeb0, NULL, ;
WebTcpipRecvExact(hWeb0, NULL, 134);
WebTcpipSend(hWeb0, "\r");
WebTcpipRecvExact(hWeb0, NULL, ;
WebTcpipRecvExact(hWeb0, NULL, 16);
WebTcpipSend(hWeb0, "\r");
WebTcpipRecvExact(hWeb0, NULL, ;
WebTcpipRecvExact(hWeb0, NULL, ;
WebTcpipSend(hWeb0, "\r");
WebTcpipRecvExact(hWeb0, NULL, ;
WebTcpipRecvExact(hWeb0, NULL, 23);
WebTcpipSendBin(hWeb0, "\h0F");
WebTcpipRecvExact(hWeb0, NULL, 1);
WebTcpipRecvExact(hWeb0, NULL, 1824);
WebTcpipRecvExact(hWeb0, NULL, 1210);
WebTcpipSend(hWeb0, "\r");
WebTcpipRecvExact(hWeb0, NULL, 94);
WebTcpipRecvExact(hWeb0, NULL, 1929);
WebTcpipRecvExact(hWeb0, NULL, 83);
WebTcpipSend(hWeb0, "\r");
WebTcpipRecvExact(hWeb0, NULL, ;
WebTcpipRecvExact(hWeb0, NULL, 23);
WebTcpipSend(hWeb0, "\r");
WebTcpipRecvExact(hWeb0, NULL, ;
ThinkTime(2.4);
WebTcpipSend(hWeb0, "f");
WebTcpipRecvExact(hWeb0, NULL, 23);
WebTcpipSend(hWeb0, "u");
WebTcpipRecvExact(hWeb0, NULL, 23);
WebTcpipSend(hWeb0, "j");
WebTcpipRecvExact(hWeb0, NULL, 23);
WebTcpipSend(hWeb0, "i");
WebTcpipRecvExact(hWeb0, NULL, 23);
WebTcpipSend(hWeb0, "a");
WebTcpipRecvExact(hWeb0, NULL, 23);
WebTcpipSend(hWeb0, "n");
WebTcpipRecvExact(hWeb0, NULL, 23);
WebTcpipSend(hWeb0, "\r");
WebTcpipRecvExact(hWeb0, NULL, ;
WebTcpipSend(hWeb0, "1");
WebTcpipRecvExact(hWeb0, NULL, 23);
WebTcpipSend(hWeb0, "0");
WebTcpipRecvExact(hWeb0, NULL, 23);
WebTcpipSend(hWeb0, "0");
WebTcpipRecvExact(hWeb0, NULL, 23);
WebTcpipSend(hWeb0, "0");
WebTcpipRecvExact(hWeb0, NULL, 23);
WebTcpipSend(hWeb0, "0");
WebTcpipRecvExact(hWeb0, NULL, 23);
WebTcpipSend(hWeb0, "0");
WebTcpipRecvExact(hWeb0, NULL, 23);
WebTcpipSend(hWeb0, "\r");
WebTcpipRecvExact(hWeb0, NULL, ;
WebTcpipSend(hWeb0, "\r");
WebTcpipRecvExact(hWeb0, NULL, ;
WebTcpipSend(hWeb0, "1");
WebTcpipRecvExact(hWeb0, NULL, 23);
WebTcpipSend(hWeb0, "1");
WebTcpipRecvExact(hWeb0, NULL, 23);
WebTcpipSend(hWeb0, "\r");
WebTcpipRecvExact(hWeb0, NULL, 34);
WebTcpipRecvExact(hWeb0, NULL, ;
ThinkTime(47.9);
WebTcpipSend(hWeb0, "1");
WebTcpipRecvExact(hWeb0, NULL, 43);
WebTcpipSend(hWeb0, "0");
WebTcpipRecvExact(hWeb0, NULL, 23);
WebTcpipSend(hWeb0, "0");
WebTcpipRecvExact(hWeb0, NULL, 23);
WebTcpipSend(hWeb0, "0");
WebTcpipRecvExact(hWeb0, NULL, 23);
WebTcpipSend(hWeb0, "\r");
WebTcpipRecvExact(hWeb0, NULL, 49);
WebTcpipRecvExact(hWeb0, NULL, 51);
WebTcpipSend(hWeb0, "1");
WebTcpipRecvExact(hWeb0, NULL, 92);
WebTcpipSend(hWeb0, "1");
WebTcpipRecvExact(hWeb0, NULL, 31);
WebTcpipRecvExact(hWeb0, NULL, 23);
WebTcpipSend(hWeb0, "0");
WebTcpipRecvExact(hWeb0, NULL, 23);
WebTcpipSend(hWeb0, "1");
WebTcpipRecvExact(hWeb0, NULL, 23);
WebTcpipSend(hWeb0, "0");
WebTcpipRecvExact(hWeb0, NULL, 23);
WebTcpipSend(hWeb0, "0");
WebTcpipRecvExact(hWeb0, NULL, 23);
WebTcpipSend(hWeb0, "0");
WebTcpipRecvExact(hWeb0, NULL, 23);
WebTcpipSend(hWeb0, "0");
WebTcpipRecvExact(hWeb0, NULL, 23);
WebTcpipSend(hWeb0, "0");
WebTcpipRecvExact(hWeb0, NULL, 23);
WebTcpipSend(hWeb0, "2");
WebTcpipRecvExact(hWeb0, NULL, 23);
WebTcpipSend(hWeb0, "\r");
WebTcpipRecvExact(hWeb0, NULL, 30);
WebTcpipSendBin(hWeb0, "\h1B"); // ?
WebTcpipRecvExact(hWeb0, NULL, 3);
WebTcpipRecvExact(hWeb0, NULL, 122);
WebTcpipRecvExact(hWeb0, NULL, 1);
WebTcpipRecvExact(hWeb0, NULL, 39);
WebTcpipRecvExact(hWeb0, NULL, 38);
WebTcpipSend(hWeb0, "0");
WebTcpipRecvExact(hWeb0, NULL, 92);
WebTcpipRecvExact(hWeb0, NULL, 2081);
WebTcpipRecvExact(hWeb0, NULL, 1711);
WebTcpipRecvExact(hWeb0, NULL, 6);
WebTcpipSend(hWeb0, "0");
WebTcpipRecvExact(hWeb0, NULL, 128);
WebTcpipRecvExact(hWeb0, NULL, 1440);
WebTcpipSend(hWeb0, "0");
WebTcpipRecvExact(hWeb0, NULL, 128);
WebTcpipRecvExact(hWeb0, NULL, 1017);
WebTcpipSend(hWeb0, "0");
WebTcpipRecvExact(hWeb0, NULL, 122);
WebTcpipRecvExact(hWeb0, NULL, 1161);
end TMain;
transaction TShutdown
begin
WebTcpipSend(hWeb0, "0");
WebTcpipRecvExact(hWeb0, NULL, 4);
WebTcpipRecvExact(hWeb0, NULL, 34);
WebTcpipSend(hWeb0, "y");
WebTcpipRecvExact(hWeb0, NULL, 1);
WebTcpipSend(hWeb0, "\r");
WebTcpipRecvExact(hWeb0, NULL, 10);
WebTcpipRecvExact(hWeb0, NULL, 66);
ThinkTime(2.3);
WebTcpipSend(hWeb0, "exit");
WebTcpipRecvExact(hWeb0, NULL, 1);
WebTcpipSend(hWeb0, "\r");
WebTcpipRecvExact(hWeb0, NULL, 1);
WebTcpipRecvExact(hWeb0, NULL, 3);
WebTcpipShutdown(hWeb0);
FileUnload(registnamefiletran1);
FileUnload(hRegistpert1);
FileUnload(hRegistrandomtran1);
end TShutdown;