user7656533
user7656533

Reputation:

How can I check if a variable is inside a list during a for loop in robot framework?

first time posting here. I've a feeling that this is a really dumb question, but for some reason my code keeps failing and I just can't put my finger on what's wrong.

Here's is what I have:

*** 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

This is the output:

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

If I change the condition to something like this it works:

'${PAGE} == /page1'

I checked the documentation and it seems that the IN condition could be used. I'm totally lost here. Any hints? Thanks!

Upvotes: 4

Views: 31457

Answers (3)

A. Kootstra
A. Kootstra

Reputation: 6971

The documentation Evaluating Expressions does indeed specify that in construction used in the evaluation itself. An alternative approach is to use the Collections library keyword Get Match Count. This will return 0 when no results are found, and not generate a test failure.

*** 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.

Upvotes: 0

Todor Minakov
Todor Minakov

Reputation: 20067

The check was almost right, but you've effectively turned the Boolean expression into a String by surrounding it with the quotes. Here's the syntax that'll do it:

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

Mind there are no curly brackets {} around the variable names - thus the check is (almost) the straight python's variable in another_variable

Upvotes: 1

Bryan Oakley
Bryan Oakley

Reputation: 386230

This is the proper way to do the expression:

Run Keyword If  $PAGE in $ALLOWED  Log  Testing  WARN

By removing the quotes and the curly braces, robot is able to treat PAGE and ALLOWED as python variables when evaluating the expression.

From the section Evaluating Expressions in the documentation for the BuiltIn library:

Starting from Robot Framework 2.9, variables themselves are automatically available in the evaluation namespace. They can be accessed using special variable syntax without the curly braces like $variable. These variables should never be quoted, and in fact they are not even replaced inside strings.

Also, when using keywords like Run Keyword If, the expression must be a valid python expression after variable substitution. Therefore, you must use the operator in rather than IN. The latter is used only by the robot :FOR statement.

Example

*** Variables ***
@{ALLOWED}  /page1  /page2  /page3

*** Test Cases ***
Example that passes
    ${PAGE}=  set variable  /page1
    Run Keyword If  $PAGE in $ALLOWED
    ...  pass execution  ${PAGE} is allowed
    fail  ${PAGE} is not allowed

Example that fails
    ${PAGE}=  set variable  /page99
    Run Keyword If  $PAGE in $ALLOWED
    ...  pass execution  ${PAGE} is allowed
    fail  ${PAGE} is not allowed

Upvotes: 11

Related Questions