Nested loop in RobotFramework
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
Related videos on Youtube
Narek Hakobyan
Updated on June 04, 2022Comments
-
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 about 3 yearsI wonder whether Tidy will reformat
Run Keyword If
calls to the newIF
syntax. It would be nice.