写了一个递归Keyword, 运行的时候很正常,但是dryrun却总是报错:Maximum limit of started keywords exceeded.
在Robot Framework中,递归关键字通常使用 Run Keyword 或 Call Method 来调用自身。这是因为直接调用自身可能会导致递归深度超出Python的默认限制(通常为1000层),而使用 Run Keyword 或 Call Method 可以绕过这个限制。
Run Keyword 和 Call Method 都会将关键字的调用委托给Robot Framework的执行上下文,从而允许在执行关键字时控制递归深度。这样可以确保递归关键字在运行时不会超出递归深度限制,从而避免因此导致的错误。
因此,为了在递归关键字中控制递归深度并避免超出Python的默认限制,推荐使用 Run Keyword 或 Call Method 来调用自身。
以下例子是实现从字典结构的json数据获取特定元素的值。
错误写法:
Get Value From Json
[Arguments] ${json_data} ${key_name}
Set Test Variable ${result} ${None}
:FOR ${key} IN @{json_data.keys()}
\ ${value}= Get From Dictionary ${json_data} ${key}
\ Run Keyword If '${key}' == '${key_name}' Run Keywords Set Test Variable ${result} ${value} AND
... Exit for Loop
\ ${is_dict}= Evaluate isinstance($value, dict)
\ Run Keyword If '${is_dict}'=='True' Run Keyword Get Value From Json ${value} ${key_name}
[Return] ${result}
正确写法:
Get Value From Json
[Arguments] ${json_data} ${key_name}
Set Test Variable ${result} ${None}
:FOR ${key} IN @{json_data.keys()}
\ ${value}= Get From Dictionary ${json_data} ${key}
\ Run Keyword If '${key}' == '${key_name}' Run Keywords Set Test Variable ${result} ${value} AND
... Exit for Loop
\ ${is_dict}= Evaluate isinstance($value, dict)
\ Run Keyword If '${is_dict}'=='True' Run Keyword Call Method Get Value From Json ${value} ${key_name}
[Return] ${result}