如何将对象传递给机器人框架中的关键字?

时间:2016-10-25 10:53:47

标签: python object robotframework method-call

我有一个用文件MyClass编写的python类MyClass.py

class MyClass(object):
    def __init__(self):
        self.myvar = list()

    def setvar(self, val):
        self.myvar = val

    def mymethod(self):
        return self.myvar

我已在Robot Framework中导入如下:

Library         MyClass    WITH NAME    my_component

我还有一个关键字,它调用传递给它的对象的方法:

testing component
    [Arguments]       ${cmp}
    log to console    ************* ${cmp}
    ${result} =       ${cmp}.mymethod

我有从类MyClass实例化的多个对象,并且每个对象都有不同的属性。我想使用testing component关键字获取其属性,而不管对象本身。

当我致电testing componentmy_component

Test Method Call
    testing component    my_component

我明白了:

No keyword with name '${cmp}.mymethod' found.

如果我在关键字testing component中以这种方式调用它:

${result} =    call method     ${cmp}   mymethod

我明白了:

Object 'my_component' does not have method 'mymethod'.

我还尝试call method my_component mymethod进行测试,然后我再次获得Object 'my_component' does not have method 'mymethod'.

但是当我使用${result} = my_component.mymethod时,一切正常。

1 个答案:

答案 0 :(得分:5)

关于如何调用python对象方法的问题的字面答案是您可以使用扩展变量语法(例如:${cmp.mymethod()}或者您可以使用call method关键字(例如:{ {1}})。

例如,robot中的常规标量变量是python字符串对象。因此,我们可以调用它们上的方法,例如call method ${cmp} mymethodlower()。以下测试用例说明了如何使用前面提到的两种机制在字符串上调用这些方法:

upper()

您的代码存在的问题是您对*** Variables *** ${message} Hello, world # a python string object *** Test cases *** Example # Example using "Call method" keyword ${lower}= call method ${message} lower should be equal ${lower} hello, world # Example using extended variable syntax ${upper}= set variable ${message.upper()} should be equal ${upper} HELLO, WORLD my_component所代表的内容的误解。它们不是不是 python对象。相反,它是机器人框架库的名称。尽管在引擎盖下它可能作为对库中定义的类的实例的引用而存在,但在测试中${cmp}只是库的名称

这就是my_component有效的原因 - my_component.my_method是库的名称,my_component是该库中关键字的名称。这是标准的机器人框架语法。请参阅机器人框架用户指南中的Specifying a keyword explicitly

如果您希望能够像my_method一样传递my_component,则可以使用run keyword来运行该库中实施的关键字。

例如,首先使用以下代码创建MyClass.py

class MyClass(object):
    def mymethod(self):
        return "Hello, world"

如果您将call method替换为run keyword

,您的代码就可以使用
*** Keywords ***
testing component
    [Arguments]       ${cmp}
    log to console    ************* ${cmp}
    ${result} =       run keyword   ${cmp}.mymethod

最后,如果你真的想要传递实际的库 object ,你可以使用内置的关键字Get Library Instance来获取实际的库对象,然后你可以使用它Call Method

*** Keywords ***
testing component
    [Arguments]       ${cmp_name}
    ${cmp}=  Get library instance    ${cmp_name}
    log to console    ************* ${cmp}
    ${result} =       call method    ${cmp}    mymethod
    [return]          ${result}

奇怪的是,扩展变量语法在这种情况下不起作用。我不知道为什么。