Python Robot框架位置和关键字名称

Python Robot框架位置和关键字名称,python,robotframework,Python,Robotframework,我想创建一个带有0参数函数的python库,我的自定义Robot框架关键字可以调用该函数。它需要知道定义关键字的文件的绝对路径,以及关键字的名称。我知道如何使用robot.libraries.BuiltIn库和${SUITE\u SOURCE}和${test NAME}变量对测试用例执行类似的操作,但是我找不到任何与自定义关键字类似的操作。我不在乎答案有多复杂,也许我必须挖掘Robot框架内部类的精髓,并以某种方式访问这些数据。有什么方法可以做到这一点吗?我比较快速地查看了源代码,似乎执行上下文

我想创建一个带有0参数函数的python库,我的自定义Robot框架关键字可以调用该函数。它需要知道定义关键字的文件的绝对路径,以及关键字的名称。我知道如何使用robot.libraries.BuiltIn库和${SUITE\u SOURCE}和${test NAME}变量对测试用例执行类似的操作,但是我找不到任何与自定义关键字类似的操作。我不在乎答案有多复杂,也许我必须挖掘Robot框架内部类的精髓,并以某种方式访问这些数据。有什么方法可以做到这一点吗?

我比较快速地查看了源代码,似乎执行上下文确实引用了当前正在执行的关键字。因此,我唯一能想到的解决办法是:

您的库还需要是一个侦听器,因为侦听器在关键字启动时获取事件 您需要遍历robot.libraries.BuiltIn.EXECUTION\u CONTEXT.\u kw\u store.resources以找出哪个资源文件包含当前正在执行的关键字。
我没有做POC,所以我不确定这是否可行,但这是我目前想到的解决方案。

我相对快速地查看了源代码,似乎执行上下文确实引用了当前正在执行的关键字。因此,我唯一能想到的解决办法是:

您的库还需要是一个侦听器,因为侦听器在关键字启动时获取事件 您需要遍历robot.libraries.BuiltIn.EXECUTION\u CONTEXT.\u kw\u store.resources以找出哪个资源文件包含当前正在执行的关键字。
我没有做POC,所以我不确定这是否可行,但这是我目前想到的解决方案。

多亏了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_handlername.libname获取定义关键字名称的库的名称。对于用户定义的关键字,是文件名,而不是完整路径减去扩展名


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

多亏了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_handlername.libname获取定义关键字名称的库的名称。对于用户定义的关键字,是文件名,而不是完整路径减去扩展名


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

如果我没有弄错的话,我不确定:您想要一个只返回其名称和文件路径的自定义关键字吗?或者将其写入变量?我想要一个python函数,它可以确定调用它的任何自定义关键字的名称和文件路径,加载具有相关路径的数据文件,并将该文件的内容返回给自定义关键字,但这与问题无关我不确定,如果我没弄错的话:你想要一个自定义关键字,它只返回它的名称和文件路径?或者将其写入变量?我想要一个python函数,它可以确定调用它的任何自定义关键字的名称和文件路径,加载具有相关路径的数据文件,并将该文件的内容返回给自定义关键字,但这与听起来很有希望的问题无关,我想解决办法应该是类似的。谢谢你的建议,我会尝试一下。听起来很有希望,我想解决办法也会是类似的。谢谢你的建议,我试试看!我想进一步探索它,并根据需要覆盖默认的SE屏幕截图创建-我在UI堆栈中使用了很多负面验证,如“Run关键字和Expect Error”,成功的运行以1200多个屏幕截图结束。谢谢你把这个挖出来!美好的我想进一步探索它,并根据需要覆盖默认的SE屏幕截图创建-我在UI堆栈中使用了很多负面验证,如“Run关键字和Expect Error”,成功的运行以1200多个屏幕截图结束。谢谢你 把这个挖出来!