首页 文章

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

提问于
浏览
1

使用Variable Files上的Robot Framework文档作为指南,我使用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用点表示法解释完整的嵌套结构 .

Variable Class File

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)])

Robot Framework Script

*** 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}

Robot Framework Console Log

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 回答

  • 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
    

相关问题