【问题标题】:IF ELSE in robot framework with variables assignment带有变量分配的机器人框架中的 IF ELSE
【发布时间】: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 分支..

标签: python if-statement automated-tests robotframework


【解决方案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.
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-12-29
        • 2017-08-21
        • 1970-01-01
        • 2018-11-14
        • 2016-02-02
        • 2014-10-06
        • 1970-01-01
        相关资源
        最近更新 更多