使用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'
答案 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