《Loadrunner系统知识(非常好).docx》由会员分享,可在线阅读,更多相关《Loadrunner系统知识(非常好).docx(44页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、LoadRunner 内部构造1, 被测系统是由驱动进程 mdrv.exe(多线程驱动的进程)和 r3vuser.exe 来产生压力的,其中 r3vuser.exe 仿真应用程序的客户端,如 IE 扫瞄器。它执行了三个主要的操作:Kli cpp (C 语言 pre-processor)1cci C 语言编译器,建立 ci 文件,然后使用被测系统的协议相关的驱动来执行。通过在 Windows 批处理脚本中启动 Mdrv.exe 来静静地启动运行。Mdrv 能自动停顿加载 Vuser,由于他们与 Vuser 和 Windows 负载生成器上的 CPU 使用监视器之间相互通信。在 Windows 机
2、器上,对于每一个基于 Java 的 Vuser 都有一个独立的 JVM。2,虚拟用户通过在负载生成器客户端机器上使用 agent3900magentproc.exe作为效劳或者进程来依据组在指定的负载生成器上运行一样脚本的虚拟用户的集合启动虚拟用户。3,每一个拥有代理的机器维护一个在.qtp 文件中的执行日志。4,当日志被启用后,代理同样会在结果文件中为每一个虚拟用户由虚拟用户组分开建立一系列日志文件。5,在执行过程中,这些文件可以通过在 Controller 机器上的 view Show Output 窗口中显示。6,在预先设置延时上,Controller 上运行的 Scheduler 指导
3、代理(通过Windows 54345 端口,或者 Unix 上的动态端口)去初始化场景会话.Controller(wlrun.exe)在恳求中发送一份场景的拷贝.7,代理是由每一个负载生成器上的 Remote Agent Dispatcher 进程(以前叫 Remote Command Launcher(RCL)启动的.8,每一个依据场景(.lrs)定义文件中设置的代理来打算哪一个虚拟用户组和脚本需要在主机上运行.# 这就是说 Controller 可以从 DOS 的批处理文件(.batch)中启动.REM Start Controller:SET M_ROOT=C:Program Files
4、Mercury InteractiveLoadRunnerbin cd %M_ROOT%wlrun.exe -TestPath D:DevDev1.lrs -port 8080 -Run -DontClosel 包含的-Run 参数与手动的点”开头场景”自动运行是一样的. 这不是一个很好的方法,由于你可能需要打算从以前的运行中收集文件或者想转变输出文件夹.l 这是假设系统环境变量PATH 已经被更了,包括 LoadRunner 的安装.9, Controller 通过使用 Windows 操作系统文件夹里的参数值来启动.由于LoadRunner 被设计成在一个机器上一次只能运行一个 Contr
5、oller 实例,所以需要使用 Windows 文件夹.#为了在几个应用之间快速的切换, 在 Controller 工作之后保存LoadRunner 的 ini 文件, 然后使用记事原来制作一个批处理文件. 在执行10wlrun 之前拷贝应用程序的指定版本的 ini 文件. 下面是一个应用程序文件拷贝的例子:copy %WinDir%/wlrun7-XXX.ini%WinDir%/wlrun7.inicopy %WinDir%/wlrun7-XXX.dft%WinDir%/wlrun7.dft需要修改一些默认值:l 在 wlrun7.ini 文件的 output 区域, MaxNumberOf
6、OutputMessages=from 10000 to 100000, 这就限制了存储在数据库中的输出信息的数目.l MaxOutputUIRowsToShow 限制了在 Controller 的输出窗口中显示的信息/错误行总数.l 在 LoadRunner 程序文件的 datprotocols文件夹下的QTWeb.lrp 文件的Vugen局部, 添加一个 MaxThreadPerProcess=5 来限制由每个负载生成器 mdrv.exe 进程治理的线程数.l 存储在 wlrun5.ini 和 wlrun7.dft 文件中的 DefaultScenarioDir, Defaultscrpt
7、Dir, DefaultResultDir,Recent File List几个数据的值会在每次 Controller 转变的时候更。10,在 Vu scrpts 中定义的每个虚拟用户进展的操作是用 LoadRunner的 VuGen.exe 生成的. 当这个程序启动后, 它在 windows 文件夹下存储了 comparamui.INI 文件来保存LastTablesUsed下面文件的历史, 并且保存由 Insert New Parameter Dates 菜单指定的ParamDialogDates.VuGen 在 Windows 文件夹下存储和检索 vugen.ini 文件.当使用 JAV
8、A的时候,需要添加一些其他的调试选项:DynaDlgJavaLevel=3当在 VuGen 8.1 中使用 8.0 的脚本, 往 Vugen.ini 中参与信息:Editor OLDEDITOR = 1VuGen 在 LR 文件夹 template/qtwebdefault.cfg 里和脚本文件里翻开.Vu scrpts 可以使用脚本外部的参数文件来获得的变量值进展编码.更多关于 VuGen 的信息请看脚本编写的章节.11. 运行过程中,执行结果存储到一个结果文件夹中.我宠爱在场景执行中把结果设置成自动产生结果.这样,LoadRunner 会在每次启动一个场景之后自动产生一个子增的结果名. 例
9、如,结果名称 Res1 会自动增长到 Res12 或有时候是 R es11-1.错误被写到 output.mdb 微软的 Access 数据库中。12. 在每一个结果文件夹中, 程序自动创立 Log 文件夹来包含每个组的日志文件. 运行之后,在 Controller 中查看日志文件,点 , .然后在组中点右键,选择 “Show Vuser Log”13. 场景运行的时候, 监视器在本地维护每个主机的计数器.14. 运行完成之后, “collate“进程处理.eve 和.lrr 结果文件, 并且在结果文件夹下创立一个临时的.mdb 数据库.在处理大数据量的结果时, 为了防止错误发生,使用 MSD
10、E. 15. 分析模块(8,320K analysisu.exe)使用 mdb 数据库中的数据来产生分析图表和报告.16. 每一次场景运行后的结果文件 results_name.lrr,也叫分析文档文件,由分析程序来读取并且显示百分位图表.Loadrunner 系列学习-Loadrunner 架构(1)一:Loadrunner 构造概述Loadrunner 通过使用虚拟用户代替真有用户操作客户端软件来工作的, 例如使用 IE 对 IIS 或者 Apache Web 效劳器发送 恳求.多个虚拟用户客户端的恳求是有负载生成器(Load Generator)产生的,目的是对不同类型的被测效劳器产生负
11、载.这些负载生成器代理(load generator agent )是由 Mercury”s 的把握器(Controller)来把握启动或停顿的.把握器依据由编译的脚本引起的场景(Scenarios)和相关的运行时设置(Run-time Settings)来把握负载测试的运行.这些脚本是由虚拟用户脚本生成器(Virtual user scrpt Generator)也叫VUGen 生成的.它是通过截获网络应用程序的客户端和效劳器之间的网络通信包而产生的 C 语言脚本,这些脚本可以被虚拟用户执行.对于 Java 客户端,VuGen 通过客户端的 JVM 的钩子技术来捕获恳求.在运行时,每个机器的
12、状态由把握器监控.运行完毕后,把握器把监视日志和右负载生成器产生的日志结合起来给分析器(Analysis)使用.分析器能够把这些日志生成结果报表和 Microsoft 的图表,水晶报表或 HTML 格式页.每一个由分析器生成的 HTML 报表页包括一个到结果的超链接,这些结果文件可以用 Microsoft Excel 翻开来进展其他的分析.运行时产生的错误都被存储在一个数据库中,该数据库可以用Microsoft Access 翻开.虚拟用户:不象 WINRUNNER 那样只能模拟一个客户端用户,LOADRUNNER 能够模拟成千上万的虚拟用户.负载生成器由 VnGen 脚本把握.这些脚本是使用
13、跟被测客户端一样的协议产生的非GUI 的API 函数.但是WINRUNNER 是使用GUI 用 户来模拟被测客户端的键盘输入,鼠标点击和其他用户接口的操作,而且只能运行一个 GUI 用户.而LOADRUNNER 终端效劳治理器 (LoadRunner Terminal Services Manager)治理使用终端效劳代理来治理远程机器并且能登陆到客户端终端效劳的会话.运行的时候,线程类型的虚拟用户共享一个公用的内存池.所以线程方式可以使每个负载生成器支持更多的虚拟用户.全部负载生成器上的虚拟用户的状态是从“Running“开头的,然后在运行完脚本的 init 局部后变为“Ready“.虚拟用
14、户的“Finished“有通过或者失败的完毕状态.当负载生成器负载过重时虚拟用户自动的“Stopped“.监控标准的 Web( )效劳器(Apache, IIS, and Netscape)不需要额外的 license.为了能够监控使用 SOAP 和 XML 的 Web Services,需要一个独立的license,并且虚拟用户需要 Web Services 插件.该插件被 Feature Pack(FP1)安装.产品版本:略应用程序组件需求应用程序程序进程名称V9V8.0Img KBFileSize-LRLauncherApp.exe 15,840 16,288n/aVirtual Use
15、r Generator VuGen.exe23,980 12,436 2,334,769Controllerwithwlrun.exe61,312 13,076 5,681,215On-Line MonitorsLoad Generator Agentmagentproc.exe3,3363,236magentservice.exe3,49665,536mdrv.exe-AnalysisAnalysisui.exe64,460 13,132 6,058,496Tuning Consoleprotune.exe-3,403,833把握台程序:perl5.8.0.exe Interpreter20
16、,535regtlb.exeregisters the batch automation type library 30,720sed.exeGNU sed (gsed) version 2.0555,296wdiff.exeCompares text files197,632使用 WINDOWS 远程桌面连接为了使 WINDOWS 远程桌面连接会话在测试时不会超时,每个机器的终端效劳应当如下配置:1. 开头-程序(或者把握面板),治理工具下选择终端效劳配置.2. 翻开树型的连接文件夹3. 右击 RDP-Tcp,选择属性.4,点会话标签页.5,确保选中“Override user settin
17、gs“6.设置空闲会话限制为最大 2 天来代替默认的 2 个小时.7,点应用.8.OK留意:确保上面的做法没有影响到公司的安全策略.留意:终端用户只能允许两个活动的连接.断开会话的时候使用开头-退出,而不要点远程桌面的“X“关闭.LR 的安装和配置:略应用程序文件的位置:(省略局部介绍)可以使用环境变量来快速获得 LR 的安装路径,如环境变量为“LR81“,你可以使用cd %lr81%WINDOWS 文件夹下的文件:1. 路径存储在 wlrun.ini 文件中的ProductEnv下作为 M_ROOT.该文件在C:WINNT (或 C:Windows)2. C:WINNT (或 C:Windo
18、ws)下同样存有安装时的 Maintenance Number (MPN),存在 mercury.ini 文件中. 其他省略.好了,今日先翻译到这里了,该吃中午饭了,哈哈,下期会翻译 LOADRUNNER 的内部构造.Loadrunner 学习-脚本编写(1)VuGen 脚本文件的开发过程1。定义测试工程的目标,环境,脚本,测试数据,硬件等。脚本应当符合编码标准或编码习惯。2。创立一个版本文件夹来保存被测应用程序相关的各种不同资源,例如截获 的.png/.gif 图形文件,录制过程保存的html 文件,录制中的全部html 源文件和 VuGen 的录制日志。3。列出在表里每一个手动操作业务过程
19、需要的实际步骤1截取每一个屏幕图像screen image 。2为每一个屏幕screen安排一个唯一的事务名称。3) 为处理的每一个步骤使用的技术组件URL 或者方法和函数做注释。4。创立一个版本文件夹。注:我不宠爱使用默认位置,我宠爱把全部脚本相关的文件放到一个一样的文件夹中。不幸的是,这意味着假设我在不同的测试间相互交换录制,那我每次都得记住修改默认的设置。注:当录制一个的脚本时,我宠爱选择多协议而不是单个协议。5。依据你的业务处理列表上指定的用户使用步骤和 screen 的挨次来使用 VuGen录制程序,产生一系列脚本代码。在“开头录制”对话框中* 使用 COM/DCOM 协议时,选择“
20、Win32 应用程序“* 使用 Web( /HTML)时,选择“Internet Application“6。依据改进脚本方法和脚本语言规章来修改脚本。改进脚本的方法:1) 为每一个 GUI 的 screen 添加事务语句来获得事务时间。2) 添加显示数据来帮助调试。3) 添加验证点来验证是否期望的文本或者图片在每个脚本执行后显示。4) 通过插入参数和动态获得整个文件的方式对硬编码的 URL,用户 id, 用户密码和其他的变量数据进展参数化。这样脚本中的参数就可以被动态的替换, 以此来模拟运行时不同数据的使用。5) 添加重试规律retry logic来处理不行见的错误。6添加随机函数发生器变化
21、脚原来模拟真实的负载。7) 添加 if/else 规律来检查结果,或者来进展适宜的操作,或者来在适宜的时候退出脚本。8) 在一个 screen 中添加语句来捕获需要在其他命令中使用的数据。当使用 Microsoft .NET 的 web form 技术的时候,需要避开习惯性的“脚本超时“错误。9) 添加语句来调用外部库函数,以便保存和检索在内存 Virtual Table Server 中的数据。10) 处理 XML.11) 添加语句来仿照客户端的 Javascrpt 问题。12) 添加语句来治理超时。13) 从事务计时器中计算和减去无效的时间。14) 输出日志。15) 添加集合点。 16添加
22、时间Timing。脚本语言规章:把 cookie 代码标注出来由于脚本运行的时候他们被再次执行。7。通过在 VuGen 中运行来调试和调整脚本单个用户,同时运行时设置的日志能够显示如下信息:区分和解决脚本编辑错误。打算 timing.设置初始运行设置的场景。8。在把握器中使用 full test Runtime Settings 来运行脚本。脚本录制和产生:建立一个脚本的第一步是选择一个单协议或多协议。* 一些协议可能在多协议模式下不能用。* 只有在多协议的 GUI 下你才能重排列 action在使用 Java 协议之前,确保你在环境变量的路径下有JDK,否则你可能会遇到这个错误:Error:
23、 Failed to find javac.exe Java Compiler in Path and JDK installation folderin registry. MsgId: MERR-22981Error: Failed to get JRE version. Check that your PATH environment variable contains bin directory. MsgId: MERR-22986中选择 Java 协议的时候:* 只有选择了“RMI Java”才能录制。* 假设选择“Java user”,“开头录制”图标或菜单是灰色的。当你翻开一个的
24、脚本时,默认的脚本名称为“noname1”。下一个的脚本名称为“noname2”,以此类推。注:有挨次的录制多个动作而不是录制一个动作,然后停顿开头另一个动作。 这样能使你识别出在你脚本中需要关联的序列码在例如 PeopleSoft 的程序中。注:每次修改脚本后,脚本都需要重编译。Java:略脚本文件的调用:VuGen 是默认在你双击.usr 后缀文件的时候被调用。在这个文件里,Javascrpt 被指定为“Type=General-Js”。为了避开重编译,我使用命令行的变量和值得组合这样的批处理文件来调用把握器。例如:REM LoadRun from LoadRunner 8.0 defau
25、lt installation location:SET LR80=C:Program FilesMercury InteractiveMercury LoadRunnerbincd %LR80%wlrun.exe -TestRun c:TempScenario1.lrs -port 8080脚本文件 Action主机上的代理发送的到效劳器的恳求是由虚拟用户生成器创立的(VuGen.exe)action 的回放实现的。Loadrunner 创立的脚本有三局部:* vuser_init 来初始化 Vuser。执行在这局部的虚拟用户的状态是“Init“* Action 用来重复屡次迭代执行到这局部
26、的虚拟用户的状态是“Running“* vuser_end推出虚拟用户。 执行到这局部的虚拟用户的状态是“Exiting“假设你的脚本只需要执行一次,你照旧需要把这些脚本写到 Action 局部,由于在其他局部vuser_init 和 vuser_end有些命令是不合法的或者会无视掉。VuGen 允许脚本包含多个action。所以我为每一个 screen 创立一个的action。注:假设你想使用不同的用户登陆,就不要把登陆操作放到 vuser_init 中,而是放到 action 局部。VuGen 依据选择脚本选择协议的不同来添加不用的引用到“.h”头文件。C 的.h 头文件对于 Web( /
27、HTML)协议, 创立 globals.h,包含内容:#ifndef _GLOBALS_H #define _GLOBALS_H/-/ Include Files #include “lrun.h“ #include “web_api.h“#include “lrw_custom_body.h“/ recorded for web_custom_request functions./-/ Global Variables #endif / _GLOBALS_H 对于 COM/DCOM 协议:略C 脚本语言的格式:LoadRunner 使用的没有进展微软扩展的 ANSI C 语法。任意最小的 a
28、ction 代码块如下:#include as_web.h / from LoadRunner”s include folder. Action1/* comment block*/ comment line return 0;C 脚本编译/类库当 VuGen 编译脚本时,产生一个“pre_cci.ci“文件,这个文件包含了全部 action 的代码和包含文件。这就是为什么会有语法错误“not writing pre_cci.ci”的缘由。把握器编译这些.ci 文件为机器目标码。VuGen 在每一个脚本文件中自动创立一个 lib 文件夹,这个文件夹中包含了combined_lib.c 文件。该
29、文件包含了全部引用文件。#include “lrun.h“来定义UNIX 或者 Windows 的函数。#include “globals.h“LoadRunner”的模版文件夹的其中一个。#include “vuser_init.c“ #include “Action.c“ #include “vuser_end.c“警告:当你使用类库中的函数却没有正确包含该类库的时候,你会收到一条错误信息:Error - Unresolved symbolC 类库LoadRunner使用1994 GNU C Pre-Processoroptions 和1995LCC-win32 Retargetable
30、C Compiler/Linker from the Free Software Foundation via Chris Fraser of AT&T and Dave Hanson of Princeton.附加的函数定义在ANSI C library 中。外部的没有返回整型数的 C 函数需要在脚本的开头进展显式声明。例如,string函数中的 string tokenizer:extern char* strtok(char *token, const char *delimiter);Java 语法:略loadrunner 学习系列-脚本编写(2)VUser_Init 局部这里是 Vu
31、ser_init 局部的一些例子: 操作系统的 User ID下面显示了使用 advapi32.dll 的 GetUserNameA 函数获得的操作系统的用户 IDcharsUserID1024; / Maximum possible UserID length. longlUserIDSize = sizeof(sUserID)-1;intrc;rc=lr_load_dll(“advapi32.dll“); if( rc != 0 )lr_error_message(“lr_load_dll of advapi32.dll failed.Aborted for rc=%d“,rc);lr_a
32、bort;elseGetUserNameA(sUserID, &lUserIDSize);lr_message(“UserID=”%s”“, sUserID);全部的变量声明需要一块放到最上方。在 vuser_init 局部创立的本地C 变量如int 或 char对其他局部的脚本是不行见的。所以使用 lr_save_string 函数来创立对全部脚本可用的全局参数。例子:char *itoa ( int value, char *str, int radix ); vuser_initint x = 10;char buffer10;lr_save_string( itoa( x, buffe
33、r, 10) , “pX“ ); lr_message ( “int x = %s“, lr_eval_string(“pX“ );return 0;运行时设置的附加属性Additional Attribute8.0 版本引进了一个格外有价值的特性:在运行时设置中指定属性,这个属性可以对不同的虚拟用户组设置不同的值。下面的代码是从运行时设置的附加属性中读取名为“usertype”的参数。然后使用参数值来对应的设置全局的“thinktime1“变量。int thinktime1=0; vuser_initLPCSTR strUsertype; / Define *str.strUsertype
34、= lr_get_attrib_string (“usertype“); if (strUsertype=NULL)lr_output_message(“# Run-time Settings Additional Attribute usertype not specified. Cannot continue.“); lr_abort;elselr_message(“# Run-time Settings Additional Attribute usertype=“%s“, strUsertype );if( strcmp( strUsertype,“advanced“) = 0 ) t
35、hinktime1=2; elseif( strcmp( strUsertype,“intermediate“) =0 ) thinktime1=4; elseif( strcmp( strUsertype,“basic“) = 0 ) thinktime1=8; elselr_error_message(“# ERROR: Value not recognized. Aborting run.“ );lr_abort;return 0;Time Structure Fix不知道怎么翻译,呵呵,“时间构造的解决“?依据学问库 34195 的文章,默认当前时间戳的毫秒局部不被更,除非 ftime
36、使用的时间构造被重定义:typedef long time_t; struct _timeb time_t time; unsigned short millitm;short timezone; short dstflag;struct _timeb t;_tzset; 使用 ftime 设置变量_ftime( &t );lr_message( “Plus milliseconds: %u“, t.millitm );把握信息的显示:在每个失败的事务之后,发出一个能够唯一确定该用户的信息。在运行时,当脚本的事务失败后连续,你怎么知道哪个用户失败了?Loadrunner 供给了一些函数来在运行
37、时显示信息:/ 往输出日志上发送消息,这个消息前边会带有action 的名称和行数lr_output_message(“an output message“);例子: Actions.c (4): an output message / 往输出日志和虚拟用户日志上发消息: lr_message(“* a message“+“r“+“A new line.“把“);“放到另一行,这样可以简洁的在命令上添加或者删除代码项。);在 UNIX/Linux 机器上,使用 “n“来添加一个换行。在 Windows 机器上,使用“r“来添加一个换行。/ 往输出日志上发送不带 action 名称和行数的信息l
38、r_log_message(“numbert“+ numvar +“t“);/ 只给把握器上的虚拟用户状态区域发送信息(当在 VuGen 中运行时,只是简洁的显示):lr_vuser_status_message (“a vuser status message“);/ 给 LoadRunner 把握器或者 Tuning 模块的把握台输出窗口显示一个红色高亮度显示的-17999 信息。lr_error_message(“an error message“);使用 lr_error_message 将会使日志信息堆栈在每个的 action 开头时被自动清空。假设选择了“当错误发生时才发送消息“,
39、 这些信息照旧被创立在“日志信息堆栈“里, 但是被压缩了(没有显示),直到监测到一个错误。LoadRunner 学习-脚本编写4比较重要2023-12-13 23:45:39 / 个人分类:性能测试今日接着来翻译 :/ wilsonmar /中关于 LoadRunner 脚本编写局部,下面该翻译脚本编写中一些比较重要的局部了。Web 用户 Action在 VuGen 中,脚本产生的默认模式是基于 HTML 的-“描述用户的动作的脚本”直接与用户的动作是对应的:* web_url 是扫瞄器地址栏的URL.* web_link 是点击在和之间的文本超链接。* web_image 是点击 HTML
40、的 Internet Procotol Recording”中选择“a scrpt containing explicit URLs only”,这将会产生 URL-based 的脚本录制,只使用web_url 和web_submit_data 函数,将不会使用 web_link 和 web_image 函数,或包含在 applets, XML, ActiveX 或 javascrpt 中的非 HTML 元素。在进展下一页录制之前如点击链接或者图标,暂停录制,把该页屏幕的标题拷贝下来粘贴到注释中。录制完成之后,这将会在后面的给事务命名上用到。在每一个页面显示之后,暂停录制,把打算是否是期望页的
41、文本拷贝下来,粘贴到注释中。录制完成之后,这将会用到文本验证检查点的脚本编写中。录制中产生的各种信息都保存在 RecordingLog.txt 文件中,删除它不会对脚本的回放产生影响。额外录制的 Action 脚本录制脚本的时候,当扫瞄器没有安装 SSL 根证书的时候,会捕获的下面这些代码行。这个信息意思是“这个证书不能被信任证书验证”。web_url(“authrootseq.txt“,“URL= :/ download.windowsupdate /msdownload/update/v3/static/truste dr/en/authrootseq.txt“,“Resource=1“,
42、 “RecContentType=text/plain“, “Referer=“,LAST);web_url(“authrootstl.cab“,“URL= :/ download.windowsupdate /msdownload/update/v3/static/truste dr/en/authrootstl.cab“,“Resource=1“, “RecContentType=application/octet-stream“, “Referer=“,LAST);录制脚本的时候,但扫瞄器遇到Macromedia flash 组件的时候,会产生下面的代码行:web_url(“versio
43、n_en_win_ax.xml“, “URL= :/fpdownload.macromedia /pub/flashplayer/update/current/xml/version_en_win_ax.xml“, “Resource=0“, “RecContentType=text/html“, “Referer=“, “Snapshot=t8.inf“, “Mode=HTML“,LAST);假设你安装有 Google Toolbar,即使你没有访问Google,也会录制上发到Google的恳求。脚本语言规章:在 LoadRunner 中,大小写是敏感的,甚至在被检验的值中。所以上面的脚本会由于大写字母的缘由,不会识别“Welcome”的。所以 Steve Cheney 建议使用“ic”无视大小写的文字标志:web_reg_find(“Text/ic=Welcome“,LAST);括号里的参数包含了 LAST 是为了指定最终的一个参数。这样做是很便利的,由于上面的例子漏掉了一个指定期望是“found”还是“notfound”的属性。默认是“found”, 全部我常常无视它。另一个文本标志是“/BIN”用来指定是二进制的字符集。例如,查找“Adams”:留意两个反斜杠,一个是转义字符,代表是使用了一个符号。假设错误的