【问题标题】:Robot Framework Variable Class File with triple Nested Dictionary is not dot notation accessible具有三重嵌套字典的机器人框架变量类文件不可访问点符号
【发布时间】:2017-10-05 03:06:20
【问题描述】:

使用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 生成的嵌套字典,我可以通过点符号访问所有节点。第二个示例是由变量类返回的普通 Python 字典。在最后一个示例中,返回的变量类的类型为 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}

Robot Framework 控制台日志

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'

【问题讨论】:

    标签: robotframework


    【解决方案1】:

    Robot Framework Slack channelPekka Klarck 中指出Robot Framework 内部使用了robot.utils.DotDic 类。让get_variables() 返回DotDic 结构解决了我的问题,我现在可以使用点符号。下面是变量类 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
    

    【讨论】:

      猜你喜欢
      • 2019-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-17
      • 2016-04-07
      • 1970-01-01
      • 2017-10-09
      • 1970-01-01
      相关资源
      最近更新 更多