Reputation: 107
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
Upvotes: 3
Views: 17786
Reputation: 11
*** 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
Upvotes: 1
Reputation: 20067
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.
Upvotes: 5
Reputation: 20067
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
Upvotes: 3
Reputation: 854
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
Upvotes: 0
Reputation: 1582
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.
Upvotes: 2