【问题标题】:Robotframework Listener throws "Cannot access execution context" errorRobotframework 监听器抛出“无法访问执行上下文”错误
【发布时间】:2017-05-07 02:43:26
【问题描述】:

为了支持另一种日志记录格式,我开始开发custom Robotframework Listener。使用指南中的示例,我已经能够复制简单的PythonListner example。此示例可以使用以下命令成功运行:

python.exe -m robot.run --listener C:\temp\tiny.py -s Test02.Test C:\temp\Test02

由侦听器类生成的文件包含已发生的不同事件,并且功能正常工作。

当将以下行添加到类的__init__ 方法时:

BuiltIn().get_variable_value('${SUITE SOURCE}')

收到以下响应:

 failed: Creating instance failed: RobotNotRunningError: Cannot access execution context
Traceback (most recent call last):
  File "C:\temp\tiny.py", line 9, in __init__
    print  repr(BuiltIn().get_variables())
  File "C:\Python27\lib\site-packages\robot\libraries\BuiltIn.py", line 940, in get_variables
    return utils.NormalizedDict(self._variables.current, ignore='_')
  File "C:\Python27\lib\site-packages\robot\libraries\BuiltIn.py", line 2669, in _variables
    return self._namespace.variables
  File "C:\Python27\lib\site-packages\robot\libraries\BuiltIn.py", line 2661, in _namespace
    return self._context.namespace
  File "C:\Python27\lib\site-packages\robot\libraries\BuiltIn.py", line 2656, in _context
    raise RobotNotRunningError('Cannot access execution context')
==============================================================================
Test02
==============================================================================
Test02.Test
==============================================================================
Process Data File                                                     | PASS |
------------------------------------------------------------------------------
Test02.Test                                                           | PASS |
1 critical test, 1 passed, 0 failed
1 test total, 1 passed, 0 failed
==============================================================================
Test02                                                                | PASS |
1 critical test, 1 passed, 0 failed
1 test total, 1 passed, 0 failed
==============================================================================
Output:  C:\temp\output.xml
Log:     C:\temp\log.html
Report:  C:\temp\report.html

测试通过但未生成文件。此结果已在 Python 2.7 和 Robotframework 3.0 和 2.8.5 上复制。这很奇怪,我需要一些帮助来进一步分析或(理想情况下)解决这个问题。

因为 Python 类是由 Robotframework 调用的,所以我不确定如何继续调试它,所以也请随意提出建议。无论如何,我被困住了,可以使用你的帮助。

【问题讨论】:

    标签: robotframework


    【解决方案1】:

    您试图在测试开始前引用BuiltIn()。这就是错误Cannot access execution context 的含义:测试尚未开始,因此没有执行上下文。简单地说,在测试运行之前,您无法访问BuiltIn 库的方法。

    您必须等到测试开始运行后才能调用该语句。

    例如:

    class listener:
        ROBOT_LISTENER_API_VERSION = 2
    
        def start_suite(self, name, attrs):
            self.suite_source = BuiltIn().get_variable_value('${SUITE SOURCE}')
    

    但是,如果您只需要当前套件的来源,则可以在侦听器方法start_suite 中获得该信息。

    例如:

    class MyListener:
        ROBOT_LISTENER_API_VERSION = 2
    
        def start_suite(self, name, attrs):
            self.suite_source = attrs["source"]
    

    【讨论】:

    • 我也注意到了这种行为,它对测试特定变量很有意义。但是,对于在 Robotframework 本身开始时设置的全局变量(如 OUTPUT_DIR),我希望在侦听器初始化期间可以访问这些变量。在这种情况下,SUITE_SOURCE 可能不是要使用的正确示例。有什么想法吗?
    • @A.Kootstra:我同意在初始化监听器时应该提供一些信息。
    • 那么如何在没有上下文的情况下测试包含像 BuiltIn().get_variable_value('${SUITE SOURCE}') 这样的语句的代码 sn-p?
    • @stefanzweig:你不能。
    • @BryanOakley 非常感谢你。那么实现需要知道机器人变量的关键字的策略是什么?
    猜你喜欢
    • 1970-01-01
    • 2018-08-24
    • 2023-03-31
    • 2018-06-09
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    • 2018-05-15
    • 1970-01-01
    相关资源
    最近更新 更多