【问题标题】:How to Have Multiple inheritance in Robot Framework Library file?如何在机器人框架库文件中进行多重继承?
【发布时间】:2019-11-18 16:23:45
【问题描述】:

我想在机器人框架的 python 库文件中进行如下所示的设置。


Class Main(foo):
    def common_functions():
       pass

Class Child1(Main):
    def something_unique_child1():
       pass

Class Child2(Main):
    def something_unique_child2():
      pass

但是,要使用这些类,我必须将它们导入 .robot 文件单独像这样:-

Library                 python_filename . Child1
Library                 python_filename . Child2

现在。问题是,如果我需要使用“Common_functions()”关键字,Robot 会抛出错误,指出存在 “多个关键字同名”

我猜由于两个子类都可以访问该函数,所以它会变得混乱。

如何在 RF 中实现这一功能?

附加信息: 我想要继承的原因(因为有人向我指出这不是编写库的最佳方式)是因为它下面有一个具有多种功能的特性,把它想象成一个菜单特性

(文件-->关闭,文件-->保存,文件-->另存为)

现在,这个 “保存” 功能本身有很多子功能”,因此打开应用程序并转到“文件-->保存”是一个重复的步骤,我必须再次执行并再次针对所有子功能。

我正在考虑将这个和其他一些重复步骤放在一个基类中,并简单地将函数继承到子特性上以避免代码重复。

【问题讨论】:

  • 您希望您的子类从主类继承什么?这解决了什么问题?
  • @BryanOakley 我已经编辑了问题并添加了其他信息。

标签: python python-3.x automation robotframework


【解决方案1】:

无需导入所有三个类。由于Child2 继承自Main,而Child1 继承自Main,因此您只需导入Child1Child2 即可从所有三个类中获取所有关键字。

但是,如果你需要所有的关键字,你可以让Child2继承自Child1,然后你可以直接导入Child2来得到所有的关键字。

如果你坚持要导入所有三个,你可以做两件事。

首先,您可以完全限定关键字,以便机器人知道要使用哪个库。例如,Child1.common_functions

您可以做的另一件事是使用Set library search order 内置关键字告诉机器人在发生冲突时使用哪个库。

【讨论】:

  • Child2 不继承自 Child1
  • @chepner:我的错。我会改写我的答案。感谢您指出这一点。
  • 我试过了,但问题是当添加新关键字时,它需要导入以前的类,并且必须在 .robot 文件中更新这个新的,并且需要删除旧的引用.换句话说,想象一下这些子类执行完全不同的事情,这样做会在将来让那些可能不明白为什么要继承一个完全不相关的类的人感到困惑。
  • @Anarach:我完全不明白你的评论。添加的唯一混淆是当您尝试对库使用继​​承时。这不是编写关键字库的最佳方式。您明确导致多个库具有相同的关键字。如果你删除继承,你就解决了问题。
【解决方案2】:

您是否尝试过使用合格的关键字名称?当存在名称冲突时(如您的情况),指定应提供关键字的库:

python_filename.Main.Common Functions

如果输入完整的 library.class 太麻烦,您可以使用别名 - WITH NAME 导入它们,然后使用它:

Library                 python_filename.Child2    WITH NAME    c2
....
c2.Common Functions

【讨论】:

  • 哦.. 但是,每当我在主类中添加一个新的通用函数时,我都必须来这里更新这个 .robot 文件对吗?
  • 这就是菱形继承的一般问题——通用方法的来源是模棱两可的。 RF 将决定权留给了用户 - 当您使用这种方法时(如您所见)失败,让您明确您真正需要哪个。
  • @TodorMinakov 没有歧义; MRO 准确定义了用于任何特定方法查找的类。
  • python(作为语言)选择的解决方案是什么?其他语言有其他(java - 最简单的,没有多重继承)。不过,Robot Framework 确实有歧义——它将所有类方法公开为关键字,无需限定符即可访问。当你遇到碰撞时,框架的设计者选择不强制一个位置,而是把它留给用户 - 如 OP 的问题所示,失败。 @chepner
  • @TodorMinakov:机器人让用户决定订单。这就是 set library search order 关键字的具体用途。
猜你喜欢
  • 2014-11-28
  • 2013-04-11
  • 1970-01-01
  • 2010-11-05
  • 2018-09-09
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 2016-04-09
相关资源
最近更新 更多