issue with loging a list and list element in robot frame work - variables

i want to log a list in robot frame work
i tried LOG #{listname} but it throws an error
to acccess the list element i use LOG #{listname}[0] it also throws an error
LOG #{listname} -- print list to log
LOG #{listname}[0] -- print the first element to log

Reference: https://robotframework.org/robotframework/latest/libraries/Collections.html#Log%20List
There is Log List to log all the values in List. Please see the below example
*** Settings ***
Library Collections
*** Variables ***
#{NUMBERS} ${1} ${2} ${5}
#{NAMES} one two five
*** Test Cases ***
Logs Lists
Log List ${NUMBERS}
Log Scalar Variable
Log ${NUMBERS}[0]

Related

How do I skip some optional arguments in Robot Framework?

My intend is to skip the ${num2} and ${num4} arguments.
But I got an error saying:
Positional argument cannot be used after named arguments
I don't know why it considers the list as a positional argument, shouldn't it be a variable one?
*** Test Cases ***
Test
#{daysOff}= Create List Tuesday Friday
Keyword 30 num3=6 #{daysOff}
*** Keywords ***
Keyword
[Arguments] ${num1} ${num2}=5 ${num3}=10 ${num4}=15 #{list}
Log ${num1}
Log ${num2}
Log ${num3}
Log ${num4}
FOR ${item} IN #{list}
Log ${item}
END
To resolve the
Positional argument cannot be used after named arguments
error you should move the list argument before the named, positional arguments.
Note that you cannot move it before ${num1} as that would give another error:
Keyword 'Keyword' missing named-only argument 'num1'.
All in all:
*** Test Cases ***
Test
#{daysOff}= Create List Tuesday Friday
Keyword 30 #{daysOff} num3=6
*** Keywords ***
Keyword
[Arguments] ${num1} #{list} ${num2}=5 ${num3}=10 ${num4}=15
Log ${num1}
Log ${num2}
Log ${num3}
Log ${num4}
FOR ${item} IN #{list}
Log ${item}
END

Error in SeleniumLibrary.Input Text - used in if/else block

I have a problem with RobotFramework code. Im trying to make an If/ELSE and testing some functionalities but when I declare the Keyword I get the error:
"Keyword 'SeleniumLibrary.Input Text' expected 2 arguments, got 10."
I tried changing the variables of the Keywords but nothing.
*** Settings ***
Library SeleniumLibrary
*** Variables ***
${WEB} https://google.es #Url we are going to open
${BROWSER} chrome #Browser to use
${SELENIUM_DELAY} 1
*** Test Cases ***
Conditional Test q Different from 0 Equal to 0
*** Keywords ***
Open Browser
Log To Console Opening browser...
Open Browser ${WEB} ${BROWSER}
Maximize Browser Window
Conditional Test
[Arguments] ${textview} ${text} ${text2}
Open Browser
Input Text ${textview} ${text} if ${SELENIUM_DELAY} != 0
... ELSE Input Text ${textview} ${text2}
I just tried to make a condition that if the value of ${SELENIUM_DELAY} is different from 0, then write on google search a String.
The syntax for conditional execution is different, you have to use the keyword Run Keyword If, providing the keywords to run when the condition is true/false (the false is optional). Like this:
Run Keyword If ${SELENIUM_DELAY} != 0 Input Text ${textview} ${text}
... ELSE Input Text ${textview} ${text2}

Robotframework: Suite variable not found in 2nd test case

Hi does anybody know why I cannot reference suite variable defined in TC1 and then referencing it TC2 within one suite I am getting error : Variable not found
Running both tests is ok, but runnig tc1 and then tc2 will produce this error
Python 2.7.13
Ride: 1.7.3.1
Thanx a lot
TC1
TC2
Try next simple code and say if it works, main point here is where you define suite variable by Set Suite Variable, it should be in the first test case or in the one of the setups(Test/Suite Setup):
*** Settings ***
Library Collections
*** Test Cases ***
TestCase1
Log to Console ${EMPTY}
Set Suite Variable ${suite_variable} case1
Log To Console I'm in case 1: ${suite_variable}
TestCase2
Log to Console ${EMPTY}
${variables} Get Variables
Dictionary Should Contain Key ${variables} \${suite_variable}
Log To Console I'm in case 2: ${suite_variable}

Assign a variable within the keyword "Run Keywords" possible?

following code is producing some problem:
API Setup
[Arguments] ${url} ${username} ${password} ${run}=True ${fail}=False
Run Keyword If ${run}
... Run Keywords
... ${passed}= Run Keyword And Return Status Setup ${url} ${username} ${password}
... AND Log To Console ${passed}
... AND Should Not Be Equal ${fail} ${passed}
When I try to execute that, my RF says: Variable '${passed}' not found.
The RED IDE also says
Multiple markers at this line:
• Variable 'passed' is used, but not defined
• Keyword name '${passed}=' contains variables. RED is unable to validate
arguments given to this keyword
Does the keywords "Run Keywords" not allow any assignments of values to variables and if so, is there any "best practice" way to do what I want to do?
Thanks!
The Run Keywords does not allow assignments, that's true. This comes from the parser - the purpose of the keyword is to run other ones; it comes to the line with the assignment (${passed}= Run...), tries to substitute the variable "passed" with its value so it can execute it, but at this point the var is still undefined - and it fails.
It looks like what you want to do is to run a particular keyword (Setup) only if a condition is true, and only if the condition is true then log its outcome, and assert it (the outcome) is the desired one.
This can be achieved by breaking up the block in two. The keyword Run Keyword If returns the value of the embedded keyword, so this will work:
${passed}= Run Keyword If ${run} Run Keyword And Return Status Setup ${url} ${username} ${password}
... ELSE Set Variable ${False}
If ${run} == True the Setup keyword will be ran, and {passed} will hold a True/False value did the execution pass. If ${run} != True we're setting ${passed} to False, just so it doesn't have a value of None (its value is not really important in this case, but doing that gives consistency in the datatypes it has).
And now the other two keywords can be in an if-block by themselves - do their work only when ${run} == True:
Run Keyword If ${run} Run Keywords Log To Console ${passed}
... AND Should Not Be Equal ${fail} ${passed}
It is true that Run Keywords does not allow variable assignment within
Make a keyword that contains everything inside Run Keywords and just call it instead.
For example
*** Test Cases ***
API Setup
[Arguments] ${url} ${username} ${password} ${run}=True ${fail}=False
Run Keyword If ${run} Keyword A
*** Keywords ***
Keyword A
# put everything you need here

How to run a particular keyword multiple times in a test case of robot framework using seleniumlibrary?

I want to execute two keywords in a test-case out of which, one keyword has to be executed only once and the other has to be executed multiple times. Please find the code below to understand the logic of the execution:
*** Settings ***
Test Setup OPEN CHROME BROWSER
Test Teardown CLOSE CHROME BROWSER
Test Template KEYWORD1
Force Tags Smoke
*** Test Cases *** userid userpass content
VALID CREDENTIAL userid#mysite.com mypass CONTENT A
CONTENT B
CONTENT C
*** Keywords ***
--------------------------------------------------------------------------
KEYWORD 1
[Arguments] ${userid} {userpass}
GO TO LOGIN PAGE
ENTER USERID
ENTER PASSWORD
CLICK ON LOGIN BUTTON
-----needs to run once and then KEYWORD 2 should run thrice---------------
KEYWORD 2
[Arguments] ${content}
CLICK ON CONTENT TILE ${content}
DO SOME ACTION
GO TO HOME
I want 'keyword 1' to be executed only once and 'keyword 2' to be repeated 3 times as per the content list. Please guide me how to handle this.
Current issue:
While continuing with second test it asks userid and userpass to be passed again.
What I want to achieve:
Login once into the web-portal(KEYWORD1). RUN KEYWORD 2 with CONTENT A as arguement, then with CONTENT B as arguement and finally with CONTENT C. I should not login for each time the content needs to be changed.
What you need is the Repeat Keyword from the BuildIn library.
Examples:
Repeat Keyword 5 times Go Back
Repeat Keyword ${var} Some Keyword arg1 arg2
Repeat Keyword 2 minutes Some Keyword arg1 arg2
You can create another keyword like below
Execute Keyword Multiple Times
[Arguments] ${keyword_name} #{params}
FOR ${i} IN #{params}
Run Keyword ${keyword_name} ${i}
END
and you can call it
Execute Keyword Multiple Times KEYWORD 2 CONTENT A CONTENT B ...
If You need to give more than one param you can use dict.
I suggest you another way: give to KEYWORD 2 n args and put a loop into it. The code will be more understandable.
*** Settings ***
Test Setup KEYWORD1 ${reg_userid} ${reg_userpass}
Test Teardown CLOSE CHROME BROWSER
Test Template KEYWORD2 ${content}
Force Tags Smoke
*** Test Cases *** content
VALID CREDENTIAL CONTENT A
CONTENT B
CONTENT C
*** Keywords ***
#------------------------KEYWORD 1 runs once--------------------------------
KEYWORD 1
[Arguments] ${userid} {userpass}
OPEN CHROME BROWSER
GO TO LOGIN PAGE
ENTER USERID
ENTER PASSWORD
CLICK ON LOGIN BUTTON
#------------------------KEYWORD 2 runs thrice-----------------------------
KEYWORD 2
[Arguments] ${content}
CLICK ON CONTENT TILE ${content}
DO SOME ACTION
GO TO HOME
***Variables***
${reg_userid} test#test.com
${reg_userpass} password