RF内置库-----内置库的学习过程总结

前段时间充忙的学习RF,系统学习完之后就开始动手做各种接口的测试,虽然各类的接口测试基本能跑通了,但是重复造车的问题存在太明显。RF本身内置库就已经比较丰富,比如不需要import直接就加载到内存的BuiltIn库,还有需要import的常用模块String,Collections,XML库。在前面的接口测试中,使用最多的就是这几个内置库,接口返回的数据基本都是xml格式的居多,然后自己也重复造车了,为此特地花了几天时间去学习了下内置库,主要还是学了下XML库,以下的分享都是基于XML库。

学习XML内置库,我认为需要掌握以下几个知识点:

第一:内置库的概念?有哪些内置库,大概都有什么关键字?有区分版本吗?跟RF版本有关么?为什么内置库有些需要import,有些不需要import?

第二:XML内置库使用的是python的哪个标准库?对这个标准库需要有哪些基本的了解?

第三:内置库是怎么构建起来的?基本关键字是否能灵活的使用?

第四:有时候可能需要稍微修改下内置库,比如增加一些关键字等,该怎么修改?

从网上和官网(http://robotframework.org)上搜到一些资料,整理如下:

第一:内置库的基本概念?

内置库实际在官网称为standard library,就是标准库。常见的其他库比如Request,SeleniumLibrary库,官网称之为external library,就是外部库,也称第三方库。标准库和外部库首先要正确的进行区分,对于标准库,这些库是直接绑定在RF内的,在

D:\Python27\Lib\site-packages\robot\libraries(视python安装目录变化) 下可以看到,无须再下载;而外部库,是需要根据个人需要,下载后再安装导入才能使用的。 对于标准库,又分两类,类似BuiltIn库是RF自动加载到内存的,安装后按下F5就能直接使

用,不需要再次import,而XML库需要再次import才能正常使用。因为BuiltIn library 提供了很多常用的关键字,比如Should Be EqualConvert To Integer等,所以RF就把这个常用的库自动加载到了内存。

不同版本的RF,支持不同的内置库而且相同的内置库里的关键字可能也是不一样的,以RF3.0(使用命令robot --version查看RF版本)为例,3.0是目前最新的RF的版本,支持很多的内置库,查看D:\Python27\Lib\site-packages\robot下的py文件,可以看到:

基本官网写的10个标准库都能在这里面找到相应的py文件。BuiltIn,Collections,DateTime,Dialogs,Process,OperatingSystem,Remote(没有关键字,暂时不算在内),Screenshot,String,Telnet,XML.这11个库,有些是在RF2.0的时候就已经有了的,最晚的DateTime,Process,XML是在RF2.8之后才内置的,也就是说如果当前使用的是RF2.8之前的版本,内置库是无法直接import XML就是使用的,需要下载安装才能使用,这点需要注意下,不同的RF版本,相同的标准库之间也是会细微的区别,这需要仔细的去查看保准库内每个版本的使用文档。

10个标准库,又都是做什么用的呢,这还真需要了解,而且还需要多花时间去了解每个标准库里面的关键字,这10个标准库,介绍如下:

这个表的来源是来自官网的,官网的用户手册文档已经描述的非常详细了。学习的时候可以详细的查看官网的相关文档。

第二:XML内置库的学习。

从内置库的XML的源码可以看出,RF使用的是ETree来对xml进行解析的,部分源码如下:

import copy
import re
import os

try:
    from lxml import etree as lxml_etree
except ImportError:
    lxml_etree = None

from robot.api import logger
from robot.libraries.BuiltIn import BuiltIn
from robot.utils import (asserts, ET, ETSource, is_string, is_truthy,
                         plural_or_not as s)
from robot.version import get_version

should_be_equal = asserts.assert_equal
should_match = BuiltIn().should_match

class XML(object):
 ROBOT_LIBRARY_SCOPE = ‘GLOBAL‘
    ROBOT_LIBRARY_VERSION = get_version()
    _xml_declaration = re.compile(‘^<\?xml .*\?>‘)

def __init__(self, use_lxml=False):
    use_lxml = is_truthy(use_lxml)
        if use_lxml and lxml_etree:
            self.etree = lxml_etree
            self.modern_etree = True
            self.lxml_etree = True
        else:
            self.etree = ET
            self.modern_etree = ET.VERSION >= ‘1.3‘
            self.lxml_etree = False
        if use_lxml and not lxml_etree:
            logger.warn(‘XML library reverted to use standard ElementTree ‘
                        ‘because lxml module is not installed.‘)

def parse_xml(self, source, keep_clark_notation=False):
   with ETSource(source) as source:
            tree = self.etree.parse(source)
        if self.lxml_etree:
            strip = (lxml_etree.Comment, lxml_etree.ProcessingInstruction)
            lxml_etree.strip_elements(tree, *strip, **dict(with_tail=False))
        root = tree.getroot()
        if not is_truthy(keep_clark_notation):
            NameSpaceStripper().strip(root)
        return root

 

python提供了几个标准库都可以对xml进行解析,之前我使用的是DOM,基于RF使用的是ETree,便开始学习了下ETree的开发文档。学习对XML文件的操作,那肯定也得对XML本身有最基本的了解,比如XML的用途,树结构,节点类型(DOM),带命名空间的xml。下面是部分的知识点的总结:

xml是一种可扩展的标记语言。要求标记需要成对的出现(有时候会进行简写<b/>)。一个典型的xml文档如下所示:

<example>
  <first id="1">text</first>
  <second id="2">
    <child/>
  </second>
  <third>
    <child>more text</child>
    <second id="child"/>
    <child><grandchild/></child>
  </third>
</example>

A. 整个xml文档是一个文档节点,属于根节点,比如上述文档的<example>节点就是一个根节点,一个xml文件只能有一个根节点,否则解析的时候胡报错的

B.每个 XML 标签是一个元素节点,比如<first> 和<second>, <third>都属于元素节点,却属于<example>的子节点。

C.attribute值:表示节点元素的属性值,比如first 有一个属性id,属性值为1;second也有id属性,属性值为2,而third没有属性。

D.Text值:表示元素中的文本内容。比如:first 的text值就为1;second没有,third也没有;

一个xml还包含其他的内容:比如处理指令和一些注释;在python的etree标准库解析的过程中,是直接把这二个给剔除掉了。有兴趣的可以根据官网给出的开发文档,把常用的一些方法都敲一遍,主要的还是使用2个类 Element Objects和ElementTree Objects。

第三:RF中XML库的学习。

在使用sudslibrary做soap协议的测试时,返回的xml是带命名空间的,之前一直不理解,对XML库进行整体的学习之后就有了很大的理解。

XML库主要有以下几个作用(翻译于原文手册):

A. 解析一个XML文件,或一个包含XML的字符串,在一个XML元素结构中,并从中寻找某些元素,用于进一步分析 (e.g. Parse XML and Get Element keywords).

B. 获取元素的文本或属性(e.g. Get Element Text and Get Element Attribute).

C. 直接验证文本、属性或全部元素 (e.g Element Text Should Be and Elements Should Be Equal).

D. 修改和保存它(e.g. Set Element TextAdd Element and Save XML).

下面按照关键字的类型大致做了以下的学习:解析的xml都是前面的xml例子

A.最常用关键字的学习:

B. 通过xpath来搜素子节点。

C. 简单的带命名空间的xml的解析

D. 复杂的命名空间的xml解析(之前soap协议返回的xml的解析部分补充)

这些操作基本都是围绕着对XML的读写,之前做报文测试的时候,遇到过返回的的xml是没有根元素的,如果直接使用XML库是无法进行解析的,需要加上根节点,再进行解析,于是直接写了用户自定义的库。而且当时需要从xml中读取报文字段,与测试数据组合后,再一起发给服务器,这部分也是XML库没有提供的内容。但是对返回的xml的数据进行解析,xml库做的还是比较到位。如果觉得系统带的xml库功能不够使用,或者想把几个功能整成一个功能使用,通过以上的学习基本可以修改下代码,然后自定义一个库了。

还有几点的学习,后面还需要对RF有更深刻的了解才能有所感悟,这次的学习给我带来了一些全新的收获,以前我查找资料很少看官方文档,虽然英文过了六级,但是一看英文文档还是会头晕脑胀,这次逼着自己看了官网的标准库的开发文档和用户手册,真感觉很不错,简洁又明了,学习官网手册果然是很不错的学习方法,比去看某些博客收获更全面更权威~~~这个技能get了~~~

时间: 2025-01-04 12:46:38

RF内置库-----内置库的学习过程总结的相关文章

Python标准库 内置函数print objects sep &#39; &#39; end &#39;\n&#39; file sys st

本函数是实现对象以字符串表示的方式格式化输出到流文件对象file里.其中所有非关键字参数都按str()方式进行转换为字符串输出,关键字参数sep是实现分隔符,比如多个参数输出时想要输出中间的分隔字符:关键字参数end是输出结束时的字符,默认是换行符\n:关键字参数file是定义流输出的文件,可以是标准的系统输出sys.stdout,也可以重定义为别的文件:参数flush是立即把内容输出到流文件,不作缓存. 例子: #print() print(1, 2, 3, sep = ',', end =

js-DOM ~ 04. BOM:浏览器对象模型window. 、定时器、在线用户、祝愿墙、BOM的内置方法内置对象

multiple. select列表多选 触发事件后调用有参数的函数要先创建一个函数,然后在函数内调用执行函数 Array.from(伪数组):伪数组变为真数组 indexOf():查询字符的索引 a)  indexOf('abcde') i.      indexOf('a')的索引是0 ii.      indexOf('abc')的索引是0,按照第一个字符的索引 iii.      indexOf('ac')的索引是-1,查找不到ac连续的字符 iv.      indexOf('f')的

ios 开发中 动态库 与静态库的区别

使用静态库的好处 1,模块化,分工合作 2,避免少量改动经常导致大量的重复编译连接 3,也可以重用,注意不是共享使用 动态库使用有如下好处: 1使用动态库,可以将最终可执行文件体积缩小 2使用动态库,多个应用程序共享内存中得同一份库文件,节省资源 3使用动态库,可以不重新编译连接可执行程序的前提下,更新动态库文件达到更新应用程序的目的. 从1可以得出,将整个应用程序分模块,团队合作,进行分工,影响比较小. 等其他好处, 从2可以看出,其实动态库应该叫共享库,那么从这个意义上来说,苹果禁止iOS开

静态库和动态库的区别

real framework中不可以使用类别 或 不可以不包含类文件 real framework 中直接调用NSClassFromString函数会返回null  需要强制加载指定类 或 直接通过类名引用 linux中静态库和动态库的区别 一.不同 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 1. 静态函数库 这类库的名字一般是libxxx.a:利用静态函数库编译成的文件比较大,因为整个 函数库的所有数据都会被整合进目标代码中,他的优点就显而易见

静态库、动态库的区别汇总

real framework中不可以使用类别 或 不可以不包含类文件 real framework 中直接调用NSClassFromString函数会返回null  需要强制加载指定类 或 直接通过类名引用 linux中静态库和动态库的区别 一.不同 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 1. 静态函数库 这类库的名字一般是libxxx.a:利用静态函数库编译成的文件比较大,因为整个 函数库的所有数据都会被整合进目标代码中,他的优点就显而易见

python常用标准库和第三方库

python 常用的标准库及第三方库标准库Python拥有一个强大的标准库.Python语言的核心只包含数字.字符串.列表.字典.文件等常见类型和函数,而由Python标准库提供了系统管理.网络通信.文本处理.数据库接口.图形系统.XML处理等额外的功能.Python标准库的主要功能有:1.文本处理,包含文本格式化.正则表达式匹配.文本差异计算与合并.Unicode支持,二进制数据处理等功能2.文件处理,包含文件操作.创建临时文件.文件压缩与归档.操作配置文件等功能3.操作系统功能,包含线程与进

Python标准库、第三方库和外部工具汇总

导读:Python数据工具箱涵盖从数据源到数据可视化的完整流程中涉及到的常用库.函数和外部工具.其中既有Python内置函数和标准库,又有第三方库和工具. 这些库可用于文件读写.网络抓取和解析.数据连接.数清洗转换.数据计算和统计分析.图像和视频处理.音频处理.数据挖掘/机器学习/深度学习.数据可视化.交互学习和集成开发以及其他Python协同数据工作工具. 为了区分不同对象的来源和类型,本文将在描述中通过以下方法进行标识: Python内置函数:Python自带的内置函数.函数无需导入,直接使

Python 标准库、第三方库

Python数据工具箱涵盖从数据源到数据可视化的完整流程中涉及到的常用库.函数和外部工具.其中既有Python内置函数和标准库,又有第三方库和工具.这些库可用于文件读写.网络抓取和解析.数据连接.数清洗转换.数据计算和统计分析.图像和视频处理.音频处理.数据挖掘/机器学习/深度学习.数据可视化.交互学习和集成开发以及其他Python协同数据工作工具. 为了区分不同对象的来源和类型,本节将在描述中通过以下方法进行标识: [Python内置函数]:Python自带的内置函数.函数无需导入,直接使用.

日月累积的整理!140种Python标准库、第三方库和外部工具都有了

Python数据工具箱涵盖从数据源到数据可视化的完整流程中涉及到的常用库.函数和外部工具.其中既有Python内置函数和标准库,又有第三方库和工具. 读者福利,想要了解python人工智能可直接点击链接即可领取相关学习福利包:石墨文档 是安全网站放心,继续访问就可以领取了哦 这些库可用于文件读写.网络抓取和解析.数据连接.数清洗转换.数据计算和统计分析.图像和视频处理.音频处理.数据挖掘/机器学习/深度学习.数据可视化.交互学习和集成开发以及其他Python协同数据工作工具. 为了区分不同对象的