zoukankan      html  css  js  c++  java
  • QTP中FSO对象应用

    FSO:File System Object(文本文件系统对象)

    FSO是一个可以对系统文件进行操作的COM组件。对于自动化测试来说,FSO组件可以帮助我们方便快捷地解决文件处理上的问题。最常见的比如写测试日志,测试报告,上传具有一定规范格式的文本文件,构建测试文件夹结构,以及导出某个文本文件等各方面操作与应用。对于这些问题都可以用FSO对象来完成。

    注释:COM对象:The Component Object Model 组件对象模型

    COM组件是遵循COM规范编写、以Win32动态链接库(DLL)或可执行文件(EXE)形式发布的可执行二进制代码,能够满足对组件架构的所有需求。

     

    FSO对象模型主要由以下四个对象组成,主对象为FileSystemObject。Drive对象用的比较少。

    FileSystemObject Object: 文件系统对象,操作计算机的文件系统。

    Folder Object: 文件夹系统对象,提供存取文件夹的属性及操作。

    TextStream Object: 文本流对象,提供存取文件内容。

    Drive Object: 驱动器对象,管理和操作磁盘。

    截图里就是FileSystemObject的所有属性跟对象。

    下面简单列举文件夹操作,包括文件夹的增删拷贝。

    Set fso = CreateObject("scripting.filesystemobject")
    folderPath = "d:\sunyu"
    folderBak = "f:\bak"
    If fso.FolderExists(folderPath) Then
        If fso.FolderExists(folderBak) Then
            fso.DeleteFolder folderBak  '如果备份文件夹已经存在了,则删除
        End If 
        fso.CopyFolder folderPath,folderBak '删除sunyu这个文件夹前我们在f
                                            '盘里做个备份,改名为bak
        fso.DeleteFolder folderPath  '如果文件夹已存在则删除
    End If
    Set myFolder = fso.CreateFolder(folderPath)'在D盘创建一个叫sunyu的文件夹
    Set fso = Nothing

    下面来尝试创建一个目录结构,并获取父文件夹下所有子文件夹的名称。

    这是目标结构,主文件夹为sunyu,下面有三个文件夹

    Set fso = CreateObject("scripting.filesystemobject")
    folderPath = "d:\sunyu"
    If fso.FolderExists(folderPath) Then
        fso.DeleteFolder folderPath  '如果文件夹已存在则删除
    End If
    Set myFolder = fso.CreateFolder(folderPath)'在D盘创建一个叫sunyu的文件夹
    fso.CreateFolder folderPath + "\1"
    fso.CreateFolder folderPath + "\2"
    fso.CreateFolder folderPath + "\3"
    '取子文件件名方式一
    Set subFolders = fso.GetFolder("d:\").SubFolders.Item("sunyu").SubFolders
    For Each f In subFolders
        MsgBox f.Name
    Next
    '取子文件件名方式二
    Set subFolders = myFolder.SubFolders
    For Each f In subFolders
        MsgBox f.Name
        MsgBox f.ParentFolder.Name  '获得父文件夹名
    Next
    Set fso = Nothing

    为了让脚本可以重复执行,我首先会删除之前建立的文件夹。两种取子文件夹的方式都是比较常用的,我就写在了一个程序里。

    下面我来列举文本文件的操作方式,主要包括三种模式

    Const ForAppending = 8 '从文件末端开始继续写入
    Const ForReading = 1 '读取模式
    Const ForWriting = 2 '写入模式
    Set fso = CreateObject("scripting.filesystemobject")
    txtPath = "d:\test.txt"
    '创建txt对象,返回TextStream对象
    'True表示文件可被重写
    Set txtFile = fso.CreateTextFile(txtPath,True) 
    '写入文本并换行
    txtFile.WriteLine "hello Mr Sun"
    '关闭文件
    txtFile.Close
    '打开先前建立的txt文件,ForReading模式
    Set txtFile = fso.OpenTextFile(txtPath,ForReading,True)
    '读取文件里所有内容
    MsgBox txtFile.ReadAll
    txtFile.Close
    '打开先前建立的txt文件,ForAppending模式
    Set txtFile = fso.OpenTextFile(txtPath,ForAppending,True)
    txtFile.WriteLine "hello Ms G"
    txtFile.Close
    '打开先前建立的txt文件,ForReading模式
    Set txtFile = fso.OpenTextFile(txtPath,ForReading,True)
    MsgBox txtFile.ReadAll
    txtFile.Close
    '最后来看看ForWriting的效果
    '打开先前建立的txt文件,ForWriting模式
    Set txtFile = fso.OpenTextFile(txtPath,ForWriting,True)
    txtFile.WriteLine "This is forWriting Model"
    txtFile.Close
    Set txtFile = fso.OpenTextFile(txtPath,ForReading,True)
    MsgBox txtFile.ReadAll
    Set txtFile = Nothing
    Set fso = Nothing

    注释比较详细,我每次读文件之前都会先关掉之前的TextStream,然后换成读取模式才能将文件里所有的内容打印出来。这是因为后续操作必须与IO模式一致才行,否则会出错。

    关于三个读写模式,不必强记,在对象浏览器里可以找到。

    以下是我三次打印的结果:

    可以注意到,第三个打印结果,之前写入到txt文件里的字符串已经不存在了,ForWriting模式中,写入的字符串会覆盖掉原来的文字,而ForAppending模式下,会接在原来文字的末尾开始写,这是区别。

    上一篇WshShell里说到过,FSO对象也可以用于获取当前路径,我们要实现的是,即使母文件夹移动了,其里面的所有文件的路径不会出现错误,这也是相对路径在自动化测试里最有用的地方。

    首先我在D盘里创建一个文件夹,然后里面有两个文件如下:

    我的目的是通过运行test.vbs里的脚本,可以读到test.txt文件里的内容。这样我就可以保证无论我的主文件夹移动到哪里,我只要运行test.vbs我就可以取得test.txt里的内容。我事先在test.txt里写了一段文字。

    下面这段就是我写进test.vbs里的脚本。

    Const ForReading = 1
    Set fso = CreateObject("Scripting.FileSystemObject")
    myPath = fso.GetFolder(".")
    Set txtFile = fso.OpenTextFile(myPath + "\test.txt",ForReading,True)
    MsgBox txtFile.ReadAll
    Set txtFile = Nothing
    Set fso = Nothing

    运行结果是:

    “.”作为参数,是获取当前文件夹路径。当然了用GetFile方法也可以获得的。有兴趣的可以自己试试。有时间的话我再写写关于FSO生成QTP测试日志的介绍。

  • 相关阅读:
    C#图形编程
    深入浅出话事件(上)
    .NET名称空间对应的类集
    Equals() 和运算符 == 的重写准则(C# 编程指南)
    Implement EventArgs
    CLS(公共语言规范)的CLSCompliant(跨语言调用)
    学习MSCOREE.dll是托管程序的入口点
    设计模式之原型模式代码示例
    The disk cannot be added to Cluster Shared Volumes because it does not have any suitable partitions
    RAID小结
  • 原文地址:https://www.cnblogs.com/ryansunyu/p/2707399.html
Copyright © 2011-2022 走看看