具有三重嵌套字典的机器人框架变量类文件不是点符号可访问

时间:2017-05-06 20:38:09

标签: robotframework

使用Variable Files上的机器人框架文档作为指南,我使用get_variables实现了一个可变文件类。基本示例如所描述的那样工作。

当我实现三重嵌套词典(${A.B.C})时,我可以使用${A}${A.B}表示法访问前两个词典。但是,当我想访问第三个节点${A.B.C}时,结果是我收到错误

Resolving variable '${A.B.C}' failed: AttributeError: 'OrderedDict' object
has no attribute 'C'

在下面的三个例子中,我有一个RF生成的嵌套字典,我可以通过点表示法访问所有节点。第二个示例是由Variable Class返回的普通Python字典。在最后一个示例中,返回的Variable类的类型为OrderedDict

虽然${A['B']['C']['key']}有效,但在代码中读取起来比较困难。当我加载一个类似的yaml结构时,它完全支持点符号,但这不是一个选项,因为yaml文件是静态的,我需要Python的一些关键值的灵活性。

所以,我正在寻找一些关于如何返回数据结构的支持,该数据结构允许Robot Framework用点表示法解释完整的嵌套结构。

变量类文件

from collections import OrderedDict

class OrderDict(object):
    def get_variables(self):
        C = OrderedDict([(u'key', u'value')])
        B = OrderedDict([(u'C', C)])
        A = OrderedDict([(u'B', B)])
        D = {
                u'E':
                    {
                    u'F':
                        {
                            u'key':  u'value'
                        }
                    }
            }
        return OrderedDict([(u'DICT__A', A), (u'DICT__D', D)])

机器人框架脚本

*** Test Cases ***
Dictionary RF
    ${Z}    Create Dictionary    key=value
    ${Y}    Create Dictionary    Z=${Z}
    ${X}    Create Dictionary    Y=${Y}
    Log To Console    ${EMPTY}
    Log To Console    ${X}
    Log To Console    ${X['Y']['Z']['key']}
    Log To Console    ${X.Y}
    Log To Console    ${X.Y.Z}
    Log To Console    ${X.Y.Z.key}

Plain Dictionary Variable Class
    Log To Console    ${EMPTY}
    Log To Console    ${D}
    Log To Console    ${D['E']['F']['key']}
    Log To Console    ${D.E}
    Log To Console    ${D.E.F}
    Log To Console    ${D.E.F.key}

Ordered Dictionary Variable Class
    Log To Console    ${EMPTY}
    Log To Console    ${A}
    Log To Console    ${A['B']['C']['key']}
    Log To Console    ${A.B}
    Log To Console    ${A.B.C}
    Log To Console    ${A.B.C.key}

机器人框架控制台日志

Suite Executor:Robot Framework 3.0.2(win32上的Python 2.7.9)

Dictionary RF                                                         
{u'Y': {u'Z': {u'key': u'value'}}}
value
{u'Z': {u'key': u'value'}}
{u'key': u'value'}
value
| PASS |
------------------------------------------------------------------------------
Plain Dictionary Variable Class                                       
{u'E': {u'F': {u'key': u'value'}}}
value
{u'F': {u'key': u'value'}}
| FAIL |
Resolving variable '${D.E.F}' failed: AttributeError: 'dict' object has no attribute 'F'
------------------------------------------------------------------------------
Ordered Dictionary Variable Class                                     
{u'B': OrderedDict([(u'C', OrderedDict([(u'key', u'value')]))])}
value
OrderedDict([(u'C', OrderedDict([(u'key', u'value')]))])
| FAIL |
Resolving variable '${A.B.C}' failed: AttributeError: 'OrderedDict' object has no 
attribute 'C'

1 个答案:

答案 0 :(得分:1)

Robot Framework Slack channel Pekka Klarck中指出Robot Framework内部使用robot.utils.DotDic类。让get_variables()返回DotDic结构解决了我的问题,我现在可以使用点表示法。下面是Variable Class DotDic的代码(存储为DotDic.py)。

from robot.utils import DotDict

class DotDic(object):
    def get_variables(self):
        G = {
                u'H':
                    {
                    u'I':
                        {
                            u'key':  u'value'
                        }
                    }
            }
        return {u'G': self.dict_to_dotdict(G)}

    def dict_to_dotdict(self, dct):
        dd = DotDict({})
        for key, val in dct.items():
            if isinstance(val, dict):
                dd[key] = self.dict_to_dotdict(val)
            else:
                dd[key] = val
        return dd