【问题标题】: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

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

【问题讨论】:

    标签: python automation robotframework 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

    【讨论】:

      猜你喜欢
      • 2015-11-07
      • 2013-11-08
      • 2020-05-03
      • 2016-12-17
      • 1970-01-01
      • 2015-10-14
      • 2019-06-11
      • 2017-12-19
      • 1970-01-01
      相关资源
      最近更新 更多