带有变量分配的机器人框架中的 IF ELSE

Posted

技术标签:

【中文标题】带有变量分配的机器人框架中的 IF ELSE【英文标题】:IF ELSE in robot framework with variables assignment 【发布时间】:2017-05-18 18:21:35 【问题描述】:

我需要在机器人框架中有条件地执行一些关键字,但我不知道该怎么做,它不起作用。我尝试了很多选项,但我想我的“IF-ELSE”语句完全错误..

Choose Particular Filter $FILTER And Uncheck All Values
    $bool=   is filter opened   $AVAILABLE FILTERS   $FILTER
    $uncheck_all_button=    run keyword  if    "$bool" == "True"   uncheck all in filter  $AVAILABLE FILTERS   $FILTER
    ...                       click element   $uncheck_all_button
    ...                       ELSE
    ...                       Set variable    $particular_filter:    find particular filter   $AVAILABLE FILTERS  $FILTER
    ...                       click element   $particular_filter
    ...                       Set variable    $uncheck_all_button:   uncheck all in filter  $AVAILABLE FILTERS   $FILTER
    ...                       click element   $uncheck_all_button

它失败了:Variable '$particular_filter' not found. 但是如果我运行它,它甚至不应该去 ELSE 分支,因为 $bool 是 True... 我的自定义函数is filter opened 只是检查过滤器是否已经打开 - 如果是,则返回 True。 我的自定义函数uncheck all in filter 只返回“取消选中所有”按钮的 XPATH。 我的自定义函数find particular filter 返回“过滤器下拉菜单”按钮的 XPATH。 在这整个关键字中,我需要检查过滤器下拉菜单是否已经打开——如果是,那么我必须直接点击$uncheck_all_button,否则如果过滤器下拉菜单还没有打开,我需要先点击过滤器本身@ 987654327@ 之后我可以点击$uncheck_all_button

我还尝试了“运行关键字”这一行:

$uncheck_all_button=    run keyword  if    "$bool" == "True"    Set Variable    uncheck all in filter    $AVAILABLE FILTERS    $FILTER

或者这个:

run keyword  if    "$bool" == "True"   $uncheck_all_button=    uncheck all in filter    $AVAILABLE FILTERS    $FILTER

我也试过$bool == "True"$bool == True

但没有什么真正起作用,仍然是同样的错误:(

非常感谢您的帮助!

【问题讨论】:

我建议您使用“Log To Console $bool”查看它的值,然后添加条件。 当然,这是我做的第一件事——正如我所写,值为 True..所以不明白为什么它会转到 else 分支.. 【参考方案1】:

在每个块中使用带有多个语句的 IF/THEN/ELSE 在 Robot 中不起作用(或者我想您必须使用“运行关键字”,但这会变得不可读)。所以我会用这种方式重构你的代码:

Choose Particular Filter $FILTER And Uncheck All Values
    $is_filter_opened=   is filter opened   $AVAILABLE FILTERS   $FILTER
    run keyword  if    $is_filter_opened    actions_when_unchecked
    ...                ELSE  actions_when_checked

actions_when_unchecked
    uncheck all in filter  $AVAILABLE FILTERS   $FILTER
    click element   $uncheck_all_button

actions_when_checked    
    $particular_filter:    find particular filter   $AVAILABLE FILTERS  $FILTER
    click element   $particular_filter
    $uncheck_all_button:   uncheck all in filter  $AVAILABLE FILTERS   $FILTER
    click element   $uncheck_all_button   

希望这会有所帮助。

【讨论】:

【参考方案2】:

根据以下语法,更新您的代码并检查它。

IF-ELSE 的语法:

   Run Keyword If    '$Condition'== 'True'    Run Keywords    <Keyword 1>     <Keyword 2>
   ...    ELSE    <Keyword 1>

基于条件的“设置变量”语法:

 $Status=    Run Keyword If    '$Condition'== 'True'    Set Variable    <Yes>    <No>

根据你在 IF 部分的代码,

如果“bool=true”,它将只执行自定义关键字“uncheck all in filter”,而不执行“Click element”关键字。如果您希望根据条件执行两个关键字,请使用 IF-ELSE 语法中提到的“运行关键字”关键字。

【讨论】:

【参考方案3】:

从4以上版本开始,支持IF-Else内部赋值的机器人框架 参考:https://robocorp.com/docs/languages-and-frameworks/robot-framework/conditional-execution

IF    $random == $NUMBER_TO_PASS_ON
$var = set variable 10
ELSE IF    $random > $NUMBER_TO_PASS_ON
$var = set variable $random
ELSE
$var = set variable $NUMBER_TO_PASS_ON
END

【讨论】:

这太棒了。 “运行关键字 if”对我来说很烦人。【参考方案4】:

非常感谢 Laurent,您的解决方案是正确的! 我只需要进行一些小改动即可使其正常工作:

Choose Particular Filter $FILTER And Uncheck All Values
$is_filter_opened=   is filter opened   $AVAILABLE FILTERS   $FILTER
run keyword if      $is_filter_opened    actions_when_unchecked $FILTER
...                ELSE  actions_when_checked $FILTER

actions_when_unchecked $FILTER
$uncheck_all_button=  uncheck all in filter  $AVAILABLE FILTERS   $FILTER
click element   $uncheck_all_button

actions_when_checked $FILTER
$particular_filter=    find particular filter   $AVAILABLE FILTERS  $FILTER
click element   $particular_filter
$uncheck_all_button=   uncheck all in filter  $AVAILABLE FILTERS   $FILTER
click element   $uncheck_all_button

【讨论】:

欢迎来到 SO!顺便说一句,您实际上可以使用您所做的更改来编辑@Laurent 的答案。【参考方案5】:
$error_status Set Variable    False       
log $error_status         
Run Keyword If  $error_status calltrue    ELSE    login_sucessful

calltrue and login_sucessful are keywords it can be any keyword of your choice. so in this case login_sucessful  keyword is executed. if error_status is set to true then calltrue function will get executed.

请注意缩进单个空格会扰乱您的执行流程

【讨论】:

以上是关于带有变量分配的机器人框架中的 IF ELSE的主要内容,如果未能解决你的问题,请参考以下文章

带有 Gherkin 的机器人框架中的场景大纲

机器人框架:UnboundLocalError:分配前引用的局部变量“cellValue”

错误:没有部分:使用 DatabaseLibrary 的机器人框架中的“默认”

机器人框架:从 python 库导入变量

Pycharm for Robot 框架中的自动完成

为啥用变量排除标签在机器人框架中不起作用?