在关键字中运行关键字的机器人框架

Posted

技术标签:

【中文标题】在关键字中运行关键字的机器人框架【英文标题】:Robot Framework running a Keyword within a keyword 【发布时间】:2020-11-06 16:21:00 【问题描述】:

我正在尝试获取一个关键字来运行其他关键字,而不必如此调用它。

keyword_rp   variable    keyword_2  $arg1  $arg2  $arg3
keyword_rp   variable    $return_data=   keyword_3
keyword_rp   variable    keyword_4  arg11
etc.....

您可以看到这会使您的机器人测试变得混乱 相反,我想要您调用的另一个关键字,它将整个测试作为参数。然后通过python为每一行调用keyword_rp。

keyword_rp_once   variable    
...               keyword_2  $arg1  $arg2  $arg3
...               $return_data=   keyword_3
...               keyword_4  arg11

python 看起来像这样

def keyword_rp_once(self, variable, *argv):
    #parse arguments and use robot built in to run each keyword

或者也许有更好的方法来做到这一点?

【问题讨论】:

【参考方案1】:

问题是,机器人没有看到三行,它在实际运行关键字时看到了一长串参数。当keyword_rp_once 被调用时,关键字看到的和你输入的完全一样:

keyword_rp_once  variable  keyword2  $arg1  $arg2  $arg3  $return_data=  keyword_3  keyword_4  arg11

简而言之,你不可能直接在关键字中做你想做的事情,因为机器人会丢弃关键信息 - 换行符 - 所以你的自定义关键字不可能知道一组参数在哪里结束,第二组从哪里开始.

请注意,使用 3.2 中的新解析器,可以在内部使用换行符,但是您必须做很多工作才能通过侦听器和/或预运行修饰符从解析器中获取信息并进入关键字.

更简单的选择是做机器人自己的Run Keywords 所做的事情:它强制你添加一个标记来告诉它一个关键字在哪里结束,下一个在哪里开始(特别是在那个关键字中,特殊参数AND) .然后,您的关键字可以通过查找该标记将单个长参数列表拆分为多个参数列表。

例如,我曾经通过使用: 将一组参数与另一组参数分开来完成您想要做的事情。它看起来像这样:

keyword_rp_once  variable
...  :  keyword2  $arg1  $arg2  $arg3
...  :  $return_data=  keyword_3
...  :  keyword_4  arg11

阅读起来稍微容易一些,但代价是必须编写复杂的关键字,并且了解机器人但对您的关键字了解不多的人会发现语法令人困惑。

这个解决方案需要大量的工作,特别是因为中间有一个变量赋值。您的关键字必须有一堆代码来遍历参数,然后为任何看起来像 : 或匹配像 $.*?|=? 或类似的正则表达式的参数添加特殊处理。

【讨论】:

我的问题是如何处理 $return_data= ?由于3.2.1版本的机器人框架,我无法使用start_keyword监听器。 我不知道你如何处理它。这可能是不可能的,机器人根本就不是为了这样工作而设计的。 我认为您必须调用 register_run_keyword,这是 BuiltIn 库中的一个方法。它只是在用户指南中非常简短地提及。我认为调用它会阻止机器人在调用 root 关键字之前进行变量替换。 好的,我只是想在尝试其他工具之前完全确认这真的不可能。如果有任何变化我会在这里发布解决方案。 @PatrickCaldwell:我不确定我是否会称之为“不可能”,但这绝对是困难的,需要大量的工作才能做到正确。这不是机器人开箱即用的支持。【参考方案2】:

可以通过将关键字变量放在引号之间来实现。例如:

*** Test Cases ***
Example
    I execute "ls"
    Sleep for "2" seconds
    I print "ls" with "lah" with file "File"

*** Keywords ***
I execute "$cmd"
    log to console    $cmd

I print "$cmd" with "$opts" with file "$input"
    LOG TO CONSOLE    $cmd
    Sleep for "1" seconds
    LOG TO CONSOLE     $opts
    Sleep for "10" seconds
    LOG TO CONSOLE     $input

Sleep for "$input1" seconds
    sleep    $input1

你的情况如下:

keyword_rp "variable" keyword_2 "$arg1" "$arg2" "$arg3"

您可以查看此页面:https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#embedding-arguments-into-keyword-name

【讨论】:

以上是关于在关键字中运行关键字的机器人框架的主要内容,如果未能解决你的问题,请参考以下文章

机器人框架“按坐标写入数据”-与“运行关键字 if”一起使用时的关键字问题

苹果 |机器人框架 |无法使用自定义定位器策略运行关键字来查找元素

机器人框架:无法使用 __eq__ 方法从类中获取关键字

最小化浏览器机器人框架关键字

如果机器人框架有关键字来处理异常?

在 Robot 框架中评估多个 If 条件