3

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

5 Answers 5

5

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.

Sign up to request clarification or add additional context in comments.

Comments

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

1 Comment

I wonder whether Tidy will reformat Run Keyword If calls to the new IF syntax. It would be nice.
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.

Comments

1

*** Settings ***

Documentation Learning Robot Framework

*** Variables ***

*** Keywords ***

Keyword with for loop

[Arguments]     ${x}

FOR     ${y}    IN RANGE    1   5

    Log To Console      ${x} ${y}

END

*** Test Cases ***

Nested for loop example

FOR   ${x}   IN RANGE   1   5

    Keyword with for loop       ${x}

END

Comments

0

Nested for loops

Having nested for loops is not supported directly, but it is possible to use a user keyword inside a for loop and have another for loop there.

*** Keywords ***
Handle Table
    [Arguments]    @{table}
    :FOR    ${row}    IN    @{table}
    \    Handle Row    @{row}

Handle Row
    [Arguments]    @{row}
    :FOR    ${cell}    IN    @{row}
    \    Handle Cell    ${cell}

Referenced from : http://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#nested-for-loops

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.