发布新日志

  • qtp 正则表达式(RegExp)对象(转载)

    2010-05-25 14:23:50

    正则表达式(RegExp)对象

      属性:

      Global 属性:

      设置或返回一个 Boolean 值,该值指明在整个搜索字符串时模式是全部匹配还是只匹配第一个。

      IgnoreCase 属性:

      设置或返回一个Boolean值,指明模式搜索是否区分大小写。

      Pattern 属性:

      设置或返回被搜索的正则表达式模式。

      方法:

    •   Execute 方法:

      对指定的字符串执行正则表达式搜索。

      object.Execute(string)

      参数:

      object:必选项。总是一个 RegExp 对象的名称。

      string:必选项。要在其上执行正则表达式的文本字符串。

      说明:

      正则表达式搜索的设计模式是通过 RegExp 对象的 Pattern 来设置的。

      Execute 方法返回一个 Matches 集合,其中包含了在 string 中找到的每一个匹配的 Match 对象。如果未找到匹配,Execute 将返回空的 Matches 集合。

    •   Replace 方法:

      替换在正则表达式查找中找到的文本。

      object.Replace(string1, string2)

      参数:

      Object:必选项。总是一个 RegExp 对象的名称。

      string1:必选项。string1 是将要进行文本替换的字符串。

      string2:必选项。 string2 是替换文本字符串。

      说明:

      被替换的文本的实际模式是通过 RegExp 对象的 Pattern 属性设置的。

      Replace 方法返回 string1 的副本,其中的 RegExp.Pattern 文本已经被替换为 string2。如果没有找到匹配的文本,将返回原来的 string1 的副本。

    •   Test 方法:

      对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。

      object.Test(string)

      参数:

      Object:必选项。总是一个 RegExp 对象的名称。

      String:必选项。要执行正则表达式搜索的文本字符串。

      说明:

      正则表达式搜索的实际模式是通过RegExp对象的Pattern属性来设置的。RegExp.Global属性对Test方法没有影响。

      如果找到了匹配的模式,Test方法返回True;否则返回False
  • vbs 随机数生成

    2010-05-21 10:01:15

    cstr((1000 * Rnd) + 0)
  • 通过xslt将xml显示成网页形式的资料 [2010年04月09日]

    2010-04-09 09:13:52

      这个资料我是搜集的,供大家学习!
       地址:http://blog.csdn.net/huwei2003/archive/2009/03.aspx
  • XML 解析 解析XML有两种基本方式(转载)

    2010-03-29 10:28:08

    XML 解析

    解析XML有两种基本方式:
    1)DOM
    2)SAX
    DOM解析器把 XML文档转化为一个包含其内容的树,并可以对树进行遍历。用DOM解析模型的优点是编程容易,开发人员只需要调用建树的指令,然后利用 navigation APIs访问所需的树节点来完成任务。可以很容易的添加和修改树中的元素。然而由于使用DOM解析器的时候需要处理整个XML文档,所以对性能和内存的要 求比较高,尤其是遇到很大的XML文件的时候。由于它的遍历能力,DOM解析器常用于XML文档需要频繁的改变的服务中。

    SAX解析器 采用了基于事件的模型,它在解析XML文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找 到。SAX对内存的要求通常会比较低,因为它让开发人员自己来决定所要处理的tag。特别是当开发人员只需要处理文档中所包含的部分数据时,SAX这种扩 展能力得到了更好的体现。但用SAX解析器的时候编码工作会比较困难,而且很难同时访问同一个文档中的多处不同数据。

    通俗点讲,Dom 解析器是将xml文档整个读入内存中以便查找,而SAX解析器只是依次解析读到的tag数据,当找到想要的数据时便可停止解析,不用读取整个XML文档至 内存。有很多开源项目提供了各种用于解析xml的包,其原因无非是在dom和sax的原理基础上做一些优化工作。Java中比较常用的操作xml的开源包 有 dom4j、JDOM、Crimson、Commons-Digester等等。。(后两者均为apache开源包)。

    当然JAVA 里也自带了一些包用于解析、保存xml:javax.xml包、org.w3c.dom、org.xml.sax,更多具体的操作方法可以查看java api文档(这几个包都是内置的,官方API文档里就其详尽的包描述)

    这里我们使用javax.xml,org.w3c.dom,给出如 何创建Dom树、如何从.xml文件中生成Dom树,如何将Dom树保存到xml文件中。

    生成一个Document空的文档对象:
    org.w3c.dom.Document doc = javax.xml.parsers.DocumentBuilderFactory.newInstance().
    newDocumentBuilder().newDocument();
    可 以这样理解和记忆:要建立一个Document对象(这是一个产品),那么先要有一个工厂DocumentBuilderFactory,由工厂“招聘 “一个制造者DocumentBuilder,然后由制造者来生产Document对象。
    工厂DocumentBuilderFactory没有 公有的构造方法,只能用newInstance()取得一个工厂。同样DocumentBuilder也没有公共构造方法。这里涉及到设计模式里的“工厂 方法模式”和“单态模式”,这样做的意义我们以后将在“设计模式”一块给出。

    从.xml文件中生成Document对象:
    javax.xml.parsers.DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File(“fileName”));
    其中parse方法可以是多种参数,可参看java api文档。

    取得根结点:
    doc.getDocumentElement().childNodes().item(0);
    可 以看到对dom树操作就类似于在javascript里用dom api操作xml了,事实上,两者都是有w3c标准化组织提供的。

    文件 存放xml Document对象。
    javax.xml.transform.Transformer tf =
    javax.xml.transform.TransformerFactory.newInstance().newTransformer();
    tf.transform(new javax.xml.transform.dom.DOMSource(doc),
    new javax.xml.transform.stream.StreamResult(new FileOutputStream(fileName)));

    下面是一些简单的包装过的方法:
    /**
    *将dom树对象 doc存入fileName提定的文件中
    **/
    public void saveToFile(Document doc, String fileName) throws TransformerFactoryConfigurationError, FileNotFoundException, TransformerException{
                  javax.xml.transform.Transformer trans = javax.xml.transform.TransformerFactory.newInstance().newTransformer();
                  trans.transform(new javax.xml.transform.dom.DOMSource(doc),
                                new javax.xml.transform.stream.StreamResult(new FileOutputStream(fileName)));
          }

    /**
    *生成一个带根结点名为 rootName的Dom树对象。
    **/
    public Document createXMLDoc(String rootName) throws FileNotFoundException, SAXException, IOException, ParserConfigurationException{
                  Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
                  doc.appendChild(doc.createElement(rootName));             
                  return doc;
          }

    /**
    *由给定文件名的xml文件生成一个Dom 树。
    */
    public Document createXMLFromFile(String fileName) throws SAXException, IOException,
                        ParserConfigurationException {
                  File xmlFile = new File(fileName);
                  if (!xmlFile.exists()) {
                        System.err.println("File " + fileName + "doesn't exist!");
                        System.exit(0);
                  }
                  return DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(
                                fileName);     
          }
    本贴标签:
  • (转载)QTP DotNetFactory使用解析

    2010-03-24 14:32:02

    http://docs.google.com/View?id=ddnrfkv6_1917fjkgm9hk
    QuickTest Professional 9.x 增加了一项新功能DotNetFactory,它能让你创建.NET对象实例,它封装了CreateInstance方法。如果你想使用一个.NET对象 作为QuickTest中一个方法的一个参数,你必须使用CreateInstance方法首先为该.NET对象创建一个COM接口:

    Set var_CreateInstance = DotNetFactory.CreateInstance (TypeName [,Assembly] [,args])

    Argument

    Type

    Description

    TypeName
    String
    The full name of the object type, for example, System.Windows.Forms.Form.
    Assembly
    Any
    Optional. If the assembly is preloaded in the registry, you do not need to enter it. Otherwise, you should enter the full path name, for example, System.Windows.Forms. If you want to create an instance of a type in the GAC (Global Assembly Cache), you can enter the short name, for example, Forms.
    Note: If you do not pass this argument, QuickTest assumes that the assembly is resident in memory. If QuickTest does not find the assembly, an error message is displayed during the run session.
    args
    Any
    Optional. The required arguments, if any, for the specified TypeName and/or Assembly.
    支持DotNetFactory这项功能的DLL位于%programfiles%\HP\QuickTest Professional\bin\DotNetFactory.dll
     

    Mscorlib.dll代表微软的Common Language Runtime Library,是.NET框架 通用库的主要程序集。它定义了如下命名空间(v2.0.50727):

    Microsoft.Win32

    Microsoft.Win32.SafeHandles

    System

    System.Collections

    System.Collections.Generic

    System.Collections.ObjectModel

    System.Configuration.Assemblies

    System.Deployment.Internal

    System.Deployment.Internal.Isolation

    System.Deployment.Internal.Isolation.Manifest

    System.Diagnostics

    System.Diagnostics.CodeAnalysis

    System.Diagnostics.SymbolStore

    System.Globalization

    System.IO

    System.IO.IsolatedStorage

    System.Reflection

    System.Reflection.Cache

    System.Reflection.Emit

    System.Resources

    System.Runtime

    System.Runtime.CompilerServices

    System.Runtime.ConstrainedExecution

    System.Runtime.Hosting

    System.Runtime.InteropServices

    System.Runtime.InteropServices.ComTypes

    System.Runtime.InteropServices.Expando

    System.Runtime.InteropServices.TCEAdapterGen

    System.Runtime.Remoting

    System.Runtime.Remoting.Activation

    System.Runtime.Remoting.Channels

    System.Runtime.Remoting.Contexts

    System.Runtime.Remoting.Lifetime

    System.Runtime.Remoting.Messaging

    System.Runtime.Remoting.Metadata

    System.Runtime.Remoting.Metadata.W3cXsd2001

    System.Runtime.Remoting.Proxies

    System.Runtime.Remoting.Services

    System.Runtime.Serialization

    System.Runtime.Serialization.Formatters

    System.Runtime.Serialization.Formatters.Binary

    System.Runtime.Versioning

    System.Security

    System.Security.AccessControl

    System.Security.Cryptography

    System.Security.Cryptography.X509Certificates

    System.Security.Permissions

    System.Security.Policy

    System.Security.Principal

    System.Security.Util

    System.Text

    System.Threading

    .NET类继承体系的根类Sytem.Object也定义在这个类集当中,几乎所有的托管应用程序都必须引用这个类集,所以C#编译器在编译过程中自动加上对mscorlib类集的引用,所有程序集也都自动引用了它。延伸阅读mscorlib.dll & System.dll

     
     
    例子:
    1. Set objBtn1 = DotNetFactory.CreateInstance(”System.Windows.Forms.Button”)
    2. Set myList = DotnetFactory.CreateInstance("System.Collections.ArrayList")
    3. Set File = DotNetFactory.CreateInstance("System.IO.File")
    4. Set p1 = DotNetFactory.CreateInstance(”System.Drawing.Point”,”System.Drawing”,x,y)
    5. Set objReader1 = DotNetFactory.CreateInstance(”System.Xml.XmlTextReader”, “System.Xml”,”C:\Documents and Settings\kmohankumar\Desktop\11.xml”)
     
    附录:
    [Description("Enables you to create an instance of a .NET object, and access its methods and properties."), Guid("15494157-E302-4a17-95C7-24C545CA8F53"), ClassInterface(ClassInterfaceType.None), ProgId("Mercury.DotNetFactory.1"), ComVisible(true)]
    public class DotNetFactory : IObjFactory, IReflect, IObjFactoryServices
    {
    // Fields
    private ArrayList _ArgList;

    // Methods
    static DotNetFactory()
        {
        Trace.WriteLine("ObjectFactory");
        RegistryKey currentUser = Registry.CurrentUser;
        RegistryKey key2 = currentUser.OpenSubKey(@"Software\Mercury Interactive\QuickTest Professional\MicTest\ReservedObjects\DotNetFactory");//见下图

        string str = (string) key2.GetValue("PreloadAssemblies", null);
        if (str != null)
        {
            string[] strArray = str.Split(new char[] { ';' });
            DotNetFactory factory = new DotNetFactory();
            currentUser.Close();
            key2.Close();
            foreach (string str2 in strArray)
            {
                try
                {
                    Trace.WriteLine(str2);
                    factory.LoadAssembly(str2);
                    Trace.WriteLine("Loaded");
                }
                catch
                {
                    Trace.WriteLine("Failed");
                }
            }
        }
        }

    public DotNetFactory();
        {
           this._ArgList = new ArrayList();
        }

    private void AddArg(object arg)
        {
            if (arg is DispWrapper)
            {
                arg = ((DispWrapper) arg)._object;
            }
            this._ArgList.Add(arg);
        }
     private void ClearArgs();
     
     public object CreateInstance(string TypeName, object assembly, params object[] CtorArgs)
        {
            object obj3;
            ConstructorInfo[] constructors;
            this._ArgList.Clear();
            if (CtorArgs != null)
            {
                foreach (object obj2 in CtorArgs)
                {
                    this.AddArg(obj2);
                }
            }
            if ((assembly is string) && (((string) assembly).Length > 0))
            {
                this.LoadAssembly(assembly as string);
            }
            Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();//获取当前应用程序域加载的所有程序集
            Type conversionType = null;
            foreach (Assembly assembly2 in assemblies)
            {
                conversionType = assembly2.GetType(TypeName);//如果CreateInstance仅有一个参数无须带任何可选参数,帮助里说程序集已在内存中,如例2和例3             
                 if (conversionType != null)
                {
                    break;
                }
            }
            if (conversionType == null)
            {
                throw new Exception("Type '" + TypeName + "' not found in any loaded assembly");
            }
            if (this._ArgList.Count == 0)
            {
                constructors = conversionType.GetConstructors();//值来自于如果CreateInstance仅有一个参数
                if ((constructors == null) || (constructors.Length == 0))
                {
                    if (conversionType.IsValueType)
                    {
                        string str = "0";
                        try
                        {
                            obj3 = Convert.ChangeType(str, conversionType);
                        }
                        catch (InvalidCastException)
                        {
                            obj3 = new DispWrapper(conversionType);
                        }
                    }
                    else
                    {
                        obj3 = new DispWrapper(conversionType);
                    }
                }
                else
                {
                    obj3 = conversionType.Assembly.CreateInstance(TypeName);
                }
            }
            else
            {
                object[] args = new object[this._ArgList.Count];
                for (int i = 0; i < this._ArgList.Count; i++)
                {
                    args[i] = this._ArgList[i];
                }
                this.ClearArgs();
                constructors = conversionType.GetConstructors();//值来自于如果CreateInstance仅有一个参数
                if ((constructors == null) || (constructors.Length == 0))
                {
                    obj3 = new DispWrapper(conversionType);
                }
                else
                {
                    obj3 = conversionType.Assembly.CreateInstance(TypeName, false, BindingFlags.CreateInstance, null, args, null, null);//此步能接受例4和例5的输入
                }
                if (obj3 == null)
                {
                    throw new Exception("Cannot create instance of " + TypeName);
                }
            }
            if (!(obj3 is string) && !(obj3 is DispWrapper))
            {
                obj3 = new DispWrapper(obj3);
            }
            return obj3;
        }
     
     public void LoadAssembly(string partialName)
        {
        string str = partialName.ToLower();
        if (str.IndexOf(".dll") > 0)
        {
            this.LoadAssemblyByPath(partialName);
        }
        else if (str.IndexOf(".exe") > 0)
        {
            this.LoadAssemblyByPath(partialName);
        }
        else if (Assembly.LoadWithPartialName(partialName) == null)
        {
            throw new FileNotFoundException("Cannot load Assembly " + partialName);
        }
        }

    private void LoadAssemblyByPath(string path)
        {
        Assembly.LoadFrom(path);
        }

        FieldInfo IReflect.GetField(string name, BindingFlags bindingAttr);
        FieldInfo[] IReflect.GetFields(BindingFlags bindingAttr);
        MemberInfo[] IReflect.GetMember(string name, BindingFlags bindingAttr);
        MemberInfo[] IReflect.GetMembers(BindingFlags bindingAttr);
        MethodInfo IReflect.GetMethod(string name, BindingFlags bindingAttr);
        MethodInfo IReflect.GetMethod(string name, BindingFlags bindingAttr, Binder binder, Type[] types, ParameterModifier[] modifiers);
        MethodInfo[] IReflect.GetMethods(BindingFlags bindingAttr);
        PropertyInfo[] IReflect.GetProperties(BindingFlags bindingAttr);
        PropertyInfo IReflect.GetProperty(string name, BindingFlags bindingAttr);
        PropertyInfo IReflect.GetProperty(string name, BindingFlags bindingAttr, Binder binder, Type returnType, Type[] types, ParameterModifier[] modifiers);
        object IReflect.InvokeMember(string name, BindingFlags invokeAttr, Binder binder, object target, object[] args, ParameterModifier[] modifiers, CultureInfo culture, string[] namedParameters); public object Unwrap(object wrapper);
    // Properties
    protected virtual Type MyType { get; }
    Type IReflect.UnderlyingSystemType { get; }
    }
      
     
    [ComVisible(true), ClassInterface(ClassInterfaceType.AutoDispatch)]
    internal class DispWrapper : IReflect
    {
    // Fields
    internal Exception _exception;
    internal object _object;
    private Type _ObjectType;

    // Methods
    internal DispWrapper(object obj)
    {
        this._object = obj;
        this._ObjectType = obj.GetType();
    }

    internal DispWrapper(Type t)
    {
        this._object = null;
        this._ObjectType = t;
    }
     public FieldInfo GetField(string name, BindingFlags bindingAttr);
    public FieldInfo[] GetFields(BindingFlags bindingAttr);
    public MemberInfo[] GetMember(string name, BindingFlags bindingAttr);
     public MemberInfo[] GetMembers(BindingFlags bindingAttr);
     public MethodInfo GetMethod(string name, BindingFlags bindingAttr);
     public MethodInfo[] GetMethods(BindingFlags bindingAttr);
     public PropertyInfo[] GetProperties(BindingFlags bindingAttr);  public PropertyInfo GetProperty(string name, BindingFlags bindingAttr, Binder binder, Type returnType, Type[] types, ParameterModifier[] modifiers);
     public object InvokeMember(string name, BindingFlags invokeAttr, Binder binder, object target, object[] args, ParameterModifier[] modifiers, CultureInfo culture, string[] namedParameters); MethodInfo IReflect.GetMethod(string name, BindingFlags bindingAttr, Binder binder, Type[] types, ParameterModifier[] modifiers); PropertyInfo IReflect.GetProperty(string name, BindingFlags bindingAttr);
     
     // Properties
    public Type UnderlyingSystemType { get; }
    }
     
  • vbs 操作xml文件

    2010-03-24 13:37:43

  • QTP(Quick Test Professional)插件破解 (转载)

    2010-03-12 08:57:22

    QTP(Quick Test Professional)插件破解

    下面是激活插件的步骤

    第一步:完成安装.net插件,这是,插件界面会显示出.net和WPF插件,并且有14天的测试license

    第二步:正常使用,等14天过完之后,也就是插件的状态变为 no license 之后,将HKEY_LOCAL_MACHINE\SOFTWARE\Mercury Interactive备份

    第三步:找到HKEY_LOCAL_MACHINE\SOFTWARE\Mercury Interactive\QuickTest Professional\Add-In Manager\WPF,将名称为“默认”的键值修改为“QTCoreAddin”,再将“ProgID”的键值修改为 “Mercury.AddinBaseObj”

    第四步:同理,找到HKEY_LOCAL_MACHINE\SOFTWARE\Mercury Interactive\QuickTest Professional\Add-In Manager\WinForms,将将名称为“默认”的键值修改为“QTCoreAddin”,再将“ProgID”的键值修改为 “Mercury.AddinBaseObj”

    第五步:关闭注册表,重启软件,.net插件和WPF插件的状态都已经变成了licensed状态

    http://hi.baidu.com/bianxuehui/blog/item/e771fa117e5acd0a203f2e0d.html

    本教程只为学习使用,请勿用于商业用途,否则,后果自负。

  • vbscript 对象判断

    2010-02-24 10:51:26

    basic语言中对普通类型赋值用=,对象赋值用set

    dim a,b
    a=12
    set b=document.getElementById("btnTest")

    普通数据类型用=比较,对象类型用is



     <input type="button" id="btnTest" name="btnTest" value="测试"/>
    <script. language="vbscript">
         dim btn
         set btn=document.getElementById("btnTest1")
              
         if btn is nothing then
                msgbox "无法找到对象"
         else
             msgbox "对象值:" & btn.value
         end if
    </script>
  • 关于 onBlur,onChange,onClick,OnKeyDown,OnKeyUp,OnKeyPress

    2010-02-08 14:01:59

    onblur:控件在失去焦点的时候触发

    OnChange:当控件的内容发生改变时触发该事件

    OnClick:点击该控件时触发

    OnKeyDown:在控件有焦点的情况下,按下键时发生

    OnKeyUp:在控件有焦点的情况下,释放键时发生

    OnKeyPress:在控件有焦点的情况下,按下键时发生

    键事件按下列顺序发生;
    1.KeyDown

    2.KeyPress

    3.KeyUp

    非字符键不会引发KeyPress,但是非字符键可以引发KeyDown,KeyUp

    OnMouseEnter:当鼠标指针进入控件时发生

    OnMouseDown:当鼠标指针在控件上,按下鼠标键时发生

    OnMouseUp:当鼠标指针在控件上,释放鼠标键时发生

    OnMouseLeave:当鼠标指针离开控件时发生

  • vbscript 二维数组的 定义

    2010-01-27 10:20:36

    第一种:
    <script. language="vbscript">
    dim rows(),cols,i

    i=0

    while(i<=20)    
        redim    preserve rows(i)   
        cols=array()
        redim cols(6)
       
        cols(0)=i & ":" & int(rnd*90)+10
        cols(1)=i & ":" & int(rnd*90)+10   
        cols(2)=i & ":" & int(rnd*90)+10   
        cols(3)=i & ":" & int(rnd*90)+10
        cols(4)=i & ":" & int(rnd*90)+10
        cols(5)=i & ":" & int(rnd*90)+10
       
        rows(i)=cols
        i=i+1   
    wend

    dim j
    for i=0 to ubound(rows,1)-1
         for j=0 to ubound(rows(i),1)-1
            document.write(rows(i)(j) & " ")
         next
         document.write("<br/>")   
    next
    </script>



  • 关于dom的frame日志 [2009年12月29日]

    2009-12-29 09:53:09

    在dom中的frame,只能通过contentWindow函数找到它的window,通过window来查找frame里的input, span等

    例如
    deptSelectPopFrame.contentWindow.document.getElementsByTagName("INPUT")

    另外: checkbox 使用click, 不能使用fireEvent("onclick")
  • qtp: 操作excel的workbook and worksheet

    2009-12-24 11:02:55

    Dim excelApp
    Set excelApp = getObject(  ,"Excel.Application")

    Set mySheet = excelApp.Workbooks("性能测试关注点.xls").Worksheets("sheet2")

    msgbox mysheet.cells(2,2)

  • What to do when QTP is not able to identify browse or upload buttons

    2009-12-18 16:25:51

    Dim web, webPage
    Set web = Browser("name:=****")
    Set webPage = Browser("name:=****").Page("title:=****")
    webPage.Frame("html id:="&popFrame.id).WebFile("name:=uploadFile").Click
    web.Dialog("regexpwndtitle:=选择文件").WinListView("regexpwndclass:=SysListView32").Select "指标导入.xls"
    web.Dialog("regexpwndtitle:=选择文件").WinButton("text:=打开\(\&O\)").Click
    webPage.Frame("html id:="&popFrame.id).WebFile("name:=uploadFile").Set "C:\Documents and Settings\neipin\桌面\指标导入.xls"


    转载:http://www.learnqtp.com/qtp-unable-to-identify-browse-upload-buttons/

    I am recording using QTP and for some reason QTP does not recognize any upload buttons. For example, start the recording at this site: http://cgi-lib.berkeley.edu/ex/fup.html

    Click on the "Browse" button. Notice this click is not recognized by QTP. Please provide some feedback why QTP is not able to recognize this button. Thanks

    This is an interesting question and not a typical object identification issue. I thought I will take it up on the blog to make it available to the wider audience.

    If you go on the link mentioned above, you will see QTP is not able to record the click on Browse web button. Web buttons are generally associated with input type=submit object but if you see the source of the browse button, you will notice input type=file object.

    qtp-type-file-type-submit 

    Now According to Microsoft help, input type=file object creates a file upload object with a text box AND Browse button. Notice the AND. So, in case of input type=file, the text box and browse button are considered part of ONE object. There are no separate objects for QTP to identify.

    What can we do to solve this issue?

    Enter Web Event Recording Configuration.

    1. Object Spy on the text box/ browse button object reveals that it is a WebFile type Object. QTP webfile object
    2. Using Tools > Web Event Recording Configuration, go to WebFile (under Web Objects tree). Add onclick event. When QTP does not recognize buttons
    3. Set the onclick event settings to Always. Click ‘OK’.QTP onclick werc
    4. Done!. Record the click on browse button, now QTP should be able to identify the click on the button.
  • 自动化的层次转载

    2009-12-15 09:49:33

  • 自动化测试总结

    2009-12-14 18:10:10

    自动化测试总结
    时间: 两个月半
    项目: 两个项目(两个项目80%的逻辑相似)
    测试人: 1个人
    自动化工具: qtp

    测试的目标: 在需求里的基本业务流正常使用;

    自动化的策略:
    由于项目周期短,所以80%的代码采用录制+20% 描述性编程。

    具体做法:

    1、编写测试用例的策略: 采用场景测试。一个case覆盖一个业务流。
    2、一个模块录制一次。 录制的时候,尽量覆盖所有的控件;如果遇到漏掉的控件, 在写代码时候用描述编程,尽量不要改动录制好的Object Repository;
    3、加入适当的wait 时间;

    遇到的问题
    1、 没有加入面向对象的思想,导致一个页面的一个控件改变,一个模块的所有用例跟着改变。
    2、一些反应慢的步骤,没有加入等待时间
    3、 如果两个电脑的浏览器或者qtp设置不一致, 当自动化脚本由一个电脑移动到另一台电脑的时候,会导致qtp对浏览器不识别;
    4、 当存放自动化代码的path发生变化的时候,每个case的存放Object Repository的path都要改动
    5、 简单的描述性编程运行速度慢,比如browser(name:=A).page(titile:=A).frame(name:=B).webButton(name:=c).click
    6、退出函数的使用:
    1)、ExitAction() 退出当前操作,无论其本地(操作)循环属性是什么。
    2)、ExitActionIteration() 退出操作的当前循环。

    3)、ExitComponent()退出当前组件并继续业务流程测试中的下一个组件,无论组件的循环设置是什么。

    4)、ExitComponentIteration() 退出当前组件循环并继续该组件的下一次循环,或者,如果当前组件没有其他循环,则继续业务流程测试中的下一个组件。

    5)、ExitGlobalIteration() 退出当前的全局循环,并使用全局数据表的下一行开始下一次循环。

    6)、ExitRun() 退出测试,无论其全局循环属性是什么。

    7)、ExitTest() 退出整个业务流程测试,无论运行时循环设置是什么。

    8)、ExitTestIteration() 退出业务流程测试的当前循环并继续下一次循环,或者如果没有其他运行时参数循环,则退出测试运行

    7、在vsbcript里, 可以不用命名变量,直接使用变量。 当代码多的时候,出现重名错误,所以要使用变量前先定义, 并且命名的时候遵循colde style的规则。

  • 在网页上查看某个控件的事件

    2009-12-01 15:01:20


    常用事件:onclick() onchange() onBlur() onFocus()
    在网页上查看某个控件的事件
    javascript.:var el=document.getElementById("date_20211553_input");alert(el.onblur);

  • 如何屏蔽JavaScript中的 confirm和alert

    2009-12-01 14:35:44

    新学两招:

    Dim doc,script
     Set doc=ControlPlanPopWin.document      

    ' 通过脚本注入改变alert的行为
    Set script. =doc.createElement("script")
    script.text="var alert=function(){return true}; "
    doc.appendChild(script)

    ' 通过脚本注入改变confirm的行为
    Set script. =doc.createElement("script")
    script.text="var confirm=function(){return true};"
    doc.appendChild(script)
  • VBScript 二维数组的定义

    2009-11-27 17:43:46

    mytable=array(array("s","d","g"),array("我s","人d","都g"))
  • VBScript:dom 学习笔记 [2009年11月25日]

    2009-11-25 14:12:38

    1、window.document.write("hello, how are you")
    2、window.open()
    url: 后面必须有"http://“ 和  "/"
    例如 window.open("http://www.baidu.com/")
  • VBs函数速查

    2009-11-18 10:27:47

    VBs函数速查

    VBScript. 函数

    功能说明

    例子


    Abs (数值)
    绝对值。一个数字的绝对值是它的正值。空字符串 (null) 的绝对值,也是空字符串。未初始化的变数,其绝对为 0 例子:ABS(-2000)
    结果:2000
    Array (以逗点分隔的数组元素) Array 函数传回数组元素的值。 例子:
    A=Array(1,2,3)
    B=A(2)
    结果: 2
    说明:变量B为A数组的第二个元素的值。
    Asc (字符串) 将字符串的第一字母转换成 ANSI (美国国家标准符号)字码。 例子:Asc("Internet")
    结果:73
    说明:显示第一字母 I 的 ANSI 字码。
    CBool(表达式) 转换成布尔逻辑值变量型态(True 或False ) 例子:CBool(1+2)
    结果:True
    CDate (日期表达式) 换成日期变量型态。可先使用 IsDate 函数判断是否可以转换成日 期。 例子: CDate (now( )+2)
    结果:2000/5/28 10:30:59
    CDbl(表达式) 转换成DOUBLE变量型态。
    Chr ( ANSI 字码) 将ASCII 字码转换成字符。 例子: Chr ( 72 )
    结果: H
    CInt (表达式) 转换成整数变量型态。 例子: CInt ("3.12")
    结果: 3
    CLng (表达式) 转换成LONG 变量型态。
    CSng (表达式) 转换成SINGLE 变量型态。
    CStr (表达式) 转换成字符串变量型态。
    Date ( ) 传回系统的日期。 例子: Date
    结果: 2000/5/13
    DateAdd ( I , N , D ) 将一个日期加上一段期间后的日期。 I :设定一个日期( Date )所加上的一段期间的单位。譬如 interval="d" 表示 N的单位为日。 I的设定值如下:
    yyyy Year 年
    q Quarter 季
    m Month 月
    d Day 日
    w Weekday 星期
    h Hour 时
    n Minute 分
    s Second 秒
    N :数值表达式,设定一个日期所加上的一段期间,可为正值或负值,正值表示加(结果为 >date 以后的日期),负值表示减(结果为 >date 以前的日期)。
    D :待加减的日期。
    例子: DateAdd ( "m" , 1 , "31-Jan-98")
    结果: 28-Feb-98
    说明:将日期 31-Jan-98 加上一个月,结果为 28-Feb-98 而非 31-Fe-98 。
    例子: DateAdd ( "d" , 20 , "30-Jan-99")
    结果: 1999/2/9
    说明:将一个日期 30-Jan-99 加上 20 天后的日期。
    DateDiff (I , D1 , D2[,FW[,FY>) 计算两个日期之间的期间。
    I :设定两个日期之间的期间计算之单位。譬如 >I="m" 表示计算的单位为月。 >I 的设定值如:
    yyyy > Year 年
    q Quarter 季
    m Month 月
    d Day 日
    w Weekday 星期
    h Hour 时
    m Minute 分
    s Second 秒
    D1 ,D2:计算期间的两个日期表达式,若 >date1 较早,则两个日期之间的期间结果为正值;若 >date2 较早, 则结果为负值。
    FW :设定每周第一天为星期几, 若未设定表示为星期天。 >FW 的设定值如下:
    0 使用 >API 的设定值。
    1 星期天
    2 星期一
    3 星期二
    4 星期三
    5 星期四
    6 星期五
    7 星期六
    FY :设定一年的第一周, 若未设定则表示一月一日那一周为一年的第一周。 >FY 的设定值如下:
    0 使用 >API 的设定值。
    1 一月一日那一周为一年的第一周
    2 至少包括四天的第一周为一年的第一周
    3 包括七天的第一周为一年的第一周
    例子: DateDiff ("d","25-Mar-99 ","30-Jun-99 ")
    结果: 97
    说明:显示两个日期之间的期间为 97 天。
    DatePart (I,D,[,FW[,FY>) 传回一个日期的之部份。
    >I :设定传回那一部份。譬如 >I="d" 表示传回 部份为日。 >I 的设定值如下:
    yyyy Year 年
    q Quarter 季
    m Month 月
    d Day 日
    w Weekday 星期
    h Hour 时
    m Minute 分
    s Second 秒
    D :待计算的日期。
    >FW :设定每周第一天为星期几, 若未设定则表示为星期天。 >FW 的设定值如下:
    0 使用 >API 的设定值。
    1 星期天
    2 星期一>3 星期二
    4 星期三
    5 星期四
    6 星期五
    7 星期六
    FY :设定一年的第一周, 若未设定则表示一月一日那一周为一年的第一周。 >FY 的设定值如下:
    0 使用 >API 的设定值。
    1 一月一日那一周为一年的第一周
    2 至少包括四天的第一周为一年的第一周
    3 包括七天的第一周为一年的第一周
    例子: DatePart ("m","25-Mar-99 ")
    结果: 3
    说明:显示传回一个日期 的月部份。
    Dateserial (year,month,day) 转换(year,month,day) 成日期变量型态。 例子: DateSerial (99,10,1)
    结果: 1999/10/1
    DateValue ( 日期的字符串或表达式 ) 转换成日期变量型态,日期从 January 1,100 到 December 31,9999 。格式为 month,day,and year 或 month/day/year 。譬如: December 30,1999 、 Dec 30,1999 、 12/30/1999 、 12/30/99 例子: DateValue ("January 1,2002 ")
    结果: 2002/1/1
    Day( 日期的字符串或表达式 ) 传回日期的「日」部份。 例子: Day(" 12/1/1999 ")
    结果: 1
    Fix( 表达式) 转换字符串成整数数字型态。与 Int 函数相同。若为 null 时传回 null 。
    Int (number) 与 Fix(number) 的差别在负数。如 Int (-5.6)=-6 , Fix(-5.6)=-5 。
    例子: Fix(5.6)
    结果: 5
    Hex( 表达式) 传回数值的十六进制值。若表达式为 null 时 Hex( 表达式 )=null ,若表达式 =Empty 时 Hex( 表达式 )=0 。 16 进位可以加「 &H 」表示,譬如 16 进位 &H10 表示十进制的 16 。 例子: Hex(30)
    结果: 1E
    Hour( 时间的字符串或表达式 ) 传回时间的「小时」部份。 例子: Hour("12:30:54 ")
    结果: 12
    InStr ([start,]string1,string2[,compare]) 将一 个 字符串由左 而右与另一个比较,传回第一个相同的位置。
    start 为从第几个字比较起,若省略 start 则从第一个字比较起, string1 为待寻找的字符串表达式, string2 为 待比较的字符串表达式, compare 为比较的方法, compare=0 表二进制比较法, compare=1 表文字比较法,若省略 compare 则为预设的二进制比较法。
    例子: InStr("abc123def123","12")
    结果: 4
    InstrRev ([start,]string1,string2[,compare]) 将一 个 字符串 由右而左与另一个比较,传回第一个相同的位置。
    start 为从第几个字比较起,若省略 start 则从第一个字比较起, string1 为待寻找的字符串表达式, string2 为 待比较的字符串表达式, compare 为比较的方法, compare=0 表二进制比较法, compare=1 表文字比较法,若省略 compare 则为预设的二进制比较法。
    例子: InstrRev ("abc123def123","12")
    结果: 10
    Int ( 表达式 ) 传回一个数值的整数部份。与 Fix 函数相同。 例子: Int (5.6)
    结果: 5
    IsArray ( 变数 ) 测试变量是 (True) 否 (False) 是一个数组。 例子: IsArray (3)
    结果: False
    说明:不是一个数组。
    IsDate ( 日期或字符串的表达式 ) 是否可以转换成日期。日期从 January 1,100 A.D. 到 December 31,9999 A.D 。 例子: IsDate ("December 31,1999 ")
    结果: True
    说明:可以转换成日期。
    IsEmpty ( 变数 ) 测试变量是 (True) 否 (False) 已经被初始化 例子: IsEmpty (a)
    结果: True
    IsNull ( 变数 ) 测试变数是 (True) 否 (False) 不是有效的数据。 例子: IsNull ("")
    结果: False
    说明:是有效的数据。
    IsNumeric ( 表达式 ) 是 (True) 否 (False) 是数字。 例子: IsNumeric ("abc123")
    结果: False
    说明:不是数字。
    LCase ( 字符串表达式 ) 转换字符串成小写。将大写字母的部份转换成小写。字符串其余的部份不变。 例子: LCase ("ABC123")
    结果: abc123
    Left( 字符串表达式 ,length) 取字符串左边的几个字。 length 为取个字。 Len 函数可得知字符串的长度。 例子: Left("ABC123",3)
    结果: ABC
    Len( 字符串表达式 变量 ) 取得字符串的长度。 例子: Len("ABC123")
    结果: 6
    LTrim ( 字符串表达式 ) 除去字符串左边的空白字。 RTrim 除去字符串右边的空白字, Trim 函数除去字符串左右两边的空白字。 例子: LTrim ("456+" abc ")
    结果: 456abc123
    Mid( 字符串表达式 ,start[,length]) 取字符串中的几个字。 start 为从第几个 字取起, length 为取几个字, 若略 length 则从 start 取到最右底。由Len 函数可得知字符串的长度。 例子: Mid("abc123",2,3)
    结果: c12
    Minute( 日期的字符串或表达式 ) 传回时间的「分钟」部份。 例子: Minute("12:30:54")
    结果:30
    Month(日期的字符串或表达式) 传回日期的「月」部份。 例子:Month("12/1/2001")
    结果:12
    MonthName(month[,abbreviate]) 传回月的名称。
    month :待传回月名称的数字 1~12 。譬如, 1 代表一月, 7 代表七月。
    abbreviate: 是 (True) 否 (False) 为缩写,譬如 March ,缩写为 Mar 。默认值为 False 。中文的月名称无缩写。
    例子: MonthName (7)
    结果:七月
    Now() 传回系统的日期时间。 例子: Now()
    结果: 2001/12/30 10:35:59 AM
    Oct() 传回数值的八进位值。八进位可以加「 &O 」表示,譬如八进位 &O10 表示十进制的 8 。 例子: Oct(10)
    结果: 12
    Replace( 字符串表达式,findnreplacewith[,start[,count[,compare>]) 将一个字符串取代 部份字。寻找待取代的原字符串 (find) , 若找到则被取代为新字符串 (replacewith) 。
    find :待寻找取代的原字符串。
    replacewith :取代后的字。
    start :从第几个字开始寻找取代, 若未设定则由第一个字开始寻找。
    count :取代的次数。 若未设定则所有寻找到的字符串取代字符 串全部被取代。
    compare :寻找比较的方法, compare=0 表示二进制比较法, compare=1 表文字比较法, compare =2 表根据比较的 数据型态而定,若省略 compare 则为预设的二进制比较法。
    例子: Replace("ABCD123ABC","AB","ab")
    结果: abCD123abC
    Right( 字符串表达式 ,length) 取字符串右边的几个字, length 为取几个字。 Len 函数可得知字符串的长度。 例子: Right("ABC123",3)
    结果: 123
    Rnd [(number)] 0~1 的 随机随机数值。 number 是任何有效的数值表达式。若 number 小于 0 表示每次得到相同的 随机随机数值。 number 大于 0 或未提供时表示依序得到下一个 随机随机数值。 >number=0 表示得到最近产生的 随机随机数值。为了避免得到相同的随机随机数顺序,可以于 Rnd 函数前加 Randomize 。 例子: Rnd
    结果: 0.498498
    Round( 数值表达式 [,D]) 四舍五入。
    D :为四舍五入到第几位小数,若省略则四舍五入到整数。
    例子: Round(30635,1)
    结果: 3.6
    RTrim ( 字符串表达式 ) 除去字符串右边的空白字。 LTrim 除去字符串左边的空白字, Trim 函数除去字符串左右两边的空白字。 例子: RTrim ("abc123 ")+"456"
    结果: abc123456
    Second( 时间的字符串或表达式) 传回时间的「秒」部份。 例子:Second("12:30:54")
    结果:54
    Space( 重复次数 ) 得到重复相同的空白字符串。 例子: A"+Space (5)+"B
    结果: A B
    说明: A 和 B 中间加入五个空白字。
    String( 重复次数,待重复的字 ) 得到重复相同的字符串。 例子: String(5,71)
    结果: GGGGG
    StrReverse (String(10,71)) 将一个字符串顺序颠倒。 例子: StrReverse ("ABC")
    结果: CBA
    Time() 传回系统的时间。 例子: Time
    结果: 10:35:59 PM
    TimeSerial (hour,minute,second) 转换指定的 ( hour,minute,second) 成时间 变量型态。 例子: TimeSerial (10,31,59)
    结果: 10:31:59
    TimeValue ( 日期的字符串或表达式 ) 转换 成时间变量型态。日期的字符串或表达式从 0:00:00(12:00:00 A.M.) 到 23:59:59(11:59:59 P.M.) 。 例子: TimeValue (" 11:59:59 ")
    结果: 11:59:59
    Trim( 字符串表达式 ) 除去字符串左右两边的空白字。 例子: Trim(" abc123 ")
    结果: abc123
    UCase () 转换字符串成大写。将小写字母的部份转换成大写,字符串其余部份不变。 例子: UCase ("abc123")
    结果: ABC123
    VarType ( 变数 ) 传回一个变量类型。与 TypeName 函数相同, VarType 传回变量类型的代码, TypeName 传回变量类型的名称。 例子: VarType ( "I love you!")
    结果: 8
    Weekday( 日期表达式 ,[FW]) 传回星期几的数字。
    FW :设定一周的第一天是星期几。若 省略则表 1( 星期日 ) 。
    Firstdayfweek 设定值为: 1( 星期日 ),2( 星期一 ),3( 星期二 ),4( 星期三 ),5( 星期四 ),6( 星期五 ),7( 星期六 ) 。
    例子: Weekday(" 1/1/2000")
    结果: 7
    WeekDayName (W,A,FW) 传回星期几的名称。
    W :是 (True) 否 (False) 为缩写。譬如 March ,缩写为 Mar 。预设为 False 。中文的星期几名称无缩写。
    FW :设定一周的第一天是星期几。 若省略表 1( 星期日 ) 。设定待传回星期几的名称,为一周中的第几天。
    A : 1( 星期日 ),2( 星期一 ),3( 星期二 ),4( 星期三 ),5( 星期四 ),6( 星期五 ),7( 星期六 ) 。
    例子: WeekDayName ("1/1/2000")
    结果:星期六
    Year() 传回日期的「年」部份。 例子: Year(" 12/1/2000 ")
    结果: 2000
592/3<123>
Open Toolbar