Nested loop in RobotFramework

12,365

Solution 1

No nested loops in RF; that can be done only by calling a keyword with the inner loop, in the outer one.

In your particular case though, you could go without it - as you want to match the full line, that's doable through Should Contain:

${contents}=    Get File    ${file path}
@{lines}=    Split to lines    ${contents}
${matched elements}=    Get Webelements    ${LABEL PORTAIL XPATH }
: FOR    ${element}    IN    @{matched elements}
\  ${text}=     Get Text    ${element}
\  ${present}=  Run Keyword And Return Status    Should Contain    ${lines} 
${text}
\    Run Keyword If  ${present}    Log    '${text} matched'

If you were going after a partial match - i.e. ${text} to be a part of a ${lines} member, then it wouldn't be possible like this.

Solution 2

It isn't possible without custom keyword containing the inner loop. See doc: http://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#nested-for-loops

I'd say that such logic should be always written using some stronger language (python, java...) and then just called from RF.

Solution 3

Starting with the 4.0 release, Robot Framework (finally :) has support for nested for loops.
So the code in the question, with the new FOR syntax will be:

${contents}=  Get File    ${file path}
@{lines}=     Split to lines    ${contents}
${matched elements}=    Get Webelements    ${LABEL PORTAIL XPATH }
FOR    ${element}    IN    @{matched elements}
    ${text}=    Get Text    ${element}
    FOR    ${line}    IN    @{lines}
        Run Keyword If    '${text}' == '${line}'    Log    '${text} matched'
    END
END

The 4.0 version brings also IF/ELSE flow control, so the inner loop can be made to break on the 1st match with it:

    FOR    ${line}    IN    @{lines}
        IF    '${text}' == '${line}'
            Log    '${text} matched'
            Exit For Loop
        END
    END

, vs "the old way" of doing that with Run Keyword If and `Run Keywords:

    FOR    ${line}    IN    @{lines}
        Run Keyword If    '${text}' == '${line}'    Run Keywords    Log    '${text} matched'
                                                       ...    AND   Exit For Loop
    END
Share:
12,365

Related videos on Youtube

Narek Hakobyan
Author by

Narek Hakobyan

Updated on June 04, 2022

Comments

  • Narek Hakobyan
    Narek Hakobyan almost 2 years

    I need to create a nested loop in Robot framework. Can you please Help me do it?

    ${contents}=    Get File    ${file path}
     @{lines}=    Split to lines    ${contents}
     ${matched elements}=    Get Webelements    ${LABEL PORTAIL XPATH }
     : FOR    ${element}    IN    @{matched elements}
     \    ${text}=    Get Text    ${element}
     \    : FOR    ${line}    IN    @{lines}
     \    Run Keyword If    '${text}' == '${line}'    Log    '${text} matched'
    

    I need to have a nested loop which compares all the ${text} with all the @{lines} in the file.

    Thanks in Advance

  • Bence Kaulics
    Bence Kaulics about 3 years
    I wonder whether Tidy will reformat Run Keyword If calls to the new IF syntax. It would be nice.