《LoadRunner 12七天速成宝典》—第2章2.2节解决乱码

    xiaoxiao2024-02-20  168

    本节书摘来自异步社区《LoadRunner 12七天速成宝典》一书中的第2章,第2.2节解决乱码,作者陈霁,更多章节内容可以访问云栖社区“异步社区”公众号查看。

    2.2 解决乱码恋恋:那今天你说点什么难的呢?

    云云:首先,我要给你说一下怎么确保录制出来的东西不会是乱码。还记得昨天我们录制出来的发帖操作内容是乱码么?

    恋恋:记得,那么怎么解决呢?

    云云:其实这里和编码规则有关系,你先用IE 11浏览器(不要用Windows 10的Edge浏览器)打开我们搭建的Discuz论坛,在页面上单击右键,在出现的菜单里面选择“编码”命令,如图2-1所示。

    这里该页面的编码格式是UTF-8。

    恋恋:那么什么是UTF-8呢?

    云云:UTF-8其实是一种多语言兼容性的编码格式,除了UTF-8以外还有UTF-16,这样可以把任何语言都通过这种编码方式统一处理,以前的网页中文都是使用GB2312,老外要看就有问题了,比如字体。这里我简单按照个人理解给你解释一下,更多的说明要看官方文档哦。

    恋恋:对了,想起来了,以前我用DW开发网页的时候就要设置这个编码格式。

    云云:对,其实这个东西在页面代码的开头要申明的。现在你在浏览器里面右键菜单中选择查看源,在浏览器底部会出现开发人员工具,里面的调试程序项中会出现该页面上的代码,如图2-2所示。

    画框的地方就是页面申明所使用编码的地方了,这里使用的编码格式是UTF-8。LoadRunner作为一个外来软件,自然会有些水土不服的,如果录制的时候没有使用对应的解码方式,就会乱码了,不信你把这个页面的编码从UTF-8转到GB2312上看看,如图2-3所示。

    恋恋:变成这个样子了啊,看不懂哦!

    小编码大问题啊,查看源代码也是乱码了。

    云云:所以我们开始用LoadRunner录制的时候没有告诉它应该用什么编码方式,导致录制出来的东西乱码了。

    恋恋:懂了,那怎么解决呢?

    云云:我们要修改录制方式,打开VuGen,新建一个Web(HTTP/Html)协议,这里会弹出一个录制对象框,昨天我们修改过录制模式。单击左下角的Options选项按钮,会出来详细录制选项,我们直接点到“Advance”,这里会有个“Support charset”功能,选中后我们就告诉VuGen在录制的时候用UTF-8的方式来解码了,如图2-4所示。

    恋恋:原来如此,那就是说如果我们录制的页面是GB2312的,就不能开这个选项吗?

    云云:不错,比很多人理解的更深。并不是乱码就开这个选项,而是根据页面的编码格式来做。好了,你再录制一次昨天的操作看看效果。

    恋恋:首先启动录制,选择浏览器和启动地址,等待IE框弹出,进行操作,最后单击“Recording Bar”上的停止录制按钮。代码出来了,果然没乱码了,如图2-5所示。

    这下看的通透了,原来处理乱码那么简单。

    云云:看,又翘尾巴了吧!这是最简单的情况,接着来给你说个复杂的情况。

    恋恋:来吧,有挑战才能更好地进步。

    云云:如果录制时UTF-8没用,你怎么处理乱码?

    恋恋:还会有这种事情吗?

    云云:会!不要以为设置了这里就有用了。首先你设置录制时使用UTF-8,但是并不是所有操作都能被正确解码。最常见的情况就是在Ajax请求中,LoadRunner不能对这类请求进行UTF解码,所以需要我们自己来处理编码。

    恋恋:岂不是我们要写代码来处理编码转换?

    云云:就是这个意思。

    恋恋:天呐!

    云云:你怕了啊?

    恋恋:我就是感叹一下!

    云云:这里要给你说个叫做“lr_convert_string_encoding”的函数,这个函数可以进行编码转换。

    恋恋:你这样说我怎么懂啊。

    云云:刚开始学习时帮助文件永远是最好的工具,在这个函数上按F1键试试,会出来一个帮助手册,里面有关于这个的函数说明,仔细阅读。

    恋恋:哪有你这样的老师,叫学生自己看帮助。

    云云:这就是你不懂了,普通人我就直接给他说你这样做就行了,对你我要授之以渔。

    恋恋(脸红):好吧,我认真看看帮助文件。

    (几分钟后)

    恋恋:没看懂,虽然我按照帮助写了这样一段代码,但是运行后什么都没看到。

    int rc = 0; unsigned long converted_buffer_size_unicode = 0; char *converted_buffer_unicode = NULL; rc = lr_convert_string_encoding("Hello world", LR_ENC_SYSTEM_LOCALE, LR_ENC_UNICODE, "stringInUnicode"); if(rc < 0) { // error } return 0;

    云云:这是因为你没有脚本开发和调试的知识基础,所以只要让你写或改点东西就不会了吧。

    恋恋:干嘛,你得意了是吧,我就是不会怎么的!

    云云:别急啊,我来给你解释一下。首先帮助里面的代码是这样的:第一句它定义了一个新的整形变量rc,初始值为0。

    恋恋:这个我懂,后面呢?

    云云:接着就是调用“lr_convert_string_encoding”函数,并且把返回值保存到rc中。后面进行判断,如果rc的值小于零那么就说明转换错误了。

    恋恋:那么前两句是干嘛的?

    云云:其实我也不是很清楚,应该是为了后面做类型转换做准备的,把转换过程中需要用到的内部变量都重置一下吧。不过这个已经不关键了,你按照帮助写这两条好了。

    恋恋:那怎么转的呢?

    云云:这里“lr_convert_string_encoding”函数做的事情就是将Hello world这个字符串从当前系统的默认编码修改为UNICODE编码,并且把修改的内容保存到stringInUnicode这个参数里面去。

    恋恋:我大概懂了一点,那么LR可以做哪些编码的转换呢?

    云云:帮助里面有写到,注意看一开始的函数介绍,也就是说LR支持3种编码的互转,系统本地、UTF-8、UNICODE。下面写了这样的一张表,如图2-6所示。

    恋恋:我懂了,也就是说乱码可以强行转?

    云云:我们来写个例子就明白了。还是回到论坛,先把编码改一下让他显示乱码,这里我们先修改成GB2312试试。比如页面上的高级查询,在修改为GB2312后,会显示成“楂樼骇鎼滅储”这样的乱码,我们可以写下面这个代码来解码。

    lr_convert_string_encoding("楂樼骇鎼滅储",LR_ENC_UTF8,LR_ENC_SYSTEM_LOCALE,"test");

    这里我规定将这个乱码的字符串从UTF8的格式转化为当前系统的格式,并且保存到test这个参数中去。

    恋恋:我刚才就在纳闷什么是参数,现在你又说到参数了,到底什么是参数啊?

    云云:这个解释起来话题太大,你就当做LR中自己使用的高级变量吧。

    恋恋:又多了一个大大的问号!

    云云:今天下午我就给你讲什么是参数,你别急。这段代码写了以后你是看不到结果的,所以你要做个操作,也是后面做参数我们最常用到的功能,开日志!

    恋恋:日志?

    云云:日志是非常重要的调试代码的手段,通过简单运行并确认过程是否正确,你在写JAVA时会使用变量内存跟踪技术吗?

    恋恋:什么叫变量内存跟踪技术?

    云云:你竟然连变量内存跟踪技术都不知道!

    恋恋:反应不要那么大嘛。

    云云:就是你一边跑代码一边看变量的值的运行变化啊。你不是会在代码上设置断点么!比如在循环内设置个断点,每次跑到这里脚本就会停住,然后你可以在边上的窗口中看到当前所有变量的值。

    恋恋:原来是这个啊,别说那么专业的名词嘛。

    云云:做IT人必须懂!为了看到运行后的结果,我们现在打开日志,先按F4键(也可以通过Reply菜单下的Runtime Settings),这里会出现运行设置窗口,在左侧选择Log项,然后修改成下面这个样子,如图2-7所示。

    接着你再运行一下脚本。

    恋恋(按下F5键,脚本运行结束):多了一行蓝色的内容(Action.c(3): Notify: Saving Parameter "test = 高级搜索x00".),里面有解码出来的汉字啊!如图2-8所示。

    云云:我们刚才打开的选项就是告诉LR将参数的取值和赋值在日志中显示出来,日志的意思就是指把“高级搜索x00”保存到test这个参数里面去。LR在转码的时候会多带一个x00标记,如果你要去掉还要做点操作,这个我们后面再说好了。

    **小结理解乱码产生的原因,对常见编码有所了解,能够掌握如何设置录制选项避免乱码的出现,进一步掌握如何使用转码函数对乱码进行转码并对参数有一个初步的了解。**

    相关资源:LOADRUNNER 12七天速成宝典
    最新回复(0)