发布新日志

  • 修改测试对象的属性值(SetTOProperty Method )与Run-time对象的属性值的区别

    2007-05-22 13:43:27

  • 修改测试对象的属性值(SetTOProperty Method )与Run-time对象的属性值的区别(一)

  • 通过SetTOProperty方法,可以修改测试对象(指对象仓库中的对象)的属性值;测试对象还有一个“Properties”,叫Object,通过它,可以修改Run-time对象(指应用程序中的对象)的属性值。参考下图。

    以下面的一个WebElement对象为例,介绍二者的区别:

    上面的那个控件,无法通过正常录制的方法捕捉到,同时也无法录制键盘输入文字的操作。

    现在希望能通过脚本,自动完成文字录入操作,只能通过手工的方法,先将对象加入到对象库中,然后手工添加脚本代码。

    将对象加入到对象库中的操作如下(QTP9.0):

    (1).             菜单中选择Resouces>Object Repository,打开对象仓库管理器。

    (2).             点击按钮,将对象加入到仓库中,如图下图1。对象ClassWebElement

    (3).             将对象的Enable Smart Identification值设置为False,如图2

    从上图可以看出,程序中该控件的输入内容全部可在“innertext”属性值中显示。因此应该可以通过修改innertext值,来模拟用户的文本输入操作。

    我们可以先了解一下WebElement测试对象的属性,如下图。

    上图中的属性值都可以通过测试通过的Settoproperty进行修改。如果在脚本中用SetToProperty对测试对象的属性值进行了修改,是不会真正改变对象仓库中对象的属性值的,只是一个临时的修改,测试运行时生效,运行结果后即结束它的使命,不对仓库中的对象属性产生任何影响。

    例如:

    Browser("测试").Page("测试").Frame("Frame").WebElement("测试对象").SetTOProperty"innerText","好好学习"

    下面再介绍WebElementRun-Time属性。通过Object Spy的方法,获取得该对象的Run-time属性如下图1

    通过“测试对象.object”的方法,可以修改Run-time的属性值,即修改程序中对象的属性值。从上图1中可以看到,WebElement有一个“innerText”属性,它的属性值也就是在程序中输入的文本内容。因此,如果使用“测试对象.object”的方法对innerText属性值进行修改,也就相当于在程序中手工输入了文本。

    了解了WebElement的测试对象属性与Run-Time属性后,现在尝试进行脚本的编写。

    首先,对程序(如图1)使用SetTOProperty方法建立脚本,如图2。(注:第1个语句用来检查测试对象属性值修改前,是否可以从程序中找到对象;第3个语句用来检测对象属性值修改后,是否还可以从程序中找到对象。

    运行后,测试结果如下图3

    从图3可以看出,第1行脚本的点击事件通过,表示在程序中找到了对象,但在运行至第3行脚本的点击事件时出现错误,因为无法找到测试对象。由此表示如果对对象库中的对象属性进行了修改,会导致测试时无法从程序中找到对象。

    图1

    图2

    图3

     

    现在将程序中的文本也相应的改为“好好学习”。如下图1,注释第1行脚本,如图2,再次运行脚本,结果如下图3

    从图中可以看出,脚本运行是成功的。由此可见,如果对测试对象的属性值进行了修改,并在程序中对Run-time对象的属性值进行了相应的修改,这样保持了对象仓库中测试对象的属性与程序中Run-time对象属性的一致性,在这种情况下,脚本就可以运行成功。

    上面的脚本实验同样也表时,无法通过SetToProperty方法来模拟用户输入,因为它只能改变测试对象的属性值,不能自动改变Run-Time对象的属性值。相反的,如果改变了测试对象的属性值,不在程序中对Run-time属性值进行修改的话,还会导致脚本运行时找不到对象。

    图1

    图2

    图3

  • 修改测试对象的属性值(SetTOProperty Method )与Run-time对象的属性值的区别(二)

    上面的试验证明了可以临时修改测试对象仓库中对象的属性,无法实现对程序中手工输入文本的操作。

    现在将程序界面回复初始状态,如图1,并修改脚本,如图2,运行后程序界面如图3,结果如图4

    从图3可见,脚本实现了向应用程序中输入文本的操作,并且从图4可见,整个测试运行是成功的。

    图1

    图2

    图3

    图4

    现总结如下:

    使用测试对象的SetToProperty方法,可以临时改变仓库中对象的属性,对程序中的对象没有任何作用;使用测试对象的Object属性,可以改变程序中对象的属性,对于对象仓库中的对象没有任何作用。

    当程序中的对象属性发生变化时,就需要对对象仓库中的测试对象的属性进行相应的修改,否则会导致RunTime属性与测试对象属性不一致。如果程序中有多个对象,其实可以合并为一个对象,因为它们除了某项识别属性值不同以后,其它所有的识别属性都相同,对于这种情况,可以只在仓库中保留一个对象,然后对该对象进行参数化。

    如果希望改变应用程序中对象的属性值,应该通过“Object.object”方法,来改变对象的Run-time属性。

  • QTP疑难问题解答(不能识别对象etc...)

    2007-05-22 13:40:01

     

  • 1.      运行错误:不能识别对象(Cannot identify object

    出现了这个错误时,就表示当前被测程序的窗口中没有符合条件的对象。

    出现这种错误,可能的原因有以下两种:

    l         对象此时在程序中没有显示或不存在。

    l         在程序中存在该对象,但是它的描述在后来发生了改变,导致与对象仓库中存储的信息不匹配,从而QTP无法识别对象。

    如果你正遇到“Cannot identify object”的问题,解决方法见1.1

     

    1.1 如何去识别对象描述(Idenfirying Test Object Descrīption Problems

    如果你能在被测程序中看到对象,但仍出现了“Cannot Identify Object”错误信息,这就表示仓库中对象的描述与程序中对象的描述一定存在着差异。

    解决对象描述问题的第一步是找到差异,最简单的方法是将仓库中对象的属性值与程序中对象的属性值进行比较。(仓库中对象的属性值可在Object Repository窗口中查看,程序中对象的属性值可用Object Spy功能查看。)

    比较仓库中对象的属性值与程序中对象的属性值的操作见1.3

    在完成比较后,是否发现存在差异?

    如果是,请参考1.4

    如果否,请参考1.5

     

    1.2 处理对象丢失问题(Solving Missing Object Problems

    在运行脚本时,QTP偿试进行某种操作,而该操作的对象在程序中却没有出现,出现这种情况的原因有以下几种:

    l         对象不再存在。对象已经被从程序中删除。

    解决方法:见1.2.1

    l         对象还没有装载。

    解决方法:见1.2.2

    l         当前的程序页面(或窗口)不正确,不是对象所在的页面(或窗口)。

    解决方法:见1.2.3

    l         前一个步骤没有正确执行。

    解决方法:见1.2.3

    1.2.1 解决对象不再存在的问题

    如果对象已经不再在被测程序中存在,则应在脚本中修改或删除相关步骤。

    1.2.2 解决对象装载超时的问题

    如果对象丢失的原因是因为没有足够的时间装载,偿试以下解决方案:

    a.对于Web对象,增加Browser Navigation TimeoutFile>Setting>Web页签)时间。

    b.在包括该对象的步骤前使用Wait语句,让QTP在执行该步骤之前等待一段时间。

    1.2.3 检查前面步骤的执行情况

    如果是因为打开了错误的页面(或窗口)导致对象丢失问题,或因为前一步骤执行措误导致对象丢失问题,则请按以下方法检查原因:

    a. 如果怀疑在完成脚本后,被测程序又发生了改变,则检查对象的继承关系以及对象描述。参考1.1

    b. 如果怀疑脚本错误,则检查脚本的每一个步骤。你可能是遗失了某个步骤,也可能是使用了不正确的方法或参数。

     

    1.3 测试对象的属性值与Run-time对象的属性值的比较(Comparing Test Object and Run-Time Object Property Values

    根据以下的步骤比较测试对象与Run-time对象的属性值:

    1)  进入Obecjt Repository窗口(Resources>Object Repository),选择对象。

    2)  用笔记下对象的class以及它的各个属性及属性值。

    3)  打开被测程序,并打开包含被测对象的页面或窗口。

    4)  QTP中选择菜单Tools>Object Spy或点击Object Spy按钮,打开Object Spy对话框。

    5)  选择“Test Object Properties”选项。

    6)  点击右上角的按钮(带有手图标的),这时QTP窗口以及Object Spy对话框都被最小化。

    7)  在程序页面(或窗口)中点击目标对象,恢复Object Spy对话框,并在对话框中显示对象及其父对象(以树的形式显示),并在Properties页签中显示当前对象的属性及属性值。

    8)  这时Object Spy对话框的Properties页签中显示Run-time对象的所有属性,在此查看对象的class,以及它的属性及属性值,并将它与第2步中记下的内容进行比较。

     

    1.4 解决对象描述存在的问题(Solving Object Descrīption Problems

    如果发现仓库中对象的属性值与程序中对象的属性值存在不同,你应该判断这个不同是个别对象的问题,还是其它同类对象也存在相同的问题。

    是所有(或多个)同类对象都存在问题吗?

    如果是,则参考1.6

    如果否,则参考1.7

     

    1.5 关于父对象描述的识别问题(Identifying Parent Object Descrīption Problems

    对象的识别还与它所继承的父对象有关。

    如果你能在被测程序中看到对象,而且程序中对象的属性值与仓库中对象的属性值也是一致的,但仍然遭遇到了“Cannot identify object”错误,则这个错误可能与它的父对象有关(如仓库中父对象的属性值与程序中父对象的属性值不一致),也可能是仓库中的对象与程序中对象的继承关系不相同导致的。

    要判断是继承关系中的哪个父对象出现了问题,请偿试下面的方法之一:

    l         重新录制对象,比较新旧对象的父对象。

    欲了解如何完成比较,参考1.8

    l         对继承关系中的每个父对象,分别插入一个Exist语句,并运行该部分脚本。

    欲了解如果创建Exist语句,参考1.9

    注:你也可以使用Object Repository窗口中的Highlight in Application功能,在被测程序中定位对象。

    一旦找到了存在问题的父对象,接下来偿试以下方法:

    l         修复存在问题的父对象的描述。方法见1.4

    l         在专家视图的模式下,查找所有继承存在问题的实例并进行修正。

    举例:1.8.1

     

    1.6 解决某类对象的识别问题(Soving Object Identification Problems for a Test Object Class

    如果你发现某类对象的对象描述对于被测程序来说都不是很合理,或你预期到对象描述中的某属性值是经常变化的,你可以在Object Identification对话框中改变该类的识别属性的设置,或定义该类的Smart Identification设置并启用Smart Identification机制,这样QTP就可以唯一识别对象了。

     

    1.7  解决单个对象的描述问题(Solving Individual Test Object Descrīption Problems

    选择下列方法之一来解决对象的描述问题:

    l         如果被测程序中对象描述发生了改变,并且你也清楚改变的内容,并且该改变是永久性或长期性的,你可以直接手工修改仓库中对象描述中的相关属性值。

    l         如果被测程序中的对象的属性值依赖于前面的步骤或其它对象,则将该属性值参数化,这样就可以使用其它步骤的输出值为属性值。

    l         如果属性值的组成部分中,部分是固定的,部分是动态改变的,则可以将属性值设计为正则表达式。

    l         如果属性值是遵循某种规则变化的,或者是不可预期的,则从对象描述中移除该属性,并向对象描述中添加一个或多个属性以便于QTP进行对象识别。

    l         If you can only access the information on the property values during the run session, you can create and use functions that use programmatic descrīptions to identify the object using property values retrieved earlier in the run session.

    l         如果在录制过程中对象是唯一的,但现在程序中出现了两个或多个描述相同的对象,但是它们在页面(或窗口)中的位置不相同,则应在Object PropertiesObject Repository窗口中,向对象描述中添加一个ordinal identifierindexlocation)。

     

    1.8 重新录制对象,以判断父对象描述是否存在问题(Re-recording an Object to Identify Parent Object Descrīption Problems

    根据下面的指引,来判断父对象的问题。

    通过重新录制对象,来判断它的父对象是否存在问题:

    1) 打开浏览器或程序,来到包含被测对象的页面或窗口。

    2) 在关键字视图模式,选择最后一个组件(component),或在专家视图模式,将光标放在最后一个脚本步骤的下面。

    3) 点击Record按钮,或选择Automation>Record

    4) 点击(或操作)页面或窗口中的目标对象。

    5) 点击Stop按钮,或选择Automation>Stop,完成步骤添加。

    6) 右击新添加的步骤,并选择Object Properties右键菜单。

    7) Object Properties对话框中,点击Repository,打开Object Repository窗口,并选中了新对象。注意记下该对象的继承关系。

    8) Object Repository窗口中找到旧的对象(即存在问题的对象),将它的继承关系与新对象的继承关系进行比较。

    通过比较,可以检查到新旧对象是父对象的描述存在不同,还是它们的继承关系根本就不同。

    a. 如果是父对象的描述问题,则修改父对象的描述。参见1.4.

    b. 如果是对象的继承关系不正确(即具有不同的父对象)引起的问题,则在脚本中找到所有使用该继承关系的实例,将它们替换为正确的继承关系。

    举例:参见1.8.1

     

    1.8.1 举例

    假设有一个带有Frame的网站,你录制了一个操作针对Image对象“Poster”的操作步骤。在Object Repository窗口,你可以Image对象的继承关系如下所示:

    MyCompanyBrowser

        MyCompanyPage

            Main(Frame)

                 Poster(image)

    当你运行脚本时,网页看起来没有什么不同,但是识别Image对象时却出现了“Cannot identiry object”的错误提示。当你重新录制操作步骤,然后在Object Repository窗口中查看新的Image对象时,发现该对象的继承关系如下所示:

    MyCompanyBrowser

        MyCompanyPage

             Poster(image)

    从中可以看出,Frame已经从Web Page中移除,所以尽管Image对象“Poster”的描述没有发生任何改变,但它的继承关系已经改变了。

    Object Repository窗口,你可以看到新旧Image对象“Poster”是两个完全不同的对象:旧的位于已经被移除的Frame对象之下,而新的则直接位于PageMycompany”对象之下。

    修复这个问题,可以在脚本步骤中将旧的对象替换为新的对象。

    为了保持Object Repository窗口的整洁,你应删除那些已不再存在的对象(如本例中的Frame)。

     

    1.9 创建Exist语句,以判断父对象的描述是否存在问题

    QTP在录制发生在某个对象上的操作时,也会同时去了解对象以及它的继承关系。因此,如果在运行过程中,QTP不能识别继承关系中的任何一个父对象,都会导致目标对象的识别失败。

    使用带有Exist方法的Msgbox语句,可以方便的检查出是继承关系中的哪个父对象出现了问题。

    假设在运行下面脚本时,你遇到了“Cannot identify Object”错误信息(但是可以确定对象仓库中Link对象的描述与当前程序中对象的描述是完全一致的):

    Browser("Yahoo!").Page("Yahoo!").Link("Arts & Humanities").Click

    你可以在该语句前面插入以下语句:

    Msgbox Browser("Yahoo!").Exist

    Msgbox Browser("Yahoo!").Page("Yahoo!").Exist

    Msgbox Browser("Yahoo!").Page("Yahoo!").Link("Arts & Humanities").Exist

    然后你从头开始运行脚本,发现第1行语句运行成功,并且弹出信息框,内容为“True”。

     

    但是,当QTP运行到第2步时,就弹出信息框,内容为“False”,表示不能找到Page object。这就证明Page对象存在问题。

    确定了出现问题的父对象以后,修复该问题。参见1.4

  • 2.      运行错误:对象不唯一(The object is not unique

    在被测页面或窗口中的同一父对象下,找到多个与仓库中对象描述相符的Run-tim对象。

    请确定是只有个别对象存在此问题,还是此类对象的所有对象(或部分对象)存在此问题。

    此类对象的所有对象(或部分对象)都存在此问题吗?

    如果是,参考2.1

    如果否,参考2.2

     

    2.1 为某对象类设置能唯一识别对象的描述规则(Configuring Unique Test Object Descrīptions for a Test Object Class

    如果你发现某类对象的对象描述都不足以唯一识别对象,你可以在Object Identification对话框中,改变该类的识别属性的设置,或定义该类的Smart Identification设置并启用Smart Identification机制,这样QTP就可以唯一识别对象了。

     

    2.2 设置通唯一识别对象的对象描述(Creating a Unique Test Object Descrīption for an Object

    查看当前对象的描述,并偿试在程序中找到其它具有相同描述的对象并查看它们的描述。

    l         如果你找到了可以将它们区别开来的一个或多个属性,则修改仓库中对象的相关属性(如向描述中添加属性等),以使QTP在运行时可以唯一识别它。

    l         如果它们的识别属性完全相同,则在对象描述中为对象添加一个ordinal identifierindexlocation)。

     

    3.      运行错误:找不到父对象(Parent not found

    识别对象时,会先识别它的父对象是否正确。如果遇到“Parent not found”的错误信息,请偿试以下解决方法:

    l         修复出现问题的父对象的描述。参见1.4

    l         在脚本中找到继承关系不正确的实例,并修改为正确的继承关系。例如1.8.1

     

    4.      运行错误:无效的参数(Invalid arguments

    一个或多个方法的参数是无效的。

    参数无效可能是参数类型错误,也可能是参数个数不正确。

    根据以下建议,找到方法的正确语法:

    l         Keyword模式,如果方法包括参数,则在Value栏会显示该方法的参数提示。

    l         Expert模式,如果方法包括参数,则当你插入方法然后按下Shift+Ctrl+Space键时,QTP会显示该方法的参数的提示信息。(注:只有在Editor Options对话框的General页签中打开了Statement completion功能时才可以看到参数的提示信息。)

    5.      运行错误:不能识别itemCannot identify item

    QTP不能识别方法参数中指定的列表或树对象的item时,请确认指定的item是否存在于对象之中。

    l         如果item不存在,则删除相关脚本步骤,或修改item

    l         <SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-ansi-lang

  • QTP学习指南

    2007-05-22 13:22:51

    1.         介绍

    使用QTPautomation object model,可以对QTP进行自动化编程,从而自动对QTP进行选项设置、自动运行测试(或组件),而无需使用QTP界面手工进行这些操作。

    如果要重复多次的完成同一项工作任务,或重复多次运行同一测试(或组件),或需要快速配置QTP选项,则QTP的自动化编程是非常有用的。

    本部分内容包括:

    自动化QTP操作

    决定什么时候使用QTP自动化编程

    选择设计或运行自动化程序的语言与开发环境

    了解自动化程序的基本元素

    创建自动化程序脚本

    1.1.       自动化QTP操作

    使用QTPAutomation Object Model进行自动化编程,实现QTP操作的自动化。QTPAutomation Object Model提供了objectsmethods、以及properties,使我们可以在其它的应用程序中控制QTP的操作。

    1.2.       决定什么时候使用QTP自动化编程

    我们使用QTP设计测试(或组件),创建一个有用的自动化程序也需要一个计划、设计、测试的过程。

    下面是几个实用的QTP自动化编程的例子:

    l         Initializtion programs(初始化编程)-你可以编写一个程序,来自动地启动QTP,配置操作选项及录制设定。

    l         Maintaining your tests or components(维护测试或组件)-你可以编写一个程序,作用于一系列已有的测试或组件上,以统一达到某一目的。例如:

    n         Updating values-使用合适的插件环境打开每个测试或组件,并以update的模式运行它(当然必须对应相应的已升级的被测应用程序),然后保存测试或组件以保存更新后的值。

    n         Applying new options to existing tests of components(对已有的测试或组件应用新的操作选项)-当QTP版本升级以后,你可能发现有某些新的选项设置可应用到当前已有的测试或组件中。你可以编写一个程序,打开每个已有的测试或组件,为它们设置新的选项设置,然后保存并关闭它。

    l         Calling QuickTest from other application(在其它应用程序中调用QTP)-You can design your own applications with options or controls that run QuickTest automation programs. For example, you could create a Web form or simple Windows interface from which a product manager could schedule QuickTest runs, even if the manager is not familiar with QuickTest.

    1.3.       选择设计或运行自动化程序的语言与开发环境

    现有多种面向对象的编程语言,可用于实现QTP的自动化编程。对于每种语言,都有多种开发环境的支持,在该开发环境中,可用以设计或运行自动化程序。

    编写自动化程序

    你可以在任何一个支持automation的语言与开发环境中编写QTP自动化程序,如VBscrīptJavascrīptVisual BasicVisual C++Visual Studio.NET等等。

    有的开发环境support referencing a type libraryA type library是一个二进制文件,包括了对象模型的描述、界面、以及其它定义。

    如果你选择的环境support referencing a type library,在你编程的过程中,你就可以享受到以下好处,如智能提示的功能、语句自动完成的功能、在状态栏显示帮助提示的功能。QTPautomation object model提供了一个type library文件,文件名为QTObjectModel.dll,这个文件存储于QTP安装目录的bin目录下。

    如果你选择了一个support referencing a type library的开发环境,在编写或运行程序之前,确保装载了QTPtype library。例如:如果你选用了Microsoft Visual Basic,在Microsoft Visual Basic的菜单中选择Project>References,打开References对话框,然后选择QuickTest Professional<版本号>Object Library

    运行自动化程序

    很多应用程序都可以运行自动化程序,你甚至可以在命令行使用WSH来运行自动化程序。

    例如:Wscrīpt.exe /E:VBscrīpt myscrīpt.vbs

    1.4.       了解自动化程序的基本元素(Element

    与大部分automation object modes一样,QTPautomation object model根对象Application对象。这里的Application对象代表QTP应用程序。使用它,可以返回其它QTP元素如Test对象(它代表一个测试或组件文件)、Options对象(它代表Options对话框)、Addins集合(它代表Add-in管理对话框中一系列的add-in)等,并可以完成以下操作如装载add-in、启动QTP、打开并保存测试或组件、以及关闭QTP

    Application对象返回的每一个对象,又可以返回其它对象,以完成其它与该对象相关的操作,并获取(或设置)与该对象相关的属性值。

    每个自动化程序从创建QTP Application对象开始,创建此对象并不是启动QTP,它仅仅是提供一个对象,以便于你从该对象获得通道,以通向其它QTP automation object model的对象、方法以及属性。

    如果你在程序中需多次的启动或退出QTP,你可以只创建一个Application对象实例,而不必多次创建QTP Application对象。

    1.4.1.       创建Application对象

    对于不同的语言,创建Application对象的过程稍有不同。下面例子中,是使用VBscrīpt语言,实现创建Application对象,并以visible的模式打开QTP程序的操作。

    Dim qtApp

    Set qtApp=CreateObject(“QuickTest.Application”)      创建Application对象

    qtApp.Launch                                    启动QTP

    qtApp.visible=True                                设置QTP为可见模式

     

    1.4.2.       建设自动化程序的其它部分

    如何建设自动化程序的其它部分,与你的编程目标有关。

    在启动QTP之前,你可以完成一些其它操作,如获取相关的add-in、装载add-in、并指导QTPvisible模式打开QTP等。

    当完成这些预备步骤后,如果QTP还没有被打开,你可以使用Application.Launch方法打开它。自动化程序的其它操作一般都是位于Launch方法之后。

    当完成这些必需的操作之后,或你想要实现的操作需要关闭并重新启动QTP如修改插件的装载),则使用Application.Quit方法。

    1.4.3.       在远程电脑中运行自动化程序

    默认情况下,当你在自动化程序中创建一个Application对象时,该对象创建于本地电脑中(使用QTP的本地副本)。你也可以选择在远程QTP电脑中运行自动化脚本。为了实现这个目标,你必须:

    l         确保远程电脑的Distributed COMDCOM)配置属性已设置为允许你运行QTP自动化脚本。

    l         在自动化程序的创建Application对象的脚本行,指定远程电脑的名称,例如在VBscrīptCreateObject函数中使用可选参数location

     

    名词:COM-组件对象模型。COM提供了一套允许同一台计算机上的客户端和服务器之间进行通信的接口。

    DCOM-分布式组件对象模型。是一系列微软的概念和程序接口,利用这个接口,客户端程序对象能够请求来自网络中另一台计算机上的服务器程序对象。

    设置远程电脑中的DCOM配置属性

    要在远程电脑中运行自动化程序,必须确保在远程电脑的DCOM设置中,给了你装载及设置QTP COM 服务器的权限。

    下面描述了在远程电脑中设置DCOM的过程。注意因为远程电脑的操作系统的不同,DCOM配置对话框中显示可能不同。

    (下面的图片都是WinXP操作系统中的):

    1.         在远程电脑中,选择Start>Run,打开Run对话框。

    2.         在命令栏输入“dcomcnfg”后,点击OK,打开DCOM配置对话框或组件服务窗口(这与操作系统有关),并显示当前电脑中有效的COM应用程序。

    3.         在列表中选择“QuickTest Professional Automation”,打开属性对话框。

    4.         QuickTest Professional Automation对话框中,选中Security(安全)页签。

    5.         在“launch permissions”(启动和激活权限)部分,选择custom(“自定义”)选项,然后点击EDIT(“编辑”)按钮。

    6.         使用AddRemove操作选择网络用户或组,让用户或组就可以在本地电脑中通过自动化程序,远程让QTP脚本在本电脑上运行。当完成设置用户或组后,点击OK保存设置。

    7.         重复56步,设置“configuration permissions”部分,设置用户或组,让用户或组可以通过自动化程序,远程修改本电脑的QTP的选项配置。

    8.         QuickTest Professional Automation对话框中,点击Identity(标识)页签,选择interactive user选项。

     

    9.         点击OK保存QuickTest Professional Automation属性设置。

    10.     点击OK关闭DCOM配置对话框,或关闭组件服务窗口。

    在远程电脑中创建Application

    当远程电脑的DCOM设置完成后,你就可以在自动化程序中指定该远程电脑。

    VBscrīpt中,你可以在CreateObject函数的可选参数location中指定远程电脑名称。例如:在一个名为MyServer的远程电脑上运行自动程序,你可以编写以下脚本:

    Dim qtApp

    Set qtApp=CreateObject(“QuickTest.Application”,”MyServer”)

    1.5.       创建自动化程序脚本

    Test Setting对话框中的Properties页签、Options对话框的General页签、以及Object Identification对话框中,都有一个Generate scrīpt按钮。点击此按钮可以生成一个自动化脚本文件(.vbs),该文件包含了相关对话框的当前设定。

    你可以运行这些脚本,运行该脚本可以打开QTP,并且QTPOptions设置使用的是脚本中的设置;你也可以将脚本中的内容复制到你自已的自动化脚本中。

    例如,你在Options对话框中通过Generate scrīpt功能创建了一个脚本,脚本的内容应该是下面这样的:

    Dim App 'As Application

    Set App = CreateObject("QuickTest.Application")

    App.Launch

    App.Visible = True

    App.Options.DisableVORecognition = False

    App.Options.AutoGenerateWith = False

    App.Options.WithGenerationLevel = 2

    App.Options.TimeToActivateWinAfterPoint = 500

    ...

    ...

    App.Options.WindowsApps.NonUniqueListItemRecordMode = "ByName"

    App.Options.WindowsApps.RecordOwnerDrawnButtonAs = "PushButtons"

    App.Folders.RemoveAll

     

  • [Quote]QTP学习的一些技巧

    2007-05-22 13:13:24

    1.在测试中我们使用QTP调试脚本的时候一般就是DEBUG或者MSGBOX察看一些信息,其实有时候也可以使用print来实现批量的察看信息但是不影响程序运行.
    运行脚本:
    a="100"
    print a
    ~~~~~~~~~~~~~~~~~~~~~~~~~
    2.取datatable特定行的数据可以这样使用
    运行脚本:
    DataTable.GetSheet("Action1").GetParameter("test").ValueByRow(4)
    ~~~~~~~~~~~~~~~~~~
    3.Wait Seconds [, Milliseconds]可以精确到毫秒.
    ~~~~~~~~~~~~~~~~~~
    4.在自定义的function里面数组作为返回值.
    运行脚本:
    circuit = "399937"
    Function trimString(circuit)
    Dim holdArray(5)
    holdArray(0) = Left(circuit, 2)
    holdArray(1) = Right(circuit, 2)
    msgbox holdArray(0) 'showed 39
    trimString = holdArray' I get an out of range error here
    End Function
    dim myArray
    'here I want to assign the return array to another array
    myArray = trimString(circuit)
    ' and then call one element from it
    msgbox myArray(1)
    ~~~~~~~~~~~~~~~
    5.计算一个操作的时间.
    运行脚本:
    Browser("Browser").Page("Page").Image("getRates").Click
    var_StartTime = Timer
    Browser("Browser").Page("Page").Sync
    Browser("Browser").Page("Page").Check CheckPoint("Check1")
    var_EndTime = Timer
    intRespTime = round ((var_EndTime - var_StartTime), 2 )
    msgbox (intRespTime)

  • [Quote]QTP Timeout Settings

    2007-05-22 13:09:11

    1.      Object Sync Timeout:这是QTP在等待一个对象显示的时间

    具体设置方法: Test Settings, Run Tab, the “Object Synchronization timeout:” setting.

    请注意在8.x版本中单位是毫秒,而在9.x 就变成秒了。

    程序中设置: Setting(“DefaultTimeout”) [=milliseconds]

    2. Browser Navigation Timeout
    帮助里这样定义 “sets the maximum time (in seconds) that QuickTest waits for a Web page to load before running a step in the test”. 那和上面的Object Sync Timeout setting有什么区别的,MI没有说,我猜想是在测试一个显示很缓慢的页面的时候使用吧。针对Navigation而不是一个对,从脚本看:

    Browser(“Browser”).Page(“Page”).WebRadioGroup(“Name:=txt_Name”,”html tag:=INPUT”).set “Test”

    这可能是一开始Browser的等待时间吧。

    具体设置方法: Test Settings, Web tab, “Browser navigation timeout:” X “seconds”

    在程序中怎么实现还没有解决,谁可以帮助我?

    3. Default Load Time
    QTP help 这样定义Instructs QuickTest to add a specified number of seconds to the page load time property specified in each Page checkpoint.”. 很迷惑,按照帮助的理解就是检查点额外的等待时间,过了这个时间再没有出现检查的数据可能就会返回错误了。
    具体设置方法: Options, Web Tab, “Add” x “seconds to page load time”
    程序中设置: Setting(“DefaultLoadTime”) [=seconds]

    4. Activate Window
    定义“specifies the time (in tenths of a second) that QuickTest waits before it sets the focus on an application window when using the pointing hand to point to an object in the application (for Object Spy, checkpoints, Step Generator, Recovery Scenario Wizard, and so forth)”. 我一直使用的默认的值,挺好的。呵呵。
    具体设置方法: Options, General tab, “When pointing at a window, activate it after” X “tenths of a second”
    程序中设置,暂无。

    5. .Exists(Timeout)
    用的是毫秒作为单位.

    6.  .WaitProperty(x, y, Timeout)
    用的是毫秒作为单位.

    7. Wait seconds [, milliseconds]

    这个就是我们经常用的wait,不过后面可以选择毫秒可能有的人就不知道了。

     

     

    以上是我总结的一些QTP关于时间的设置的,很多概念自己也不算清楚,希望和大家一起在学习中进步。

  • (转)QTP中的descriptive programming

    2007-05-22 12:59:50

     

    【摘要】自动化功能测试是一种企业级的用于检验应用程序是否如期运行的功能性测试工具。通过自动捕获,检测,和重复用户交互的操作,能够辨认缺陷并且确保那些跨越多个应用程序和数据库的业务流程在初次发 布就能避免出现故障,并且保持长期可靠运行。在市场上用的比较多的主要包括Mercury公司的WinRunner,QuickTest Professional和IBM的Rational Robot。笔者对于QuickTest Professional相对较为熟悉,希望有机会向大家逐步介绍QuickTest Professional中的一些要点及技巧。在本文里主要介绍了QuickTest Professional中的一项核心内容Descrīptive Programming,希望对大家有所借鉴和帮助。在文中,为了方便起见,将QuickTest Professional简称QTP。(本文是基于Quick Test Professional V8.0而写)。

    【关键词】

    描述性编程Descrīptive Programming

    功能测试Functional Test

    专家视图Expert View

    关键字视图Keyword View

    对象模型Object Model

    运行时对象Run-Time Object

    测试对象Test Object

    【正文】

    .QTP功能测试基本方法

    我们简单介绍一下有关功能测试的基本方法,这实际上对于所有自动化功能测试产品来说都是一样的。一般情况下,用QTP来进行功能测试的基本方法主要包括三个主要阶段:

       

    1、创建测试或组建

    首先可以通过在应用程序或网站上录制会话,或者建立对象库并使用关键字驱动功能向关键字视图中手动添加步骤来创建测试或组件。在QTP里面我们可以通过两种方式添加步骤来创建测试或组件:

    • 在应用程序或网站上录制会话。
    • 建立对象库并使用这些对象在关键字视图或专家视图中手动添加步骤

    然后在在测试或组件中插入检查点,检查页面、对象或文本字符串中的特定值或特征,通过它可以标识网站或应用程序是否正常运行。或是通过用参数替换固定值扩展测试或组件的范围。提供数据表中的数据,定义环境变量和值,定义测试、组件或操作参数和值,或者使用QTP生成随机数字或当前用户和测试数据等。

    最后如果需要的话使用QTP中众多的功能测试功能来增强测试或组件或添加编写语句来实现更复杂的测试目标。

    2、运行测试和组建

    控制运行会话,帮助标识和消除测试或组件中的缺陷。使用“单步执行”、“单步跳过”和“单步退出”命令逐步运行测试或组件,或设置断点使测试或组件在预定点暂停。每当测试或组件在断点处停止时,可以在“调试查看器”中查看其变量的值。

    3、分析结果

    在运行测试或组件之后,通过两种方式可以查看其结果:在“结果”窗口中查看结果;自动报告在运行会话过程中检测到的缺陷,可能的话并上报到其他缺陷管理产品中。

    .试图与对象模型

    在介绍QTP中的Descrīptive Programming前,我们有必要先介绍一下ExpertView及在ExpertView里进行编码的一些基本知识。

    在QTP里面提供了两种视图,第一种我们把它称为KeywordView(关键字视图,在早期的版本中称为TreeView),第二种把它成为ExpertView(专家视图),这两种视图分别是针对两种类型的人进行使用的。

    1、KeywordView(关键字视图)

    通过关键字视图,QTP提供了一种模块化的表格格式创建和查看测试或组件的步骤。每个步骤在关键字视图中都是一行,这样用户可以轻松的修改任何一部分组成。

    在录制会话过程中,用户在应用程序上执行的每个步骤在关键字视图中记录为一行。例如,在51testing的页面上执行的下列三个步骤:

    • 在“用户名”编辑框中输入 zhoda02。
    • 在“密码”编辑框中输入加密字符串 41c630a213508cd49eb35089db1b893144b9。
    • 单击“登录”按钮。

    那么,关键字视图将包含下列行:

       

    很显然,关键字视图非常直观有效,使用的人可以很清晰的看到被录制对象的录制层次及运行步骤,比较适合那些对于业务操作流程熟悉的人员使用。但是,如果需要一些增强型的操作,那就需要切换到专家视图里进行了。

    2.ExpertView(专家视图)

    QTP在关键字视图中的每个节点在专家视图中对应一行脚本。上面例子对应的脚本如下:(删除后一句是因为前后重复,一句可以说明问题)

    Browser("51Testing软件测试网:软件测试的专业网站").Page("51Testing软件测试网:软件测试的专业网站").WebEdit("username").Set "zhoda02"

    Browser("51Testing软件测试网:软件测试的专业网站").Page("51Testing软件测试网:软件测试的专业网站").WebEdit("password").SetSecure "41c630a213508cd49eb35089db1b893144b9"

    Browser("51Testing软件测试网:软件测试的专业网站").Page("51Testing软件测试网:软件测试的专业网站").WebButton("登录").Click

    对于QTP来说,其核心编码语言是Visual Basic scrīpt,因此,如果用户熟悉VBscrīpt,可以运用自如的添加和更新语句,并通过编程方式增强测试和脚本,而这一切必须在专家视图中完成。

    更为重要的是,有些操作是必须在专家视图中才可以完成的,例如:要处理动态对象、客户化报告、获取对象运行时的属性值(Run-time Value)等等,这些都必须通过专家视图中的VBscrīpt编码完成。

    然而,QTP里所有的操作都是基于对象进行的,所以我们必须对对象模型有一个基本了解,才可以在专家视图内进行Descrīptive Programming。

    3、测试对象模型

    测试对象模型是一大组对象类型或类,QTP用这些对象类型或类来表示应用程序中的对象。每个测试对象类都有一个可以唯一标识属于该类的对象的属性列表,以及一组 QTP可以对其进行录制的方法。它包括测试对象(Test Object)和运行时对象(RunTime Object)。

    测试对象是QTP在测试或组件中创建的用于表示应用程序中的实际对象的对象。QTP存储有关该对象的信息,这些信息有助于它在运行会话期间标识和检查该对象。

    运行时对象是网站或应用程序中的实际对象,在运行会话期间执行针对该对象的方法。

    如果录制时执行应用程序的相应操作,则一般情况下QTP将完成以下操作:

    • 标识 QTP测试对象类(表示执行了操作的对象),并创建相应的测试对象
    • 读取应用程序中对象属性的当前值,然后将属性和属性值列表与测试对象一起存储。
    • 选择该对象的唯一名称,一般使用该对象某个重要属性的值。
    • 使用适当的 QPT 测试对象方法录制对对象执行的操作。

    例如,假定使用以下 HTML 源代码单击“查找”按钮:

    <INPUT TYPE="submit" NAME="Find" VALUE="Find">

    QTPl将单击的对象标识为 WebButton 测试对象。它将创建一个名为 Find 的 WebButton 对象,然后为该 Find WebButton 对象录制下列属性和属性值,同时还会录制对WebButtion的Click方法。

       

    在关键字视图及专家视图中显示内容分别为:

       

    Browser("Mercury Interactive").Page("Mercury Interactive").WebButton("Find").Click

    运行测试或组件时,QTP通过其测试对象类及其描述(一组用于唯一标识该对象的测试对象属性和属性值)来标识应用程序中的每个对象。测试对象及其属性和属性值的列表存储在对象库中。例如在上例中,QTP将在运行会话期间在对象库中搜索 WebButton 对象,通过名称 Find 来查找其描述。QTP根据找到的描述,在应用程序中查找 WebButton 对象,该对象带有 HTML 标记 INPUT、类型为 submit、值为 Find。找到对象后,它将对其执行 Click 方法。

    在这样一组对象模型的基础上,QTP为各类应用对象都提供了一组方法和属性,例如Web Objects,Windows Objects,SAPGUI Objects,ActiveX,Java等。下面是一些Web Objects的方法和示例:

    对象 方法
    Browser

    Check

    Frame

    Click

    Image

    Exist

    Link

    GetCellData

    Page

    GetProperty

    WebArea

    GetROProperty

    WebButtion

    Mouseover

    WebCheckBox

    RowCount

    WebEdit

    Select

    WebList

    Set

    WebRadioGroup

    SetProperty

    WebTable Submit

    例1:获取单元格中的值

    thisText = Browser(…).Page(…).Frame.(…).WebTable("sample").GetCellData(2,1)

    例2:获取图片的名称

    ObjectName = Browser(…).Page(…).Image("Find").GetProperty("Name")

    例3:检查某个对象是否存在,如果存在弹出对话框说明对象存在。

    If Browser("Browser").Page("Page").Applet("login.html").JavaEdit("username").Exist Then

    MsgBox("The object exists.")

    End if

    .描述性编程(descrīptive programming)

    1、descrīptive programming概述

    通常情况下,当在录制一个操作时,QTP会将被操作对象加入到对象库里(Object Repository)。一旦对象存在于对象库里,我们就可以在专家视图里通过添加相关的对象方法来对该对象进行操作。我们可以通过引用层次型对象库里的对象描述(Object Descrīption)来添加相应的方法。

    因为QTP对象库中的每个对象都具有唯一名称,所以在引用时对象名是必须需要指定的。然后在测试运行期间,QTP在对象库中根据这个对象的名称和父对象来查找对象,并使用为这个测试对象存储的测试对象描述,在网站或应用程序中标识该对象。

    例如我们用QTP录制Yahoo Mail登录情况时我们需要输入用户名,于是在录制时我们就会录下一个WebEdit对象,它的缺省逻辑名为“login”,该编辑字段位于名为 “Yahoo! Mail - The best” 的页面上,并且该页面在浏览器中使用名称 Yahoo!进行录制。如图所示,即为录制时的对象库的内容:

       

    那么如果我们想要应用该对象,就可以在专家视图输入以下信息:

    Browser("Yahoo!").Page("Yahoo! Mail - The best").WebEdit("login").Set “xxx”

    或者我们也可以调用一些方法,获取改对象在运行时的对象名,如:

    Browser("Yahoo!").Page("Yahoo! Mail - The best").WebEdit("login").GetROProperty(“name”)

    然而,我们可以发觉到,上面的例子在处理对象时,对象已经存在于对象库里,因此我们可以应用这个对象的逻辑名。实际使用中,情况往往并非如此简单,我们经常会遇到很多在页面上动态产生的对象,换而言之,对象库里没有这些对象,我们也无从引用。因此我们必须采用其他的技术来完成这类操作,这也就是我们需要讲解的Descrīptive Programming。

    为了满足上面提到的动态对象的处理问题,QTP允许用户通过将对象属性编码到测试脚本里来动态识别对象,这就是我们通常意义下称为的Descrīptive Programming。通过这种方式,我们可以指示QTP不通过引用对象库和对象名来对实际对象进行操作。具体操作中,我们只需要为QTP提供对象的一组属性和值,这样QTP就可以来识别相应的对象并对其进行操作。这相当于,告诉QTP要识别对象的一些关键特征,根据这些特征QTP就可以一一匹配然后识别出来这个对象。

    而且,更为重要的是,通过这种Descrīptive Programming的方式,还可以让QTP识别具有某些相同属性的对象。我们先来举个例子来看一下:我们假设当前的Windows系统中打开了若干的Yahoo主页面(多于一个),现在我们要关闭所有的正在浏览Yahoo主页面的浏览器。

    对于上面那个例子来说,我们先看一个简单一点的情况,假设只有且仅有一个Yahoo主页面:那么我们可以用下面的方法来

    Window("Text:=Yahoo! - Microsoft Internet Explorer").Close

    我们可以看到语句里我们要查找的对象是Window窗口标题为“Yahoo! - Microsoft Internet Explorer”,然后把它关闭,具体的语法说明我们稍后为解释。但是上面的语句仅仅适合前面提到的条件“只有且仅有一个Yahoo主页面”,如果有多个同样的窗口就会出错,原因是通过语句可以匹配到多个对象,而QTP不知道应该对哪个对象进行关闭动作。我们需要进一步的缩小匹配范围:

    Dim i

    i = 0

    while (Window("Text:=Yahoo! - Microsoft Internet Explorer", "index:="&i).exist)

    Window("Text:=Yahoo! - Microsoft Internet Explorer", "index:="&i).close

    i = i +1

    wend

    这里我们可以看到,对于具有相同属性的对象,我们可以通过index参数来对其进行区别,第一个对象为index=0,第二个为index=1等等,依次类推。当然我们还可以通过CreationTime和Location参数来定位对象,这里就不详细叙述了。

    通过上面的例子,我们对Descrīptive Programming有一个基本了解了,下面我们详细讲解一下Descrīptive Programming:在具体实现中,我们有两种类型的Descrīptive Programming方法。可以列出直接在测试语句中描述对象的属性和值的集合;或者向 Descrīption 对象中添加属性和值的集合,然后在语句中输入 Descrīption 对象的名称。下面我们分别举例介绍。

    2、直接在语句中输入编程描述

    通过多个指定描述对象的property:=value对,可以直接在语句中描述对象,这是最直接有效的方法。

    常规语法为:

    TestObject("PropertyName1:=PropertyValue1", "..." , "PropertyNameX:=PropertyValueX"}

    TestObject - 测试对象的类。

    PropertyName:=PropertyValue - 测试对象的属性及其值。各个property:=value 对之间应用逗号和引号分开。

    例如:以下语句指定 Mercury Tours 页面中名为author且索引值为 3 的 WebEdit 测试对象。当测试运行时,QTP 将查找具有匹配属性值的 WebEdit 对象,并输入文本jojo。

    Browser("Mercury Tours").Page("Mercury Tours").WebEdit("Name:=Author", "Index:=3").Set "Mark Twain"

    我们也可以从从描述中的特定位置(从 Page 对象描述开始)开始使用Descrīptive Programming。

    Browser("Mercury Tours").Page("Title:=Mercury Tours").WebEdit("Name:=Author", "Index:=3").Set "jojo"

    此外,如果我们希望在在一个测试或组件中多次使用相同的Descrīptive Programming,则可以将创建的对象赋值给变量,这样使用会方便很多。

    例如:我们需要完成下面一系列操作

    Window("Text:=HyperSna").WinButton("Caption:=日期").Click

    Window("Text:=HyperSna").WinButton("Caption:=时间").Click

    Window("Text:=HyperSna").WinButton("Caption:=确定").Click

    那么,为了方便其见,我们可以将Window("Text:=HyperSna")赋值到一个变量,然后再使用,参见下面的代码:

    Set WinHyper = Window("Text:=HyperSna")

    WinHyper.WinButton("Caption:=日期").Click

    WinHyper.WinButton("Caption:=时间").Click

    WinHyper.WinButton("Caption:=确定").Click

    如果使用了VBscrīpt里面的With语句,还可以简化为以下代码:

    With Window("Text:=HyperSna")

    .WinButton("Caption:=日期").Click

    .WinButton("Caption:=时间").Click

    .WinButton("Caption:=确定").Click

    End With

    下面我们来看一个更为详细的例子,在QTP产品缺省安装里面自带了一个网上订机票的示例称为Mercury Tour,我们看一下在订票过程中何时需要用Descrīptive Programming。

    首先登入系统后,如果需要订票,就要先搜索航班,此时系统要求输入订票乘客的数量,假设我们在第一次录制脚本时选择了1个Passenger,并成功完成订票。然后,我们需要参数化乘客数量来测试订票系统,我们会发现回放会失败。原因在于,不同的乘客的数量导致在订票时需要输入每个乘客的姓名,而录制时,只输入了一个乘客的姓名。而乘客姓名的输入框是随着乘客数量的变化而动态生成的,我们不可能从对象库里得到没有录制的对象,因此必须使用Descrīptive Programming。

       

    在录制单个乘客时,我们得到的录制语句是:

    Browser("Welcome: Mercury Tours").Page("Book a Flight: Mercury").WebEdit("passFirst0").Set "Michael"

    Browser("Welcome: Mercury Tours").Page("Book a Flight: Mercury").WebEdit("passLast0").Set "Wang"

    显然WebEdit("passFirst0")和WebEdit("passLast0")是录制时产生的对象并存放到对象库里的。通过对象库,我们可以看到对象的属性如下

       

    系统对于发生多个FirstName时,命名规则是passFirst0,passFirst1…依次类推。因此只要通过简单的Descrīptive Programming就可以完成动态FirstName与LastName的识别工作。这里我们假设参数化的乘客数已经赋值给intPassNum,下面是脚本中的关键语句:

    counter = 0

    For i = 0 to (intPassNum)

    Browser("Find a Flight:").Page("Book a Flight:").WebEdit("name:=passFirst"&i).Set "Michael"

    Browser("Find a Flight:").Page("Book a Flight:").WebEdit("name:=passLast"&i).Set "Wang"

    counter = counter + 1

    Next

    3、使用descrīption对象

    使用 Descrīption 对象可以返回包含一组 Property 对象的 Properties 集合对象。Property 对象由属性名和值组成。然后,可以在语句中指定用返回的 Properties 集合代替对象名。(每个 property 对象都包含一个属性名和值)。

    要创建 Properties 集合,可以使用以下语法输入 Descrīption.Create 语句:

    Set MyDescrīption = Descrīption.Create()

    创建 Properties 对象(例如,以上示例中的MyDescrīption)后,就可以输入语句,以便在运行会话期间在 Properties 对象中添加、编辑、删除或检索属性和值。这样,就可以在运行会话期间,使用动态方法确定哪个属性以及多少个属性应包含在对象描述中。

    在 Properties 集合中填充一组 Property 对象(属性和值)后,可以在测试语句中指定用 Properties 对象代替对象名。

    例如,假设我们需要完成以下一个操作:

    Window("Error").WinButton("text:=OK", "index:=1").Click

    我们可以通过Descrīption对象来实现同样的功能,参加下面的代码:

    Set MyDescrīption = Descrīption.Create()

    MyDescrīption("text").Value = "OK"

    MyDescrīption("index").Value = 1

    Window("Error").WinButton(MyDescrīption).Click

    Set MyDescrīption = Nothing

    【小结】以上是对QTP中有关处理动态对象中的Descrīptive Programming的简单介绍,希望对大家能够有所帮助,就总体而言,如果能够熟练掌握Descrīptive Programming,那么有很多实际中的问题就可以迎刃而解。当然Descrīptive Programming只是QTP中的一个功能,QTP在实际功能测试中还有很多强大的功能,作为QTP学习的一个系列有机会我会一一介绍。

  • QTP中的描述性编程

    2007-05-22 12:57:50


      当我们并不想QTP依靠对象库来识别对象时,我们就可以借用描述性编程的方式.把对象的属性及属性值直接搬到代码中去,让QTP直接通过脚本中的这些属性及属性值就能识别到这个对象,而不必再去匹配对象库.总的来说,如果您希望在未存储在对象库中的对象上执行操作,则这种编程描述将是非常有用的。或者还可以使用编程描述在具有某些相同属性的多个对象上执行相同的操作,或者在其属性与运行会话期间动态确定的描述相匹配的对象上执行操作。比如:在我的<QTP参数化实例>文章中,已经运用过描述性编程了.由于参数化的时候受到了对象库的制约,所以也采用了描述性编程的形式,让要参数化的对象不再受到对象库的制约.

    Dialog("Login").WinEdit("Agent Name:").Set "mercury"
    Dialog("Login").WinEdit("Password:").SetSecure "45a1e193f9dac3bf91f3ba7c1dd250a48a33eabf"
    Dialog("Login").WinButton("OK").Click
    Window("Flight Reservation").Close

        对应的对象库,如图:

        然后我们把对象库中,这些对象的属性及属性值从对象库搬到脚本中,代码修改成为:


    Dialog("text:=Login").WinEdit("attached text:=Agent Name:").Set "mercury"
    Dialog("text:=Login").WinEdit("attached text:=Password:").SetSecure "4414d23c42046da1ea3a895f1518b9c476b2b225"
    Dialog("text:=Login").WinButton("text:=OK").Click
    Window("regexpwndtitle:=Flight Reservation").close

        把对象库中对象删除掉,如下图:

        再来执行脚本,QTP执行成功.这就是描述性编程.当然值得注意的是,如果父对象用描述性编程表示了,那么后面的对象都要用描述性编程表示了.如:

    Dialog("text:=Login").WinEdit("attached text:=Agent Name:").Set "mercury"

        这边Dialog("text:=Login")用描述性编程表示了,那么WinEdit("attached text:=Agent Name:")就必须要描述性编程表示了.因为在对象库中,子对象是依靠父对象存在的.所以如果Dialog("text:=Login")这个父对象从对象库中删除了,那么后面的子对象也同时被删除了.反过来子对象删除就不影响父对象.所以子对象可以单独用描述性编程表示,而不需牵连其他对象.

    此文来源于51testing博客,转载请注明出处为51testing博客
    原始链接:
    http://blog.51testing.com/?26649/action_viewspace_itemid_2625.html

  • (转)QTP中读取Access数据

    2007-05-22 12:53:58

    以下是QTP脚本,目的是用来读取Access数据库中的数据,代码如下:

    Option explicit
    R0q:J:B0NOGqq94129Dim Cnn ,strDb,Rst,strCnn,ilen  '//定义变量
    n8keP.RYCk94129strCnn="Provider=Microsoft.Jet.OLEDB.4.0;Ole DB Services=-4;Data Source=D:\test\calc.mdb" ' //将获得的连接字符串赋值到
    8f:AgdFH-K94129Set Cnn=CreateObject("ADODB.Connection") '//生成数据库连接对象
    Z#cP2nBu1yw94129Cnn.Open strCnn   '   //打开数据库
    K R9N`IJ-j%[94129Set Rst=CreateObject("ADODB.Recordset")  '//生成记录集对象  51Testing软件测试网im9L#CT{:kJNS2p
    Rst.Open "select * from calc" ,Cnn  
    im*~1Nl1X8k94129Do While Not  Rst.EOF 51Testing软件测试网(s0},p p PZ,V
       For iLen=1 to 3  '//我的表中只有3个字段,当然这种方法通用性不是很好51Testing软件测试网y~I bdZ9Oe c
        Select Case iLen51Testing软件测试网)RQiI8a j]V{F}
          Case 151Testing软件测试网\mj8LsL
                  strDb=strDb&Rst.Fields.item(iLen)&" "
    {B [1z#_"M*|oT Z$V(U94129      Case 2
    ,J,pB c,ou94129              strDb=strDb&"+ "&Rst.Fields.item(iLen)&" "
    ({0D"|3G cG!V"x7}&Z94129      Case 3
    a(N)c Vx9ul[(Vg94129              strDb=strDb&"= "&Rst.Fields.item(iLen)51Testing软件测试网#`PA wY9r |j"h&w
        End Select
    9dO"S @7RK-F-Z5B%G1^94129   Next
    zMOJ L94129   strDb=strDb&chr(13)
    .V}SQ%S,g94129   Rst.MoveNext
    (u;t!y,o4]e5v$W J1}94129 Loop 51Testing软件测试网_4h)~lSV ] G'Yfzf
    Rst.Close51Testing软件测试网|M4L/R~ {yO#K
    cnn.close51Testing软件测试网K&x)B-t3kBt8lL
    msgbox strDb51Testing软件测试网'^p)T5`:F ~o@hL
    希望这对QTP新手找这方面资料时有点帮助.

  • QTP中读取Eexcel数据

    2007-05-22 12:51:14

     以下是我用QTP进行Excel数据的读取,希望可以给找这方面资料的朋友一点帮助,但也有可能代码有错误,请务必指出!以下是代码:

    Option explicit 51Testing软件测试网nb$XZ%_([BbO
    Dim srcData,srcDoc,i,j51Testing软件测试网9U4TN*v"E
    set srcData = CreateObject("Excel.Application")
    n-eT ^E;l6c5re B94129srcData.Visible = true
    5C Oj(d:E Ac6W0r0Nk94129set srcDoc = srcData.Workbooks.Open("D:\test\calc.xls")51Testing软件测试网\J0kety ^'Q
           srcDoc.Worksheets("Sheet1").Activate
    @\3d4a#_RDu94129    Dim myarray(7,4),temp
    Re;\)c:o @ zt5x+h7y94129    Dim str51Testing软件测试网 S@(I.`2Q3w}
        For i=2 to 7
    N$iLG)C'A8~!h94129     For j=1 to 4
    LwPL!HEK94129              myarray(i,j)= srcDoc.Worksheets("Sheet1").Cells(i,j).value 51Testing软件测试网3w`|v`:aZ F;_
         Select Case j
    ff!h BI,\#g6w94129     Case "1" 51Testing软件测试网|q*{FX;r+|;W"q
           str=str&myarray(i,j)&" "
    h:N9kFM%ja94129    Case "2"51Testing软件测试网W c6Y&M6b
          temp=myarray(i,j)51Testing软件测试网@1J nTHn| r$qM&oK
       Case "3"51Testing软件测试网s5hE!Mn`8S_4nu
        str=str&myarray(i,j)&" "&temp51Testing软件测试网jc_g'NU
         Case "4"51Testing软件测试网HG2~.o:Cu
          str=str&" = "&myarray(i,j)51Testing软件测试网"w B:ONrt!Rq W
         End Select
    wmN5H_94129    Next
    4?0I K.M%y])T5F ~/j94129    str=str&chr(13)
    8G`;\X/`k94129      Next51Testing软件测试网/Mw(E4r1F/|8b
       srcData.Workbooks.Close51Testing软件测试网!T.V3k3d'v PS
       msgbox str

  • (转帖)获取EXCEL文件的行数

    2007-05-22 12:50:01

    类似DATATABLE的GETROWCOUNT方法

    Set xlapp = Createobject("excel.application")
    Set wkBook = xlapp.Workbooks.Open("c:\aa.xls")
    Set wksheeta = wkBook.Worksheets("sheet1")
    n=wksheeta.UsedRange.Cells.Rows.Count
    msgbox "n="&n
    wkbook.save
    wkbook.close
    xlapp.quit
    set xlapp = nothing

  • VB编程的8个小技巧

    2007-05-22 12:07:59

     
        1、"&"替换"+"
       在很多人的编程语言中,用“+”来连接字符串,这样容易导致歧义。良好的习惯是用“&”来连接字符串.
       
       不正确:
       Dim sMessage As String
       sMessage = "1" + "2"
       
       正确:
       Dim sMessage As String
       sMessage = "1" & "2"
       
       注意:"&"的后面有个空格
       
       2、变量命名大小写,语句错落有秩,源代码维护方面
       
       下面大家比较一下以下两段代码:
       
       读懂难度很大的代码:
       
       Dim SNAME As String
       Dim NTURN As Integer
       
       If NTURN = 0 Then
       If SNAME = "vbeden" Then
       Do While NTURN < 4
       NTURN = NTURN + 1
       Loop
       End If
       End If
       
       容易读懂的代码:
       
       Dim sName As String
       Dim nTurn As Integer
       
       If nTurn = 0 Then
         If sName = "vbeden" Then
          Do While nTurn < 4
            nTurn = nTurn + 1
          Loop
         End If
       End If
       
       3请养成以下的“对象命名约定”良好习惯
       
       推荐使用的控件前缀
       
       控件类型 前缀 例子
       3D Panel pnl pnlGroup
       ADO Data ado adoBiblio
       Animated button ani aniMailBox
       Check box chk chkReadOnly
       Combo box, drop-down list box cbo cboEnglish
       Command button cmd cmdExit
       Common dialog dlg dlgFileOpen
       Communications com comFax
       Control (当特定类型未知时,在过程中所使用的) ctr ctrCurrent
       Data dat datBiblio
       Data-bound combo box dbcbo dbcboLanguage
       Data-bound grid dbgrd dbgrdQueryResult
       Data-bound list box dblst dblstJobType
       Data combo dbc dbcAuthor
       Data grid dgd dgdTitles
       Data list dbl dblPublisher
       Data repeater drp drpLocation
       Date picker dtp dtpPublished
       Directory list box dir dirSource
       Drive list box drv drvTarget
       File list box fil filSource
       Flat scroll bar fsb fsbMove
       Form frm frmEntry
       Frame fra fraLanguage
       Gauge gau gauStatus
       Graph gra graRevenue
       Grid grd grdPrices
       Hierarchical flexgrid flex flexOrders
       Horizontal scroll bar hsb hsbVolume
       Image img imgIcon
       Image combo imgcbo imgcboProduct
       ImageList ils ilsAllIcons
       Label lbl lblHelpMessage
       Lightweight check box lwchk lwchkArchive
       Lightweight combo box lwcbo lwcboGerman
       Lightweight command button lwcmd lwcmdRemove
       Lightweight frame lwfra lwfraSaveOptions
       Lightweight horizontal scroll bar lwhsb lwhsbVolume
       Lightweight list box lwlst lwlstCostCenters
       Lightweight option button lwopt lwoptIncomeLevel
       Lightweight text box lwtxt lwoptStreet
       Lightweight vertical scroll bar lwvsb lwvsbYear
       Line lin linVertical
       List box lst lstPolicyCodes
       ListView lvw lvwHeadings
       MAPI message mpm mpmSentMessage
       MAPI session mps mpsSession
       MCI mci mciVideo
       Menu mnu mnuFileOpen
       Month view mvw mvwPeriod
       MS Chart ch chSalesbyRegion
       MS Flex grid msg msgClients
       MS Tab mst mstFirst
       OLE container ole oleWorksheet
       Option button opt optGender
       Picture box pic picVGA
       Picture clip clp clpToolbar
       ProgressBar prg prgLoadFile
       Remote Data rd rdTitles
       RichTextBox rtf rtfReport
       Shape shp shpCircle
       Slider sld sldScale
       Spin spn spnPages
       StatusBar sta staDateTime
       SysInfo sys sysMonitor
       TabStrip tab tabOptions
       Text box txt txtLastName
       Timer tmr tmrAlarm
       Toolbar tlb tlbActions
       TreeView tre treOrganization
       UpDown upd updDirection
       Vertical scroll bar vsb vsbRate
       
       --------------------------------------------------------------------------------
       推荐使用的数据访问对象 (DAO) 的前缀
       用下列前缀来指示数据访问对象
       数据库对象 前缀 例子
       Container con conReports
       Database db dbAccounts
       DBEngine dbe dbeJet
       Document doc docSalesReport
       Field fld fldAddress
       Group grp grpFinance
       Index ix idxAge
       Parameter prm prmJobCode
       QueryDef qry qrySalesByRegion
       Recordset rec recForecast
       Relation rel relEmployeeDept
       TableDef tbd tbdCustomers
       User usr usrNew
       Workspace wsp wspMine
       
       --------------------------------------------------------------------------------
       
       应用程序频繁使用许多菜单控件,对于这些控件具备一组唯一的命名约定很实用。除了最前面 "mnu" 标记以外,菜单控件的前缀应该被扩展:对每一级嵌套增加一个附加前缀,将最终的菜单的标题放在名称字符串的最后。下表列出了一些例子。
       
       推荐使用的菜单前缀
       菜单标题序列 菜单处理器名称
       File Open mnuFileOpen
       File Send Email mnuFileSendEmail
       File Send Fax mnuFileSendFax
       Format Character mnuFormatCharacter
       Help Contents mnuHelpContents
       
       当使用这种命名约定时,一个特定的菜单组的所有成员一个接一个地列在 Visual Basic 的“属性”窗口中。而且,菜单控件的名字清楚地表示出它们所属的菜单项。
       
       为其它控件选择前缀
       
       对于上面没有列出的控件,应该用唯一的由两个或三个字符组成的前缀使它们标准化,以保持一致性。只有当需要澄清时,才使用多于三个字符的前缀。
       
       常量和变量命名约定
       除了对象之外,常量和变量也需要良好格式的命名约定。本节列出了 Visual Basic 支持的常量和变量的推荐约定。并且讨论标识数据类型和范围的问题。
       
       变量应该总是被定义在尽可能小的范围内。全局 (Public) 变量可以导致极其复杂的状态机构,并且使一个应用程序的逻辑非常难于理解。全局变量也使代码的重用和维护更加困难。
       
       Visual Basic 中的变量可以有下列范围
       
       范围 声明位置 可见位置
       过程级 过程,子过程或函数过程中的 ‘Private’ 在声明它的过程中
       模块级 窗体或代码模块(.frm、.bas )的声明部分中的 ‘Private’ 窗体或代码模块中的每一个过程
       全局 代码模块(.bas)的声明部分中的 ‘Public’ 应用程序中的每一处
       
       在 Visual Basic 的应用程序中,只有当没有其它方便途径在窗体之间共享数据时才使用全局变量。当必须使用全局变量时,在一个单一模块中声明它们,并按功能分组。给这个模块取一个有意义的名称,以指明它的作用,如 Public.bas。
       
       较好的编码习惯是尽可能写模块化的代码。例如,如果应用程序显示一个对话框,就把要完成这一对话任务所需要的所有控件和代码放在单一的窗体中。这有助于将应用程序的代码组织在有用的组件中,并减小它运行时的开销。
       
       除了全局变量(应该是不被传递的),过程和函数应该仅对传递给它们的对象操作。在过程中使用的全局变量应该在过程起始处的声明部分中标识出来。此外,应该用 ByVal 将参数传递给 Sub 过程及 function 过程,除非明显地需要改变已传递的参数值。
       
       随着工程大小的增长,划分变量范围的工作也迅速增加。在类型前缀的前面放置单字母范围前缀标明了这种增长,但变量名的长度并没有增加很多。
       
       变量范围前缀
       
       范围 前缀 例子
       全局 g gstrUserName
       模块级 m mblnCalcInProgress
       本地到过程 无 dblVelocity
       
       如果一个变量在标准模块或窗体模块中被声明为 Public,那么该变量具有全局范围。如果一个变量在标准模块或窗体模块中被分别声明为 Private,那么该变量有模块级范围。
       
       注意: 一致性是卓有成效地使用这种技术的关键;Visual Basic 中的语法检查器不会捕捉以 "p." 开头的模块级变量。
       
       常量
       常量名的主体是大小写混合的,每个单词的首字母大写。尽管标准 Visual Basic 常量不包含数据类型和范围信息,但是象 i、s、g 和 m 这样的前缀对于理解一个常量的值和范围还是很有用的。对于常量名,应遵循与变量相同的规则。例如:
       
       mintUserListMax  ''对用户列表的最大限制
                ''(整数值,本地到模块)
       gstrNewLine    ''新行字符
                ''(字符串,应用程序全局使用)
       
       变量
       声明所有的变量将会节省编程时间,因为键入操作引起的错误减少了(例如,究竟是 aUserNameTmp,还是 sUserNameTmp,还是 sUserNameTemp)。在“选项”对话框的“编辑器”标签中,复选“要求变量声明”选项。Option Explicit 语句要求在 Visual Basic 程序中声明所有的变量。
       
       应该给变量加前缀来指明它们的数据类型。而且前缀可以被扩展,用来指明变量范围,特别是对大型程序。
       
       用下列前缀来指明一个变量的数据类型。
       
       变量数据类型
       
       数据类型 前缀 例子
       String (字符串类型) str strFName
       Integer (短整数类型) int intQuantity
       Long (长整数类型) lng lngDistance
       Single (单精度浮点数类型) sng sngAverage
       Double (双精度浮点数类型) dbl dblTolerance
       Boolean (布尔类型) bln blnFound
       Byte (字节类型) byt bytRasterData
       Date (日期类型) dte dteNow
       Currency (货币计算与定点计算类型) cur curRevenue
       Object (对象类型) obj objCurrent
       Variant (变体类型) vnt vntCheckSum
       
       描述变量和过程名
       
       变量或过程名的主体应该使用大小写混合形式,并且应该足够长以描述它的作用。而且,函数名应该以一个动词起首,如 InitNameArray 或 CloseDialog。
       
       对于频繁使用的或长的项,推荐使用标准缩略语以使名称的长度合理化。一般来说,超过 32 个字符的变量名在 VGA 显示器上读起来就困难了。
       
       当使用缩略语时,要确保它们在整个应用程序中的一致性。在一个工程中,如果一会儿使用 Cnt, 一会儿使用 Count,将导致不必要的混淆。
       
       用户定义的类型
       在一项有许多用户定义类型的大工程中,常常有必要给每种类型一个它自己的三个字符的前缀。如果这些前缀是以 "u" 开始的,那么当用一个用户定义类型来工作时,快速识别这些类型是很容易的。例如,ucli 可以被用来作为一个用户定义的客户类型变量的前缀。
       
       4在简单的选择条件情况下,使用IIf()函数
       
       罗索的代码:
       If nNum = 0 Then
        sName = "sancy"
       Else
        sName = "Xu"
       End If
       
       简单的代码:
       sName=IIf(nNum=0,"sancy","Xu")
       
       5、尽量使用Debug.Print进行调试
       
       在很多初学者的调试中,用MsgBox来跟踪变量值.其实用Debug.Print不仅可以达到同样的功效,而且在程序最后编译过程中,会被忽略.而MsgBox必须手动注释或删除.
       
       通常:
       MsgBox nName
       
       应该:
       Debug.Print nName
       
       6、在重复对某一对象的属性进行修改时,尽量使用With....End With
       
       通常:
       Form1.Height = 5000
       Form1.Width = 6000
       Form1.Caption = "This is MyLabel"
       
       应该:
       With Form1
        .Height = 5000
        .Width = 6000
        .Caption = "This is MyLabel"
       End With
       这种结构程序执行效率比较高,特别在循环语句里。
       
       7、MsgBox中尽量使用消息图标,这样程序比较有规范
       
       一般来说
       
       vbInformation 用来提示确认或成功操作的消息
       
       vbExclamation 用来提示警告的消息
       
       vbCritical 用来提示危机情况的消息
       
       vbQuestion 用来提示询问的消息
       
       8、在可能的情况下使用枚举
       
       枚举的格式为
       [Public | Private] Enum name
       membername [= constantexpression]
       membername [= constantexpression]
       ....
       End Enum
       
       Enum 语句包含下面部分:
       
       部分 描述
       Public 可选的。表示该 Enum 类型在整个工程中都是可见的。Enum 类型的缺省情况是 Public。
       Private 可选的。表示该 Enum 类型只在所声明的模块中是可见的。
       name 必需的。该 Enum 类型的名称。name 必须是一个合法的 Visual Basic 标识符,在定义该 Enum 类型的变量或参数时用该名称来指定类型。
       membername 必需的。用于指定该 Enum 类型的组成元素名称的合法 Visual Basic 标识符。
       constantexpression 可选的。元素的值(为 Long 类型)。可以是别的 Enum 类型。如果没有指定 constantexpression,则所赋给的值或者是 0(如果该元素是第一个 membername),或者比其直接前驱的值大 1。
       
       说明
       所谓枚举变量,就是指用 Enum 类型定义的变量。变量和参数都可以定义为 Enum 类型。Enum 类型中的元素被初始化为 Enum 语句中指定的常数值。所赋给的值可以包括正数和负数,且在运行时不能改变。例如:
       
       Enum SecurityLevel IllegalEntry = -1 SecurityLevel1 = 0 SecurityLevel2 = 1 End Enum
       
       Enum 语句只能在模块级别中出现。定义 Enum 类型后,就可以用它来定义变量,参数或返回该类型的过程。不能用模块名来限定 Enum 类型。类模块中的 Public Enum 类型并不是该类的成员;只不过它们也被写入到类型库中。在标准模块中定义的 Enum 类型则不写到类型库中。具有相同名字的 Public Enum 类型不能既在标准模块中定义,又在类模块中定义,因为它们共享相同的命名空间。若不同的类型库中有两个 Enum 类型的名字相同,但成员不同,则对这种类型的变量的引用,将取决于哪一个类型库具有更高的引用优先级。
       
       不能在 With 块中使用 Enum 类型作为目标。
       
       Enum 语句示例
       下面的示例演示用 Enum 语句定义一个命名常数的集合。在本例中是一些可以选择的颜色常数用于设计数据库的数据输入窗体。
       
       Public Enum InterfaceColors
       icMistyRose = &HE1E4FF&
       icSlateGray = &H908070&
       icDodgerBlue = &HFF901E&
       icDeepSkyBlue = &HFFBF00&
       icSpringGreen = &H7FFF00&
       icForestGreen = &H228B22&
       icGoldenrod = &H20A5DA&
       icFirebrick = &H2222B2&
       End Enum
       
       好处是加快编程速度
       9写代码的时候,可以用中文写变量,写完后再用英文替换。这样写代码的时候思路比较清晰,而且方便调试,嘿嘿。
  • [转载]不用checkpoint的Bitmap比较

    2007-05-22 12:06:18

     

    以下是我用文件对BITMAP进行比较的方法.
    但是这种方法只能比较两张图片的全部.不能比较比较图片中的部分区域.
    LcdDlgTitle = "LCD Device(μPD16432B)"
    LcdDlgTitle1 = "LCD1 Device(μPD16432B)"
    dialog(LcdDlgTitle ).CaptureBitmap "c:\lcd.bmp",true
    dialog(LcdDlgTitle1 ).CaptureBitmap "c:\lcd1.bmp",true

      Dim FS, File1, File2
       FilePath1 = "c:\lcd.bmp"
       FilePath2 = "c:\lcd2.bmp"
       Set FS = CreateObject("scrīpting.FileSystemObject")
       If ( FS.GetFile(FilePath1).Size <> FS.GetFile(FilePath2).Size) Then
        msgbox "FilePath1:=" &  FS.GetFile(FilePath1).Size  & "endl"
        msgbox "FilePath2:=" &  FS.GetFile(FilePath2).Size & "endl"
             CompareFiles = 1
             'Exit Function
       End If
       Set File1 = FS.GetFile(FilePath1).OpenAsTextStream(1, 0)
       Set File2 = FS.GetFile(FilePath2).OpenAsTextStream(1, 0)
      
       CompareFiles = False
       Do While File1.AtEndOfStream = False
             Str1 = File1.Read(1000)
             Str2 = File2.Read(1000)
             CompareFiles = StrComp(Str1, Str2, 0)
             If CompareFiles <> 0 Then
                      CompareFiles = 1
                      Exit Do
             End If
       Loop
       File1.Close()
       File2.Close()
    通过像素点的比较
    Dim mybmp1
    Dim mybmp2
    Set mybmp1 = LoadPicture ("c:\lcd.bmp")
    Set mybmp2 = LoadPicture ("c:\lcd1.bmp")
    msgbox mybmp1.Height  
    msgbox mybmp1.Width
    For   Y   =   0   To   mybmp1.Height   
      For   X   =   0   To   mybmp2.Width   
      fColor1   =   mybmp1.Point(X,   Y)
      fColor2   =   mybmp2.Point(X,   Y)     
      if   fColor1<>fColor2   then     
      msgbox   "不一样!"   

      End   If   
      Next   'X
      Next   'Y
  • VBScript中SendKeys的妙用

    2007-05-22 12:03:10

    [quote]

    什么是VBscrīpt呢?

    VBscrīpt的全称是:Microsoft Visual Basic scrīpt Editon.(微软公司可视化BASIC脚本版). VBS(VBscrīpt的进一步简写)是基于Visual Basic的脚本语言,其不编译成二进制文件, 而是直接由宿主(host)解释源代码并执行, 简单点说就是你写的程序不需要编译成.exe, 而是直接给用户发送.vbs的源程序, 用户就能执行了.

    SendKeys 方法

    模拟键盘操作,将一个或多个按键指令发送到指定Windows窗口来控制应用程序运行, 
    其使用格式为:object.SendKeys(string) 

    “object”:表示WshShell对象 
    “string”:表示要发送的按键指令字符串,需要放在英文双引号中。

    -----------------------------------
    1.基本键 

      一般来说,要发送的按键指令都可以直接用该按键字符本身来表示,例如要发送字母“x”,使用“WshShell.SendKeys "x"”即可。当然,也可直接发送多个按键指令,只需要将按键字符按顺序排列在一起即可,例如,要发送按键“happy”,可以使用“ WshShell.SendKeys "happy" ”。

    2.特殊功能键 

      对于需要与Shift、Ctrl、Alt三个控制键组合的按键,SendKeys使用特殊字符来表示: 

      Shift---------WshShell.SendKeys "+" 
      Ctrl---------WshShell.SendKeys "^" 
      Alt---------WshShell.SendKeys "%"  (注意   这样使用时,不用大括号括起这些特殊字符。)
      由于“+”、“^”这些字符用来表示特殊的控制按键了,如何表示这些按键呢? 只要用大括号括住这些字符即可。例如: 要发送加号“+”,可使用“WshShell.SendKeys "{+}"” 

    另外对于一些不会生成字符的控制功能按键,也同样需要使用大括号括起来按键的名称。
    例如要发送回车键,需要用“ WshShell.SendKeys "{ENTER}" ”表示;
    发送向下的方向键用“ Wshell.SendKeys "{DOWN}" ”表示。 

    Space---------WshShell.SendKeys " " 
    Enter---------WshShell.SendKeys "{ENTER}" 
    ←---------WshShell.SendKeys "{RIGHT}" 
    ↑---------WshShell.SendKeys "{UP}" 
    F1---------WshShell.SendKeys "{F1}" 

    按键                代码    
    BACKSPACE     {BACKSPACE}, {BS}, 或 {BKSP}    
    BREAK         {BREAK}    
    CAPS LOCK     {CAPSLOCK}    
    DEL or Delete {Delete} 或 {DEL}    
    DOWN ARROW    {DOWN}    
    END           {END}    
    ENTER         {ENTER}或 ~    
    ESC           {ESC}    
    HELP          {HELP}    
    HOME          {HOME}    
    INS or Insert {Insert} 或 {INS}    
    LEFT ARROW    {LEFT}    
    NUM LOCK      {NUMLOCK}    
    PAGE DOWN     {PGDN}    
    PAGE UP       {PGUP}    
    PRINT SCREEN  {PRTSC}    
    RIGHT ARROW   {RIGHT}    
    SCROLL LOCK   {SCROLLLOCK}    
    TAB           {TAB}    
    UP ARROW      {UP}    
    F1 {F1}    
    F2 {F2}    
    F3 {F3}    
    F4 {F4}    
    F5 {F5}    
    F6 {F6}    
    F7 {F7}    
    F8 {F8}    
    F9 {F9}    
    F10 {F10}

    Tips:如果需要发送多个重复的单字母按键,不必重复输入该字母,SendKeys允许使用简化格式进行描述,使用格式为“{按键 数字}”。例如要发送10个字母“x”,则输入“WshShell.SendKeys "{x 10}"”即可。

    -----------------------------------
    按下F5刷新桌面 

    Dim WshShell,Path,i 
    Set WshShell = Wscrīpt.CreateObject("Wscrīpt.Shell") 
    WshShell.SendKeys "{F5}" 
    ---------------------------------------------------- 
    电脑的自动重启 

    set WshShell = CreateObject("Wscrīpt.Shell") 
    WshShell.SendKeys "^{ESC}u" 
    WshShell.SendKeys "R" 
    ---------------------------------------------------- 
    启动任务管理器 

    set WshShell = CreateObject("Wscrīpt.Shell") 
    WshShell.SendKeys "^+{ESC}" 
    ---------------------------------------------------- 
    QQ消息连发 

    Dim WshShell 
    Set WshShell= Wscrīpt.createObject("Wscrīpt.Shell") 
    WshShell.AppActivate "bomb" 
    for i=1 to 60 
    Wscrīpt.Sleep 800 
    WshShell.SendKeys "What do you say" 
    WshShell.SendKeys i 
    WshShell.SendKeys "%s" 
    next 
    ---------------------------------------------------- 
    自动到百度搜索歌曲:white flag 

    Dim WshShell,Path,i 
    Set WshShell = Wscrīpt.CreateObject("Wscrīpt.Shell") 
    WshShell.Run("IEXPLORE.EXE") 
    Wscrīpt.Sleep 2000 
    WshShell.AppActivate "about:blank-Microsoft Internet Explorer" 
    WshShell.SendKeys "+{TAB}" 
    WshShell.SendKeys "
    http://mp3.baidu.com
    Wscrīpt.Sleep 800 
    WshShell.SendKeys "{ENTER}" 
    Wscrīpt.Sleep 3000 
    WshShell.SendKeys "white flag" 
    Wscrīpt.Sleep 800 
    WshShell.SendKeys "{ENTER}" 
    ---------------------------------------------------- 
    自动关机

    Dim WshShell
    Set WshShell=Wscrīpt.CreateObject("Wscrīpt.Shell")
    Wscrīpt.Sleep 2000
    WshShell.Run "shutdown -r -t 120"
    wscrīpt.sleep 6000
    WshShell.Run "shutdown -a"
    ---------------------------------------------------- 
    在记事本中输入Happy Birthday!并保存为birth.txt 

    Dim WshShell 
    Set WshShell=Wscrīpt.CreateObject("Wscrīpt.Shell") 
    WshShell.Run "notepad" 
    Wscrīpt.Sleep 1500 
    WshShell.AppActivate "无标题 - 记事本" 
    WshShell.SendKeys "H" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "a" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "p" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "p" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "y" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys " " 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "B" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "i" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "r" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "t" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "h" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "d" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "a" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "y" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "!" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "%FS" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "b" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "i" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "r" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "t" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "h" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "%S" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "%FX" 
    ---------------------------------------------------- 
    制作能自动定时存盘的记事本 

    '第一部分:定义变量和对象 

    Dim WshShell, AutoSaveTime, TXTFileName 
    AutoSaveTime=300000 
    Set WshShell=Wscrīpt.CreateObject("Wscrīpt.Shell") 
    TXTFileName=InputBox("请输入你要创建的文件名(不能用中文和纯数字):") 

    '第二部分:打开并激活记事本 

    WshShell.Run "notepad" 
    Wscrīpt.Sleep 200 
    WshShell.AppActivate "无标题 - 记事本" 

    '第三部分:用输入的文件名存盘 

    WshShell.SendKeys "^s" 
    Wscrīpt.Sleep 300 
    WshShell.SendKeys TXTFileName 
    Wscrīpt.Sleep 300 
    WshShell.SendKeys "%s" 
    Wscrīpt.Sleep AutoSaveTime 
    '第四部分:自动定时存盘 
    While WshShell.AppActivate (TXTFileName)=True 
    WshShell.SendKeys "^s" 
    Wscrīpt.Sleep AutoSaveTime 
    Wend 
    Wscrīpt.Quit 

    ---------------------------------------------------- 

    自动死机o(∩_∩)o...

    DIM WSHSHELL 
    SET WSHSHELL=Wscrīpt.CreateOBJECT("Wscrīpt.SHELL") 
    'WSHSHELL.RUN " " 
    'Wscrīpt.SLEEP 1000 
    WSHSHELL.SENDKEYS "{ENTER}" 
    'Wscrīpt.SLEEP 1000 
    WSHSHELL.SENDKEYS "{ENTER}" 
    'Wscrīpt.SLEEP 1000 
    WSHSHELL.SENDKEYS "{ENTER}" 
    'Wscrīpt.SLEEP 1000 
    WSHSHELL.SENDKEYS "{ENTER}" 
    'Wscrīpt.SLEEP 1000 
    WSHSHELL.SENDKEYS "{ENTER}" 

    [/quote]

  • VBS常用的内置函数

    2007-05-22 11:52:35Digest 2

    Abs 函数:返回数的绝对值。  
    Array函数:返回含有数组的变体。  
    Asc 函数:返回字符串首字母的 ANSI 字符码。 
    Atn 函数:返回数值的反正切。  
    CBool函数:返回已被转换为 Boolean 子类型的变体的表达式。  
    CByte函数:返回已被转换为字节子类型的变体的表达式。  
    CCur 函数:返回已被转换为货币子类型的变体的表达式。  
    CDate函数:返回已被转换为日期子类型的变体的表达式。  
    CDbl函数:返回已被转换为双精度子类型的变体的表达式。  
    Chr 函数:返回与指定的 ANSI 字符码相关的字符。  
    CInt 函数:返回已被转换为整形子类型的变体的表达式。  
    CLng 函数;返回已被转换为Long子类型的变体的表达式。  
    Cos 函数:返回角度的余弦。   C
    reateObject函数:创建并返回对“自动”对象的引用。
    CSng函数:返回已被转换为单精度子类型的变体的表达式。
    CStr函数:返回已被转换为字符串子类型的变体的表达式。
    Date函数:返回当前系统日期。
    DateAdd 函数:返回的日期已经加上了指定的时间间隔。
    DateDiff 函数:返回两个日期之间的间隔。
    DatePart 函数:返回给定日期的指定部分。
    DateSerial函数:返回指定年月日的日期子类型的变体。
    DateValue 函数:返回日期子类型的变体。
    Day 函数:返回日期,取值范围为 1 至 31。
    Eval 函数:计算表达式并返回结果。
    Exp 函数:返回 e (自然对数的底) 的多少次方。
    Filter函数:根据指定的筛选条件,返回含有字符串数组子集的、下限为 0 的数组。
    Fix 函数:返回数的整数部分。
    FormatCurrency 函数:返回的表达式为货币值格式,其货币符号采用系统控制面板中定义的。
    FormatDateTime 函数:返回的表达式为日期和时间格式。
    FormatNumber 函数:返回的表达式为数字格式。
    FormatPercent 函数:返回的表达式为百分数(乘以 100)格式,后面有 % 符号。
    GetObject 函数:返回从文件对“自动”对象的引用。
    GetRef 函数:返回对能够绑定到一事件的过程的引用。
    Hex 函数:返回一字符串,代表一个数的十六进制值。
    Hour函数:返回表示钟点的数字,取值范围为 0 至 23。
    InputBox函数:在对话框中显式一提示,等待用户输入文本或单击按钮,并返回文本框的内容。
    InStr函数:返回一个字符串在另一个字符串中首次出现的位置。
    InStrRev函数;返回一个字符串在另一个字符串中出现的位置,但是从字符串的尾部算起。

  • 庆祝自己的"贝壳"开通了

    2007-05-22 11:43:35

      今天终于在51testing开通属于自己的"贝壳"了,以后可以将自己工作中遇到的问题和所思所想装进"贝壳"里了,同时想利用这个机会把专业版的blog搞好,希望在自己学习的同时能帮到其他有需要的同事和朋友们,广交天下友人
  • 553/3<123

    用户菜单

    我的栏目

    我的存档

    数据统计

    RSS订阅

    Open Toolbar