if语句中的参数被忽略1/2次

时间:2018-11-29 00:08:21

标签: robotframework

*** variables ***
${x}    0
*** Test Cases ***
Test1
    run keyword if   ${x} == 1    run keywords
    ...    print    hi
    ...    ELSE
    ...    print    hi
Test2
    run keyword if   ${x} == 0    run keywords
    ...    print    hi
    ...    ELSE
    ...    print    hi    
*** keywords ***
print
   [arguments]   ${x}
   log to console     ${x}

输出:

Test1                                                                 hi
Test1                                                                 | PASS |
------------------------------------------------------------------------------
Test2                                                                 | FAIL |
Keyword 'print' expected 1 argument, got 0.
------------------------------------------------------------------------------

这是怎么回事?在第二个打印工作中有争论,但在第一个工作中被忽略。

2 个答案:

答案 0 :(得分:3)

区别在于,在一种情况下,您正在调用run keywords(带有参数),而在另一种情况下,您正在运行print(带有参数)。

我们可以重新格式化您的代码,以显示机器人如何看待它:

run keyword if   ${x} == 1
...    run keywords    print  hi
...    ELSE
...    print    hi

当表达式为false时,您会陷入并运行print hi,一切正常。

在这种情况下,机器人将运行run keywords print hirun keywords将其每个参数视为要运行的单独关键字,因此它尝试运行print,然后尝试运行hi。由于您没有提供要打印的参数,因此会引发错误。

答案 1 :(得分:2)

问题出在您期望hi作为print构造中的run keywords的参数而传递,但是机器人不会这样处理,{{1 }}只是要运行的另一个关键字。

Run Keywords documentation中,有一段如何使用带有参数的关键字-您必须将关键字与hi链接起来:

  

...关键字也可以使用大写的AND作为关键字之间的分隔符,并使用参数运行。执行关键字是为了使第一个参数是第一个关键字,而后续的参数直到第一个AND是它的参数。第一个AND之后的第一个参数是第二个关键字,直到下一个AND的后续参数是它的参数。依此类推。

在您的情况下:

AND

,现在将调用更改为“使用参数'hi'运行关键字run keyword if ${x} == 1 run keywords ... print hi AND No Operation ... ELSE ... print hi ,然后运行关键字print”(实际上不执行任何操作,在这种情况下会派上用场)。