我快乐,不是因为我得到的多,而是因为我计较的少

发布新日志

  • JIRA与sql Server 2005连接

    2010-03-12 15:15:21

        原系统使用的是软件自带数据库(HSQL),随着数据日益积累,数据量的变大以及安全性考虑,现要求将数据库从HSQL中移植出来而后转移到MSSQL上,现将转移的具体操作方法介绍如下:

           环境: Windows 2003 (XP也可以),MS SQLServer2000附带SP4,atlassian-jira-enterprise-3.7.1
           步骤:

    1.安装JDK(jdk-1_5_0-windows-i586),配置java运行环境; 环境变量:系统变量   JAVA_HOME=C:\Program Files\Java\jdk1.5.0 (根据你安装JAVA的路径而定)

    2.安装MS SQLServer2000数据库,确保打上MS SQLServer2000的Service Pack4补丁;
       注意:安装过程要自定义,选择chinese_RPC方式,语言为simple chinese; 身份验证选择混合模式;

    3.创建jiradb和jirauser数据库,创建jirauser的过程中要先先创建jirauser(数据库用户名);把public和dbo角色赋给jirauser,不要将jirauser作为dbower;



    4.将JIRA(atlassian-jira-enterprise-3.7.1)的SETUP压缩包文件解压缩到硬盘中(目录自己定义即可);

    5.编辑atlassian-jira/WEB-INF/classes/entityengine.xml文件,将<datasource>标签内的field-type-name属性的值设置为mssql; 如下:
    <datasource name="defaultDS"
    helper-class="org.ofbiz.core.entity.GenericHelperDAO"
    field-type-name="mssql"
    check-on-start="true"
    use-foreign-keys="false"
    use-foreign-key-indices="false"
    check-fks-on-start="false"
    check-fk-indices-on-start="false"
    add-missing-on-start="true">
    <jndi-jdbc jndi-server-name="default"
    jndi-name="java:comp/env/jdbc/JiraDS" />
    </datasource>

    6.编辑conf/server.xml文件

    将<Context ... .../>中的内容,修改为:
    <Context path="" docBase="${catalina.home}/atlassian-jira" reloadable="false">
    <Resource name="jdbc/JiraDS" auth="Container" type="javax.sql.DataSource"
    username="jirauser"
    password="passward***"
    driverClassName="net.sourceforge.jtds.jdbc.Driver"
    url="jdbc:jtds:sqlserver://localhost:1433/jiradb" />


    7.下载JTDS驱动(SQL JDBC Driver)download jira-jars-tomcat5.zip, 解压缩后将jtds-1.2.jar文件拷贝到Tomcat的common/lib/ 目录下;


    8. 运行\bin目录下的STARTUP.BAT文件,启动JIRA

    9. 访问: http://192.168.2.1:8080

    10.进入访问界面配置JIRA,选择用备份文件导入即可,此时将原先的HSQL数据库成功移植到MSSQL中.


    注意事项:因为是在原由的数据文件上作修改,修改前建议备份配置文件,以免发生错误,请注意问题跟踪管理系统JIRA中附件的原路径,否则会有出错提示(x:\xxx\xxx找不到此系统路径....)

  • 编辑框WebFile无法set的解决方法

    2009-08-23 19:28:31

    一.出处

    最近一个同事写qtp时候遇到问题:后台发布spu,QTP录制脚本时,上传本地图片,脚本可以录制出来,但上传路径只能选择录入,不支持从键盘输入.在脚本回访时,Set方法不能被执行,导致上传本地文件失败.怎么解决呢

    问题脚本代码:

    Browser(“taobao”).Page(”Taobao-CRM_2″).Frame(”mainFrame_3″).WebFile(”editor_image”).Set “F:\document\图片\da4b4633-5e6c-4dfa-a38f-5d4e800856d5.jpg”

    二.解决方法

    1.       解决把上面那句代码替代为:

    Browser(“taobao”).Page(”Taobao-CRM_2″).Frame(”mainFrame_3″).WebFile(”editor_image”).click

    Browser(“taobao”).Dialog(”选择文件“).WinEdit(”文件名(N):”).Set “F:\document\图片\da4b4633-5e6c-4dfa-a38f-5d4e800856d5.jpg

    Browser(“taobao”).Dialog(”选择文件“).WinButton(”打开(O)”).Click

    2.       分析

      无法使用set是因为对应对话框被定为不可以赋值方式进行编写;但qtp录制时候还是按赋值录制没有录制弹出窗口这个操作,这时候我们要自己写弹出窗口语句来模拟操作,解决的三局代码就是模拟操作:1.点击按钮;2.在弹出的dialog输入文件名;3.点击确认选择按钮

  • weblist_"#index"

    2009-08-23 17:16:50

    Select Method
    Web Environment

    Select Method

    Description

    Selects the specified item in the list, replacing any previously selected values.

    Syntax

    object.Select Item

    Argument Description
    object A test object of type WebList.
    Item Required. A Variant value. The value to select. The value can either be one of the items in the list or an index. To specify the index of the item to select, use "#index". Index values begin with 0.

    Return Value

    None.  
  • QTP报禁止运行ActiveX控件

    2009-08-23 12:23:31

    在使用QTP期间,大家是否也遇到了经常报“当前安全设置禁止运行该页中的ActiveX控件。。。”的错误信息,怎么解决它:



    如果是录制的时候报这个msg,应该是和IE的设置有关;反之,如果是回放时才有这个msg,考虑qtp的设置问题
    Tools->Options->Active Screen->Advanced...-> 选中Disabled和Load ActiveX controls->OK
  • QTP 参数化

    2008-12-28 16:43:59

    QTP 参数化

    原始脚本录制:
    Browser("LightPole").Page("LoginPg").Sync    '打开LightPole的网站
    Browser("LightPole").Refresh                        '刷新当前页面
    Browser("LightPole").Page("LoginPg").Link("Company").Click       '点击Company链接
    Browser("LightPole").Page("Company").Sync        ' Company链接页面打开
    Browser("LightPole").Close                              '关闭当前页面  

    *******************************

    参数化 (一)
    Dim mylink                            '定义一个变量mylink
    mylink="Press"                        '给这个变量赋值为Press

    Browser("LightPole").Page("LoginPg").Sync
    Browser("LightPole").Refresh
    Browser("LightPole").Page("LoginPg").Link("text:="&mylink).Click   '把原来录制脚本时候的链接参数化(用描述性编程"text:="&mylink)
    Browser("LightPole").Page("text:="&mylink).Sync        '可以回避这个页面,对应打开的页面也应该参数化,页面也参数化,和链接保持一致
    Browser("LightPole").Close                    '关闭当前页面

    运行这个脚本就会打开Press链接对应的页面 (注意:在运行脚本的时候把其它的IE窗口关掉,否则的话可能出现对象库为定义的问题) 

    *************************************************

    参数化 (二)   把参数放在QTP自带的Datatable里,然后QTP会循环执行,用datatable里面指定列的每一行参数
    前提:在datatable里面输入指定的参数,参见图片:para.jpg (在发布图片的testing 里,因为我现在在文档里面添加不了图片)
     
    Dim mylink
    mylink=DataTable("A",dtGlobalSheet)    '指定列为A
    Browser("LightPole").Page("LoginPg").Sync
    Browser("LightPole").Refresh
    Browser("LightPole").Page("LoginPg").Link("text:="&mylink).Click
    Browser("LightPole").Page("text:="&mylink).Sync
    Browser("LightPole").Close
     
    ************************************************************

    参数化(三)
    把excel表格中的数据倒入(import)到QTP的datatable中,制定其倒入的“文件名”,sheet名,把excel的数据导入到本地第几个datatable里

    DataTable.ImportSheet(FileName, SheetSource, SheetDest)
    Datatable.ImportSheet "参数1" ,参数2,参数3
    参数1:要导入的excel文件的绝对路径
    参数2:要导入的excel文件的第几个sheet
    参数3:要导入到本地datatable的第几个表中



    关于一下两个例子的备注说明:

    注1: excel表的内容
    excel:地址d:\\mydata.xls;
    sheet1:                       sheet2:
    mylink                         mylink
    Company                        Blog
    Press
    注2.本地datatable的两个表的名称:1.Golbal ;2.Action1 


    例 1:

    Datatable.ImportSheet "d:\\mydata.xls" ,2,2   '把excel文件中第二个sheet的数据导入到本地第2个datatable的数据表格中
    Dim mylink
    mylink=DataTable("lindk","Action1")   '所以在这里就要调用本地第二个datatable的数据
    msgbox mylink
    Browser("LightPole").Page("LoginPg").Sync
    'Browser("LightPole").Refresh
    Browser("LightPole").Page("LoginPg").Link("text:="&mylink).Click
    Browser("LightPole").Page("text:="&mylink).Sync
    Datatable.SetNextRow
    Browser("LightPole").Close

    运行结果应该是:Msgbox应该弹出 Blog。
    调用本地的第二个datatable时候,程序不会自动执行循环去遍历所有的参数,此时需要使用循环语句,判断本地其他数据表中数据的个数(遍历次数);只有在本地的Global中的数据才能自动遍历执行。


    例2:


    Datatable.ImportSheet "d:\\mydata.xls" ,1,1    '把excel文件中第一个sheet的数据导入到本地第二个datatable的数据表格中
    Dim mylink
    mylink=DataTable("lindk",dtGlobalSheet)    '所以在这里就要调用本地第二个datatable的数据
    msgbox mylink
    Browser("LightPole").Page("LoginPg").Sync
    'Browser("LightPole").Refresh
    Browser("LightPole").Page("LoginPg").Link("text:="&mylink).Click
    Browser("LightPole").Page("text:="&mylink).Sync
    Datatable.SetNextRow
    Browser("LightPole").Close

    运行结果因该是:Msgbox应该弹出 Company,再一遍弹出Press。

  • Windowns操作系统资源监控指标

    2008-12-15 17:02:08

    Windowns操作系统资源监控指标

    对象

    度量

    描述

    System

    %Total Processor Time

    系统上所有处理器都忙于执行非空闲线程的平均时间的百分比。在多处理器系统上,如果所有处理器始终繁忙,此值是100%,如果所有处理器是50%繁忙,此值为50%。而如果这些处理器中的1/4100%繁忙的,则此值为25%。它反映了用于有用作业上的时间的比率。每个处理器将分配给闲置进程中的一个闲置线程,以消耗所有其他线程不使用的那些非生产性处理器周期。

    Processor

    %Processor Time(Windowns 2000)

    处理器执行非空闲线程的时间百分比,此计数器设计为处理器活动的一个主要指示器。它是通过 测量处理器在每个采样间隔中执行空闲进程的线程所花费的时间,然后从100%中减去此值来进行计算的(每个处理器都有管委会空闲线程,它在没有其他线程准备运行时消耗处理器周期)。它可以反映有用作业占用的采样间隔的百分比。此计数器显示在采样期间所观察到的繁忙时间的平均百分比。它是通过监视服务处于非活动状态的时间,然后从100%中减去些值来计算的。

    System

    File Data Operation/sec

    计算机向文件系统设备发出读取和写入操作的速度。此操作不包括文件控制操作。

    System

    Processor Queue Length

    线程单元中的处理器队列的即时长度。如果不同时监视线程计数,则此计数始终为0。所有处理器都使用单一队列(线程在该队列中等待处理器进行循环)。此长度不包括当前正在执行的线程。一般情况下,如果处理器队列的长度一直超过2,则可能表示处理器堵塞。此值为即时计数,不是一段时间的平均值

    Memory

    Page Faults/sec

    此值为处理器中的页面错误的计数。当进程引用特定的虚拟内存页,该页不在其在主内存的工作集当中时,将出现页面错误。如果某页位于待机列表中(因此它已经位于主内存中),或者它正在被共享该页的其他进程所使用,则页面错误不会导致该页从磁盘中提取出

    PhysicalDisk

    %Disk Time

    选定的磁盘驱动器对读写请求提供服务的已用时间所占百分比

    Memory

    Pool Nonpaged Bytes

    非分页池中的字节数,指可供操作系统组件完成指定任务后从其中获得空间的系统内存区域。非分页池页面不可以退出到分页文件中,它们自己分配以来就始终位于主内存中

    Memory

    Pages/sec

    为解析内存对页面(引用时不在内存中)的引用而从磁盘读取的页数或写入磁盘的页数。这是“Page Iput/sec”和“Page Output/sec”的和。此计数器中包括页面流量代表着用于访问应用程序的文件数据的系统缓存。此值还包括传递到/来自非缓存映射内存文件的页数,如果关心内存压力过大问题(即系统失效)和可能产生的过多分页,则这是值得考虑的主要计数器

    System

    Total Interrupts/sec

    计算机接收并处理硬件中断的速度。可以生成中断的设备有系统时钟、鼠标、数据通信线路、网络接口卡和其他外围设备。此计数指示这些设备在计算机上所处的繁忙程度

    Objects

    Threads

    计算机在收集数据时的线程篓。注意,这是一个即时计数,不是一段时间的平均值。线程是基本的可执行实体,用于处理器中执行指令

    Process

    Private Bytes

    专为此进程分配,无法与其他进程共享的当前字节数

  • LR监控指标数据分析

    2008-12-15 17:00:56

    监控指标数据分析
    1.最大并发用户数:
    应用系统在当前环境(硬件环境、网络环境、软件环境(参数配置))下能承受的最大并发用户数。
    在方案运行中,如果出现了大于3个用户的业务操作失败,或出现了服务器shutdown的情况,则说明在当前环境下,系统承受不了当前并发用户的负载压力,那么最大并发用户数就是前一个没有出现这种现象的并发用户数。
    如果测得的最大并发用户数到达了性能要求,且各服务器资源情况良好,业务操作响应时间也达到了用户要求,那么OK。否则,再根据各服务器的资源情况和业务操作响应时间进一步分析原因所在。

     

    2.业务操作响应时间:
    ? 分析方案运行情况应从平均事务响应时间图和事务性能摘要图开始。使用事务性能摘要图,可以确定在方案执行期间响应时间过长的事务。
    ? 细分事务并分析每个页面组件的性能。查看过长的事务响应时间是由哪些页面组件引起的?问题是否与网络或服务器有关?
    ? 如果服务器耗时过长,请使用相应的服务器图确定有问题的服务器度量并查明服务器性能下降的原因。如果网络耗时过长,请使用网络监视器图确定导致性能瓶颈的网络问题
    3.服务器资源监控指标:
    内存:
        1 UNIX资源监控中指标内存页交换速率(Paging rate),如果该值偶尔走高,表明当时有线程竞争内存。如果持续很高,则内存可能是瓶颈。也可能是内存访问命中率低。

     

        2 Windows资源监控中,如果Process\Private Bytes计数器和Process\Working Set计数器的值在长时间内持续升高,同时Memory\Available bytes计数器的值持续降低,则很可能存在内存泄漏。

     

    内存资源成为系统性能的瓶颈的征兆:
        很高的换页率(high pageout rate);
        进程进入不活动状态;
        交换区所有磁盘的活动次数可高;
        可高的全局系统CPU利用率; 
        内存不够出错(out of memory errors) 

     

    处理器:
        1 UNIX资源监控(Windows操作系统同理)中指标CPU占用率(CPU utilization),如果该值持续超过95%,表明瓶颈是CPU。可以考虑增加一个处理器或换一个更快的处理器。如果服务器专用于SQL Server,可接受的最大上限是80-85% 
        合理使用的范围在60%70%
        2 Windows资源监控中,如果System\Processor Queue Length大于2,而处理器利用率(Processor Time)一直很低,则存在着处理器阻塞。

     

    CPU资源成为系统性能的瓶颈的征兆:   
         很慢的响应时间(slow response time) 
         CPU空闲时间为零(zero percent idle CPU) 
         过高的用户占用CPU时间(high percent user CPU) 
         过高的系统占用CPU时间(high percent system CPU) 
        长时间的有很长的运行进程队列(large run queue size sustained over time) 

     

    磁盘I/O
        1 UNIX资源监控(Windows操作系统同理)中指标磁盘交换率(Disk rate),如果该参数值一直很高,表明I/O有问题。可考虑更换更快的硬盘系统。
        2 Windows资源监控中,如果 Disk TimeAvg.Disk Queue Length的值很高,而Page Reads/sec页面读取操作速率很低,则可能存在磁盘瓶径。 

     

    I/O资源成为系统性能的瓶颈的征兆 :
         过高的磁盘利用率(high disk utilization) 
        太长的磁盘等待队列(large disk queue length) 
        等待磁盘I/O的时间所占的百分率太高(large percentage of time waiting for disk I/O) 
        太高的物理I/O速率:large physical I/O rate(not sufficient in itself) 
        过低的缓存命中率(low buffer cache hit ratio(not sufficient in itself)) 
        太长的运行进程队列,但CPU却空闲(large run queue with idle CPU) 

     

    4.数据库服务器:
    SQL Server数据库:
        1 SQLServer资源监控中指标缓存点击率(Cache Hit Ratio),该值越高越好。如果持续低于80%,应考虑增加内存。
        2 如果Full Scans/sec(全表扫描/秒)计数器显示的值比12高,则应分析你的查询以确定是否确实需要全表扫描,以及SQL查询是否可以被优化。 
        3 Number of Deadlocks/sec(死锁的数量/):死锁对应用程序的可伸缩性非常有害,并且会导致恶劣的用户体验。该计数器的值必须为0
       4 Lock Requests/sec(锁请求/),通过优化查询来减少读取次数,可以减少该计数器的值。

     

    Oracle数据库:
      1 如果自由内存接近于0而且库快存或数据字典快存的命中率小于0.90,那么需要增加SHARED_POOL_SIZE的大小。
        快存(共享SQL区)和数据字典快存的命中率: 
       select(sum(pins-reloads))/sum(pins) from v$librarycache; 
        select(sum(gets-getmisses))/sum(gets) from v$rowcache; 
        自由内存:    select * from v$sgastat where name=’free memory’; 
    2 如果数据的缓存命中率小于0.90,那么需要加大DB_BLOCK_BUFFERS参数的值(单位:块)。
      缓冲区高速缓存命中率:
        select name,value from v$sysstat where name in ('db block gets’,
        'consistent gets','physical reads') ; 
        
        Hit Ratio = 1-(physical reads / ( db block gets + consistent gets))
    3 如果日志缓冲区申请的值较大,则应加大LOG_BUFFER参数的值。
        日志缓冲区的申请情况 :
         select name,value from v$sysstat where name = 'redo log space requests' ;
    4 如果内存排序命中率小于0.95,则应加大SORT_AREA_SIZE以避免磁盘排序 。
       内存排序命中率 :
         select round((100*b.value)/decode((a.value+b.value), 0, 1, (a.value+b.value)), 2)from v$sysstat a, v$sysstat b where a.name='sorts (disk)' and b.name='sorts (memory)' 
       
        注:上述SQL ServerOracle数据库分析,只是一些简单、基本的分析,特别是Oracle数据库的分析和优化,是一门专门的技术,进一步的分析可查相关资料。
  • loadrunner中Lr_save_string()函数和Itoa()函数的使用

    2008-12-10 12:27:48

    目的:使用for循环添加多条有规律的数据,比如说:a1a2a3......a1000

    方法:从上面看1-1000是一个有序序列,并且前面的a都是固定的,所以只需要用for循环将1-1000循环出来就可以了。

          但是loadrunner使用的是C语言的语法,所以不能向在java中一样,将两个变量直接相加(+)(+:连字符)

          所以这个时候就需要将首先将int变量转换成string,然后再用lr_save_string()函数将该变量用loadrunner可以识别的参数化方式保存起来,再应用到录制的脚本中就可以了

         

    函数简介:

          int itoa ( int value, char *str, int radix );

          函数目的:int类型转换成string

          参数介绍:value 要转换的int型的值

                     str 目标字符串,即将转换成的string值保存到str

                    radix:转换数字时所用的基数 10:十进制;2:二进制……

                   

          int lr_save_string (const char *param_value, const char *param_name);

          函数目的:param_value值保存到param_name变量中

          参数介绍:param_value:要保存的值

                    param_name 变量名称

     

    问题:为什么要用itoa()lr_save_string()两个函数相结合使用呢?

          因为lr_save_string()中的两个参数都是char类型的指针,int类型的值必须经过转换才能在lr_save_string()函数中使用,所以此处就要将itoa()lr_save_string()两个函数相结合使用。

    */

     

    Action()

    {

           int i;

           char str[100];   //定义一个数组用来保存int类型转换后的值

     

           for(i=0;i<=9;i++){

                  itoa(i,str,10);

                  lr_save_string(str,"ID");

                  lr_output_message("==str:=%s==ID:=%s====",str,lr_eval_string("{ID}"));

           }

     

     /*

    lr_save_string()将数组保存到变量中以后就可以应用到Loadrunner录制的脚本中了

    {ID}loardrunner识别参数的方式

     

        web_url("login",

                  "URL=http://server0.im.sonoro.cn:18001/login?username=a{ID}&password=test&autoLogin=false&1211433835878&1211433835878",

                  "TargetFrame=",

                  "Resource=0",

                  "RecContentType=text/html",

                  "Referer=http://server0.im.sonoro.cn:18001/proxy.html?1211433821547",

                  "Snapshot=t6.inf",

                  "Mode=HTML",

                  LAST);

     

    */

           return 0;

    }

  • 详解lr参数表中的参数分配规则

    2008-12-10 12:26:25

    <!--[if !supportMisalignedColumns]--> <!--[endif]-->

    Select next row

    Update value on

     

     

    Sequential

    Each iteration

    每次执行Action时,参数值改变。

    每个Vuser的参数取值都一样。

    Each occurrence

    每次取参数时,参数值改变。

    每个Vuser的参数取值都一样。

    Once

    唯一

    Random

     

    自由选取参数

     

     

     

    Unique

    Each iteration

    每次执行Action时,参数值改变。

    Allocate Vuser values in the Controller

    可选择“自动”和“手动”分配。

    “自动”分配把参数平均分给每个Vuser

    “手动”分配时,参数不够的话,压力测试时会报错。

    Each occurrence

    每次取参数时,参数值改变。

    只有“手动”分配。参数不够,测试时报错。

    Once

    唯一

     

    When out of values

    Abort Vuser

    结束Vuser

    Continue in a cyclic manner

    使用同样的循环样式继续

    Continue with last value

    使用最后一个参数值继续






     

    注释:

    iteration: Run-time Settings中对Number of Iterations进行设置,即每次运行脚本时,Action反复执行的次数。

    occurrence: 在一个Action中出现2次以上的同一个参数表。

    注意:

    当在脚本中使用lr_message lr_ouput_message输出参数值时,

    例如lr_message(“result=%s”,lr_eval_string(“{NewParam}”)

    参数表也会给这个语句中的{NewParam}分配一个参数值。

     

    Parameter type: Unique Number

    Number range: Start: 1  

             Block size per Vuser: 100   从1开始,每个并发使用100个参数.第1个并发使用1-                                      100,第2个使用101=200,第3个……

    Number format: %d 不保留有效数字。

                   %01d 保留1位有效数字。

  • FQA

    2008-12-07 17:21:24

    <a>标签中的target=_blank是什么意思?

    该连接在新窗口中打开
      _self相同框架  
      _top整页  
      _blank新建一个窗口  
      _parent父窗口  
    其它的就是自定义了,可以指向已有的窗口名称
  • QTP之顺序标识符

    2008-12-07 16:41:51

    QTP之顺序标识符

    众所周知,QTP是根据对象的属性及属性值去识别对象的,但有时仅仅有强制属性和辅助属性是不够的,这就需要加上顺序标识符来唯一描述对象。今天学习一下关于顺序标识符的知识,希望大家一起讨论!# b8 i! }& v! U& H

    & }- d1 n5 G! U: Z# e5 mQuickTest 可以使用三种类型的顺序标识符来标识对象: 3 S7 y% l% a& D" H
    • 索引 - 指示该对象在应用程序代码中相对于其他描述都相同的其他对象的显示顺序。
    • 位置 - 指示该对象在父窗口、框架或对话框中相对于其他描述都相同的其他对象的显示顺序。
    • CreationTime(仅限于浏览器对象)- 指示该浏览器打开的顺序,相对于其他描述都相同的其他打开的浏览器。

    % t0 u% j; z7 {3 u) X2 X" L
    + {4 c& o7 m2 l  u' i3 N# I4 o+ G. w( I/ m5 @% j' C1 [" O
          默认情况下,每个测试对象类的顺序标识符都被选中。要修改选定的顺序标识符,请从“顺序标识符”框中选择所需的类型。(Tools--->Object Identification打开)3 G) P& b7 G2 C9 B% x
    $ V( G6 |3 t# H1 _3 ]: T( e9 R8 P
                                                          
    # W! r' l; a1 {% u1 w1 n/ p6 D0 ~. l* T' }

    3 K" I" ~* X) U( P: {
         如果 QuickTest 在录制时使用强制和辅助属性成功地创建了唯一的测试对象描述,则不会录制顺序标识符值。您可以在以后使用“对象属性”或“对象库”对话框中的“添加/删除”选项,向对象的测试对象属性中添加顺序标识符。
    ( r! r' V/ W1 L. g* t5 u! X( V0 e

    5 Q5 F  i# g; v

    3 ]- r3 h. H" m使用索引属性标识对象
         在录制期间,QuickTest 可以为对象的 Index 测试对象属性分配一个值,以便唯一标识该对象。该值基于对象在源代码中的显示顺序。第一个出现的是 0。 注意,Index 属性值是特定于对象的。因此,如果使用 Index:=3 描述 WebEdit 测试对象,QuickTest 将在页中搜索第四个 WebEdit 对象。但是,如果使用 Index:=3 描述 WebElement 对象,QuickTest 将在页中搜索第四个任何类型的 Web 对象,因为 WebElement 对象适用于所有 Web 对象。 ' w8 S6 s; U/ `" c' o
    5 Q  x) c9 q. q# W0 n
    例如,假定页中有下列对象: 2 m* [& G0 Z( u
    • 名为 Apple 的图像
    • 名为 UserName 的图像
    • 名为 UserName 的 WebEdit 对象
    • 名为 Password 的图像
    • 名为 Password 的 WebEdit 对象
      _8 R" q# ]0 Q+ Y
    下面的描述引用了上述列表中的第三项,因为它是页中第一个名为 UserName 的 WebEdit 对象。
    / X4 R+ c# Q: qWebEdit("Name:=UserName", "Index:=0")
    2 ~/ {' N" o( J, a. b4 j" k% X" c5 y8 A0 @2 q2 T/ J
    但是,下面的描述引用的是上述列表中的第二项,因为它是第一个名为 UserName 的、任何类型 (WebElement) 的对象。 . B2 p  v' K# R; H
    WebElement("Name:=UserName", "Index:=0")
    * {# z% T+ w8 H) Q
    使用位置属性标识对象
    在录制期间,QuickTest 可以为对象的 Location 测试对象属性分配一个值,以便唯一标识该对象。该值基于对象在窗口、框架或对话框中相对于具有相同属性的其他对象的显示顺序。第一个出现的对象是 0。各列值的分配从上到下、从左到右。 % y9 H; v0 n7 i: _
    例如,下面的对话框中的单选按钮按照其位置属性编号。
    9 m, k- _  h; b  Z1 N( V$ P6 }8 x% W
                                 
    3 ]# L  N5 a7 j9 s7 R
    ; ~  F% X7 l8 t, O( a注意,Location 属性值是特定于对象的。因此,如果使用 Location:=3 描述 WinButton 测试对象,则 QuickTest 在该页从上到下、从左到右搜索第四个 WinButton 对象。 但是,如果使用 Location:=3 描述 WinObject 对象,则 QuickTest 在该页中从上到下、从左到右搜索第四个任何类型的标准对象,因为 WinObject 对象适用于所有标准对象。
    2 F' P. @9 o( H7 _! {6 S. r
    例如,假定对话框中有下列对象:
    5 p3 V/ ?+ E% Z! A& |' b: E7 Q- [7 k* b
    • 名为 OK 的按钮对象
    • 名为 Add/Remove 的按钮对象
    • 名为 Add/Remove 的复选框对象
    • 名为 Help 的按钮对象
    • 名为 Check spelling 的复选框对象

    # B3 _! a. D; D5 x; N' k
    下面的描述引用了上述列表中的第三项,因为它是页中第一个名为 Add/Remove 的复选框对象。 7 ^& Y7 T% O9 f* w
    WinCheckBox("Name:=Add/Remove", "Location:=0") $ f7 O; A& \& y" p  p, u
    ! @' K1 t8 b1 z/ H
    但是,下面的描述引用的是上述列表中的第二项,因为它是第一个名为 Add/Remove 的、任何类型 (WinObject) 的对象。 7 h: u- M1 `; P
    WinObject("Name:=Add/Remove", "Location:=0")
    * p. x" |9 b! K9 R4 R, n9 a3 K
    使用 CreationTime 属性标识对象
           在录制期间,如果 QuickTest 不能仅基于测试对象描述唯一标识浏览器对象,它将为“CreationTime”测试对象属性分配一个值。该值指示该浏览器打开的顺序,相对于其他描述都 相同的其他打开的浏览器。在运行会话期间,如果 QuickTest 不能只是基于其测试对象描述来标识某个浏览器对象,那么,它将检查浏览器的打开顺序,然后使用“CreationTime”属性标识正确的对象。 6 j) h& P, N+ E9 b2 U' g
    例如,如果您在三个浏览器上录制测试或组件,这三个浏览器除了打开时间分别在 9:01 pm、9:03 pm 和 9:05 pm 之外,其他方面完全相同,那么,QuickTest 将把 CreationTime 值 0 分配给 9:01 pm 浏览器,1 分配给 9:03 pm 浏览器,2 分配给 9:05 pm 浏览器。在 10:30 pm,当您返回测试或组件时,假定浏览器分别在 10:31 pm、10:33 pm 和 10:34 pm 打开。QuickTest 将使用 CreationTime = 0 的浏览器测试对象标识 10:31 pm 浏览器,使用 CreationTime = 1 的测试对象标识 10:33 pm 浏览器,使用 CreationTime = 2 的测试对象标识 10:34 pm 浏览器。
    * c) {! n9 F9 U0 M8 ^' p* x  F
           如果打开几个浏览器,则 CreationTime 最高的浏览器是最后一个打开的浏览器,CreationTime 最低的浏览器是第一个打开的浏览器。例如,如果打开三个或更多的浏览器,则 CreationTime = 2 的浏览器是第三个打开的浏览器。如果恰好有七个或更少的浏览器,则 CreationTime = 6 的浏览器是最后一个打开的浏览器。 2 z. A2 i( D! K* S- Y
    $ Y4 }, w+ u4 z* @" H! D
          例如,如果在 CreationTime = 6 的浏览器上录制步骤,并且具有该 CreationTime 值的浏览器没有打开,该步骤将在当前打开的、CreationTime 值最高的浏览器上运行。例如,如果在运行会话期间,当前打开了 CreationTime = 0 和 CreationTime = 1 的两个浏览器,那么该步骤不会由于找不到 CreationTime = 6 的浏览器而失败,相反,它会在最后一个打开的浏览器上运行,如果是这种情况,浏览器 CreationTime = 1。
    * K5 c( C! P0 h. H  Z& e
    * |  ]! Y5 _: M1 t      注意:可能会出现这样的情况,在会话期间的特定时间,可用的 CreationTime值并不有序。例如,如果您在录制或运行会话期间打开六个浏览器,然后在该会话期间,您关闭第二个和第四个浏览器 (CreationTime 值为 1 和 3),那么在会话结束时,打开的浏览器将是 CreationTime 值为 0、2、4 和 5 的浏览器! o, o) \  N& E0 T. z% r& k
                             # x) I. w# J5 a4 i3 r% B$ d
  • QTP测试页面的连接是否可用.

    2008-12-07 13:52:45

    set a= Browser("Yahoo!")
    set b= Browser("Yahoo!").Page("Yahoo!")
    call CheckLinks(a,b)
    Function CheckLinks (BrowserObject,BrowserPage)
    CheckLinks=TRUE
    Dim s_URL,i_CreationTime
    Dim s_LinkOuterText,s_LinkInnerText,s_Linkhref
    s_URL=BrowserPage.GetROProperty("url")
    i_CreationTime=1
    i_LinkCount=BrowserPage.object.links.length - 1

    Dim i_Link

    For i_Link=0 to i_LinkCount
    If Trim(BrowserPage.object.links(i_Link).target)="" Then
    BrowserPage.object.links(i_Link).target="_blank" ' Set the link to open i a new window so that we dont have any change in current window
    End If

    BrowserPage.object.links(i_Link).click
    On error resume next
    Browser("CreationTime:=" & i_CreationTime).sync
    Browser("CreationTime:=" & i_CreationTime).Page("micClass:=Page").sync
    On error goto 0
    Dim s_LinkDetails

    IHTML = Browser("CreationTime:=" & i_CreationTime).Page("micClass:=Page").object.Body.innerHTML
    'Check if page was not able to be displayed
    If (InStr(IHTML,"HTTP 404") <> 0) Or (InStr(IHTML,"cannot be displayed") <> 0) Then
    s_LinkDetails="Link Broken" + vbcrlf + "Link Details:" +vbcrlf
    s_LinkDetails=s_LinkDetails+"OuterText: "+ s_LinkOuterText + vbcrlf
    s_LinkDetails=s_LinkDetails+"InnerText: "+ s_LinkInnerText + vbcrlf
    s_LinkDetails=s_LinkDetails+ "href: " + s_Linkhref+ vbcrlf
    s_LinkDetails=s_LinkDetails+ "Links Open in New Browse: " & bNewBrowser & vbcrlf
    Reporter.ReportEvent micWarning,"Check Link(" & i_Link & ") -> " & s_LinkOuterText ,s_LinkDetails
    CheckLinks=FALSE
    Else
    s_LinkDetails="Link Working" + vbcrlf + "Link Details:" +vbcrlf
    s_LinkDetails=s_LinkDetails+"OuterText: "+ s_LinkOuterText + vbcrlf
    s_LinkDetails=s_LinkDetails+"InnerText: "+ s_LinkInnerText+ vbcrlf
    s_LinkDetails=s_LinkDetails+ "href: " + s_Linkhref+ vbcrlf
    s_LinkDetails=s_LinkDetails+ "Links Open in New Browse: " & bNewBrowser & vbcrlf
    Reporter.ReportEvent micPass,"Check Link(" & i_Link & ") -> " & s_LinkOuterText ,s_LinkDetails
    End If

    Browser("CreationTime:=1").close ' Close the link open.
    Next
    End Function

  • 学无止境

    2008-12-07 13:51:04

    RT

  • 我的栏目

    数据统计

    • 访问量: 8266
    • 日志数: 13
    • 建立时间: 2008-12-04
    • 更新时间: 2010-03-12

    RSS订阅

    Open Toolbar