如何在机器人框架中的for循环期间检查变量是否在列表中?

时间:2017-03-04 03:26:02

标签: robotframework

第一次在这里发帖。我有一种感觉,这是一个真的愚蠢的问题,但由于某种原因,我的代码一直在失败,我只是无法指出错误。

这就是我所拥有的:

*** Settings ***
Library  Selenium2Library
Library  OperatingSystem
Library  String
Library  Collections


*** Test Cases ***
Test Robot Framework Logging
    @{ALLOWED}=  Create List  /page1  /page2  /page3
    ${ControllersList}=  Get File   ${EXEC_DIR}/Resources/controllers.txt
    @{PAGES}=  Split to lines  ${ControllersList}
    :FOR  ${PAGE}  IN  @{PAGES}
    \  Run Keyword If  '${PAGE} IN @{ALLOWED}'  Log  Testing  WARN
    [Teardown]  Close Browser

这是输出:

Evaluating expression ''/page1 IN [u'/page1', u'/page2', u'/page3']'' failed: SyntaxError: invalid syntax (<string>, line 1)

如果我将条件改为这样的话,那就有效:

'${PAGE} == /page1'

我检查了documentation,似乎可以使用IN条件。我完全迷失在这里。任何提示?谢谢!

3 个答案:

答案 0 :(得分:5)

这是表达式的正确方法:

_FILE_OFFSET_BITS=64

通过删除引号和花括号,robot在评估表达式时能够将PAGE和ALLOWED视为python变量。

来自Evaluating Expressions的文档中的BuiltIn library部分:

  

从Robot Framework 2.9开始,变量本身在评估命名空间中自动可用。可以使用特殊的变量语法访问它们,而不需要像$ variable那样的花括号。永远不应引用这些变量,事实上它们甚至不会在字符串中被替换。

此外,在使用Run Keyword If $PAGE in $ALLOWED Log Testing WARN 之类的关键字时,表达式必须是变量替换后的有效python表达式。因此,您必须使用运算符Run Keyword If而不是in。后者仅由机器人IN声明使用。

实施例

:FOR

答案 1 :(得分:0)

文档Evaluating Expressions确实指定了评估本身使用的in构造。另一种方法是使用Collections library关键字Get Match Count。如果未找到结果,则返回0,并且不会生成测试失败。

*** Settings ***
Library  Collections

*** Test Cases ***
Test Robot Framework Logging
    @{ALLOWED}=  Create List  /page1  /page2  /page3
    @{PAGES}=  Create List  /page1  /page3  /page5
    :FOR  ${PAGE}  IN  @{PAGES}
    \    ${InList}=    Get Match Count    ${ALLOWED}    ${PAGE}
    \    Run Keyword If  ('${InList}' == '0')    Log To Console    Page Not Allowed
    \    ...    ELSE IF  ('${InList}' == '1')    Log To Console    1 Page Found
    \    ...    ELSE                             Log To Console    More pages found.

答案 2 :(得分:0)

检查几乎是正确的,但是您通过用引号括起来有效地将布尔表达式转换为String。这是“它会这样做的语法:

\  Run Keyword If    $PAGE in $ALLOWED    Log  Testing  WARN      

请注意,变量名称周围没有大括号{} - 因此检查(几乎)是直接python的variable in another_variable