创建RobotFramework可使用的自定义Library(一)

创建RobotFramework可使用的自定义Library(一)

借鉴AppiumLibrary和RF内置关键字的编写方法:

使用这种方式创建自定义库需要注意以下几点:

  1. 库的名称与初始化类的名称相同
  2. 初始化类在多重继承时选择需要的功能类
  3. 关键方法的构造类可继承KeywordGroup类,该类的方法参见AppiumLibrary,文中我会给出具体的代码实现,可以自建一个py文件代替。

实现步骤

  1. 在…\Python37\Lib\site-packages 下建立一个新的文件夹命名为TestLibrary
  2. 新建一个__init__.py文件,内容如下:
from TestLibrary.keywords._Connect import _TestConnect
from TestLibrary.keywords._Start import _TestStart

class TestLibrary(_TestConnect,_TestStart):
    """
    #注释1. 
    使用多重继承的方式,在此处加载所有自建类的方法
    这里举例只加了_Connect和_Start,根据自己需要增加
    此处的TestLibrary也可以不写,写成__init__
    关键是整个文件夹的名称要和你定义的库名称保持一致,才可以被RF识别调用
    """

    def __init__(self):
        for base in TestLibrary.__bases__:
            base.__init__(self)
    #注释2. 此处的初始化让继承所有父类都执行相应的初始化
  1. 在TestLibrary目录下新建keywords文件夹,功能类代码如下:
# _Connect.py
from TestLibrary.keywords.keywordgroup import KeywordGroup

class _TestConnect(KeywordGroup):

    def __init__(self):
        pass
        #根据需要可自行进行增加

    def connect(self):
        print("this is connect")


#_Start.py
from TestLibrary.keywords.keywordgroup import KeywordGroup
class _TestStart(KeywordGroup):

    def __init__(self):
        pass
        #根据需要可自行进行增加

    def start(self, connect_way):
        print("this is start")

在keywords目录下创建,keywordgroup.py,内容如下:(直接照搬AppiumLibrary/keywords/keywordgroup.py)

# -*- coding: utf-8 -*-

import sys
import inspect
from six import with_metaclass
try:
    from decorator import decorator
except SyntaxError:  # decorator module requires Python/Jython 2.4+
    decorator = None
if sys.platform == 'cli':
    decorator = None  # decorator module doesn't work with IronPython 2.6


def _run_on_failure_decorator(method, *args, **kwargs):
    try:
        return method(*args, **kwargs)
    except Exception as err:
        self = args[0]
        if hasattr(self, '_run_on_failure'):
            self._run_on_failure()
        raise err


class KeywordGroupMetaClass(type):
    def __new__(cls, clsname, bases, dict):
        if decorator:
            for name, method in dict.items():
                if not name.startswith('_') and inspect.isroutine(method):
                    dict[name] = decorator(_run_on_failure_decorator, method)
        return type.__new__(cls, clsname, bases, dict)


class KeywordGroup(with_metaclass(KeywordGroupMetaClass, object)):
    pass

对于注释1,这种构造关键字的方式其实就是继承所有父类的对象和方法,需要确保父类的方法不重名,否则Python中的多重继承是按照从左往右依次继承,方法重名则被覆盖调用,到时候你都不知道调用的是哪一个。
对于注释2,该步骤的目的是将所有的继承类进行初始化操作,可以在这一步实例化所有对象。
文中的base打印出来其实就是_Connect和_Start创建的类:_TestConnect和_TestStart:

在创建功能类的时候,每个类都继承了KeywordGroup类,该方法是借鉴AppiumLibrary的实现行为,当然我在查看了RF的BuildIn功能后,发现不用该方法也可以
RF内置的方法也是通过直接继承各个方法类来调用,因此仅靠继承的方式,在RF中也已经可以调用所有方法。之所以让大家在方法类中继承KeywordGroup是为了在出错时可以更好的查找原因。

导入方法

参考Selenium2Library包的导入方式,直接输入TestLibrary即可。
注意:如果选择文件夹完整…/…/Lib/site-packages/TestLibrary,虽然显示library导入成功(library部分没有变红,但是执行case的时候依然显示keyword找不到,具体原因暂不清楚)
在这里插入图片描述

参考:https://blog.csdn.net/ANDERDOW/article/details/81632168?spm=1001.2014.3001.5502

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值