【问题标题】:Robot Framework location and name of keyword机器人框架位置和关键字名称
【发布时间】:2015-08-12 20:07:03
【问题描述】:

我想创建一个带有 0 参数函数的 python 库,我的自定义机器人框架关键字可以调用该函数。它需要知道定义关键字的文件的绝对路径,以及关键字的名称。我知道如何使用robot.libraries.BuiltIn 库和${SUITE_SOURCE}${TEST NAME} 变量对测试用例做类似的事情,但是对于自定义关键字我找不到类似的东西。我不在乎答案有多复杂,也许我必须深入了解 Robot Framework 的内部类并以某种方式访问​​该数据。有没有办法做到这一点?

【问题讨论】:

  • 我不确定,如果我没听错:您想要一个自定义关键字,它只返回其名称和文件路径?还是写入变量?
  • 我想要一个 python 函数,它可以确定调用它的任何自定义关键字的名称和文件路径(并加载具有相关路径的数据文件并将该文件的内容返回给自定义关键字,但这与问题无关)

标签: python robotframework


【解决方案1】:

我相对快速地浏览了源代码,似乎执行上下文确实对当前正在执行的关键字有任何引用。所以,我能想到解决这个问题的唯一方法是:

  1. 您的库也需要是一个监听器,因为监听器会在关键字启动时获取事件
  2. 您需要通过robot.libraries.BuiltIn.EXECUTION_CONTEXT._kw_store.resources找出哪个资源文件包含当前正在执行的关键字。

我没有做 POC,所以我不确定这是否真的可行,但这是我目前想到的解决方案。

【讨论】:

  • 这听起来很有希望,我认为解决方案会是类似的。谢谢你的建议,我试试看
【解决方案2】:

感谢 janne,我找到了解决方案。

from robot.running.context import EXECUTION_CONTEXTS

def resource_locator():
    name      = EXECUTION_CONTEXTS.current.keywords[-1].name
    libname   = EXECUTION_CONTEXTS.current.get_handler(name).libname
    resources = EXECUTION_CONTEXTS.current.namespace._kw_store.resources
    path = ""
    for key in resources._keys:
        if resources[key].name == libname:
            path = key
            break
    return {'name': name, 'path': path}

EXECUTION_CONTEXTS.current.keywords是调用的关键字栈,最早的在前,最近的在后,所以EXECUTION_CONTEXTS.current.keywords[-1]得到最后一个关键字,也就是调用这个函数的关键字。

EXECUTION_CONTEXTS.current.get_handler(name).libname 获取定义了关键字name 的库的名称。对于用户定义的关键字,它是文件名(不是完整路径)减去扩展名。

EXECUTION_CONTEXTS.current.namespace._kw_store.resources 是包含所有资源的字典,其中键是绝对路径。因为文件路径是关键,所以我必须搜索关键,使得值的名称是定义关键字的资源的名称(libname

【讨论】:

  • 不错!我想进一步探索它,并根据需要覆盖默认的 SE 屏幕截图创建 - 我在 UI 堆栈中使用了很多否定验证,例如“运行关键字和预期错误”,成功运行以 1200 多个屏幕截图结束。感谢您挖掘这个!
猜你喜欢
  • 2019-07-04
  • 1970-01-01
  • 2013-11-08
  • 2015-10-14
  • 2019-06-11
  • 2017-12-19
  • 1970-01-01
  • 2015-09-02
  • 2021-08-15
相关资源
最近更新 更多