我可以使用一个导入并从多个python库中公开关键字吗?

时间:2013-12-16 22:28:44

标签: python python-2.7 robotframework

我是Python和机器人的新手,所以请跟我一起,但这是我想要做的。

我正在2个移动设备上进行一些自动化,并且我创建了一个库,允许我与这些设备进行通信,由我们的一个开发团队提供给我。在我的测试套件中,我必须两次导入此库,每个设备一个实例,我使用WITH NAME机器人来调用特定于每个设备的关键字。例如,我像这样导入库:

Library    keyword_module.DEVICE.DEVICE    ${USB_GUID_1}    WITH NAME    d1
Library    keyword_module.DEVICE.DEVICE    ${USB_GUID_2}    WITH NAME    d2

该库有一组关键字,我可以从Robot调用它们来执行设备上的基本操作。如:

d1.turn_on_wifi
d2.turn_on_cellular

然后我创建了自己的python模块,在这个模块中我创建了一些关键字,从这个库中获取一些关键字以创建更高级别的功能。我使用Robots BuiltIn()。get_library_instance来引入上面的实例,这样我就可以使用模块中的关键字了。例如:

class Common(object):

    def __init__(self, libName):
        self.d = BuiltIn().get_library_instance(libName)

    def some_keyword(self):
        self.d.turn_on_wifi
        self.d.turn_off_cellular

然后,我按如下方式导入两个设备的模块:

Library    keyword_module.DEVICE.DEVICE    $[USB_GUID_1}    WITH NAME    d1
Library    keyword_module.DEVICE.DEVICE    $[USB_GUID_2}    WITH NAME    d2
Library    Common.Common    d1    WITH NAME    D1
Library    Common.Common    d2    WITH NAME    D2

所以现在我可以从Common和D1和D2调用我的关键字,并使用d1和d2作为DEVICE库。

问题是我的库变得越来越大,我想把它分解成基于类似特征分组的子模块,即我想要一个文件/模块用于我创建的wifi关键字,另一个用于细胞,另一种其他东西。

我可以为每个文件执行上面所做的操作,但是我最终会在Robot中使用不同名称的大量导入列表,这是我想要避免的。

我有办法将关键字移动到多个文件中,但仍然只为Robot中的每个设备导入一个。我基本上想要有多个py文件,但是它们都以某种方式链接,这样我仍然只能为每个设备导入一个公共库,这将公开所有关键字供我从所有子文件调用?

这有意义吗?

2 个答案:

答案 0 :(得分:1)

你可以看到'Selenium2Library'!

class Selenium2Library(
_LoggingKeywords, 
_RunOnFailureKeywords, 
_BrowserManagementKeywords, 
_ElementKeywords, 
_TableElementKeywords,
_FormElementKeywords,
_SelectElementKeywords,
_JavaScriptKeywords,
_CookieKeywords,
_ScreenshotKeywords,
_WaitingKeywords

):

您只需要导入'Selenium2Library',但会公开所有关键字! 例如:

名为'_ALibrary.py'的模块

class _ALibrary(object):
def __init__(self):
    pass
def fun1(self):
    print 'fun1'`

名为'_BLibrary.py'的模块

class _BLibrary(object):

def __init__(self):
    pass
def fun2(self):
    print 'fun2'
def fun3(self):
    print 'fun3'

一个名为'CommonLibrary.py'的常见模块

import _ALibrary
import _BLibrary
class CommonLibrary(_BLibrary._BLibrary,_ALibrary._ALibrary):
def __init__(self):
    for base in CommonLibrary.__bases__:
        base.__init__(self)

所以你只需要导入'CommonLibrary.py'

答案 1 :(得分:0)

实现此目的的另一种方法是使用dynamic library api