Page Not Found | ROBOT FRAMEWORK
-
+
diff --git a/assets/js/0058b4c6.baeb9a27.js b/assets/js/0058b4c6.dce21e24.js
similarity index 86%
rename from assets/js/0058b4c6.baeb9a27.js
rename to assets/js/0058b4c6.dce21e24.js
index 5429bbc6..bf69631b 100644
--- a/assets/js/0058b4c6.baeb9a27.js
+++ b/assets/js/0058b4c6.dce21e24.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[849],{6164:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"Robot Framework Guides","href":"/docs/","docId":"index","unlisted":false},{"type":"category","label":"About","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"About RF Guides","href":"/docs/about/about_us","docId":"about/about_us","unlisted":false},{"type":"link","label":"How to contribute","href":"/docs/about/contribute","docId":"about/contribute","unlisted":false}]},{"type":"category","label":"Getting Started","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"I\'m looking for testing","href":"/docs/getting_started/testing","docId":"getting_started/testing","unlisted":false},{"type":"link","label":"I\'m looking for RPA","href":"/docs/getting_started/rpa","docId":"getting_started/rpa","unlisted":false},{"type":"link","label":"Set up your IDE","href":"/docs/getting_started/ide","docId":"getting_started/ide","unlisted":false},{"type":"link","label":"Videos","href":"/docs/getting_started/videos","docId":"getting_started/videos","unlisted":false}]},{"type":"category","label":"Libraries","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"How to find the right library","href":"/docs/different_libraries/how_to_find_library","docId":"different_libraries/how_to_find_library","unlisted":false},{"type":"link","label":"Overview","href":"/docs/different_libraries/overview","docId":"different_libraries/overview","unlisted":false},{"type":"link","label":"RPA Framework","href":"/docs/different_libraries/rpa","docId":"different_libraries/rpa","unlisted":false},{"type":"link","label":"Appium Library","href":"/docs/different_libraries/appium","docId":"different_libraries/appium","unlisted":false},{"type":"link","label":"Browser Library","href":"/docs/different_libraries/browser","docId":"different_libraries/browser","unlisted":false},{"type":"link","label":"Database Library","href":"/docs/different_libraries/database","docId":"different_libraries/database","unlisted":false},{"type":"link","label":"Requests Library","href":"/docs/different_libraries/requests","docId":"different_libraries/requests","unlisted":false},{"type":"link","label":"Selenium Library","href":"/docs/different_libraries/selenium","docId":"different_libraries/selenium","unlisted":false},{"type":"link","label":"Standard Library","href":"/docs/different_libraries/standard","docId":"different_libraries/standard","unlisted":false}]},{"type":"category","label":"Examples","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Overview","href":"/docs/examples/overview","docId":"examples/overview","unlisted":false},{"type":"link","label":"Vehicle Insurance App","href":"/docs/examples/insurance","docId":"examples/insurance","unlisted":false},{"type":"link","label":"MFA Login","href":"/docs/examples/mfa_login","docId":"examples/mfa_login","unlisted":false},{"type":"link","label":"Project Structure","href":"/docs/examples/project_structure","docId":"examples/project_structure","unlisted":false},{"type":"link","label":"Restful Booker","href":"/docs/examples/restfulbooker","docId":"examples/restfulbooker","unlisted":false},{"type":"link","label":"TodoMVC","href":"/docs/examples/todo","docId":"examples/todo","unlisted":false}]},{"type":"link","label":"Style Guide","href":"/docs/style_guide","docId":"style_guide","unlisted":false},{"type":"category","label":"Docker And CI Systems","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Docker Images","href":"/docs/using_rf_in_ci_systems/docker","docId":"using_rf_in_ci_systems/docker","unlisted":false},{"type":"link","label":"Play With Docker","href":"/docs/using_rf_in_ci_systems/playground","docId":"using_rf_in_ci_systems/playground","unlisted":false},{"type":"category","label":"CI Systems","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u26d4 Azure DevOps","href":"/docs/using_rf_in_ci_systems/ci/azure-devops","docId":"using_rf_in_ci_systems/ci/azure-devops","unlisted":false},{"type":"link","label":"\u26d4 GitHub Actions","href":"/docs/using_rf_in_ci_systems/ci/github-actions","docId":"using_rf_in_ci_systems/ci/github-actions","unlisted":false},{"type":"link","label":"GitLab","href":"/docs/using_rf_in_ci_systems/ci/gitlab","docId":"using_rf_in_ci_systems/ci/gitlab","unlisted":false},{"type":"link","label":"Jenkins","href":"/docs/using_rf_in_ci_systems/ci/jenkins","docId":"using_rf_in_ci_systems/ci/jenkins","unlisted":false},{"type":"link","label":"\u26d4 TeamCity","href":"/docs/using_rf_in_ci_systems/ci/teamcity","docId":"using_rf_in_ci_systems/ci/teamcity","unlisted":false}],"href":"/docs/using_rf_in_ci_systems/ci/"}]},{"type":"category","label":"Extending Robot Framework","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Custom Keyword Libraries","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Create Non-Python Libraries","href":"/docs/extending_robot_framework/custom-libraries/non-python_library","docId":"extending_robot_framework/custom-libraries/non-python_library","unlisted":false},{"type":"link","label":"Create Python Libraries","href":"/docs/extending_robot_framework/custom-libraries/python_library","docId":"extending_robot_framework/custom-libraries/python_library","unlisted":false},{"type":"link","label":"Create And Release Libraries","href":"/docs/extending_robot_framework/custom-libraries/releasing_your_own_libraries","docId":"extending_robot_framework/custom-libraries/releasing_your_own_libraries","unlisted":false}]},{"type":"category","label":"Listeners, PrerunModifiers and the API","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Overview","href":"/docs/extending_robot_framework/listeners_prerun_api/overview","docId":"extending_robot_framework/listeners_prerun_api/overview","unlisted":false},{"type":"link","label":"Listener Interface","href":"/docs/extending_robot_framework/listeners_prerun_api/listeners","docId":"extending_robot_framework/listeners_prerun_api/listeners","unlisted":false},{"type":"link","label":"PreRunModifier","href":"/docs/extending_robot_framework/listeners_prerun_api/prerunmodifier","docId":"extending_robot_framework/listeners_prerun_api/prerunmodifier","unlisted":false},{"type":"link","label":"Robot Framework API","href":"/docs/extending_robot_framework/listeners_prerun_api/rf-api","docId":"extending_robot_framework/listeners_prerun_api/rf-api","unlisted":false}]}]},{"type":"link","label":"Re-Execute failed tests","href":"/docs/flaky_tests","docId":"flaky_tests","unlisted":false},{"type":"link","label":"Running tests in parallel","href":"/docs/parallel","docId":"parallel","unlisted":false},{"type":"link","label":"Parsing Test Results","href":"/docs/parsing_results","docId":"parsing_results","unlisted":false},{"type":"link","label":"Reporting Test Results","href":"/docs/reporting_alternatives","docId":"reporting_alternatives","unlisted":false},{"type":"category","label":"Testcase Styles","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"BDD (Behavior Driven Development)","href":"/docs/testcase_styles/bdd","docId":"testcase_styles/bdd","unlisted":false},{"type":"link","label":"DataDriven Tests","href":"/docs/testcase_styles/datadriven","docId":"testcase_styles/datadriven","unlisted":false}]},{"type":"link","label":"Variables","href":"/docs/variables","docId":"variables","unlisted":false}]},"docs":{"about/about_us":{"id":"about/about_us","title":"About RF Guides","description":"Who we are","sidebar":"tutorialSidebar"},"about/contribute":{"id":"about/contribute","title":"How to contribute","description":"Quickstart","sidebar":"tutorialSidebar"},"different_libraries/appium":{"id":"different_libraries/appium","title":"Appium Library","description":"Introduction","sidebar":"tutorialSidebar"},"different_libraries/browser":{"id":"different_libraries/browser","title":"Browser Library","description":"Robot Framework Browser library powered by Playwright. Moving browser automation to year 2021!","sidebar":"tutorialSidebar"},"different_libraries/database":{"id":"different_libraries/database","title":"Database Library","description":"Database Library is a Robot Framework library that provides keywords for interacting with databases.","sidebar":"tutorialSidebar"},"different_libraries/how_to_find_library":{"id":"different_libraries/how_to_find_library","title":"How to find the right library","description":"That\'s the main question, when searching for a library to steer your application.","sidebar":"tutorialSidebar"},"different_libraries/overview":{"id":"different_libraries/overview","title":"Library Overview","description":"","sidebar":"tutorialSidebar"},"different_libraries/requests":{"id":"different_libraries/requests","title":"Requests Library","description":"\ud83c\udfe0 `RequestsLibrary` is a Robot Framework library","sidebar":"tutorialSidebar"},"different_libraries/rpa":{"id":"different_libraries/rpa","title":"RPA Framework","description":"Introduction","sidebar":"tutorialSidebar"},"different_libraries/selenium":{"id":"different_libraries/selenium","title":"Selenium Library","description":"SeleniumLibrary is a web testing library for Robot Framework that utilizes the Selenium tool internally. The project is hosted on GitHub and downloads can be found from PyPI.","sidebar":"tutorialSidebar"},"different_libraries/standard":{"id":"different_libraries/standard","title":"Standard Library","description":"The Libraries which are part of the Standard Library are distributed with Robot Framework Core.","sidebar":"tutorialSidebar"},"examples/insurance":{"id":"examples/insurance","title":"Vehicle Insurance App","description":"Webpage//sampleapp.tricentis.com/","sidebar":"tutorialSidebar"},"examples/mfa_login":{"id":"examples/mfa_login","title":"Login with Multi Factor Authentication","description":"Webpage//seleniumbase.io/realworld/login","sidebar":"tutorialSidebar"},"examples/overview":{"id":"examples/overview","title":"Examples Overview","description":"General hints about a good project structure can be found here.","sidebar":"tutorialSidebar"},"examples/project_structure":{"id":"examples/project_structure","title":"Project Structure","description":"Root Folder","sidebar":"tutorialSidebar"},"examples/restfulbooker":{"id":"examples/restfulbooker","title":"Restful Booker","description":"Webpage//restful-booker.herokuapp.com/","sidebar":"tutorialSidebar"},"examples/todo":{"id":"examples/todo","title":"TodoMVC","description":"Webpage//todomvc.com/","sidebar":"tutorialSidebar"},"extending_robot_framework/custom-libraries/non-python_library":{"id":"extending_robot_framework/custom-libraries/non-python_library","title":"Non-Python Libraries","description":"Rust","sidebar":"tutorialSidebar"},"extending_robot_framework/custom-libraries/python_library":{"id":"extending_robot_framework/custom-libraries/python_library","title":"Python Libraries","description":"Talk Creating Libraries - Why and How from RoboCon 2021","sidebar":"tutorialSidebar"},"extending_robot_framework/custom-libraries/releasing_your_own_libraries":{"id":"extending_robot_framework/custom-libraries/releasing_your_own_libraries","title":"Package and Release Your Own Libraries","description":"Check out the Robot Framework User Guide for more information.","sidebar":"tutorialSidebar"},"extending_robot_framework/listeners_prerun_api/listeners":{"id":"extending_robot_framework/listeners_prerun_api/listeners","title":"Listener Interface","description":"Listeners can listen \ud83d\udc42 to the events that are fired during the execution of a test suite and react to them.","sidebar":"tutorialSidebar"},"extending_robot_framework/listeners_prerun_api/overview":{"id":"extending_robot_framework/listeners_prerun_api/overview","title":"Overview","description":"Listeners","sidebar":"tutorialSidebar"},"extending_robot_framework/listeners_prerun_api/prerunmodifier":{"id":"extending_robot_framework/listeners_prerun_api/prerunmodifier","title":"PreRunModifier","description":"A PreRunModifier can modify the test suite before it is executed.","sidebar":"tutorialSidebar"},"extending_robot_framework/listeners_prerun_api/rf-api":{"id":"extending_robot_framework/listeners_prerun_api/rf-api","title":"Robot Framework API","description":"What is the Robot Framework API?","sidebar":"tutorialSidebar"},"flaky_tests":{"id":"flaky_tests","title":"Re-Execute failed tests","description":"HOW TO! Rerun failed testcases in Robot Framework","sidebar":"tutorialSidebar"},"getting_started/ide":{"id":"getting_started/ide","title":"Set up your IDE","description":"Install an IDE and Extensions for code-completion and debugging","sidebar":"tutorialSidebar"},"getting_started/rpa":{"id":"getting_started/rpa","title":"I\'m looking for RPA","description":"Use rcc to create a new RPA project","sidebar":"tutorialSidebar"},"getting_started/testing":{"id":"getting_started/testing","title":"I\'m looking for testing","description":"Install Python and Robot Framework using pip","sidebar":"tutorialSidebar"},"getting_started/videos":{"id":"getting_started/videos","title":"Videos and Tutorials","description":"Videos and Tutorials","sidebar":"tutorialSidebar"},"index":{"id":"index","title":"Welcome to","description":"Docusaurus themed image","sidebar":"tutorialSidebar"},"parallel":{"id":"parallel","title":"Running tests in parallel","description":"Pabot","sidebar":"tutorialSidebar"},"parsing_results":{"id":"parsing_results","title":"Parsing Test Results","description":"Robot Framework can create different output files after a test run.","sidebar":"tutorialSidebar"},"reporting_alternatives":{"id":"reporting_alternatives","title":"Reporting Test Results","description":"Other Reporting Tools and Dashboards","sidebar":"tutorialSidebar"},"style_guide":{"id":"style_guide","title":"Style Guide","description":"Version 0.9b","sidebar":"tutorialSidebar"},"testcase_styles/bdd":{"id":"testcase_styles/bdd","title":"BDD (Behavior Driven Development)","description":"What is BDD?","sidebar":"tutorialSidebar"},"testcase_styles/datadriven":{"id":"testcase_styles/datadriven","title":"DataDriven Tests","description":"Using DataDriven Syntax in Robot Framework","sidebar":"tutorialSidebar"},"using_rf_in_ci_systems/ci/azure-devops":{"id":"using_rf_in_ci_systems/ci/azure-devops","title":"\u26d4 Azure DevOps","description":"No content yet \ud83d\ude3f","sidebar":"tutorialSidebar"},"using_rf_in_ci_systems/ci/ci":{"id":"using_rf_in_ci_systems/ci/ci","title":"CI Systems","description":"{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"Robot Framework Guides","href":"/docs/","docId":"index","unlisted":false},{"type":"category","label":"About","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"About RF Guides","href":"/docs/about/about_us","docId":"about/about_us","unlisted":false},{"type":"link","label":"How to contribute","href":"/docs/about/contribute","docId":"about/contribute","unlisted":false}]},{"type":"category","label":"Getting Started","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"I\'m looking for testing","href":"/docs/getting_started/testing","docId":"getting_started/testing","unlisted":false},{"type":"link","label":"I\'m looking for RPA","href":"/docs/getting_started/rpa","docId":"getting_started/rpa","unlisted":false},{"type":"link","label":"Set up your IDE","href":"/docs/getting_started/ide","docId":"getting_started/ide","unlisted":false},{"type":"link","label":"Videos","href":"/docs/getting_started/videos","docId":"getting_started/videos","unlisted":false}]},{"type":"category","label":"Libraries","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"How to find the right library","href":"/docs/different_libraries/how_to_find_library","docId":"different_libraries/how_to_find_library","unlisted":false},{"type":"link","label":"Overview","href":"/docs/different_libraries/overview","docId":"different_libraries/overview","unlisted":false},{"type":"link","label":"RPA Framework","href":"/docs/different_libraries/rpa","docId":"different_libraries/rpa","unlisted":false},{"type":"link","label":"Appium Library","href":"/docs/different_libraries/appium","docId":"different_libraries/appium","unlisted":false},{"type":"link","label":"Browser Library","href":"/docs/different_libraries/browser","docId":"different_libraries/browser","unlisted":false},{"type":"link","label":"Database Library","href":"/docs/different_libraries/database","docId":"different_libraries/database","unlisted":false},{"type":"link","label":"Requests Library","href":"/docs/different_libraries/requests","docId":"different_libraries/requests","unlisted":false},{"type":"link","label":"Selenium Library","href":"/docs/different_libraries/selenium","docId":"different_libraries/selenium","unlisted":false},{"type":"link","label":"Standard Library","href":"/docs/different_libraries/standard","docId":"different_libraries/standard","unlisted":false}]},{"type":"category","label":"Examples","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Overview","href":"/docs/examples/overview","docId":"examples/overview","unlisted":false},{"type":"link","label":"Vehicle Insurance App","href":"/docs/examples/insurance","docId":"examples/insurance","unlisted":false},{"type":"link","label":"MFA Login","href":"/docs/examples/mfa_login","docId":"examples/mfa_login","unlisted":false},{"type":"link","label":"Project Structure","href":"/docs/examples/project_structure","docId":"examples/project_structure","unlisted":false},{"type":"link","label":"Restful Booker","href":"/docs/examples/restfulbooker","docId":"examples/restfulbooker","unlisted":false},{"type":"link","label":"TodoMVC","href":"/docs/examples/todo","docId":"examples/todo","unlisted":false}]},{"type":"link","label":"Style Guide","href":"/docs/style_guide","docId":"style_guide","unlisted":false},{"type":"category","label":"Docker And CI Systems","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Docker Images","href":"/docs/using_rf_in_ci_systems/docker","docId":"using_rf_in_ci_systems/docker","unlisted":false},{"type":"link","label":"Play With Docker","href":"/docs/using_rf_in_ci_systems/playground","docId":"using_rf_in_ci_systems/playground","unlisted":false},{"type":"category","label":"CI Systems","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"\u26d4 Azure DevOps","href":"/docs/using_rf_in_ci_systems/ci/azure-devops","docId":"using_rf_in_ci_systems/ci/azure-devops","unlisted":false},{"type":"link","label":"\u26d4 GitHub Actions","href":"/docs/using_rf_in_ci_systems/ci/github-actions","docId":"using_rf_in_ci_systems/ci/github-actions","unlisted":false},{"type":"link","label":"GitLab","href":"/docs/using_rf_in_ci_systems/ci/gitlab","docId":"using_rf_in_ci_systems/ci/gitlab","unlisted":false},{"type":"link","label":"Jenkins","href":"/docs/using_rf_in_ci_systems/ci/jenkins","docId":"using_rf_in_ci_systems/ci/jenkins","unlisted":false},{"type":"link","label":"\u26d4 TeamCity","href":"/docs/using_rf_in_ci_systems/ci/teamcity","docId":"using_rf_in_ci_systems/ci/teamcity","unlisted":false}],"href":"/docs/using_rf_in_ci_systems/ci/"}]},{"type":"category","label":"Extending Robot Framework","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Custom Keyword Libraries","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Create Non-Python Libraries","href":"/docs/extending_robot_framework/custom-libraries/non-python_library","docId":"extending_robot_framework/custom-libraries/non-python_library","unlisted":false},{"type":"link","label":"Create Python Libraries","href":"/docs/extending_robot_framework/custom-libraries/python_library","docId":"extending_robot_framework/custom-libraries/python_library","unlisted":false},{"type":"link","label":"Create And Release Libraries","href":"/docs/extending_robot_framework/custom-libraries/releasing_your_own_libraries","docId":"extending_robot_framework/custom-libraries/releasing_your_own_libraries","unlisted":false}]},{"type":"category","label":"Listeners, PrerunModifiers and the API","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Overview","href":"/docs/extending_robot_framework/listeners_prerun_api/overview","docId":"extending_robot_framework/listeners_prerun_api/overview","unlisted":false},{"type":"link","label":"Listener Interface","href":"/docs/extending_robot_framework/listeners_prerun_api/listeners","docId":"extending_robot_framework/listeners_prerun_api/listeners","unlisted":false},{"type":"link","label":"PreRunModifier","href":"/docs/extending_robot_framework/listeners_prerun_api/prerunmodifier","docId":"extending_robot_framework/listeners_prerun_api/prerunmodifier","unlisted":false},{"type":"link","label":"Robot Framework API","href":"/docs/extending_robot_framework/listeners_prerun_api/rf-api","docId":"extending_robot_framework/listeners_prerun_api/rf-api","unlisted":false}]}]},{"type":"link","label":"Re-Execute failed tests","href":"/docs/flaky_tests","docId":"flaky_tests","unlisted":false},{"type":"link","label":"Running tests in parallel","href":"/docs/parallel","docId":"parallel","unlisted":false},{"type":"link","label":"Parsing Test Results","href":"/docs/parsing_results","docId":"parsing_results","unlisted":false},{"type":"link","label":"Reporting Test Results","href":"/docs/reporting_alternatives","docId":"reporting_alternatives","unlisted":false},{"type":"category","label":"Testcase Styles","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"BDD (Behavior Driven Development)","href":"/docs/testcase_styles/bdd","docId":"testcase_styles/bdd","unlisted":false},{"type":"link","label":"DataDriven Tests","href":"/docs/testcase_styles/datadriven","docId":"testcase_styles/datadriven","unlisted":false}]},{"type":"link","label":"Variables","href":"/docs/variables","docId":"variables","unlisted":false}]},"docs":{"about/about_us":{"id":"about/about_us","title":"About RF Guides","description":"Who we are","sidebar":"tutorialSidebar"},"about/contribute":{"id":"about/contribute","title":"How to contribute","description":"Quickstart","sidebar":"tutorialSidebar"},"different_libraries/appium":{"id":"different_libraries/appium","title":"Appium Library","description":"Introduction","sidebar":"tutorialSidebar"},"different_libraries/browser":{"id":"different_libraries/browser","title":"Browser Library","description":"Robot Framework Browser library powered by Playwright. Moving browser automation to year 2021!","sidebar":"tutorialSidebar"},"different_libraries/database":{"id":"different_libraries/database","title":"Database Library","description":"Database Library is a Robot Framework library that provides keywords for interacting with databases.","sidebar":"tutorialSidebar"},"different_libraries/how_to_find_library":{"id":"different_libraries/how_to_find_library","title":"How to find the right library","description":"That\'s the main question, when searching for a library to steer your application.","sidebar":"tutorialSidebar"},"different_libraries/overview":{"id":"different_libraries/overview","title":"Library Overview","description":"","sidebar":"tutorialSidebar"},"different_libraries/requests":{"id":"different_libraries/requests","title":"Requests Library","description":"\ud83c\udfe0 `RequestsLibrary` is a Robot Framework library","sidebar":"tutorialSidebar"},"different_libraries/rpa":{"id":"different_libraries/rpa","title":"RPA Framework","description":"Introduction","sidebar":"tutorialSidebar"},"different_libraries/selenium":{"id":"different_libraries/selenium","title":"Selenium Library","description":"SeleniumLibrary is a web testing library for Robot Framework that utilizes the Selenium tool internally. The project is hosted on GitHub and downloads can be found from PyPI.","sidebar":"tutorialSidebar"},"different_libraries/standard":{"id":"different_libraries/standard","title":"Standard Library","description":"The Libraries which are part of the Standard Library are distributed with Robot Framework Core.","sidebar":"tutorialSidebar"},"examples/insurance":{"id":"examples/insurance","title":"Vehicle Insurance App","description":"Webpage//sampleapp.tricentis.com/","sidebar":"tutorialSidebar"},"examples/mfa_login":{"id":"examples/mfa_login","title":"Login with Multi Factor Authentication","description":"Webpage//seleniumbase.io/realworld/login","sidebar":"tutorialSidebar"},"examples/overview":{"id":"examples/overview","title":"Examples Overview","description":"General hints about a good project structure can be found here.","sidebar":"tutorialSidebar"},"examples/project_structure":{"id":"examples/project_structure","title":"Project Structure","description":"Root Folder","sidebar":"tutorialSidebar"},"examples/restfulbooker":{"id":"examples/restfulbooker","title":"Restful Booker","description":"Webpage//restful-booker.herokuapp.com/","sidebar":"tutorialSidebar"},"examples/todo":{"id":"examples/todo","title":"TodoMVC","description":"Webpage//todomvc.com/","sidebar":"tutorialSidebar"},"extending_robot_framework/custom-libraries/non-python_library":{"id":"extending_robot_framework/custom-libraries/non-python_library","title":"Non-Python Libraries","description":"Rust","sidebar":"tutorialSidebar"},"extending_robot_framework/custom-libraries/python_library":{"id":"extending_robot_framework/custom-libraries/python_library","title":"Python Libraries","description":"Talk Creating Libraries - Why and How from RoboCon 2021","sidebar":"tutorialSidebar"},"extending_robot_framework/custom-libraries/releasing_your_own_libraries":{"id":"extending_robot_framework/custom-libraries/releasing_your_own_libraries","title":"Package and Release Your Own Libraries","description":"Check out the Robot Framework User Guide for more information.","sidebar":"tutorialSidebar"},"extending_robot_framework/listeners_prerun_api/listeners":{"id":"extending_robot_framework/listeners_prerun_api/listeners","title":"Listener Interface","description":"Listeners can listen \ud83d\udc42 to the events that are fired during the execution of a test suite and react to them.","sidebar":"tutorialSidebar"},"extending_robot_framework/listeners_prerun_api/overview":{"id":"extending_robot_framework/listeners_prerun_api/overview","title":"Overview","description":"Listeners","sidebar":"tutorialSidebar"},"extending_robot_framework/listeners_prerun_api/prerunmodifier":{"id":"extending_robot_framework/listeners_prerun_api/prerunmodifier","title":"PreRunModifier","description":"A PreRunModifier can modify the test suite before it is executed.","sidebar":"tutorialSidebar"},"extending_robot_framework/listeners_prerun_api/rf-api":{"id":"extending_robot_framework/listeners_prerun_api/rf-api","title":"Robot Framework API","description":"What is the Robot Framework API?","sidebar":"tutorialSidebar"},"flaky_tests":{"id":"flaky_tests","title":"Re-Execute failed tests","description":"HOW TO! Rerun failed testcases in Robot Framework","sidebar":"tutorialSidebar"},"getting_started/ide":{"id":"getting_started/ide","title":"Set up your IDE","description":"Install an IDE and Extensions for code-completion and debugging","sidebar":"tutorialSidebar"},"getting_started/rpa":{"id":"getting_started/rpa","title":"I\'m looking for RPA","description":"Use rcc to create a new RPA project","sidebar":"tutorialSidebar"},"getting_started/testing":{"id":"getting_started/testing","title":"I\'m looking for testing","description":"Install Python and Robot Framework using pip","sidebar":"tutorialSidebar"},"getting_started/videos":{"id":"getting_started/videos","title":"Videos and Tutorials","description":"Videos and Tutorials","sidebar":"tutorialSidebar"},"index":{"id":"index","title":"Welcome to","description":"Docusaurus themed image","sidebar":"tutorialSidebar"},"parallel":{"id":"parallel","title":"Running tests in parallel","description":"Pabot","sidebar":"tutorialSidebar"},"parsing_results":{"id":"parsing_results","title":"Parsing Test Results","description":"Robot Framework can create different output files after a test run.","sidebar":"tutorialSidebar"},"reporting_alternatives":{"id":"reporting_alternatives","title":"Reporting Test Results","description":"Other Reporting Tools and Dashboards","sidebar":"tutorialSidebar"},"style_guide":{"id":"style_guide","title":"Style Guide","description":"Version 0.10b","sidebar":"tutorialSidebar"},"testcase_styles/bdd":{"id":"testcase_styles/bdd","title":"BDD (Behavior Driven Development)","description":"What is BDD?","sidebar":"tutorialSidebar"},"testcase_styles/datadriven":{"id":"testcase_styles/datadriven","title":"DataDriven Tests","description":"Using DataDriven Syntax in Robot Framework","sidebar":"tutorialSidebar"},"using_rf_in_ci_systems/ci/azure-devops":{"id":"using_rf_in_ci_systems/ci/azure-devops","title":"\u26d4 Azure DevOps","description":"No content yet \ud83d\ude3f","sidebar":"tutorialSidebar"},"using_rf_in_ci_systems/ci/ci":{"id":"using_rf_in_ci_systems/ci/ci","title":"CI Systems","description":"{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>b,frontMatter:()=>l,metadata:()=>d,toc:()=>h});var a=s(4848),i=s(8453),t=s(1470),r=s(9365);const l={sidebar_position:5},o="Style Guide",d={id:"style_guide",title:"Style Guide",description:"Version 0.9b",source:"@site/docs/style_guide.md",sourceDirName:".",slug:"/style_guide",permalink:"/docs/style_guide",draft:!1,unlisted:!1,editUrl:"https://github.com/MarketSquare/robotframeworkguides/edit/main/website/docs/style_guide.md",tags:[],version:"current",sidebarPosition:5,frontMatter:{sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"TodoMVC",permalink:"/docs/examples/todo"},next:{title:"Docker Images",permalink:"/docs/using_rf_in_ci_systems/docker"}},c={},h=[{value:"Introduction",id:"introduction",level:2},{value:"Purpose",id:"purpose",level:3},{value:"Robocon 2022 Presentation",id:"robocon-2022-presentation",level:3},{value:"Contributors",id:"contributors",level:3},{value:"Special Thanks To",id:"special-thanks-to",level:4},{value:"We are always looking for contributors",id:"we-are-always-looking-for-contributors",level:4},{value:"Vertical Order",id:"vertical-order",level:2},{value:"Sections",id:"sections",level:3},{value:"Settings",id:"settings",level:3},{value:"Variables",id:"variables",level:3},{value:"Test Cases Or Tasks",id:"test-cases-or-tasks",level:3},{value:"Keyword",id:"keyword",level:3},{value:"Keywords - Best Practices",id:"keywords---best-practices",level:4},{value:"Keyword Organization",id:"keyword-organization",level:4},{value:"Vertical Spacing",id:"vertical-spacing",level:2},{value:"Sections",id:"sections-1",level:3},{value:"Spacing After The Section Header Line",id:"spacing-after-the-section-header-line",level:4},{value:"Spacing After Sections",id:"spacing-after-sections",level:4},{value:"Example Of Section Header And Section Spacing",id:"example-of-section-header-and-section-spacing",level:5},{value:"Settings",id:"settings-1",level:3},{value:"Spacing Between Settings Within The Settings Section",id:"spacing-between-settings-within-the-settings-section",level:4},{value:"Example Of Settings Section Vertical Spacing",id:"example-of-settings-section-vertical-spacing",level:5},{value:"Spacing Between Settings Within A Test Case, Task Or Keyword",id:"spacing-between-settings-within-a-test-case-task-or-keyword",level:4},{value:"Variables",id:"variables-1",level:3},{value:"Spacing Between Variables In The Variables Section",id:"spacing-between-variables-in-the-variables-section",level:4},{value:"Test Cases Or Tasks",id:"test-cases-or-tasks-1",level:3},{value:"Spacing After Test Cases Or Tasks",id:"spacing-after-test-cases-or-tasks",level:4},{value:"Spacing Between Code Blocks Within Test Cases Or Tasks",id:"spacing-between-code-blocks-within-test-cases-or-tasks",level:4},{value:"Spacing After Templated Test Cases",id:"spacing-after-templated-test-cases",level:4},{value:"Spacing Between Templated Test Case Data",id:"spacing-between-templated-test-case-data",level:4},{value:"Keywords",id:"keywords",level:3},{value:"Spacing After Keywords",id:"spacing-after-keywords",level:4},{value:"Spacing Between Keyword Calls",id:"spacing-between-keyword-calls",level:4},{value:"Spacing Between Code Blocks Within Keyword Calls",id:"spacing-between-code-blocks-within-keyword-calls",level:4},{value:"Spacing Of Line Continuations",id:"spacing-of-line-continuations",level:4},{value:"Examples",id:"examples",level:4},{value:"Example Robot File Vertical White Spacing",id:"example-robot-file-vertical-white-spacing",level:5},{value:"Example Resource File Vertical Spacing",id:"example-resource-file-vertical-spacing",level:5},{value:"Horizontal Spacing",id:"horizontal-spacing",level:2},{value:"Separation",id:"separation",level:4},{value:"Indentation",id:"indentation",level:4},{value:"Generic",id:"generic",level:3},{value:"Line Length",id:"line-length",level:4},{value:"Trailing Whitespaces",id:"trailing-whitespaces",level:4},{value:"Settings",id:"settings-2",level:3},{value:"Indentation Within Settings Section",id:"indentation-within-settings-section",level:4},{value:"Separation Within Settings Section",id:"separation-within-settings-section",level:4},{value:"Separated With 4 Spaces",id:"separated-with-4-spaces",level:5},{value:"Aligned In Columns",id:"aligned-in-columns",level:5},{value:"Variables",id:"variables-2",level:3},{value:"Indentation Within Variables Section",id:"indentation-within-variables-section",level:4},{value:"Test Cases, Tasks And Keywords",id:"test-cases-tasks-and-keywords",level:3},{value:"Indentation Within Test Cases, Tasks And Keywords Section",id:"indentation-within-test-cases-tasks-and-keywords-section",level:4},{value:"Block Indentation",id:"block-indentation",level:4},{value:"Examples From The User Guide",id:"examples-from-the-user-guide",level:4},{value:"Comments",id:"comments",level:3},{value:"Line Continuation",id:"line-continuation",level:2},{value:"Arguments",id:"arguments",level:3},{value:"Line Continuation For Arguments In Keyword Definition",id:"line-continuation-for-arguments-in-keyword-definition",level:4},{value:"Required Arguments",id:"required-arguments",level:4},{value:"Optional Arguments",id:"optional-arguments",level:4},{value:"Required And Optional Arguments Together",id:"required-and-optional-arguments-together",level:4},{value:"Embedded Arguments",id:"embedded-arguments",level:4},{value:"Line Continuation For Arguments In Test Cases Or Tasks",id:"line-continuation-for-arguments-in-test-cases-or-tasks",level:4},{value:"Variables",id:"variables-3",level:3},{value:"Variables Section Line Continuation",id:"variables-section-line-continuation",level:4},{value:"Scalars",id:"scalars",level:5},{value:"Lists",id:"lists",level:6},{value:"Dictionaries",id:"dictionaries",level:6},{value:"Keywords Section",id:"keywords-section",level:4},{value:"Scalar Variable Creation",id:"scalar-variable-creation",level:5},{value:"List Variable Creation",id:"list-variable-creation",level:5},{value:"Dictionary Variable Creation",id:"dictionary-variable-creation",level:5},{value:"Assigning Multiple Variables",id:"assigning-multiple-variables",level:5},{value:"Test Cases Or Tasks Section",id:"test-cases-or-tasks-section",level:4},{value:"Variables",id:"variables-4",level:2},{value:"Variable Scope And Casing",id:"variable-scope-and-casing",level:3},{value:"Declaring Variable Scope Properly",id:"declaring-variable-scope-properly",level:4},{value:"Variable Assignment Syntax",id:"variable-assignment-syntax",level:3},{value:"Spaces Or Underscores Variables",id:"spaces-or-underscores-variables",level:3},{value:"Using Variables With Spaces Within Python Code Blocks",id:"using-variables-with-spaces-within-python-code-blocks",level:4},{value:"Variables Within Settings Section",id:"variables-within-settings-section",level:3},{value:"Variables Section",id:"variables-section",level:3},{value:"Test Cases Or Tasks",id:"test-cases-or-tasks-2",level:3},{value:"Keywords",id:"keywords-1",level:3},{value:"Special Cases",id:"special-cases",level:3},{value:"Variable Files",id:"variable-files",level:4},{value:".resource Variable Files",id:"resource-variable-files",level:5},{value:"Python Variable Files",id:"python-variable-files",level:5},{value:"Yaml Variable Files",id:"yaml-variable-files",level:5},{value:"Json Variable Files",id:"json-variable-files",level:4},{value:"Commandline Variables",id:"commandline-variables",level:4},{value:"Environment Variables",id:"environment-variables",level:4},{value:"Deviation When Context Is More Important",id:"deviation-when-context-is-more-important",level:4},{value:"Embedded Variables",id:"embedded-variables",level:4},{value:"Variables with Attributes",id:"variables-with-attributes",level:4}];function u(e){const n={a:"a",admonition:"admonition",blockquote:"blockquote",br:"br",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",h6:"h6",hr:"hr",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h1,{id:"style-guide",children:"Style Guide"}),"\n",(0,a.jsx)(n.p,{children:"Version 0.9b"}),"\n",(0,a.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,a.jsx)(n.h3,{id:"purpose",children:"Purpose"}),"\n",(0,a.jsx)(n.p,{children:"This style guide is a community driven set of sensible rules to write your Robot Framework code."}),"\n",(0,a.jsxs)(n.p,{children:["As a starting point, use the existing standards from\n",(0,a.jsx)(n.a,{href:"https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#getting-started",children:"Robot Framework"})," user guide,\n",(0,a.jsx)(n.a,{href:"https://robocop.readthedocs.io/en/stable/",children:"Robocop"}),", and ",(0,a.jsx)(n.a,{href:"https://robotidy.readthedocs.io/en/stable/",children:"Robotidy"}),"."]}),"\n",(0,a.jsx)(n.h3,{id:"robocon-2022-presentation",children:"Robocon 2022 Presentation"}),"\n",(0,a.jsx)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/Mpt_4MItha0",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:!0}),"\n",(0,a.jsx)(n.h3,{id:"contributors",children:"Contributors"}),"\n",(0,a.jsx)(n.p,{children:"Guido Demmenie, Manana Koberidze, Kelby Stine"}),"\n",(0,a.jsx)(n.h4,{id:"special-thanks-to",children:"Special Thanks To"}),"\n",(0,a.jsx)(n.p,{children:"V\xe1clav Fuksa, Many Kasiriha, Bartlomiej Hirsz, Mateusz Nojek, Ren\xe9 Rohner, Miikka Solmela"}),"\n",(0,a.jsx)(n.h4,{id:"we-are-always-looking-for-contributors",children:"We are always looking for contributors"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["If you have feedback please:","\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["Reach out to any one of us on the RobotFramework Slack channel: ",(0,a.jsx)(n.code,{children:"#style-guide"})]}),"\n",(0,a.jsxs)(n.li,{children:["Create an issue on ",(0,a.jsx)(n.a,{href:"https://github.com/MarketSquare/robotframework-style-guide",children:"robotframework-style-guide"})]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(n.li,{children:"We meet up once every two weeks to talk about style guide topics"}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:["For more info go to our repository: ",(0,a.jsx)(n.a,{href:"https://github.com/MarketSquare/robotframework-style-guide",children:"MarketSquare/robotframework-style-guide"})]}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h2,{id:"vertical-order",children:"Vertical Order"}),"\n",(0,a.jsxs)(n.p,{children:["Recommended approaches to ordering ",(0,a.jsx)(n.code,{children:".robot"})," and ",(0,a.jsx)(n.code,{children:".resource"})," files."]}),"\n",(0,a.jsx)(n.p,{children:"Vertical order refers to the recommended order of settings, sections, variables, keywords."}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"sections",children:"Sections"}),"\n",(0,a.jsxs)(n.p,{children:["User Guide Reference: ",(0,a.jsx)(n.a,{href:"https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#test-data-sections",children:"Test Data Section"})]}),"\n",(0,a.jsxs)(t.A,{children:[(0,a.jsx)(r.A,{value:"tests",label:"Tests",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Comments ***\n\n\n*** Settings ***\n\n\n*** Variables ***\n\n\n*** Test Cases ***\n\n\n*** Keywords ***\n"})})}),(0,a.jsx)(r.A,{value:"tasks",label:"RPA",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Comments ***\n\n\n*** Settings ***\n\n\n*** Variables ***\n\n\n*** Tasks ***\n\n\n*** Keywords ***\n"})})})]}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"settings",children:"Settings"}),"\n",(0,a.jsxs)(n.p,{children:["User Guide Reference: ",(0,a.jsx)(n.a,{href:"https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#setting-section-1",children:"Settings Section"})]}),"\n",(0,a.jsxs)(t.A,{children:[(0,a.jsx)(r.A,{value:"tests",label:"Tests",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Settings ***\nDocumentation\nMetadata\n\nLibrary BuiltIn\nLibrary 3rd Party\nLibrary Custom\nResource\nVariables\n\nSuite Setup\nSuite Teardown\nTest Setup\nTest Teardown\nTest Template\nTest Timeout\n\nTest Tags\n"})})}),(0,a.jsx)(r.A,{value:"tasks",label:"RPA",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Settings ***\nDocumentation\nMetadata\n\nLibrary BuiltIn\nLibrary 3rd Party\nLibrary Custom\nResource\nVariables\n\nSuite Setup\nSuite Teardown\nTask Setup\nTask Teardown\nTask Template\nTask Timeout\n\nTask Tags\n"})})})]}),"\n",(0,a.jsx)(n.p,{children:"For easier navigation, libraries in each group can be sorted alphabetically.\nAdditionally, extra new lines can be used to separate the builtin, 3rd party and custom libraries."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Settings ***\n...\nLibrary BuiltIn\nLibrary Collections\nLibrary DateTime\nLibrary OperatingSystem\n\nLibrary Browser\nLibrary JSONLibrary\nLibrary SSHLibrary\n\nLibrary Acustom\nLibrary Bcustom\nLibrary Ccustom\nLibrary Dcustom\n...\n"})}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"variables",children:"Variables"}),"\n",(0,a.jsx)(n.p,{children:"Simple variables (scalar, list, dictionary) variables should be listed first.\nComposite variables (variables composed of other variables) should be listed after simple variables."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Variables ***\n${VARIABLE} This is a Variable\n${COMPOSITE VARIABLES} ${VARIABLE} with other variables.\n\n"})}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"test-cases-or-tasks",children:"Test Cases Or Tasks"}),"\n",(0,a.jsxs)(n.p,{children:["User Guide Reference: ",(0,a.jsx)(n.a,{href:"https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#test-case-section",children:"Test Case Section"})]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"Test Case\n [Documentation]\n [Tags]\n [Timeout]\n [Setup]\n [Template]\n Static Variable Assignments\n Keyword Calls\n Verification Keyword Call\n [Teardown]\n"})}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"keyword",children:"Keyword"}),"\n",(0,a.jsxs)(n.p,{children:["User Guide Reference: ",(0,a.jsx)(n.a,{href:"https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#keyword-section-1",children:"Keyword Section"})]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"Keyword\n [Documentation]\n [Tags]\n [Arguments]\n [Timeout]\n [Setup]\n Static Variable Assignments\n Keyword Calls\n [Teardown]\n"})}),"\n",(0,a.jsx)(n.h4,{id:"keywords---best-practices",children:"Keywords - Best Practices"}),"\n",(0,a.jsx)(n.p,{children:"It is a good idea to put static variable assignments before keyword calls."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"Keyword With Static Variables\n [Arguments] ${argument}\n ${static variable} Set Variable This is a static variable.\n Set Local Variable ${other static variable} Another way to set a static variable.\n ${dynamic variable} Catenate SEPARATOR=${SPACE} ${static variable} ${other static variable} ${argument}\n ${another dynamic variable} Evaluate $static variable.upper()\n Log To Console ${dynamic variable}\n Should Not Be Equal ${static variable} ${other static variable}\n"})}),"\n",(0,a.jsx)(n.h4,{id:"keyword-organization",children:"Keyword Organization"}),"\n",(0,a.jsx)(n.p,{children:"In order to make keyword search within a resource file easier alphabetize your keywords. Some IDEs have an outline side bar (i.e. VSCode) and by alphabetizing the keywords they appear in the side menu in the same way."}),"\n",(0,a.jsx)(n.h2,{id:"vertical-spacing",children:"Vertical Spacing"}),"\n",(0,a.jsxs)(n.p,{children:["These are the recommended vertical space guidelines for ",(0,a.jsx)(n.code,{children:".robot"})," and ",(0,a.jsx)(n.code,{children:".resource"})," files."]}),"\n",(0,a.jsx)(n.admonition,{type:"note",children:(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"The guidelines of larger sections will supersede the guidelines of the subsections."}),"\n",(0,a.jsx)(n.li,{children:"Vertical White Space\n: Any line that contains no characters."}),"\n",(0,a.jsx)(n.li,{children:"Commented lines are not considered white space."}),"\n"]})}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"sections-1",children:"Sections"}),"\n",(0,a.jsx)(n.h4,{id:"spacing-after-the-section-header-line",children:"Spacing After The Section Header Line"}),"\n",(0,a.jsxs)(n.blockquote,{children:["\n",(0,a.jsx)(n.p,{children:"There should be no space immediately after each section header line."}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"spacing-after-sections",children:"Spacing After Sections"}),"\n",(0,a.jsxs)(n.blockquote,{children:["\n",(0,a.jsx)(n.p,{children:"There should be 2 lines of white space after the last line of each section, except the last section of the file.\nThe last section of a file should have 1 line of white space."}),"\n"]}),"\n",(0,a.jsx)(n.h5,{id:"example-of-section-header-and-section-spacing",children:"Example Of Section Header And Section Spacing"}),"\n",(0,a.jsxs)(t.A,{children:[(0,a.jsx)(r.A,{value:"tests",label:"Tests",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:" *** Comments ***\n Comments\n\n\n *** Settings ***\n Documentation\n\n\n *** Variables ***\n ${VARIABLE} a variable\n\n\n *** Test Cases ***\n Test Case\n\n\n *** Keywords ***\n Keyword\n"})})}),(0,a.jsx)(r.A,{value:"tasks",label:"RPA",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:" *** Comments ***\n Comments\n\n\n *** Settings ***\n Documentation\n\n\n *** Variables ***\n ${VARIABLE} a variable\n\n\n *** Tasks ***\n Tasks\n\n\n *** Keywords ***\n Keyword\n"})})})]}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"settings-1",children:"Settings"}),"\n",(0,a.jsx)(n.h4,{id:"spacing-between-settings-within-the-settings-section",children:"Spacing Between Settings Within The Settings Section"}),"\n",(0,a.jsxs)(n.blockquote,{children:["\n",(0,a.jsx)(n.p,{children:"It is recommended to allow 1 line of white space between common lines of settings."}),"\n"]}),"\n",(0,a.jsx)(n.h5,{id:"example-of-settings-section-vertical-spacing",children:"Example Of Settings Section Vertical Spacing"}),"\n",(0,a.jsxs)(t.A,{children:[(0,a.jsx)(r.A,{value:"tests",label:"Tests",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:" *** Settings ***\n Documentation\n Metadata\n\n Library\n Resource\n Variables\n\n Suite Setup\n Suite Teardown\n Test Setup\n Test Teardown\n Test Template\n Test Timeout\n\n Default Tags\n Test Tags\n"})})}),(0,a.jsx)(r.A,{value:"tasks",label:"RPA",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:" *** Settings ***\n Documentation\n Metadata\n\n Library\n Resource\n Variables\n\n Suite Setup\n Suite Teardown\n Task Setup\n Task Teardown\n Task Template\n Task Timeout\n\n Default Tags\n Task Tags\n"})})})]}),"\n",(0,a.jsx)(n.h4,{id:"spacing-between-settings-within-a-test-case-task-or-keyword",children:"Spacing Between Settings Within A Test Case, Task Or Keyword"}),"\n",(0,a.jsxs)(n.blockquote,{children:["\n",(0,a.jsx)(n.p,{children:"No lines of white space should exist between the settings of a Test Case or Task or Keyword."}),"\n"]}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"variables-1",children:"Variables"}),"\n",(0,a.jsx)(n.h4,{id:"spacing-between-variables-in-the-variables-section",children:"Spacing Between Variables In The Variables Section"}),"\n",(0,a.jsx)(n.p,{children:"There should be no lines of white space between variables within the Variables section."}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"test-cases-or-tasks-1",children:"Test Cases Or Tasks"}),"\n",(0,a.jsx)(n.h4,{id:"spacing-after-test-cases-or-tasks",children:"Spacing After Test Cases Or Tasks"}),"\n",(0,a.jsxs)(n.blockquote,{children:["\n",(0,a.jsx)(n.p,{children:"There should be 1 line of white space after each Test Case or Task."}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"spacing-between-code-blocks-within-test-cases-or-tasks",children:"Spacing Between Code Blocks Within Test Cases Or Tasks"}),"\n",(0,a.jsxs)(n.blockquote,{children:["\n",(0,a.jsx)(n.p,{children:"Occasionally Test Cases or Tasks can be grouped in subsections of logical code blocks. In these instances it is acceptable to have 1 space between these code blocks."}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"spacing-after-templated-test-cases",children:"Spacing After Templated Test Cases"}),"\n",(0,a.jsxs)(n.blockquote,{children:["\n",(0,a.jsx)(n.p,{children:"There should be 1 line of white space after each Templated Test Case."}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"spacing-between-templated-test-case-data",children:"Spacing Between Templated Test Case Data"}),"\n",(0,a.jsxs)(n.blockquote,{children:["\n",(0,a.jsx)(n.p,{children:"No lines of white space should exist between lines of test data in Templated Tests."}),"\n"]}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"keywords",children:"Keywords"}),"\n",(0,a.jsx)(n.h4,{id:"spacing-after-keywords",children:"Spacing After Keywords"}),"\n",(0,a.jsxs)(n.blockquote,{children:["\n",(0,a.jsx)(n.p,{children:"There should be 1 line of white space after the last line in a keyword code block."}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"spacing-between-keyword-calls",children:"Spacing Between Keyword Calls"}),"\n",(0,a.jsxs)(n.blockquote,{children:["\n",(0,a.jsx)(n.p,{children:"In most cases there should be no white space between keyword calls."}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"spacing-between-code-blocks-within-keyword-calls",children:"Spacing Between Code Blocks Within Keyword Calls"}),"\n",(0,a.jsxs)(n.blockquote,{children:["\n",(0,a.jsx)(n.p,{children:"Occasionally keywords can be grouped in subsections of logical code blocks. In these instances it is acceptable to have 1 space between these code blocks, but no more than 1 space."}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"spacing-of-line-continuations",children:"Spacing Of Line Continuations"}),"\n",(0,a.jsxs)(n.blockquote,{children:["\n",(0,a.jsx)(n.p,{children:"No lines of white space should exist between lines of code using line continuation (...) syntax."}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"examples",children:"Examples"}),"\n",(0,a.jsx)(n.p,{children:"Key to examples:"}),"\n",(0,a.jsxs)(n.blockquote,{children:["\n",(0,a.jsxs)(n.p,{children:["\u2460 Two spaces between sections",(0,a.jsx)(n.br,{}),"\n","\u2461 One space between Tests/Tasks",(0,a.jsx)(n.br,{}),"\n","\u2462 No space in the settings section of Tests/Tasks or Keywords",(0,a.jsx)(n.br,{}),"\n","\u2463 No space after settings section of Tests/Tasks or Keywords",(0,a.jsx)(n.br,{}),"\n","\u2464 No spaces between template Test/Task data lines",(0,a.jsx)(n.br,{}),"\n","\u2465 One space Between Keywords",(0,a.jsx)(n.br,{}),"\n","\u2466 No space between continuation lines",(0,a.jsx)(n.br,{}),"\n","\u2467 One space for separating code blocks",(0,a.jsx)(n.br,{}),"\n","\u2468 One space at the very end of the file"]}),"\n"]}),"\n",(0,a.jsx)(n.h5,{id:"example-robot-file-vertical-white-spacing",children:"Example Robot File Vertical White Spacing"}),"\n",(0,a.jsxs)(t.A,{children:[(0,a.jsx)(r.A,{value:"tests",label:"Tests",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Comments ***\nThis is the comments section\n\u2460\n\n*** Settings ***\nDocumentation This is documentation\n\u2466 ... robot -d Results -i example-tag Tests\n\nLibrary Collections\nResource ../Resources/ExampleResource.resource\n\nSuite Setup Suite Setup Keywords\nSuite Teardown Suite Teardown Keywords\nTest Setup Test Setup Keywords\nTest Teardown Test Teardown Keywords\n\nTest Tags example-tag\n\n\n*** Variables ***\n${EXAMPLE SCALAR VARIABLE} This is a suite scope scalar variable\n@{EXAMPLE LIST VARIABLE} This is a suite scope list variable\n&{EXAMPLE DICTIONARY VARIABLE} This=is a\n\u2466 ... suite=scope\n... dictionary=variable\n\u2460\n\n*** Test Cases ***\nAn Example Test Case\n\u2462 [Documentation] Test documentation\n [Tags] standard-example-tag\n\u2463 ${RESULT LIST} This Is A Complex Keyword With Sections ${EXAMPLE SCALAR VARIABLE}\n Log To Console ${RESULT LIST}\n\u2461\nA More Complex Test Case\n\u2462 [Documentation] Test documentation\n [Tags] standard-example-tag\n [Setup] Set Test Variable ${EXPECTED LENGTH} 2\n ${IS LARGER THAN FOUR} Create List\n\u2467\n ## Adding vertical white space can be used to separate test code blocks\n FOR ${item} IN @{EXAMPLE LIST VARIABLE}\n IF len($item)> 4\n This Is A Complex Keyword With Sections ${item}\n Append To List ${IS LARGER THAN FOUR} ${item}\n END\n END\n Length Should Be ${IS LARGER THAN FOUR} ${EXPECTED LENGTH}\n\u2461\nAn Example Templated Test\n\u2462 [Documentation] Templated test documentation.\n [Tags] templated-example-tag\n [Template] This Is A Complex Keyword With Sections\n\u2464 ${EXAMPLE DICTIONARY VARIABLE}[This]\n ${EXAMPLE DICTIONARY VARIABLE}[suite]\n ${EXAMPLE DICTIONARY VARIABLE}[dictionary]\n\u2460\n\n*** Keywords ***\nSuite Setup Keywords\n [Documentation] A keyword for setting up a suite\n Log To Console Setting up ${SUITE NAME} keywords\n\u2465\nSuite Teardown Keywords\n [Documentation] A keyword for tearing down a suite\n Log To Console Tearing down suite keywords\n\u2465\nTest Setup Keywords\n [Documentation] A keyword for setting up a test\n Log To Console Setting up ${TEST NAME} keywords\n\u2465\nTest Teardown Keywords\n [Documentation] A keyword for tearing down a test\n Log To Console Tearing down test keywords\n\u2468\n"})})}),(0,a.jsx)(r.A,{value:"tasks",label:"RPA",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Comments ***\nThis is the comments section\n\u2460\n\n*** Settings ***\nDocumentation This is documentation\n\u2466 ... robot -d Results -i example-tag Tasks\n\nLibrary Collections\nResource ../Resources/ExampleResource.resource\n\nSuite Setup Suite Setup Keywords\nSuite Teardown Suite Teardown Keywords\nTask Setup Task Setup Keywords\nTask Teardown Task Teardown Keywords\n\nTask Tags example-tag\n\n\n*** Variables ***\n${EXAMPLE SCALAR VARIABLE} This is a suite scope scalar variable\n@{EXAMPLE LIST VARIABLE} This is a suite scope list variable\n&{EXAMPLE DICTIONARY VARIABLE} This=is a\n\u2466 ... suite=scope\n... dictionary=variable\n\u2460\n\n*** Tasks ***\nAn Example Task\n\u2462 [Documentation] Task documentation\n [Tags] standard-example-tag\n\u2463 ${RESULT LIST} This Is A Complex Keyword With Sections ${EXAMPLE SCALAR VARIABLE}\n Log To Console ${RESULT LIST}\n\u2461\nA More Complex Task\n\u2462 [Documentation] Task documentation\n [Tags] standard-example-tag\n [Setup] Set Task Variable ${EXPECTED LENGTH} 2\n ${IS LARGER THAN FOUR} Create List\n\u2467\n ## Adding vertical white space can be used to separate task code blocks\n FOR ${item} IN @{EXAMPLE LIST VARIABLE}\n IF len($item)> 4\n This Is A Complex Keyword With Sections ${item}\n Append To List ${IS LARGER THAN FOUR} ${item}\n END\n END\n Length Should Be ${IS LARGER THAN FOUR} ${EXPECTED LENGTH}\n\u2461\nAn Example Templated Task\n\u2462 [Documentation] Templated task documentation.\n [Tags] templated-example-tag\n [Template] This Is A Complex Keyword With Sections\n\u2464 ${EXAMPLE DICTIONARY VARIABLE}[This]\n ${EXAMPLE DICTIONARY VARIABLE}[suite]\n ${EXAMPLE DICTIONARY VARIABLE}[dictionary]\n\u2460\n\n*** Keywords ***\nSuite Setup Keywords\n [Documentation] A keyword for setting up a suite\n Log To Console Setting up ${SUITE NAME} keywords\n\u2465\nSuite Teardown Keywords\n [Documentation] A keyword for tearing down a suite\n Log To Console Tearing down suite keywords\n\u2465\nTask Setup Keywords\n [Documentation] A keyword for setting up a task\n Log To Console Setting up ${TASK NAME} keywords\n\u2465\nTask Teardown Keywords\n [Documentation] A keyword for tearing down a task\n Log To Console Tearing down task keywords\n\u2468\n"})})})]}),"\n",(0,a.jsx)(n.h5,{id:"example-resource-file-vertical-spacing",children:"Example Resource File Vertical Spacing"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Settings ***\nDocumentation Resources follow the same rules as test cases and tasks\n\nLibrary String\nLibrary Collections\n\u2460\n\n*** Variables ***\n${EXAMPLE RESOURCE SCALAR} This is a really really really really really really really\n\u2466 ... really really really really really really really long string.\n\u2460\n\n*** Keywords ***\nA Small Keyword\n [Documentation] Small keyword documentation.\n ${small variable} Catenate SEPARATOR= Such a small keyword\n RETURN ${small variable}\n\u2465\nThis Is A Complex Keyword With Sections\n\u2462 [Documentation] Complex keyword documentation.\n [Arguments] ${an argument}\n ${local list} Create List\n ${get small value} A Small Keyword\n ${words} Split String ${get small value}\n FOR ${word} IN @{words}\n ${characters} Split String To Characters ${word}\n\u2467\n ## Insert a vertical whitespace here to separate logical sections within a keyword.\n FOR ${character} IN @{characters}\n IF $character in 'aeiou'\n Append To List ${local list} ${character} ${an argument}\n END\n END\n END\n RETURN ${local list}\n\u2468\n"})}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h2,{id:"horizontal-spacing",children:"Horizontal Spacing"}),"\n",(0,a.jsxs)(n.p,{children:["Separation of tokens should be ",(0,a.jsx)(n.strong,{children:"4 spaces"})," as described in the the recommended file format: ",(0,a.jsx)(n.a,{href:"https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#space-separated-format",children:"space separated format"}),"."]}),"\n",(0,a.jsx)(n.h4,{id:"separation",children:"Separation"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"Separator"})," >= 4 spaces represented by ",(0,a.jsx)(n.code,{children:"\xb7\xb7\xb7\xb7"})," in the following examples."]}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:"Separation thus is the vertical space between tokens, where tokens are any keywords, variables, constructs."}),"\n",(0,a.jsxs)(t.A,{children:[(0,a.jsx)(r.A,{value:"tests",label:"Tests",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Test Cases ***\nMy Test\n Keyword One\xb7\xb7\xb7\xb7argument1\xb7\xb7\xb7\xb7argument2\n"})})}),(0,a.jsx)(r.A,{value:"tasks",label:"RPA",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Tasks ***\nMy Task\n Keyword One\xb7\xb7\xb7\xb7argument1\xb7\xb7\xb7\xb7argument2\n"})})})]}),"\n",(0,a.jsx)(n.h4,{id:"indentation",children:"Indentation"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"Indentation"})," n time 4 spaces (where n is the level of indentation) and n never exceeds 5, hence nesting depth cannot exceed 4 steps in a keyword."]}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.em,{children:"Example with additional vertical lines for visual clarification: where n == 4 because the keyword also counts in the nesting."})}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nMy Nested Keyword\n|\xb7\xb7\xb7\xb7FOR ${i} IN RANGE 10\n|\xb7\xb7\xb7\xb7|\xb7\xb7\xb7\xb7IF $i % 2\n|\xb7\xb7\xb7\xb7|\xb7\xb7\xb7\xb7|\xb7\xb7\xb7\xb7IF $i > 5\n|\xb7\xb7\xb7\xb7|\xb7\xb7\xb7\xb7|\xb7\xb7\xb7\xb7|\xb7\xb7\xb7\xb7Log Odd number over 5: ${i}\n|\xb7\xb7\xb7\xb7|\xb7\xb7\xb7\xb7|\xb7\xb7\xb7\xb7END |\n|\xb7\xb7\xb7\xb7|\xb7\xb7\xb7\xb7END | |\n|\xb7\xb7\xb7\xb7END | | |\n| | | | |\n0 1 2 3 4\n"})}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"generic",children:"Generic"}),"\n",(0,a.jsx)(n.h4,{id:"line-length",children:"Line Length"}),"\n",(0,a.jsxs)(n.blockquote,{children:["\n",(0,a.jsxs)(n.p,{children:["A line length of 120 characters is recommended. ",(0,a.jsx)(n.a,{href:"https://robocop.readthedocs.io/en/stable/rules_list.html#line-too-long-w0508",children:"Robocop: #line-too-long"})]}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"trailing-whitespaces",children:"Trailing Whitespaces"}),"\n",(0,a.jsxs)(n.blockquote,{children:["\n",(0,a.jsxs)(n.p,{children:["Trailing whitespaces should be avoided. ",(0,a.jsx)(n.a,{href:"https://robocop.readthedocs.io/en/stable/rules_list.html#trailing-whitespace-w1001",children:"Robocop: #trailing-whitespace"})]}),"\n"]}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"settings-2",children:"Settings"}),"\n",(0,a.jsx)(n.h4,{id:"indentation-within-settings-section",children:"Indentation Within Settings Section"}),"\n",(0,a.jsx)(n.p,{children:"Indentations should only be added when needed."}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"*** Settings ***"})," section should always be left aligned without any indentation ",(0,a.jsx)(n.a,{href:"https://robocop.readthedocs.io/en/stable/rules_list.html#suite-setting-should-be-left-aligned-e1016",children:"Robocop: #suite-setting-should-be-left-aligned"})]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Settings ***\nLibrary Collections\nResource data.resource\nVariables vars.robot\n"})}),"\n",(0,a.jsx)(n.h4,{id:"separation-within-settings-section",children:"Separation Within Settings Section"}),"\n",(0,a.jsxs)(n.p,{children:["Arguments to settings should be aligned according to the longest setting added with 4 spaces. ",(0,a.jsx)(n.a,{href:"https://robotidy.readthedocs.io/en/stable/transformers/AlignSettingsSection.html#alignsettingssection",children:"Robotidy: #alignsettingssection"})]}),"\n",(0,a.jsx)(n.p,{children:"Arguments to Libraries should be aligned if there are multiple libraries that have arguments on importing.\nAfter the first argument to libraries all other arguments should either:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"be separated with 4 spaces"}),"\n",(0,a.jsx)(n.li,{children:"be aligned in columns"}),"\n"]}),"\n",(0,a.jsx)(n.h5,{id:"separated-with-4-spaces",children:"Separated With 4 Spaces"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Settings ***\nLibrary String\nLibrary DataDriver my_data_file.csv dialect=UserDefined delimiter=.\nLibrary Telnet timeout=3s newline=CLRF encoding=UTF-8\nResource ${resourcedir}/mykeywords.resource\nResource ${resourcedir}/myotherkeywords.resource\nTest Tags mytag\n"})}),"\n",(0,a.jsx)(n.h5,{id:"aligned-in-columns",children:"Aligned In Columns"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Settings ***\nLibrary String\nLibrary DataDriver my_data_file.csv dialect=UserDefined delimiter=.\nLibrary Telnet timeout=3s newline=CLRF encoding=UTF-8\nResource ${resourcedir}/mykeywords.resource\nResource ${resourcedir}/myotherkeywords.resource\nTest Tags mytag\n"})}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"variables-2",children:"Variables"}),"\n",(0,a.jsx)(n.h4,{id:"indentation-within-variables-section",children:"Indentation Within Variables Section"}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"*** Variables ***"})," section should always be left aligned without any indentation ",(0,a.jsx)(n.a,{href:"https://robocop.readthedocs.io/en/stable/rules_list.html#variable-should-be-left-aligned-e1014",children:"Robocop: #variable-should-be-left-aligned"})]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Variables ***\n${VAR} my variable\n${VAR2} 2\n"})}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"test-cases-tasks-and-keywords",children:"Test Cases, Tasks And Keywords"}),"\n",(0,a.jsx)(n.h4,{id:"indentation-within-test-cases-tasks-and-keywords-section",children:"Indentation Within Test Cases, Tasks And Keywords Section"}),"\n",(0,a.jsx)(n.p,{children:"The test case, task and keyword names should always start at the first character on a line. Test steps, task steps and keywords called from within keyword should be indented."}),"\n",(0,a.jsxs)(t.A,{children:[(0,a.jsx)(r.A,{value:"tests",label:"Tests",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Test Cases ***\nMy First Test Case\n Test Step One\n ${myvar} Test Step Two That Returns A Value\n"})})}),(0,a.jsx)(r.A,{value:"tasks",label:"RPA",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Tasks ***\nMy First Task\n Task Step One\n ${myvar} Task Step Two That Returns A Value\n"})})})]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nTest Step One\n Some Keywords Being Called\n Log Some Message\n\nTest Step Two That Returns A Value\n RETURN some string\n"})}),"\n",(0,a.jsx)(n.h4,{id:"block-indentation",children:"Block Indentation"}),"\n",(0,a.jsxs)(n.p,{children:["Blocks like ",(0,a.jsx)(n.code,{children:"IF"}),", ",(0,a.jsx)(n.code,{children:"WHILE"}),", ",(0,a.jsx)(n.code,{children:"FOR"})," and ",(0,a.jsx)(n.code,{children:"TRY/EXCEPT"})," should always be indented such that the keywords that are run within the loop have to be indented from the lines that start and end the block. ",(0,a.jsx)(n.a,{href:"https://robocop.readthedocs.io/en/stable/rules_list.html#bad-indent-w1008",children:"Robocop: #bad-indent"})]}),"\n",(0,a.jsx)(n.h4,{id:"examples-from-the-user-guide",children:"Examples From The User Guide"}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.a,{href:"https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#if-else-syntax",children:"IF/ELSE"})}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Test Cases ***\nExample\n IF $rc > 0\n Positive keyword\n ELSE IF $rc < 0\n Negative keyword\n ELSE IF $rc == 0\n Zero keyword\n ELSE\n Fail Unexpected rc: ${rc}\n END\n"})}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.a,{href:"https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#while-loops",children:"WHILE"})}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Test Cases ***\nLimit as iteration count\n WHILE True limit=100\n Log This is run 100 times.\n END\n"})}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.a,{href:"https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#for-loops",children:"FOR"})}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Test Cases ***\nExample\n FOR ${animal} IN cat dog\n Log ${animal}\n Log 2nd keyword\n END\n Log Outside loop\n\nSecond Example\n FOR ${var} IN one two ${3} four ${five}\n ... kuusi 7 eight nine ${last}\n Log ${var}\n END\n"})}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.a,{href:"https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#try-except-syntax",children:"TRY/EXCEPT"})}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Test Cases ***\nFirst example\n TRY\n Some Keyword\n EXCEPT Error message\n Error Handler Keyword\n END\n Keyword Outside\n"})}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"comments",children:"Comments"}),"\n",(0,a.jsxs)(n.p,{children:["In comments there should be a space between the ",(0,a.jsx)(n.code,{children:"#"})," and the actual comment. ",(0,a.jsx)(n.a,{href:"https://robocop.readthedocs.io/en/stable/rules_list.html#missing-space-after-comment-w0702",children:"Robocop: #missing-space-after-comment"})]}),"\n",(0,a.jsxs)(n.p,{children:["Comments should be avoided, write your code readable or use the ",(0,a.jsx)(n.code,{children:"[Documentation]"}),".\nThe only valid use of comments is for TODO's that should be fixed soon."]}),"\n",(0,a.jsx)(n.p,{children:"If you use comments:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"Comments should be aligned with the block they belong to."}),"\n",(0,a.jsxs)(n.li,{children:["Inline comments have one indentation before the ",(0,a.jsx)(n.code,{children:"#"})]}),"\n"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\n## Comment about Some Keyword here\nSome Keyword\n Called Keyword One\n ## Comment about Called Keyword Two here\n Called Keyword Two ## TODO fix weird behaviour.\n"})}),"\n",(0,a.jsx)(n.h2,{id:"line-continuation",children:"Line Continuation"}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"arguments",children:"Arguments"}),"\n",(0,a.jsxs)(n.p,{children:["Recommended use of line continuation when having more than one arguments as described in the Robot Framework User Guide:\n",(0,a.jsx)(n.a,{href:"https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#user-keyword-arguments",children:"User keyword arguments"}),"."]}),"\n",(0,a.jsx)(n.p,{children:"General guidelines:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["Try limiting the number of arguments to 5 (",(0,a.jsx)(n.a,{href:"https://robocop.readthedocs.io/en/stable/rules_list.html#too-many-arguments-w0507",children:"Robocop: #too-many-arguments"}),")."]}),"\n",(0,a.jsx)(n.li,{children:"One argument per continuation line."}),"\n",(0,a.jsx)(n.li,{children:"Continuation line should not be indented."}),"\n",(0,a.jsxs)(n.li,{children:["Line continuation character (",(0,a.jsx)(n.code,{children:"..."}),") should be placed at the beginning of the new row."]}),"\n",(0,a.jsx)(n.li,{children:"No empty lines between arguments."}),"\n",(0,a.jsxs)(n.li,{children:["No empty continuation lines between arguments (i.e., lines containing only ",(0,a.jsx)(n.code,{children:"'...'"}),")"]}),"\n",(0,a.jsx)(n.li,{children:"If many arguments are required, consider representing them as a list or a dictionary."}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"line-continuation-for-arguments-in-keyword-definition",children:"Line Continuation For Arguments In Keyword Definition"}),"\n",(0,a.jsxs)(n.blockquote,{children:["\n",(0,a.jsxs)(n.p,{children:["In Keywords, the very first argument should be placed on the same line as ",(0,a.jsx)(n.code,{children:"[Arguments]"})," setting. Every other argument\nshould be placed on a new continuation line and aligned with the argument on the previous line."]}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"required-arguments",children:"Required Arguments"}),"\n",(0,a.jsx)(n.p,{children:"Required arguments placed on continuation lines:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nCustom Keyword With Five Required Arguments\n [Arguments] ${name}\n ... ${surname}\n ... ${street}\n ... ${block}\n ... ${apartment}\n Do Something\n"})}),"\n",(0,a.jsx)(n.h4,{id:"optional-arguments",children:"Optional Arguments"}),"\n",(0,a.jsx)(n.p,{children:"Optional arguments, due to having a default value, follow the same line continuation rules as required arguments:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nCustom Keyword With Various Optional Arguments\n [Arguments] ${first arg}=the first argument\n ... ${second arg}=${123}\n ... ${third arg}=${some list}\n ... ${fourth arg}=${some dict}\n ... ${fifth arg}=the last argument\n Do Something\n"})}),"\n",(0,a.jsx)(n.h4,{id:"required-and-optional-arguments-together",children:"Required And Optional Arguments Together"}),"\n",(0,a.jsx)(n.p,{children:"Here, all required arguments are listed first, and optional arguments with default values afterwards (please note that this is a requirement within Robot Framework).\nEach argument is placed on a single continuation line, as before:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nCustom Keyword With Required And Optional Arguments\n [Arguments] ${argument1}\n ... ${argument2}\n ... ${argument3}=this is a default value\n ... ${argument4}=9999\n ... ${argument5}=${EMPTY}\n Do Something\n"})}),"\n",(0,a.jsx)(n.h4,{id:"embedded-arguments",children:"Embedded Arguments"}),"\n",(0,a.jsx)(n.p,{children:"Unlike required and optional arguments, embedded arguments cannot be split over lines, since\nin this case, arguments become part of the Keyword name."}),"\n",(0,a.jsxs)(n.p,{children:["In the below example, the Keyword contains two embedded arguments, ",(0,a.jsx)(n.code,{children:"${country}"})," and ",(0,a.jsx)(n.code,{children:"${number}"}),".\nThe entire Keyword has to be on a single line:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:'*** Keywords ***\nGet Capital Of "${country}" And First "${number}" Cities With Biggest Population\n Do Something\n'})}),"\n",(0,a.jsx)(n.h4,{id:"line-continuation-for-arguments-in-test-cases-or-tasks",children:"Line Continuation For Arguments In Test Cases Or Tasks"}),"\n",(0,a.jsx)(n.p,{children:"In Test Cases, the first argument should be placed on the same line as the Keyword to which it belongs.\nEvery other argument should be placed on a new continuation line and separated from the continuation character\nby exactly four spaces. Following arguments should be aligned with the argument on the previous line.\nThis is different from the argument formatting in the Keywords definition.\nThe reason is that test cases might include several Keywords with arguments and overly sparse\nformatting may result in difficult to read test cases."}),"\n",(0,a.jsx)(n.p,{children:"EXAMPLES"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:'*** Test Cases ***\nTest Case With Many Keywords And Arguments\n Do Something\n Use Keyword With Five Arguments name=Name\n ... surname=Surname\n ... street=Somestreet 123\n ... block=45\n ... apartment=6\n Do Something Else\n Use Another Keyword With Arguments 123\n ... abcdef\n ... ${True}\n ... @{mylist}\n Do A Lot Of Stuff\n More Stuff\n Use One More Keyword With Various Arguments abc\n ... 123\n ... optional arg=12345\n ... another optional arg=Hello\n Use Keyword With "two" Embedded Arguments And "three" Required Arguments first arg\n ... second arg\n ... third arg\n Do Final Steps\n'})}),"\n",(0,a.jsx)(n.p,{children:"If Test Cases include Keywords with relatively short names and with only a few arguments,\nthen arguments can be accommodated on a single line if the maximum length of the line is not\nexceeded. Mixing single-line and vertical listing should be avoided within the same test case,\nand either one or the other should be chosen:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Test Cases ***\nTest Case With Compact Contents\n Log To Console message=Hello stream=STDERR\n Sleep 10s reason=Wait\n Catenate SEPARATOR= Robot Framework\n"})}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"variables-3",children:"Variables"}),"\n",(0,a.jsx)(n.p,{children:"It is reasonable to split a variable definition across multiple lines when it exceeds the recommended line length,\nor for the better readability of the code."}),"\n",(0,a.jsx)(n.p,{children:"Below are examples for the different variable types in different sections of the test and resources files."}),"\n",(0,a.jsx)(n.h4,{id:"variables-section-line-continuation",children:"Variables Section Line Continuation"}),"\n",(0,a.jsx)(n.p,{children:"General guidelines:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["Line continuation character (",(0,a.jsx)(n.code,{children:"..."}),") should be placed at the beginning of the new row,\nthat is, not at the end of the previous row."]}),"\n",(0,a.jsxs)(n.li,{children:["No empty continuation lines (lines containing only ",(0,a.jsx)(n.code,{children:"'...'"}),")"]}),"\n",(0,a.jsx)(n.li,{children:"Every new continuation line should be aligned with the previous line"}),"\n",(0,a.jsx)(n.li,{children:"Continuation line should not be indented"}),"\n"]}),"\n",(0,a.jsx)(n.h5,{id:"scalars",children:"Scalars"}),"\n",(0,a.jsxs)(n.p,{children:["Scalar variable in ",(0,a.jsx)(n.code,{children:"Variables"})," section on a single line:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Variables ***\n${STRING} This string has multiple sentences. They are all on the same line. It may not look nice in the code because the line is too long.\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Scalar variable in ",(0,a.jsx)(n.code,{children:"Variables"})," section split into several lines:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Variables ***\n${STRING} This string has multiple sentences.\n... They were all on the same line.\n... It did not look nice in the code\n... because the line was too long.\n... Now it is split in rows.\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Mix of line continuation and a new line (note use of newline character ",(0,a.jsx)(n.code,{children:"\\n"}),"):"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Variables ***\n${STRING} This string has multiple sentences.\n... This sentence will be printed on the same row\n... in the HTML test log.\n... And this line too.\n... Next line will be printed \\n\n... on a new row.\n"})}),"\n",(0,a.jsx)(n.h6,{id:"lists",children:"Lists"}),"\n",(0,a.jsxs)(n.p,{children:["List variable in ",(0,a.jsx)(n.code,{children:"Variables"})," section on a single line:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Variables ***\n@{LONG LIST} apple banana peach grape avocado kiwi some very long name of the fruit which exceeds the recommended line length\n"})}),"\n",(0,a.jsx)(n.p,{children:"It is recommended to either accommodate all items on a single line or to list each item on a new line:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Variables ***\n@{SHORT LIST} apple banana peach grape\n\n@{SHORT LIST} apple\n... banana\n... peach\n... grape\n\n@{LONG LIST} apple\n... banana\n... peach\n... grape\n... avocado\n... kiwi\n... some very long name of the fruit which exceeds the recommended line length\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Please note that the item values of the iterable cannot be split using line continuation character. Therefore,\nit is not possible to divide the last item in the above example with the ellipses (",(0,a.jsx)(n.code,{children:"..."}),")."]}),"\n",(0,a.jsx)(n.p,{children:"In this case, it is recommended to define the item separately:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Variables ***\n${LONG ITEM} some very long name of the\n... fruit which exceeds\n... the recommended line length\n\n@{LIST} apple\n... banana\n... peach\n... grape\n... avocado\n... kiwi\n... ${LONG ITEM}\n"})}),"\n",(0,a.jsx)(n.h6,{id:"dictionaries",children:"Dictionaries"}),"\n",(0,a.jsxs)(n.p,{children:["Dictionary variable in ",(0,a.jsx)(n.code,{children:"Variables"})," section on a single line:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Variables ***\n&{LONG DICT} name=robot age=14 occupation=framework version=latest address=https://robotframework.org/ documentation=This text is so long that it does not fit on one line\n"})}),"\n",(0,a.jsx)(n.p,{children:"It is recommended to place all key-value pairs of a dictionary\neither on a single line or each on a new line:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Variables ***\n&{SHORT DICT} name=robot age=14 occupation=framework\n\n&{SHORT DICT} name=robot\n... age=14\n... occupation=framework\n\n&{LONG DICT} name=robot\n... age=14\n... occupation=framework\n... version=latest\n... address=https://robotframework.org/\n... documentation=This text is so long that it does not fit on one line\n"})}),"\n",(0,a.jsx)(n.p,{children:"Similarly to the list items, a key-value pair of the dictionary cannot be split using the line continuation character. In this case, it is recommended to define the value separately:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Variables ***\n${LONG VALUE} This text is so long\n... it cannot be fit on one line\n\n&{DICT} name=robot\n... age=14\n... occupation=framework\n... version=latest\n... address=https://robotframework.org/\n... documentation=${LONG VALUE}\n"})}),"\n",(0,a.jsx)(n.h4,{id:"keywords-section",children:"Keywords Section"}),"\n",(0,a.jsx)(n.p,{children:"General guidelines:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["Line continuation character (",(0,a.jsx)(n.code,{children:"..."}),") should be placed at the beginning of the new row,\nthat is, not at the end of the previous row."]}),"\n",(0,a.jsxs)(n.li,{children:["No empty continuation lines (lines containing only ",(0,a.jsx)(n.code,{children:"..."}),")."]}),"\n",(0,a.jsxs)(n.li,{children:["For every variable definition containing keywords (e.g., ",(0,a.jsx)(n.code,{children:"Set Variable"}),", ",(0,a.jsx)(n.code,{children:"Catenate"}),", ",(0,a.jsx)(n.code,{children:"Create Dictionary"}),"),\ncontinuation line should be aligned with the beginning of the first item for the iterables, and with the value\ndefinition for scalars."]}),"\n",(0,a.jsx)(n.li,{children:"Continuation line should not be indented"}),"\n"]}),"\n",(0,a.jsx)(n.h5,{id:"scalar-variable-creation",children:"Scalar Variable Creation"}),"\n",(0,a.jsx)(n.p,{children:"Definition on a single line:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nMy Keyword\n ${SCALAR} Set Variable This sentence is really, really, really, really, really, really, really long\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Definition split across multiple lines (note use of built-in keyword ",(0,a.jsx)(n.a,{href:"http://robotframework.org/robotframework/latest/libraries/BuiltIn.html#Catenate.",children:"Catenate"}),".\nThis is exception for scalars in the ",(0,a.jsx)(n.code,{children:"Keywords"})," and ",(0,a.jsx)(n.code,{children:"Test Cases"})," sections):"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nMy Keyword\n ${SCALAR} Catenate This sentence is really,\n ... really, really, really, really,\n ... really, really long\n"})}),"\n",(0,a.jsx)(n.h5,{id:"list-variable-creation",children:"List Variable Creation"}),"\n",(0,a.jsx)(n.p,{children:"Definition on a single line:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nMy Keyword\n ${LIST} Create List Mercury Venus Earth Mars Jupiter Saturn Uranus Neptune\n"})}),"\n",(0,a.jsx)(n.p,{children:"Definition on multiple lines:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nMy Keyword\n ${LIST} Create List Mercury\n ... Venus\n ... Earth\n ... Mars\n ... Jupiter\n ... Saturn\n ... Uranus\n ... Neptune\n"})}),"\n",(0,a.jsx)(n.h5,{id:"dictionary-variable-creation",children:"Dictionary Variable Creation"}),"\n",(0,a.jsx)(n.p,{children:"Definition on a single line:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nMy Keyword\n &{DICTIONARY} Create Dictionary a=1 b=${2} c=${3} d=some long string e=${SOME LIST} f=pwoirpworuwruopwuroiewr\n"})}),"\n",(0,a.jsx)(n.p,{children:"Definition split across multiple lines:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nMy Keyword\n &{DICTIONARY} Create Dictionary a=1\n ... b=${2}\n ... c=${3}\n ... d=some long string\n ... e=${SOME LIST}\n ... f=pwoirpworuwruopwuroiewr\n"})}),"\n",(0,a.jsx)(n.h5,{id:"assigning-multiple-variables",children:"Assigning Multiple Variables"}),"\n",(0,a.jsx)(n.p,{children:"Definition on a single line:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nMy Keyword With Multiple Variable Assignment\n ${SCALAR1} ${SCALAR2} ${SCALAR3}= Set Variable First long item Second long item Third long item\n"})}),"\n",(0,a.jsx)(n.p,{children:"Definition split on multiple lines:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nMy Keyword With Multiple Variable Assignment\n ${SCALAR1} ${SCALAR2} ${SCALAR3} Set Variable First long item\n ... Second long item\n ... Third long item\n"})}),"\n",(0,a.jsx)(n.h4,{id:"test-cases-or-tasks-section",children:"Test Cases Or Tasks Section"}),"\n",(0,a.jsxs)(n.p,{children:["In test cases, line continuation follows the same guidelines, as in the ",(0,a.jsx)(n.code,{children:"Keywords"})," section."]}),"\n","\n",(0,a.jsx)(n.h2,{id:"variables-4",children:"Variables"}),"\n",(0,a.jsx)(n.p,{children:"Recommended methods of using and naming variables"}),"\n",(0,a.jsx)(n.p,{children:"Variables are the life blood of Robot Framework's flexibility."}),"\n",(0,a.jsx)(n.p,{children:"Understanding variable scope and proper naming are important for managing them in a project."}),"\n",(0,a.jsx)(n.p,{children:"This is also an area where you will need to understand the stakeholders involved in the project."}),"\n",(0,a.jsx)(n.p,{children:"If your project participants are less technical more syntactic sugar may be necessary than if a project is managed mostly by more technical roles (developers, devops, etc...) then more code-like syntax might be better."}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.em,{children:(0,a.jsx)(n.strong,{children:"In either case choose the style that best fits your project and keep to that decision."})})}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"variable-scope-and-casing",children:"Variable Scope And Casing"}),"\n",(0,a.jsx)(n.p,{children:"Adhering to casing rules provides a convenient way of identifying the scope of a variable."}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["Variable Syntax from the user guide ",(0,a.jsx)(n.a,{href:"https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#variable-priorities-and-scopes",children:"variable-priorities-and-scopes"})]}),"\n"]}),"\n",(0,a.jsxs)(n.table,{children:[(0,a.jsx)(n.thead,{children:(0,a.jsxs)(n.tr,{children:[(0,a.jsx)(n.th,{children:"Variable Scope"}),(0,a.jsx)(n.th,{style:{textAlign:"center"},children:"Syntax"})]})}),(0,a.jsxs)(n.tbody,{children:[(0,a.jsxs)(n.tr,{children:[(0,a.jsxs)(n.td,{children:[(0,a.jsx)(n.strong,{children:"GLOBAL"})," variables use upper-case letters."]}),(0,a.jsxs)(n.td,{style:{textAlign:"center"},children:[(0,a.jsx)(n.code,{children:"${UPPER CASED}"})," or ",(0,a.jsx)(n.code,{children:"${UPPER_CASED}"})]})]}),(0,a.jsxs)(n.tr,{children:[(0,a.jsxs)(n.td,{children:[(0,a.jsx)(n.strong,{children:"SUITE"})," variables use upper-case letters."]}),(0,a.jsxs)(n.td,{style:{textAlign:"center"},children:[(0,a.jsx)(n.code,{children:"${UPPER CASED}"})," or ",(0,a.jsx)(n.code,{children:"${UPPER_CASED}"})]})]}),(0,a.jsxs)(n.tr,{children:[(0,a.jsxs)(n.td,{children:[(0,a.jsx)(n.strong,{children:"TEST"})," variables use upper-case letters."]}),(0,a.jsxs)(n.td,{style:{textAlign:"center"},children:[(0,a.jsx)(n.code,{children:"${UPPER CASED}"})," or ",(0,a.jsx)(n.code,{children:"${UPPER_CASED}"})]})]}),(0,a.jsxs)(n.tr,{children:[(0,a.jsxs)(n.td,{children:[(0,a.jsx)(n.strong,{children:"LOCAL"})," variables use lower-case letters."]}),(0,a.jsxs)(n.td,{style:{textAlign:"center"},children:[(0,a.jsx)(n.code,{children:"${lower cased}"})," or ",(0,a.jsx)(n.code,{children:"${lower_cased}"})]})]}),(0,a.jsxs)(n.tr,{children:[(0,a.jsx)(n.td,{children:"Keyword arguments use lower-case letters."}),(0,a.jsxs)(n.td,{style:{textAlign:"center"},children:[(0,a.jsx)(n.code,{children:"${lower cased}"})," or ",(0,a.jsx)(n.code,{children:"${lower_cased}"})]})]})]})]}),"\n",(0,a.jsx)(n.h4,{id:"declaring-variable-scope-properly",children:"Declaring Variable Scope Properly"}),"\n",(0,a.jsx)(n.p,{children:"It is advised to not reuse GLOBAL or SUITE variable names in lower scoped contexts."}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.em,{children:"Example:"})}),"\n",(0,a.jsxs)(n.p,{children:["Robot Framework ignores casing therefore ",(0,a.jsx)(n.code,{children:"${I AM A VARIABLE}"})," is the same as ",(0,a.jsx)(n.code,{children:"${i am a variable}"}),"."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Variables ***\n${I AM A VARIABLE} This is a SUITE scoped variables\n\n\n*** Test Cases ***\nVariable Casing Test\n [Documentation] Robot Framework ignores casing.\n Log To Console ${I AM A VARIABLE}\n Should Be Equal ${I AM A VARIABLE} ${i am a variable}\n\nSame Variable Different Scope Test\n [Documentation] The SUITE variable is overwritten by an argument then TEST scoped variable of same name.\n A Keyword With Arguments This will be printed.\n Should Not Be Equal ${I AM A VARIABLE} This is a SUITE scoped variables\n\n\n*** Keywords ***\nA Keyword With Arguments\n [Documentation] The argument will take precedence then the SUITE level variable will be overwritten by a TEST scope variable.\n [Arguments] ${i am a variable}\n Log To Console ${i am a variable}\n Set Test Variable ${i am a variable}\n"})}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"variable-assignment-syntax",children:"Variable Assignment Syntax"}),"\n",(0,a.jsx)(n.p,{children:"There are two favored syntaxes for assigning a value to a variable:"}),"\n",(0,a.jsxs)(t.A,{children:[(0,a.jsx)(r.A,{value:"By Spacing Only",label:"Style 1",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Variables ***\n${VARIABLE} value\n\n\n*** Keywords ***\nVariable Keyword\n ${variable} Set Variable value\n Log To Console ${variable}\n"})})}),(0,a.jsx)(r.A,{value:"By '=' sign (syntactic sugar method)",label:"Style 2",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Variables ***\n${VARIABLE} = Value\n\n\n*** Keywords ***\nVariable Keyword\n ${variable} = Set Variable Value\n Log To Console ${variable}\n"})})})]}),"\n",(0,a.jsxs)(n.p,{children:["If you prefer using equals ('=') signs, then be sure that it is formatted ",(0,a.jsx)(n.code,{children:"${var}\xb7=\xb7\xb7\xb7\xb7"})," where each ",(0,a.jsx)(n.code,{children:"\xb7"})," is a space.\nThe reason for a space immediately after a variable is to make the variable more readable."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nSetting Variables\n ${var}\xb7=\xb7\xb7\xb7\xb7Set Variable good\n ${var}=\xb7\xb7\xb7\xb7Set Variable not great, but seen commonly\n"})}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nNever Like This Ever\n [Documentation] You will throw a syntax error!\n ${var}\xb7\xb7=\xb7\xb7\xb7\xb7Set Variable do not do this\n"})}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"spaces-or-underscores-variables",children:"Spaces Or Underscores Variables"}),"\n",(0,a.jsx)(n.p,{children:"Referring back to who will be involved with reading and understanding test cases, it may be best to use spaces instead of underscores."}),"\n",(0,a.jsxs)(n.p,{children:["In the user guide there are existing examples of this syntax ",(0,a.jsx)(n.a,{href:"https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#built-in-variables",children:"built-in-variables"})]}),"\n",(0,a.jsx)(n.p,{children:"Since Robot Framework treats spaces and underscores the same and in most cases not even necessary, each of these variable names are the same:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Variables ***\n${VARIABLE_ONE} same\n${VARIABLE ONE} same\n${VARIABLEONE} same\n"})}),"\n",(0,a.jsx)(n.h4,{id:"using-variables-with-spaces-within-python-code-blocks",children:"Using Variables With Spaces Within Python Code Blocks"}),"\n",(0,a.jsx)(n.p,{children:"If you are using variables containing spaces within python code blocks (Inline script, Evaluate keyword, python module, etc...) replace the space with an underscore."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nPython Syntax With Underscores\n [Argument] ${argument variable}\n ${upper value} Evaluate $argument_variable.upper()\n RETURN ${upper value}\n"})}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nPython Inline Syntax With Underscores\n [Argument] ${argument variable}\n RETURN ${{$argument_variable.upper()}}\n"})}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"variables-within-settings-section",children:"Variables Within Settings Section"}),"\n",(0,a.jsx)(n.p,{children:"Variables can be used within the settings section."}),"\n",(0,a.jsx)(n.p,{children:"They are useful for dynamic file paths and other values."}),"\n",(0,a.jsx)(n.p,{children:"Typically they are Suite or Global scoped variables. (i.e. Always UPPER CASED, UPPER_CASED)"}),"\n",(0,a.jsxs)(n.p,{children:["These variables may come from the Command Line, Resource Files, Variable Files, or the current ",(0,a.jsx)(n.code,{children:"*** Variables ***"})," section"]}),"\n",(0,a.jsxs)(n.p,{children:["It is a good idea to set a default value for a variable used in the ",(0,a.jsx)(n.code,{children:"*** Settings ***"})," section to prevent import errors."]}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.em,{children:"Example:"})}),"\n",(0,a.jsxs)(t.A,{children:[(0,a.jsx)(r.A,{value:"With Spaces",label:"style 1",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Settings ***\nResource ${RESOURCE PATH}/Resource.resource\nVariables ${VARIABLES PATH}/Variables.yaml\n\n\n*** Variables ***\n${RELATIVE PATH} ../../..\n${RESOURCE PATH} ${RELATIVE PATH}/Resources\n${VARIABLES PATH} ${RESOURCE PATH}/Variables\n"})})}),(0,a.jsx)(r.A,{value:"With Underscores",label:"style 2",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Settings ***\nResource ${RESOURCE_PATH}/Resource.resource\nVariables ${VARIABLES_PATH}/Variables.yaml\n\n\n*** Variables ***\n${RELATIVE_PATH} ../../..\n${RESOURCE_PATH} ${RELATIVE_PATH}/Resources\n${VARIABLES_PATH} ${RESOURCE_PATH}/Variables\n"})})})]}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"variables-section",children:"Variables Section"}),"\n",(0,a.jsxs)(n.p,{children:["Variables declared within the ",(0,a.jsx)(n.code,{children:"*** Variables ***"})," section are Suite level in scope. (i.e. Always UPPER CASED, UPPER_CASED)"]}),"\n",(0,a.jsx)(n.p,{children:"Be sure to use the correct indicators of type of Variables:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"Scalar ($)"}),"\n",(0,a.jsx)(n.li,{children:"List (@)"}),"\n",(0,a.jsx)(n.li,{children:"Dictionary (&)"}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:"Consult the Style Guide Line Continuation Section in regards to how to handle the values of these types."}),"\n",(0,a.jsxs)(n.admonition,{type:"note",children:[(0,a.jsxs)(n.p,{children:["You can build variables in the ",(0,a.jsx)(n.code,{children:"*** Variables ***"})," section by combining previously assigned variables."]}),(0,a.jsx)(n.p,{children:"Order of the variable assignments is important."})]}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.em,{children:"Example:"})}),"\n",(0,a.jsxs)(t.A,{children:[(0,a.jsx)(r.A,{value:"Incorrect Order",label:"style 1",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Variables ***\n${RESOURCE PATH} ${RELATIVE PATH}/Resources # This line calls ${RELATIVE PATH} that has not been declared yet.\n${VARIABLES PATH} ${RESOURCE PATH}/Variables # This line calls ${VARIABLES PATH} that has not been declared yet.\n${RELATIVE PATH} ../../..\n"})})}),(0,a.jsx)(r.A,{value:"Correct Order",label:"style 2",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Variables ***\n${RELATIVE PATH} ../../..\n${RESOURCE PATH} ${RELATIVE PATH}/Resources\n${VARIABLES PATH} ${RESOURCE PATH}/Variables\n"})})})]}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"test-cases-or-tasks-2",children:"Test Cases Or Tasks"}),"\n",(0,a.jsx)(n.p,{children:"Variables assigned within a test/task should be treated as Test Variables in scope. (i.e. Always UPPER CASED, UPPER_CASED)"}),"\n",(0,a.jsx)(n.p,{children:"The ocassional exception would be if there are FOR LOOP or WHILE LOOP structures then in those cases it would be acceptable."}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.em,{children:"FOR LOOP and WHILE LOOP structures should be avoided in test cases."})}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"keywords-1",children:"Keywords"}),"\n",(0,a.jsxs)(n.p,{children:["A majority of Keyword level variables will be local variables (i.e. lower cased, lower_cased).\nBut other scopes can be assigned using ",(0,a.jsx)(n.code,{children:"BuiltIn keywords"}),", make sure you case variables according to how they are assigned."]}),"\n",(0,a.jsxs)(t.A,{children:[(0,a.jsx)(r.A,{value:"With Spaces",label:"style 1",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nA Keyword of Variables\n [Documentation] This keyword will create these variables:\n ... ${TEST VARIABLE}\n ... ${SUITE VARIABLE}\n ... ${GLOBAL VARIABLE}\n [Arguments] ${this is an argument}\n Set Local Variable ${local variable} use lower case\n ${assigned local variable} Set Variable use lower case also\n Set Test Variable ${TEST VARIABLE} USE UPPER CASE\n Set Suite Variable ${SUITE VARIABLE} USE UPPER CASE\n ${GLOBAL VARIABLE} Create List BETTER USE UPPER CASE\n Set Global Variable ${GLOBAL VARIABLE}\n"})})}),(0,a.jsx)(r.A,{value:"With Underscores",label:"style 2",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nA Keyword of Variables\n [Documentation] This keyword will create these variables:\n ... ${TEST_VARIABLE}\n ... ${SUITE_VARIABLE}\n ... ${GLOBAL_VARIABLE}\n [Arguments] ${this_is_an_argument}\n Set Local Variable ${local_variable} use lower case\n ${assigned_local_variable} Set Variable use lower case also\n Set Test Variable ${TEST_VARIABLE} USE UPPER CASE\n Set Suite Variable ${SUITE_VARIABLE} USE UPPER CASE\n ${GLOBAL_VARIABLE} Create List BETTER USE UPPER CASE\n Set Global Variable ${GLOBAL_VARIABLE}\n"})})})]}),"\n",(0,a.jsx)(n.p,{children:"Treat keyword arguments as local variables for naming purposes."}),"\n",(0,a.jsx)(n.p,{children:"If setting Suite and Global Variables within keywords from resource files.\nSetting Test Variables should be reserved to test cases if at all possible.\nIn either case document non-local scoped variables."}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"special-cases",children:"Special Cases"}),"\n",(0,a.jsx)(n.h4,{id:"variable-files",children:"Variable Files"}),"\n",(0,a.jsx)(n.p,{children:"Assume variables declared within variable files to be at minimum SUITE in scope. (i.e. Always UPPER CASED, UPPER_CASED)"}),"\n",(0,a.jsx)(n.p,{children:"The examples given are using variables with spaces."}),"\n",(0,a.jsx)(n.h5,{id:"resource-variable-files",children:".resource Variable Files"}),"\n",(0,a.jsx)(n.p,{children:"Assume variables declared within the Variable section of a resource files to be at minimum SUITE in scope. (i.e. Always UPPER CASED, UPPER_CASED)"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Variables ***\n${STRING VARIABLE} Hello I am a resource variable.\n${INT VARIABLE} ${42}\n@{LIST VARIABLE} one two\n&{DICT VARIABLE} one=yksi two=kaksi with spaces=kolme\n"})}),"\n",(0,a.jsx)(n.h5,{id:"python-variable-files",children:"Python Variable Files"}),"\n",(0,a.jsx)(n.p,{children:"Assume variables declared within python variable files to be at minimum SUITE in scope. (i.e. Always UPPER CASED, UPPER_CASED)"}),"\n",(0,a.jsx)(n.p,{children:"Note that syntactically you cannot declare python variables with a space, but when you use them in Robot Framework you can use a space."}),"\n",(0,a.jsx)(n.p,{children:"Python libraries that declare variables are handled according to use case."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-python",children:'STRING_VARIABLE = "Hello I am a python variable."\nINT_VARIABLE = 42\nLIST_VARIABLE = ["one", "two"]\nDICT_VARIABLE = {"one": "yksi", "two": "kaksi", "with spaces": "kolme"}\n'})}),"\n",(0,a.jsx)(n.h5,{id:"yaml-variable-files",children:"Yaml Variable Files"}),"\n",(0,a.jsx)(n.p,{children:"Assume variables declared within yaml variable files to be at minimum SUITE in scope. (i.e. Always UPPER CASED, UPPER_CASED)"}),"\n",(0,a.jsx)(n.p,{children:"When using a Yaml file you should follow Yaml Specifications for the key and value formatting."}),"\n",(0,a.jsx)(n.p,{children:"As with python variables when you use them in Robot Framework you can use a space."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:"STRING VARIABLE: Hello I am a yaml variable.\nINT VARIABLE: 42\nLIST VARIABLE:\n - one\n - two\nDICT VARIABLE:\n one: yksi\n two: kaksi\n with spaces: kolme\n"})}),"\n",(0,a.jsx)(n.h4,{id:"json-variable-files",children:"Json Variable Files"}),"\n",(0,a.jsx)(n.p,{children:"Assume variables declared within json variable files to be at minimum SUITE in scope. (i.e. Always UPPER CASED, UPPER_CASED)"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-json",children:'{\n "STRING VARIABLE": "Hello I am a json variable.",\n "INTEGER VARIABLE": 42,\n "LIST VARIABLE": [\n "one",\n "two"\n ],\n "DICT VARIABLE": {\n "one": "yksi",\n "two": "kaksi",\n "with spaces": "kolme"\n }\n}\n'})}),"\n",(0,a.jsx)(n.h4,{id:"commandline-variables",children:"Commandline Variables"}),"\n",(0,a.jsx)(n.p,{children:"Commandline Variables and by extension variable files should be treated as Global Variables. (i.e. Always UPPER CASED, UPPER_CASED)"}),"\n",(0,a.jsx)(n.h4,{id:"environment-variables",children:"Environment Variables"}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.a,{href:"https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#environment-variables",children:"https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#environment-variables"})}),"\n",(0,a.jsx)(n.p,{children:"Environment Variables should be treated as Global Variables. (i.e. Always UPPER CASED, UPPER_CASED)"}),"\n",(0,a.jsx)(n.p,{children:"It is also possible that the variable casing needs to match how the variable has been declared outside of Robot Framework's context."}),"\n",(0,a.jsx)(n.h4,{id:"deviation-when-context-is-more-important",children:"Deviation When Context Is More Important"}),"\n",(0,a.jsx)(n.p,{children:"Sometimes variables should mimic the parameters of an API. This is especially true when interacting with REST API json bodies."}),"\n",(0,a.jsx)(n.p,{children:"You have a couple of choices:"}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.em,{children:"Given this example body:"})}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-json",children:'{\n "firstName": "value",\n "lastName": "value"\n}\n'})}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.em,{children:"Then choose either:"})}),"\n",(0,a.jsxs)(t.A,{children:[(0,a.jsx)(r.A,{value:"Using normal variable syntax",label:"style 1",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nCreate Json Body Option One\n [Documentation] This one is an 'OK' example.\n [Arguments] ${first name} ${last name}\n ${json body} Create Dictionary firstName=${first name} lastName=${last name}\n RETURN ${json body}\n"})})}),(0,a.jsx)(r.A,{value:"Matching variables to Json keys",label:"style 2",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nCreate Json Body Option Two\n [Documentation] This is also an 'OK' example.\n [Arguments] ${firstName} ${lastName}\n ${json body} Create Dictionary firstName=${firstName} lastName=${lastName}\n RETURN ${json body}\n"})})})]}),"\n",(0,a.jsx)(n.h4,{id:"embedded-variables",children:"Embedded Variables"}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.a,{href:"https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#variables-inside-variables",children:"variables-inside-variables"})}),"\n",(0,a.jsx)(n.p,{children:"Be careful to not embed more than one variable within a variable."}),"\n",(0,a.jsx)(n.p,{children:"Keep it simple."}),"\n",(0,a.jsx)(n.p,{children:"Readability becomes an issue with more than one embedded variable."}),"\n",(0,a.jsxs)(t.A,{children:[(0,a.jsx)(r.A,{value:"With Spaces",label:"style 1",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nSet Suite Variables\n Set Suite Variable ${EMBED VAR} embedded\n Set Suite Variable ${VARIABLE ${EMBED VAR}} good embedded variable\n Set Suite Variable ${FOO} eggs\n Set Suite Variable ${BAR} spam\n Set Suite Variable ${VARIABLE ${FOO} ${BAR}} questionable variable\n Set Suite Variable ${VAR} one\n Set Suite Variable ${WITHIN ${VAR}} two\n Set Suite Variable ${VARIABLES ${WITHIN ${VAR}}} three\n Set Suite Variable ${INCEPTION ${VARIABLES ${WITHIN ${VAR}}}} do not do this\n"})})}),(0,a.jsx)(r.A,{value:"With Underscores",label:"style 2",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nSet Suite Variables\n Set Suite Variable ${EMBED_VAR} embedded\n Set Suite Variable ${VARIABLE_${EMBED_VAR}} good embedded variable\n Set Suite Variable ${FOO} eggs\n Set Suite Variable ${BAR} spam\n Set Suite Variable ${VARIABLE_${FOO}_${BAR}} questionable variable\n Set Suite Variable ${VAR} one\n Set Suite Variable ${WITHIN_${VAR}} two\n Set Suite Variable ${VARIABLES_${WITHIN_${VAR}}} three\n Set Suite Variable ${INCEPTION_${VARIABLES_${WITHIN_${VAR}}}} do not do this\n"})})})]}),"\n",(0,a.jsx)(n.h4,{id:"variables-with-attributes",children:"Variables with Attributes"}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.a,{href:"https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#extended-variable-assignment",children:"extended-variable-assignment"})}),"\n",(0,a.jsx)(n.p,{children:"Attributes to variables can be any casing and usually follow the use case.\nThe variable itself should follow the casing rules of its scope."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"Attribute Variables\n ${local variable.name} Set Variable this is a variable\n ${local variable.foo} Set Variable this is a local attribute\n Set Suite Variable ${SUITE VARIABLE.name} this is a suite variable\n ${SUITE VARIABLE.bar} Set Variable this is a suite attribute\n"})})]})}function b(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(u,{...e})}):u(e)}},9365:(e,n,s)=>{s.d(n,{A:()=>r});s(6540);var a=s(8215);const i={tabItem:"tabItem_Ymn6"};var t=s(4848);function r(e){let{children:n,hidden:s,className:r}=e;return(0,t.jsx)("div",{role:"tabpanel",className:(0,a.A)(i.tabItem,r),hidden:s,children:n})}},1470:(e,n,s)=>{s.d(n,{A:()=>T});var a=s(6540),i=s(8215),t=s(3104),r=s(6347),l=s(205),o=s(7485),d=s(1682),c=s(679);function h(e){return a.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function u(e){const{values:n,children:s}=e;return(0,a.useMemo)((()=>{const e=n??function(e){return h(e).map((e=>{let{props:{value:n,label:s,attributes:a,default:i}}=e;return{value:n,label:s,attributes:a,default:i}}))}(s);return function(e){const n=(0,d.X)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,s])}function b(e){let{value:n,tabValues:s}=e;return s.some((e=>e.value===n))}function m(e){let{queryString:n=!1,groupId:s}=e;const i=(0,r.W6)(),t=function(e){let{queryString:n=!1,groupId:s}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!s)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return s??null}({queryString:n,groupId:s});return[(0,o.aZ)(t),(0,a.useCallback)((e=>{if(!t)return;const n=new URLSearchParams(i.location.search);n.set(t,e),i.replace({...i.location,search:n.toString()})}),[t,i])]}function p(e){const{defaultValue:n,queryString:s=!1,groupId:i}=e,t=u(e),[r,o]=(0,a.useState)((()=>function(e){let{defaultValue:n,tabValues:s}=e;if(0===s.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!b({value:n,tabValues:s}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${s.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const a=s.find((e=>e.default))??s[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:n,tabValues:t}))),[d,h]=m({queryString:s,groupId:i}),[p,g]=function(e){let{groupId:n}=e;const s=function(e){return e?`docusaurus.tab.${e}`:null}(n),[i,t]=(0,c.Dv)(s);return[i,(0,a.useCallback)((e=>{s&&t.set(e)}),[s,t])]}({groupId:i}),x=(()=>{const e=d??p;return b({value:e,tabValues:t})?e:null})();(0,l.A)((()=>{x&&o(x)}),[x]);return{selectedValue:r,selectValue:(0,a.useCallback)((e=>{if(!b({value:e,tabValues:t}))throw new Error(`Can't select invalid tab value=${e}`);o(e),h(e),g(e)}),[h,g,t]),tabValues:t}}var g=s(2303);const x={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var j=s(4848);function w(e){let{className:n,block:s,selectedValue:a,selectValue:r,tabValues:l}=e;const o=[],{blockElementScrollPositionUntilNextRender:d}=(0,t.a_)(),c=e=>{const n=e.currentTarget,s=o.indexOf(n),i=l[s].value;i!==a&&(d(n),r(i))},h=e=>{let n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const s=o.indexOf(e.currentTarget)+1;n=o[s]??o[0];break}case"ArrowLeft":{const s=o.indexOf(e.currentTarget)-1;n=o[s]??o[o.length-1];break}}n?.focus()};return(0,j.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,i.A)("tabs",{"tabs--block":s},n),children:l.map((e=>{let{value:n,label:s,attributes:t}=e;return(0,j.jsx)("li",{role:"tab",tabIndex:a===n?0:-1,"aria-selected":a===n,ref:e=>o.push(e),onKeyDown:h,onClick:c,...t,className:(0,i.A)("tabs__item",x.tabItem,t?.className,{"tabs__item--active":a===n}),children:s??n},n)}))})}function v(e){let{lazy:n,children:s,selectedValue:i}=e;const t=(Array.isArray(s)?s:[s]).filter(Boolean);if(n){const e=t.find((e=>e.props.value===i));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return(0,j.jsx)("div",{className:"margin-top--md",children:t.map(((e,n)=>(0,a.cloneElement)(e,{key:n,hidden:e.props.value!==i})))})}function y(e){const n=p(e);return(0,j.jsxs)("div",{className:(0,i.A)("tabs-container",x.tabList),children:[(0,j.jsx)(w,{...n,...e}),(0,j.jsx)(v,{...n,...e})]})}function T(e){const n=(0,g.A)();return(0,j.jsx)(y,{...e,children:h(e.children)},String(n))}},8453:(e,n,s)=>{s.d(n,{R:()=>r,x:()=>l});var a=s(6540);const i={},t=a.createContext(i);function r(e){const n=a.useContext(t);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),a.createElement(t.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/4397b8f1.d2afc8af.js b/assets/js/4397b8f1.d2afc8af.js
new file mode 100644
index 00000000..7edf05af
--- /dev/null
+++ b/assets/js/4397b8f1.d2afc8af.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[8097],{8239:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>b,frontMatter:()=>l,metadata:()=>d,toc:()=>h});var a=s(4848),t=s(8453),i=s(1470),r=s(9365);const l={sidebar_position:5},o="Style Guide",d={id:"style_guide",title:"Style Guide",description:"Version 0.10b",source:"@site/docs/style_guide.md",sourceDirName:".",slug:"/style_guide",permalink:"/docs/style_guide",draft:!1,unlisted:!1,editUrl:"https://github.com/MarketSquare/robotframeworkguides/edit/main/website/docs/style_guide.md",tags:[],version:"current",sidebarPosition:5,frontMatter:{sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"TodoMVC",permalink:"/docs/examples/todo"},next:{title:"Docker Images",permalink:"/docs/using_rf_in_ci_systems/docker"}},c={},h=[{value:"Introduction",id:"introduction",level:2},{value:"Purpose",id:"purpose",level:3},{value:"Robocon 2022 Presentation",id:"robocon-2022-presentation",level:3},{value:"Contributors",id:"contributors",level:3},{value:"Special Thanks To",id:"special-thanks-to",level:4},{value:"We are always looking for contributors",id:"we-are-always-looking-for-contributors",level:4},{value:"Vertical Order",id:"vertical-order",level:2},{value:"Sections",id:"sections",level:3},{value:"Settings",id:"settings",level:3},{value:"Variables",id:"variables",level:3},{value:"Test Cases Or Tasks",id:"test-cases-or-tasks",level:3},{value:"Keyword",id:"keyword",level:3},{value:"Keywords - Best Practices",id:"keywords---best-practices",level:4},{value:"Keyword Organization",id:"keyword-organization",level:4},{value:"Vertical Spacing",id:"vertical-spacing",level:2},{value:"Sections",id:"sections-1",level:3},{value:"Spacing After The Section Header Line",id:"spacing-after-the-section-header-line",level:4},{value:"Spacing After Sections",id:"spacing-after-sections",level:4},{value:"Example Of Section Header And Section Spacing",id:"example-of-section-header-and-section-spacing",level:5},{value:"Settings",id:"settings-1",level:3},{value:"Spacing Between Settings Within The Settings Section",id:"spacing-between-settings-within-the-settings-section",level:4},{value:"Example Of Settings Section Vertical Spacing",id:"example-of-settings-section-vertical-spacing",level:5},{value:"Spacing Between Settings Within A Test Case, Task Or Keyword",id:"spacing-between-settings-within-a-test-case-task-or-keyword",level:4},{value:"Variables",id:"variables-1",level:3},{value:"Spacing Between Variables In The Variables Section",id:"spacing-between-variables-in-the-variables-section",level:4},{value:"Test Cases Or Tasks",id:"test-cases-or-tasks-1",level:3},{value:"Spacing After Test Cases Or Tasks",id:"spacing-after-test-cases-or-tasks",level:4},{value:"Spacing Between Code Blocks Within Test Cases Or Tasks",id:"spacing-between-code-blocks-within-test-cases-or-tasks",level:4},{value:"Spacing After Templated Test Cases",id:"spacing-after-templated-test-cases",level:4},{value:"Spacing Between Templated Test Case Data",id:"spacing-between-templated-test-case-data",level:4},{value:"Keywords",id:"keywords",level:3},{value:"Spacing After Keywords",id:"spacing-after-keywords",level:4},{value:"Spacing Between Keyword Calls",id:"spacing-between-keyword-calls",level:4},{value:"Spacing Between Code Blocks Within Keyword Calls",id:"spacing-between-code-blocks-within-keyword-calls",level:4},{value:"Spacing Of Line Continuations",id:"spacing-of-line-continuations",level:4},{value:"Examples",id:"examples",level:4},{value:"Example Robot File Vertical White Spacing",id:"example-robot-file-vertical-white-spacing",level:5},{value:"Example Resource File Vertical Spacing",id:"example-resource-file-vertical-spacing",level:5},{value:"Horizontal Spacing",id:"horizontal-spacing",level:2},{value:"Separation",id:"separation",level:4},{value:"Indentation",id:"indentation",level:4},{value:"Generic",id:"generic",level:3},{value:"Line Length",id:"line-length",level:4},{value:"Trailing Whitespaces",id:"trailing-whitespaces",level:4},{value:"Settings",id:"settings-2",level:3},{value:"Indentation Within Settings Section",id:"indentation-within-settings-section",level:4},{value:"Separation Within Settings Section",id:"separation-within-settings-section",level:4},{value:"Separated With 4 Spaces",id:"separated-with-4-spaces",level:5},{value:"Aligned In Columns",id:"aligned-in-columns",level:5},{value:"Variables",id:"variables-2",level:3},{value:"Indentation Within Variables Section",id:"indentation-within-variables-section",level:4},{value:"Test Cases, Tasks And Keywords",id:"test-cases-tasks-and-keywords",level:3},{value:"Indentation Within Test Cases, Tasks And Keywords Section",id:"indentation-within-test-cases-tasks-and-keywords-section",level:4},{value:"Block Indentation",id:"block-indentation",level:4},{value:"Examples From The User Guide",id:"examples-from-the-user-guide",level:4},{value:"Comments",id:"comments",level:3},{value:"Line Continuation",id:"line-continuation",level:2},{value:"Arguments",id:"arguments",level:3},{value:"Line Continuation For Arguments In Keyword Definition",id:"line-continuation-for-arguments-in-keyword-definition",level:4},{value:"Required Arguments",id:"required-arguments",level:4},{value:"Optional Arguments",id:"optional-arguments",level:4},{value:"Required And Optional Arguments Together",id:"required-and-optional-arguments-together",level:4},{value:"Embedded Arguments",id:"embedded-arguments",level:4},{value:"Line Continuation For Arguments In Test Cases Or Tasks",id:"line-continuation-for-arguments-in-test-cases-or-tasks",level:4},{value:"Variables",id:"variables-3",level:3},{value:"Variables Section Line Continuation",id:"variables-section-line-continuation",level:4},{value:"Scalars",id:"scalars",level:5},{value:"Lists",id:"lists",level:6},{value:"Dictionaries",id:"dictionaries",level:6},{value:"Keywords Section",id:"keywords-section",level:4},{value:"Scalar Variable Creation",id:"scalar-variable-creation",level:5},{value:"List Variable Creation",id:"list-variable-creation",level:5},{value:"Dictionary Variable Creation",id:"dictionary-variable-creation",level:5},{value:"Assigning Multiple Variables",id:"assigning-multiple-variables",level:5},{value:"Test Cases Or Tasks Section",id:"test-cases-or-tasks-section",level:4},{value:"Variables",id:"variables-4",level:2},{value:"Variable Scope And Casing",id:"variable-scope-and-casing",level:3},{value:"Declaring Variable Scope Properly",id:"declaring-variable-scope-properly",level:4},{value:"Variable Assignment Syntax",id:"variable-assignment-syntax",level:3},{value:"Spaces Or Underscores Variables",id:"spaces-or-underscores-variables",level:3},{value:"Using Variables With Spaces Within Python Code Blocks",id:"using-variables-with-spaces-within-python-code-blocks",level:4},{value:"Variables Within Settings Section",id:"variables-within-settings-section",level:3},{value:"Variables Section",id:"variables-section",level:3},{value:"Test Cases Or Tasks",id:"test-cases-or-tasks-2",level:3},{value:"Keywords",id:"keywords-1",level:3},{value:"Special Cases",id:"special-cases",level:3},{value:"Variable Files",id:"variable-files",level:4},{value:".resource Variable Files",id:"resource-variable-files",level:5},{value:"Python Variable Files",id:"python-variable-files",level:5},{value:"Yaml Variable Files",id:"yaml-variable-files",level:5},{value:"Json Variable Files",id:"json-variable-files",level:4},{value:"Commandline Variables",id:"commandline-variables",level:4},{value:"Environment Variables",id:"environment-variables",level:4},{value:"Deviation When Context Is More Important",id:"deviation-when-context-is-more-important",level:4},{value:"Embedded Variables",id:"embedded-variables",level:4},{value:"Variables with Attributes",id:"variables-with-attributes",level:4},{value:"Test Templates",id:"test-templates",level:2},{value:"Test Cases Or Tasks",id:"test-cases-or-tasks-3",level:3},{value:"Note On Documentation And Tags",id:"note-on-documentation-and-tags",level:3}];function u(e){const n={a:"a",admonition:"admonition",blockquote:"blockquote",br:"br",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",h6:"h6",hr:"hr",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,t.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h1,{id:"style-guide",children:"Style Guide"}),"\n",(0,a.jsx)(n.p,{children:"Version 0.10b"}),"\n",(0,a.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,a.jsx)(n.h3,{id:"purpose",children:"Purpose"}),"\n",(0,a.jsx)(n.p,{children:"This style guide is a community driven set of sensible rules to write your Robot Framework code."}),"\n",(0,a.jsxs)(n.p,{children:["As a starting point, use the existing standards from\n",(0,a.jsx)(n.a,{href:"https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#getting-started",children:"Robot Framework"})," user guide,\n",(0,a.jsx)(n.a,{href:"https://robocop.readthedocs.io/en/stable/",children:"Robocop"}),", and ",(0,a.jsx)(n.a,{href:"https://robotidy.readthedocs.io/en/stable/",children:"Robotidy"}),"."]}),"\n",(0,a.jsx)(n.h3,{id:"robocon-2022-presentation",children:"Robocon 2022 Presentation"}),"\n",(0,a.jsx)("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/Mpt_4MItha0",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:!0}),"\n",(0,a.jsx)(n.h3,{id:"contributors",children:"Contributors"}),"\n",(0,a.jsx)(n.p,{children:"Guido Demmenie, Manana Koberidze, Kelby Stine"}),"\n",(0,a.jsx)(n.h4,{id:"special-thanks-to",children:"Special Thanks To"}),"\n",(0,a.jsx)(n.p,{children:"V\xe1clav Fuksa, Many Kasiriha, Bartlomiej Hirsz, Mateusz Nojek, Ren\xe9 Rohner, Miikka Solmela"}),"\n",(0,a.jsx)(n.h4,{id:"we-are-always-looking-for-contributors",children:"We are always looking for contributors"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["If you have feedback please:","\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["Reach out to any one of us on the RobotFramework Slack channel: ",(0,a.jsx)(n.code,{children:"#style-guide"})]}),"\n",(0,a.jsxs)(n.li,{children:["Create an issue on ",(0,a.jsx)(n.a,{href:"https://github.com/MarketSquare/robotframework-style-guide",children:"robotframework-style-guide"})]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(n.li,{children:"We meet up once every two weeks to talk about style guide topics"}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:["For more info go to our repository: ",(0,a.jsx)(n.a,{href:"https://github.com/MarketSquare/robotframework-style-guide",children:"MarketSquare/robotframework-style-guide"})]}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h2,{id:"vertical-order",children:"Vertical Order"}),"\n",(0,a.jsxs)(n.p,{children:["Recommended approaches to ordering ",(0,a.jsx)(n.code,{children:".robot"})," and ",(0,a.jsx)(n.code,{children:".resource"})," files."]}),"\n",(0,a.jsx)(n.p,{children:"Vertical order refers to the recommended order of settings, sections, variables, keywords."}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"sections",children:"Sections"}),"\n",(0,a.jsxs)(n.p,{children:["User Guide Reference: ",(0,a.jsx)(n.a,{href:"https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#test-data-sections",children:"Test Data Section"})]}),"\n",(0,a.jsxs)(i.A,{children:[(0,a.jsx)(r.A,{value:"tests",label:"Tests",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Comments ***\n\n\n*** Settings ***\n\n\n*** Variables ***\n\n\n*** Test Cases ***\n\n\n*** Keywords ***\n"})})}),(0,a.jsx)(r.A,{value:"tasks",label:"RPA",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Comments ***\n\n\n*** Settings ***\n\n\n*** Variables ***\n\n\n*** Tasks ***\n\n\n*** Keywords ***\n"})})})]}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"settings",children:"Settings"}),"\n",(0,a.jsxs)(n.p,{children:["User Guide Reference: ",(0,a.jsx)(n.a,{href:"https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#setting-section-1",children:"Settings Section"})]}),"\n",(0,a.jsxs)(i.A,{children:[(0,a.jsx)(r.A,{value:"tests",label:"Tests",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Settings ***\nDocumentation\nMetadata\n\nLibrary BuiltIn\nLibrary 3rd Party\nLibrary Custom\nResource\nVariables\n\nSuite Setup\nSuite Teardown\nTest Setup\nTest Teardown\nTest Template\nTest Timeout\n\nTest Tags\n"})})}),(0,a.jsx)(r.A,{value:"tasks",label:"RPA",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Settings ***\nDocumentation\nMetadata\n\nLibrary BuiltIn\nLibrary 3rd Party\nLibrary Custom\nResource\nVariables\n\nSuite Setup\nSuite Teardown\nTask Setup\nTask Teardown\nTask Template\nTask Timeout\n\nTask Tags\n"})})})]}),"\n",(0,a.jsx)(n.p,{children:"For easier navigation, libraries in each group can be sorted alphabetically.\nAdditionally, extra new lines can be used to separate the builtin, 3rd party and custom libraries."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Settings ***\n...\nLibrary BuiltIn\nLibrary Collections\nLibrary DateTime\nLibrary OperatingSystem\n\nLibrary Browser\nLibrary JSONLibrary\nLibrary SSHLibrary\n\nLibrary Acustom\nLibrary Bcustom\nLibrary Ccustom\nLibrary Dcustom\n...\n"})}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"variables",children:"Variables"}),"\n",(0,a.jsx)(n.p,{children:"Simple variables (scalar, list, dictionary) variables should be listed first.\nComposite variables (variables composed of other variables) should be listed after simple variables."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Variables ***\n${VARIABLE} This is a Variable\n${COMPOSITE VARIABLES} ${VARIABLE} with other variables.\n\n"})}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"test-cases-or-tasks",children:"Test Cases Or Tasks"}),"\n",(0,a.jsxs)(n.p,{children:["User Guide Reference: ",(0,a.jsx)(n.a,{href:"https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#test-case-section",children:"Test Case Section"})]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"Test Case\n [Documentation]\n [Tags]\n [Timeout]\n [Setup]\n [Template]\n Static Variable Assignments\n Keyword Calls\n Verification Keyword Call\n [Teardown]\n"})}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"keyword",children:"Keyword"}),"\n",(0,a.jsxs)(n.p,{children:["User Guide Reference: ",(0,a.jsx)(n.a,{href:"https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#keyword-section-1",children:"Keyword Section"})]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"Keyword\n [Documentation]\n [Tags]\n [Arguments]\n [Timeout]\n [Setup]\n Static Variable Assignments\n Keyword Calls\n [Teardown]\n"})}),"\n",(0,a.jsx)(n.h4,{id:"keywords---best-practices",children:"Keywords - Best Practices"}),"\n",(0,a.jsx)(n.p,{children:"It is a good idea to put static variable assignments before keyword calls."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"Keyword With Static Variables\n [Arguments] ${argument}\n ${static variable} Set Variable This is a static variable.\n Set Local Variable ${other static variable} Another way to set a static variable.\n ${dynamic variable} Catenate SEPARATOR=${SPACE} ${static variable} ${other static variable} ${argument}\n ${another dynamic variable} Evaluate $static variable.upper()\n Log To Console ${dynamic variable}\n Should Not Be Equal ${static variable} ${other static variable}\n"})}),"\n",(0,a.jsx)(n.h4,{id:"keyword-organization",children:"Keyword Organization"}),"\n",(0,a.jsx)(n.p,{children:"In order to make keyword search within a resource file easier alphabetize your keywords. Some IDEs have an outline side bar (i.e. VSCode) and by alphabetizing the keywords they appear in the side menu in the same way."}),"\n",(0,a.jsx)(n.h2,{id:"vertical-spacing",children:"Vertical Spacing"}),"\n",(0,a.jsxs)(n.p,{children:["These are the recommended vertical space guidelines for ",(0,a.jsx)(n.code,{children:".robot"})," and ",(0,a.jsx)(n.code,{children:".resource"})," files."]}),"\n",(0,a.jsx)(n.admonition,{type:"note",children:(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"The guidelines of larger sections will supersede the guidelines of the subsections."}),"\n",(0,a.jsx)(n.li,{children:"Vertical White Space\n: Any line that contains no characters."}),"\n",(0,a.jsx)(n.li,{children:"Commented lines are not considered white space."}),"\n"]})}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"sections-1",children:"Sections"}),"\n",(0,a.jsx)(n.h4,{id:"spacing-after-the-section-header-line",children:"Spacing After The Section Header Line"}),"\n",(0,a.jsxs)(n.blockquote,{children:["\n",(0,a.jsx)(n.p,{children:"There should be no space immediately after each section header line."}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"spacing-after-sections",children:"Spacing After Sections"}),"\n",(0,a.jsxs)(n.blockquote,{children:["\n",(0,a.jsx)(n.p,{children:"There should be 2 lines of white space after the last line of each section, except the last section of the file.\nThe last section of a file should have 1 line of white space."}),"\n"]}),"\n",(0,a.jsx)(n.h5,{id:"example-of-section-header-and-section-spacing",children:"Example Of Section Header And Section Spacing"}),"\n",(0,a.jsxs)(i.A,{children:[(0,a.jsx)(r.A,{value:"tests",label:"Tests",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:" *** Comments ***\n Comments\n\n\n *** Settings ***\n Documentation\n\n\n *** Variables ***\n ${VARIABLE} a variable\n\n\n *** Test Cases ***\n Test Case\n\n\n *** Keywords ***\n Keyword\n"})})}),(0,a.jsx)(r.A,{value:"tasks",label:"RPA",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:" *** Comments ***\n Comments\n\n\n *** Settings ***\n Documentation\n\n\n *** Variables ***\n ${VARIABLE} a variable\n\n\n *** Tasks ***\n Tasks\n\n\n *** Keywords ***\n Keyword\n"})})})]}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"settings-1",children:"Settings"}),"\n",(0,a.jsx)(n.h4,{id:"spacing-between-settings-within-the-settings-section",children:"Spacing Between Settings Within The Settings Section"}),"\n",(0,a.jsxs)(n.blockquote,{children:["\n",(0,a.jsx)(n.p,{children:"It is recommended to allow 1 line of white space between common lines of settings."}),"\n"]}),"\n",(0,a.jsx)(n.h5,{id:"example-of-settings-section-vertical-spacing",children:"Example Of Settings Section Vertical Spacing"}),"\n",(0,a.jsxs)(i.A,{children:[(0,a.jsx)(r.A,{value:"tests",label:"Tests",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:" *** Settings ***\n Documentation\n Metadata\n\n Library\n Resource\n Variables\n\n Suite Setup\n Suite Teardown\n Test Setup\n Test Teardown\n Test Template\n Test Timeout\n\n Default Tags\n Test Tags\n"})})}),(0,a.jsx)(r.A,{value:"tasks",label:"RPA",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:" *** Settings ***\n Documentation\n Metadata\n\n Library\n Resource\n Variables\n\n Suite Setup\n Suite Teardown\n Task Setup\n Task Teardown\n Task Template\n Task Timeout\n\n Default Tags\n Task Tags\n"})})})]}),"\n",(0,a.jsx)(n.h4,{id:"spacing-between-settings-within-a-test-case-task-or-keyword",children:"Spacing Between Settings Within A Test Case, Task Or Keyword"}),"\n",(0,a.jsxs)(n.blockquote,{children:["\n",(0,a.jsx)(n.p,{children:"No lines of white space should exist between the settings of a Test Case or Task or Keyword."}),"\n"]}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"variables-1",children:"Variables"}),"\n",(0,a.jsx)(n.h4,{id:"spacing-between-variables-in-the-variables-section",children:"Spacing Between Variables In The Variables Section"}),"\n",(0,a.jsx)(n.p,{children:"There should be no lines of white space between variables within the Variables section."}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"test-cases-or-tasks-1",children:"Test Cases Or Tasks"}),"\n",(0,a.jsx)(n.h4,{id:"spacing-after-test-cases-or-tasks",children:"Spacing After Test Cases Or Tasks"}),"\n",(0,a.jsxs)(n.blockquote,{children:["\n",(0,a.jsx)(n.p,{children:"There should be 1 line of white space after each Test Case or Task."}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"spacing-between-code-blocks-within-test-cases-or-tasks",children:"Spacing Between Code Blocks Within Test Cases Or Tasks"}),"\n",(0,a.jsxs)(n.blockquote,{children:["\n",(0,a.jsx)(n.p,{children:"Occasionally Test Cases or Tasks can be grouped in subsections of logical code blocks. In these instances it is acceptable to have 1 space between these code blocks."}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"spacing-after-templated-test-cases",children:"Spacing After Templated Test Cases"}),"\n",(0,a.jsxs)(n.blockquote,{children:["\n",(0,a.jsx)(n.p,{children:"There should be 1 line of white space after each Templated Test Case."}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"spacing-between-templated-test-case-data",children:"Spacing Between Templated Test Case Data"}),"\n",(0,a.jsxs)(n.blockquote,{children:["\n",(0,a.jsx)(n.p,{children:"No lines of white space should exist between lines of test data in Templated Tests."}),"\n"]}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"keywords",children:"Keywords"}),"\n",(0,a.jsx)(n.h4,{id:"spacing-after-keywords",children:"Spacing After Keywords"}),"\n",(0,a.jsxs)(n.blockquote,{children:["\n",(0,a.jsx)(n.p,{children:"There should be 1 line of white space after the last line in a keyword code block."}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"spacing-between-keyword-calls",children:"Spacing Between Keyword Calls"}),"\n",(0,a.jsxs)(n.blockquote,{children:["\n",(0,a.jsx)(n.p,{children:"In most cases there should be no white space between keyword calls."}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"spacing-between-code-blocks-within-keyword-calls",children:"Spacing Between Code Blocks Within Keyword Calls"}),"\n",(0,a.jsxs)(n.blockquote,{children:["\n",(0,a.jsx)(n.p,{children:"Occasionally keywords can be grouped in subsections of logical code blocks. In these instances it is acceptable to have 1 space between these code blocks, but no more than 1 space."}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"spacing-of-line-continuations",children:"Spacing Of Line Continuations"}),"\n",(0,a.jsxs)(n.blockquote,{children:["\n",(0,a.jsx)(n.p,{children:"No lines of white space should exist between lines of code using line continuation (...) syntax."}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"examples",children:"Examples"}),"\n",(0,a.jsx)(n.p,{children:"Key to examples:"}),"\n",(0,a.jsxs)(n.blockquote,{children:["\n",(0,a.jsxs)(n.p,{children:["\u2460 Two spaces between sections",(0,a.jsx)(n.br,{}),"\n","\u2461 One space between Tests/Tasks",(0,a.jsx)(n.br,{}),"\n","\u2462 No space in the settings section of Tests/Tasks or Keywords",(0,a.jsx)(n.br,{}),"\n","\u2463 No space after settings section of Tests/Tasks or Keywords",(0,a.jsx)(n.br,{}),"\n","\u2464 No spaces between template Test/Task data lines",(0,a.jsx)(n.br,{}),"\n","\u2465 One space Between Keywords",(0,a.jsx)(n.br,{}),"\n","\u2466 No space between continuation lines",(0,a.jsx)(n.br,{}),"\n","\u2467 One space for separating code blocks",(0,a.jsx)(n.br,{}),"\n","\u2468 One space at the very end of the file"]}),"\n"]}),"\n",(0,a.jsx)(n.h5,{id:"example-robot-file-vertical-white-spacing",children:"Example Robot File Vertical White Spacing"}),"\n",(0,a.jsxs)(i.A,{children:[(0,a.jsx)(r.A,{value:"tests",label:"Tests",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Comments ***\nThis is the comments section\n\u2460\n\n*** Settings ***\nDocumentation This is documentation\n\u2466 ... robot -d Results -i example-tag Tests\n\nLibrary Collections\nResource ../Resources/ExampleResource.resource\n\nSuite Setup Suite Setup Keywords\nSuite Teardown Suite Teardown Keywords\nTest Setup Test Setup Keywords\nTest Teardown Test Teardown Keywords\n\nTest Tags example-tag\n\n\n*** Variables ***\n${EXAMPLE SCALAR VARIABLE} This is a suite scope scalar variable\n@{EXAMPLE LIST VARIABLE} This is a suite scope list variable\n&{EXAMPLE DICTIONARY VARIABLE} This=is a\n\u2466 ... suite=scope\n... dictionary=variable\n\u2460\n\n*** Test Cases ***\nAn Example Test Case\n\u2462 [Documentation] Test documentation\n [Tags] standard-example-tag\n\u2463 ${RESULT LIST} This Is A Complex Keyword With Sections ${EXAMPLE SCALAR VARIABLE}\n Log To Console ${RESULT LIST}\n\u2461\nA More Complex Test Case\n\u2462 [Documentation] Test documentation\n [Tags] standard-example-tag\n [Setup] Set Test Variable ${EXPECTED LENGTH} 2\n ${IS LARGER THAN FOUR} Create List\n\u2467\n ## Adding vertical white space can be used to separate test code blocks\n FOR ${item} IN @{EXAMPLE LIST VARIABLE}\n IF len($item)> 4\n This Is A Complex Keyword With Sections ${item}\n Append To List ${IS LARGER THAN FOUR} ${item}\n END\n END\n Length Should Be ${IS LARGER THAN FOUR} ${EXPECTED LENGTH}\n\u2461\nAn Example Templated Test\n\u2462 [Documentation] Templated test documentation.\n [Tags] templated-example-tag\n [Template] This Is A Complex Keyword With Sections\n\u2464 ${EXAMPLE DICTIONARY VARIABLE}[This]\n ${EXAMPLE DICTIONARY VARIABLE}[suite]\n ${EXAMPLE DICTIONARY VARIABLE}[dictionary]\n\u2460\n\n*** Keywords ***\nSuite Setup Keywords\n [Documentation] A keyword for setting up a suite\n Log To Console Setting up ${SUITE NAME} keywords\n\u2465\nSuite Teardown Keywords\n [Documentation] A keyword for tearing down a suite\n Log To Console Tearing down suite keywords\n\u2465\nTest Setup Keywords\n [Documentation] A keyword for setting up a test\n Log To Console Setting up ${TEST NAME} keywords\n\u2465\nTest Teardown Keywords\n [Documentation] A keyword for tearing down a test\n Log To Console Tearing down test keywords\n\u2468\n"})})}),(0,a.jsx)(r.A,{value:"tasks",label:"RPA",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Comments ***\nThis is the comments section\n\u2460\n\n*** Settings ***\nDocumentation This is documentation\n\u2466 ... robot -d Results -i example-tag Tasks\n\nLibrary Collections\nResource ../Resources/ExampleResource.resource\n\nSuite Setup Suite Setup Keywords\nSuite Teardown Suite Teardown Keywords\nTask Setup Task Setup Keywords\nTask Teardown Task Teardown Keywords\n\nTask Tags example-tag\n\n\n*** Variables ***\n${EXAMPLE SCALAR VARIABLE} This is a suite scope scalar variable\n@{EXAMPLE LIST VARIABLE} This is a suite scope list variable\n&{EXAMPLE DICTIONARY VARIABLE} This=is a\n\u2466 ... suite=scope\n... dictionary=variable\n\u2460\n\n*** Tasks ***\nAn Example Task\n\u2462 [Documentation] Task documentation\n [Tags] standard-example-tag\n\u2463 ${RESULT LIST} This Is A Complex Keyword With Sections ${EXAMPLE SCALAR VARIABLE}\n Log To Console ${RESULT LIST}\n\u2461\nA More Complex Task\n\u2462 [Documentation] Task documentation\n [Tags] standard-example-tag\n [Setup] Set Task Variable ${EXPECTED LENGTH} 2\n ${IS LARGER THAN FOUR} Create List\n\u2467\n ## Adding vertical white space can be used to separate task code blocks\n FOR ${item} IN @{EXAMPLE LIST VARIABLE}\n IF len($item)> 4\n This Is A Complex Keyword With Sections ${item}\n Append To List ${IS LARGER THAN FOUR} ${item}\n END\n END\n Length Should Be ${IS LARGER THAN FOUR} ${EXPECTED LENGTH}\n\u2461\nAn Example Templated Task\n\u2462 [Documentation] Templated task documentation.\n [Tags] templated-example-tag\n [Template] This Is A Complex Keyword With Sections\n\u2464 ${EXAMPLE DICTIONARY VARIABLE}[This]\n ${EXAMPLE DICTIONARY VARIABLE}[suite]\n ${EXAMPLE DICTIONARY VARIABLE}[dictionary]\n\u2460\n\n*** Keywords ***\nSuite Setup Keywords\n [Documentation] A keyword for setting up a suite\n Log To Console Setting up ${SUITE NAME} keywords\n\u2465\nSuite Teardown Keywords\n [Documentation] A keyword for tearing down a suite\n Log To Console Tearing down suite keywords\n\u2465\nTask Setup Keywords\n [Documentation] A keyword for setting up a task\n Log To Console Setting up ${TASK NAME} keywords\n\u2465\nTask Teardown Keywords\n [Documentation] A keyword for tearing down a task\n Log To Console Tearing down task keywords\n\u2468\n"})})})]}),"\n",(0,a.jsx)(n.h5,{id:"example-resource-file-vertical-spacing",children:"Example Resource File Vertical Spacing"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Settings ***\nDocumentation Resources follow the same rules as test cases and tasks\n\nLibrary String\nLibrary Collections\n\u2460\n\n*** Variables ***\n${EXAMPLE RESOURCE SCALAR} This is a really really really really really really really\n\u2466 ... really really really really really really really long string.\n\u2460\n\n*** Keywords ***\nA Small Keyword\n [Documentation] Small keyword documentation.\n ${small variable} Catenate SEPARATOR= Such a small keyword\n RETURN ${small variable}\n\u2465\nThis Is A Complex Keyword With Sections\n\u2462 [Documentation] Complex keyword documentation.\n [Arguments] ${an argument}\n ${local list} Create List\n ${get small value} A Small Keyword\n ${words} Split String ${get small value}\n FOR ${word} IN @{words}\n ${characters} Split String To Characters ${word}\n\u2467\n ## Insert a vertical whitespace here to separate logical sections within a keyword.\n FOR ${character} IN @{characters}\n IF $character in 'aeiou'\n Append To List ${local list} ${character} ${an argument}\n END\n END\n END\n RETURN ${local list}\n\u2468\n"})}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h2,{id:"horizontal-spacing",children:"Horizontal Spacing"}),"\n",(0,a.jsxs)(n.p,{children:["Separation of tokens should be ",(0,a.jsx)(n.strong,{children:"4 spaces"})," as described in the the recommended file format: ",(0,a.jsx)(n.a,{href:"https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#space-separated-format",children:"space separated format"}),"."]}),"\n",(0,a.jsx)(n.h4,{id:"separation",children:"Separation"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"Separator"})," >= 4 spaces represented by ",(0,a.jsx)(n.code,{children:"\xb7\xb7\xb7\xb7"})," in the following examples."]}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:"Separation thus is the vertical space between tokens, where tokens are any keywords, variables, constructs."}),"\n",(0,a.jsxs)(i.A,{children:[(0,a.jsx)(r.A,{value:"tests",label:"Tests",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Test Cases ***\nMy Test\n Keyword One\xb7\xb7\xb7\xb7argument1\xb7\xb7\xb7\xb7argument2\n"})})}),(0,a.jsx)(r.A,{value:"tasks",label:"RPA",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Tasks ***\nMy Task\n Keyword One\xb7\xb7\xb7\xb7argument1\xb7\xb7\xb7\xb7argument2\n"})})})]}),"\n",(0,a.jsx)(n.h4,{id:"indentation",children:"Indentation"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.strong,{children:"Indentation"})," n time 4 spaces (where n is the level of indentation) and n never exceeds 5, hence nesting depth cannot exceed 4 steps in a keyword."]}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.em,{children:"Example with additional vertical lines for visual clarification: where n == 4 because the keyword also counts in the nesting."})}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nMy Nested Keyword\n|\xb7\xb7\xb7\xb7FOR ${i} IN RANGE 10\n|\xb7\xb7\xb7\xb7|\xb7\xb7\xb7\xb7IF $i % 2\n|\xb7\xb7\xb7\xb7|\xb7\xb7\xb7\xb7|\xb7\xb7\xb7\xb7IF $i > 5\n|\xb7\xb7\xb7\xb7|\xb7\xb7\xb7\xb7|\xb7\xb7\xb7\xb7|\xb7\xb7\xb7\xb7Log Odd number over 5: ${i}\n|\xb7\xb7\xb7\xb7|\xb7\xb7\xb7\xb7|\xb7\xb7\xb7\xb7END |\n|\xb7\xb7\xb7\xb7|\xb7\xb7\xb7\xb7END | |\n|\xb7\xb7\xb7\xb7END | | |\n| | | | |\n0 1 2 3 4\n"})}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"generic",children:"Generic"}),"\n",(0,a.jsx)(n.h4,{id:"line-length",children:"Line Length"}),"\n",(0,a.jsxs)(n.blockquote,{children:["\n",(0,a.jsxs)(n.p,{children:["A line length of 120 characters is recommended. ",(0,a.jsx)(n.a,{href:"https://robocop.readthedocs.io/en/stable/rules_list.html#line-too-long-w0508",children:"Robocop: #line-too-long"})]}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"trailing-whitespaces",children:"Trailing Whitespaces"}),"\n",(0,a.jsxs)(n.blockquote,{children:["\n",(0,a.jsxs)(n.p,{children:["Trailing whitespaces should be avoided. ",(0,a.jsx)(n.a,{href:"https://robocop.readthedocs.io/en/stable/rules_list.html#trailing-whitespace-w1001",children:"Robocop: #trailing-whitespace"})]}),"\n"]}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"settings-2",children:"Settings"}),"\n",(0,a.jsx)(n.h4,{id:"indentation-within-settings-section",children:"Indentation Within Settings Section"}),"\n",(0,a.jsx)(n.p,{children:"Indentations should only be added when needed."}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"*** Settings ***"})," section should always be left aligned without any indentation ",(0,a.jsx)(n.a,{href:"https://robocop.readthedocs.io/en/stable/rules_list.html#suite-setting-should-be-left-aligned-e1016",children:"Robocop: #suite-setting-should-be-left-aligned"})]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Settings ***\nLibrary Collections\nResource data.resource\nVariables vars.robot\n"})}),"\n",(0,a.jsx)(n.h4,{id:"separation-within-settings-section",children:"Separation Within Settings Section"}),"\n",(0,a.jsxs)(n.p,{children:["Arguments to settings should be aligned according to the longest setting added with 4 spaces. ",(0,a.jsx)(n.a,{href:"https://robotidy.readthedocs.io/en/stable/transformers/AlignSettingsSection.html#alignsettingssection",children:"Robotidy: #alignsettingssection"})]}),"\n",(0,a.jsx)(n.p,{children:"Arguments to Libraries should be aligned if there are multiple libraries that have arguments on importing.\nAfter the first argument to libraries all other arguments should either:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"be separated with 4 spaces"}),"\n",(0,a.jsx)(n.li,{children:"be aligned in columns"}),"\n"]}),"\n",(0,a.jsx)(n.h5,{id:"separated-with-4-spaces",children:"Separated With 4 Spaces"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Settings ***\nLibrary String\nLibrary DataDriver my_data_file.csv dialect=UserDefined delimiter=.\nLibrary Telnet timeout=3s newline=CLRF encoding=UTF-8\nResource ${resourcedir}/mykeywords.resource\nResource ${resourcedir}/myotherkeywords.resource\nTest Tags mytag\n"})}),"\n",(0,a.jsx)(n.h5,{id:"aligned-in-columns",children:"Aligned In Columns"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Settings ***\nLibrary String\nLibrary DataDriver my_data_file.csv dialect=UserDefined delimiter=.\nLibrary Telnet timeout=3s newline=CLRF encoding=UTF-8\nResource ${resourcedir}/mykeywords.resource\nResource ${resourcedir}/myotherkeywords.resource\nTest Tags mytag\n"})}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"variables-2",children:"Variables"}),"\n",(0,a.jsx)(n.h4,{id:"indentation-within-variables-section",children:"Indentation Within Variables Section"}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"*** Variables ***"})," section should always be left aligned without any indentation ",(0,a.jsx)(n.a,{href:"https://robocop.readthedocs.io/en/stable/rules_list.html#variable-should-be-left-aligned-e1014",children:"Robocop: #variable-should-be-left-aligned"})]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Variables ***\n${VAR} my variable\n${VAR2} 2\n"})}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"test-cases-tasks-and-keywords",children:"Test Cases, Tasks And Keywords"}),"\n",(0,a.jsx)(n.h4,{id:"indentation-within-test-cases-tasks-and-keywords-section",children:"Indentation Within Test Cases, Tasks And Keywords Section"}),"\n",(0,a.jsx)(n.p,{children:"The test case, task and keyword names should always start at the first character on a line. Test steps, task steps and keywords called from within keyword should be indented."}),"\n",(0,a.jsxs)(i.A,{children:[(0,a.jsx)(r.A,{value:"tests",label:"Tests",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Test Cases ***\nMy First Test Case\n Test Step One\n ${myvar} Test Step Two That Returns A Value\n"})})}),(0,a.jsx)(r.A,{value:"tasks",label:"RPA",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Tasks ***\nMy First Task\n Task Step One\n ${myvar} Task Step Two That Returns A Value\n"})})})]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nTest Step One\n Some Keywords Being Called\n Log Some Message\n\nTest Step Two That Returns A Value\n RETURN some string\n"})}),"\n",(0,a.jsx)(n.h4,{id:"block-indentation",children:"Block Indentation"}),"\n",(0,a.jsxs)(n.p,{children:["Blocks like ",(0,a.jsx)(n.code,{children:"IF"}),", ",(0,a.jsx)(n.code,{children:"WHILE"}),", ",(0,a.jsx)(n.code,{children:"FOR"})," and ",(0,a.jsx)(n.code,{children:"TRY/EXCEPT"})," should always be indented such that the keywords that are run within the loop have to be indented from the lines that start and end the block. ",(0,a.jsx)(n.a,{href:"https://robocop.readthedocs.io/en/stable/rules_list.html#bad-indent-w1008",children:"Robocop: #bad-indent"})]}),"\n",(0,a.jsx)(n.h4,{id:"examples-from-the-user-guide",children:"Examples From The User Guide"}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.a,{href:"https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#if-else-syntax",children:"IF/ELSE"})}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Test Cases ***\nExample\n IF $rc > 0\n Positive keyword\n ELSE IF $rc < 0\n Negative keyword\n ELSE IF $rc == 0\n Zero keyword\n ELSE\n Fail Unexpected rc: ${rc}\n END\n"})}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.a,{href:"https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#while-loops",children:"WHILE"})}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Test Cases ***\nLimit as iteration count\n WHILE True limit=100\n Log This is run 100 times.\n END\n"})}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.a,{href:"https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#for-loops",children:"FOR"})}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Test Cases ***\nExample\n FOR ${animal} IN cat dog\n Log ${animal}\n Log 2nd keyword\n END\n Log Outside loop\n\nSecond Example\n FOR ${var} IN one two ${3} four ${five}\n ... kuusi 7 eight nine ${last}\n Log ${var}\n END\n"})}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.a,{href:"https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#try-except-syntax",children:"TRY/EXCEPT"})}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Test Cases ***\nFirst example\n TRY\n Some Keyword\n EXCEPT Error message\n Error Handler Keyword\n END\n Keyword Outside\n"})}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"comments",children:"Comments"}),"\n",(0,a.jsxs)(n.p,{children:["In comments there should be a space between the ",(0,a.jsx)(n.code,{children:"#"})," and the actual comment. ",(0,a.jsx)(n.a,{href:"https://robocop.readthedocs.io/en/stable/rules_list.html#missing-space-after-comment-w0702",children:"Robocop: #missing-space-after-comment"})]}),"\n",(0,a.jsxs)(n.p,{children:["Comments should be avoided, write your code readable or use the ",(0,a.jsx)(n.code,{children:"[Documentation]"}),".\nThe only valid use of comments is for TODO's that should be fixed soon."]}),"\n",(0,a.jsx)(n.p,{children:"If you use comments:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"Comments should be aligned with the block they belong to."}),"\n",(0,a.jsxs)(n.li,{children:["Inline comments have one indentation before the ",(0,a.jsx)(n.code,{children:"#"})]}),"\n"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\n## Comment about Some Keyword here\nSome Keyword\n Called Keyword One\n ## Comment about Called Keyword Two here\n Called Keyword Two ## TODO fix weird behaviour.\n"})}),"\n",(0,a.jsx)(n.h2,{id:"line-continuation",children:"Line Continuation"}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"arguments",children:"Arguments"}),"\n",(0,a.jsxs)(n.p,{children:["Recommended use of line continuation when having more than one arguments as described in the Robot Framework User Guide:\n",(0,a.jsx)(n.a,{href:"https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#user-keyword-arguments",children:"User keyword arguments"}),"."]}),"\n",(0,a.jsx)(n.p,{children:"General guidelines:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["Try limiting the number of arguments to 5 (",(0,a.jsx)(n.a,{href:"https://robocop.readthedocs.io/en/stable/rules_list.html#too-many-arguments-w0507",children:"Robocop: #too-many-arguments"}),")."]}),"\n",(0,a.jsx)(n.li,{children:"One argument per continuation line."}),"\n",(0,a.jsx)(n.li,{children:"Continuation line should not be indented."}),"\n",(0,a.jsxs)(n.li,{children:["Line continuation character (",(0,a.jsx)(n.code,{children:"..."}),") should be placed at the beginning of the new row."]}),"\n",(0,a.jsx)(n.li,{children:"No empty lines between arguments."}),"\n",(0,a.jsxs)(n.li,{children:["No empty continuation lines between arguments (i.e., lines containing only ",(0,a.jsx)(n.code,{children:"'...'"}),")"]}),"\n",(0,a.jsx)(n.li,{children:"If many arguments are required, consider representing them as a list or a dictionary."}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"line-continuation-for-arguments-in-keyword-definition",children:"Line Continuation For Arguments In Keyword Definition"}),"\n",(0,a.jsxs)(n.blockquote,{children:["\n",(0,a.jsxs)(n.p,{children:["In Keywords, the very first argument should be placed on the same line as ",(0,a.jsx)(n.code,{children:"[Arguments]"})," setting. Every other argument\nshould be placed on a new continuation line and aligned with the argument on the previous line."]}),"\n"]}),"\n",(0,a.jsx)(n.h4,{id:"required-arguments",children:"Required Arguments"}),"\n",(0,a.jsx)(n.p,{children:"Required arguments placed on continuation lines:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nCustom Keyword With Five Required Arguments\n [Arguments] ${name}\n ... ${surname}\n ... ${street}\n ... ${block}\n ... ${apartment}\n Do Something\n"})}),"\n",(0,a.jsx)(n.h4,{id:"optional-arguments",children:"Optional Arguments"}),"\n",(0,a.jsx)(n.p,{children:"Optional arguments, due to having a default value, follow the same line continuation rules as required arguments:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nCustom Keyword With Various Optional Arguments\n [Arguments] ${first arg}=the first argument\n ... ${second arg}=${123}\n ... ${third arg}=${some list}\n ... ${fourth arg}=${some dict}\n ... ${fifth arg}=the last argument\n Do Something\n"})}),"\n",(0,a.jsx)(n.h4,{id:"required-and-optional-arguments-together",children:"Required And Optional Arguments Together"}),"\n",(0,a.jsx)(n.p,{children:"Here, all required arguments are listed first, and optional arguments with default values afterwards (please note that this is a requirement within Robot Framework).\nEach argument is placed on a single continuation line, as before:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nCustom Keyword With Required And Optional Arguments\n [Arguments] ${argument1}\n ... ${argument2}\n ... ${argument3}=this is a default value\n ... ${argument4}=9999\n ... ${argument5}=${EMPTY}\n Do Something\n"})}),"\n",(0,a.jsx)(n.h4,{id:"embedded-arguments",children:"Embedded Arguments"}),"\n",(0,a.jsx)(n.p,{children:"Unlike required and optional arguments, embedded arguments cannot be split over lines, since\nin this case, arguments become part of the Keyword name."}),"\n",(0,a.jsxs)(n.p,{children:["In the below example, the Keyword contains two embedded arguments, ",(0,a.jsx)(n.code,{children:"${country}"})," and ",(0,a.jsx)(n.code,{children:"${number}"}),".\nThe entire Keyword has to be on a single line:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:'*** Keywords ***\nGet Capital Of "${country}" And First "${number}" Cities With Biggest Population\n Do Something\n'})}),"\n",(0,a.jsx)(n.h4,{id:"line-continuation-for-arguments-in-test-cases-or-tasks",children:"Line Continuation For Arguments In Test Cases Or Tasks"}),"\n",(0,a.jsx)(n.p,{children:"In Test Cases, the first argument should be placed on the same line as the Keyword to which it belongs.\nEvery other argument should be placed on a new continuation line and separated from the continuation character\nby exactly four spaces. Following arguments should be aligned with the argument on the previous line.\nThis is different from the argument formatting in the Keywords definition.\nThe reason is that test cases might include several Keywords with arguments and overly sparse\nformatting may result in difficult to read test cases."}),"\n",(0,a.jsx)(n.p,{children:"EXAMPLES"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:'*** Test Cases ***\nTest Case With Many Keywords And Arguments\n Do Something\n Use Keyword With Five Arguments name=Name\n ... surname=Surname\n ... street=Somestreet 123\n ... block=45\n ... apartment=6\n Do Something Else\n Use Another Keyword With Arguments 123\n ... abcdef\n ... ${True}\n ... @{mylist}\n Do A Lot Of Stuff\n More Stuff\n Use One More Keyword With Various Arguments abc\n ... 123\n ... optional arg=12345\n ... another optional arg=Hello\n Use Keyword With "two" Embedded Arguments And "three" Required Arguments first arg\n ... second arg\n ... third arg\n Do Final Steps\n'})}),"\n",(0,a.jsx)(n.p,{children:"If Test Cases include Keywords with relatively short names and with only a few arguments,\nthen arguments can be accommodated on a single line if the maximum length of the line is not\nexceeded. Mixing single-line and vertical listing should be avoided within the same test case,\nand either one or the other should be chosen:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Test Cases ***\nTest Case With Compact Contents\n Log To Console message=Hello stream=STDERR\n Sleep 10s reason=Wait\n Catenate SEPARATOR= Robot Framework\n"})}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"variables-3",children:"Variables"}),"\n",(0,a.jsx)(n.p,{children:"It is reasonable to split a variable definition across multiple lines when it exceeds the recommended line length,\nor for the better readability of the code."}),"\n",(0,a.jsx)(n.p,{children:"Below are examples for the different variable types in different sections of the test and resources files."}),"\n",(0,a.jsx)(n.h4,{id:"variables-section-line-continuation",children:"Variables Section Line Continuation"}),"\n",(0,a.jsx)(n.p,{children:"General guidelines:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["Line continuation character (",(0,a.jsx)(n.code,{children:"..."}),") should be placed at the beginning of the new row,\nthat is, not at the end of the previous row."]}),"\n",(0,a.jsxs)(n.li,{children:["No empty continuation lines (lines containing only ",(0,a.jsx)(n.code,{children:"'...'"}),")"]}),"\n",(0,a.jsx)(n.li,{children:"Every new continuation line should be aligned with the previous line"}),"\n",(0,a.jsx)(n.li,{children:"Continuation line should not be indented"}),"\n"]}),"\n",(0,a.jsx)(n.h5,{id:"scalars",children:"Scalars"}),"\n",(0,a.jsxs)(n.p,{children:["Scalar variable in ",(0,a.jsx)(n.code,{children:"Variables"})," section on a single line:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Variables ***\n${STRING} This string has multiple sentences. They are all on the same line. It may not look nice in the code because the line is too long.\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Scalar variable in ",(0,a.jsx)(n.code,{children:"Variables"})," section split into several lines:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Variables ***\n${STRING} This string has multiple sentences.\n... They were all on the same line.\n... It did not look nice in the code\n... because the line was too long.\n... Now it is split in rows.\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Mix of line continuation and a new line (note use of newline character ",(0,a.jsx)(n.code,{children:"\\n"}),"):"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Variables ***\n${STRING} This string has multiple sentences.\n... This sentence will be printed on the same row\n... in the HTML test log.\n... And this line too.\n... Next line will be printed \\n\n... on a new row.\n"})}),"\n",(0,a.jsx)(n.h6,{id:"lists",children:"Lists"}),"\n",(0,a.jsxs)(n.p,{children:["List variable in ",(0,a.jsx)(n.code,{children:"Variables"})," section on a single line:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Variables ***\n@{LONG LIST} apple banana peach grape avocado kiwi some very long name of the fruit which exceeds the recommended line length\n"})}),"\n",(0,a.jsx)(n.p,{children:"It is recommended to either accommodate all items on a single line or to list each item on a new line:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Variables ***\n@{SHORT LIST} apple banana peach grape\n\n@{SHORT LIST} apple\n... banana\n... peach\n... grape\n\n@{LONG LIST} apple\n... banana\n... peach\n... grape\n... avocado\n... kiwi\n... some very long name of the fruit which exceeds the recommended line length\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Please note that the item values of the iterable cannot be split using line continuation character. Therefore,\nit is not possible to divide the last item in the above example with the ellipses (",(0,a.jsx)(n.code,{children:"..."}),")."]}),"\n",(0,a.jsx)(n.p,{children:"In this case, it is recommended to define the item separately:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Variables ***\n${LONG ITEM} some very long name of the\n... fruit which exceeds\n... the recommended line length\n\n@{LIST} apple\n... banana\n... peach\n... grape\n... avocado\n... kiwi\n... ${LONG ITEM}\n"})}),"\n",(0,a.jsx)(n.h6,{id:"dictionaries",children:"Dictionaries"}),"\n",(0,a.jsxs)(n.p,{children:["Dictionary variable in ",(0,a.jsx)(n.code,{children:"Variables"})," section on a single line:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Variables ***\n&{LONG DICT} name=robot age=14 occupation=framework version=latest address=https://robotframework.org/ documentation=This text is so long that it does not fit on one line\n"})}),"\n",(0,a.jsx)(n.p,{children:"It is recommended to place all key-value pairs of a dictionary\neither on a single line or each on a new line:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Variables ***\n&{SHORT DICT} name=robot age=14 occupation=framework\n\n&{SHORT DICT} name=robot\n... age=14\n... occupation=framework\n\n&{LONG DICT} name=robot\n... age=14\n... occupation=framework\n... version=latest\n... address=https://robotframework.org/\n... documentation=This text is so long that it does not fit on one line\n"})}),"\n",(0,a.jsx)(n.p,{children:"Similarly to the list items, a key-value pair of the dictionary cannot be split using the line continuation character. In this case, it is recommended to define the value separately:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Variables ***\n${LONG VALUE} This text is so long\n... it cannot be fit on one line\n\n&{DICT} name=robot\n... age=14\n... occupation=framework\n... version=latest\n... address=https://robotframework.org/\n... documentation=${LONG VALUE}\n"})}),"\n",(0,a.jsx)(n.h4,{id:"keywords-section",children:"Keywords Section"}),"\n",(0,a.jsx)(n.p,{children:"General guidelines:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["Line continuation character (",(0,a.jsx)(n.code,{children:"..."}),") should be placed at the beginning of the new row,\nthat is, not at the end of the previous row."]}),"\n",(0,a.jsxs)(n.li,{children:["No empty continuation lines (lines containing only ",(0,a.jsx)(n.code,{children:"..."}),")."]}),"\n",(0,a.jsxs)(n.li,{children:["For every variable definition containing keywords (e.g., ",(0,a.jsx)(n.code,{children:"Set Variable"}),", ",(0,a.jsx)(n.code,{children:"Catenate"}),", ",(0,a.jsx)(n.code,{children:"Create Dictionary"}),"),\ncontinuation line should be aligned with the beginning of the first item for the iterables, and with the value\ndefinition for scalars."]}),"\n",(0,a.jsx)(n.li,{children:"Continuation line should not be indented"}),"\n"]}),"\n",(0,a.jsx)(n.h5,{id:"scalar-variable-creation",children:"Scalar Variable Creation"}),"\n",(0,a.jsx)(n.p,{children:"Definition on a single line:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nMy Keyword\n ${SCALAR} Set Variable This sentence is really, really, really, really, really, really, really long\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Definition split across multiple lines (note use of built-in keyword ",(0,a.jsx)(n.a,{href:"http://robotframework.org/robotframework/latest/libraries/BuiltIn.html#Catenate.",children:"Catenate"}),".\nThis is exception for scalars in the ",(0,a.jsx)(n.code,{children:"Keywords"})," and ",(0,a.jsx)(n.code,{children:"Test Cases"})," sections):"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nMy Keyword\n ${SCALAR} Catenate This sentence is really,\n ... really, really, really, really,\n ... really, really long\n"})}),"\n",(0,a.jsx)(n.h5,{id:"list-variable-creation",children:"List Variable Creation"}),"\n",(0,a.jsx)(n.p,{children:"Definition on a single line:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nMy Keyword\n ${LIST} Create List Mercury Venus Earth Mars Jupiter Saturn Uranus Neptune\n"})}),"\n",(0,a.jsx)(n.p,{children:"Definition on multiple lines:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nMy Keyword\n ${LIST} Create List Mercury\n ... Venus\n ... Earth\n ... Mars\n ... Jupiter\n ... Saturn\n ... Uranus\n ... Neptune\n"})}),"\n",(0,a.jsx)(n.h5,{id:"dictionary-variable-creation",children:"Dictionary Variable Creation"}),"\n",(0,a.jsx)(n.p,{children:"Definition on a single line:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nMy Keyword\n &{DICTIONARY} Create Dictionary a=1 b=${2} c=${3} d=some long string e=${SOME LIST} f=pwoirpworuwruopwuroiewr\n"})}),"\n",(0,a.jsx)(n.p,{children:"Definition split across multiple lines:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nMy Keyword\n &{DICTIONARY} Create Dictionary a=1\n ... b=${2}\n ... c=${3}\n ... d=some long string\n ... e=${SOME LIST}\n ... f=pwoirpworuwruopwuroiewr\n"})}),"\n",(0,a.jsx)(n.h5,{id:"assigning-multiple-variables",children:"Assigning Multiple Variables"}),"\n",(0,a.jsx)(n.p,{children:"Definition on a single line:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nMy Keyword With Multiple Variable Assignment\n ${SCALAR1} ${SCALAR2} ${SCALAR3}= Set Variable First long item Second long item Third long item\n"})}),"\n",(0,a.jsx)(n.p,{children:"Definition split on multiple lines:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nMy Keyword With Multiple Variable Assignment\n ${SCALAR1} ${SCALAR2} ${SCALAR3} Set Variable First long item\n ... Second long item\n ... Third long item\n"})}),"\n",(0,a.jsx)(n.h4,{id:"test-cases-or-tasks-section",children:"Test Cases Or Tasks Section"}),"\n",(0,a.jsxs)(n.p,{children:["In test cases, line continuation follows the same guidelines, as in the ",(0,a.jsx)(n.code,{children:"Keywords"})," section."]}),"\n","\n",(0,a.jsx)(n.h2,{id:"variables-4",children:"Variables"}),"\n",(0,a.jsx)(n.p,{children:"Recommended methods of using and naming variables"}),"\n",(0,a.jsx)(n.p,{children:"Variables are the life blood of Robot Framework's flexibility."}),"\n",(0,a.jsx)(n.p,{children:"Understanding variable scope and proper naming are important for managing them in a project."}),"\n",(0,a.jsx)(n.p,{children:"This is also an area where you will need to understand the stakeholders involved in the project."}),"\n",(0,a.jsx)(n.p,{children:"If your project participants are less technical more syntactic sugar may be necessary than if a project is managed mostly by more technical roles (developers, devops, etc...) then more code-like syntax might be better."}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.em,{children:(0,a.jsx)(n.strong,{children:"In either case choose the style that best fits your project and keep to that decision."})})}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"variable-scope-and-casing",children:"Variable Scope And Casing"}),"\n",(0,a.jsx)(n.p,{children:"Adhering to casing rules provides a convenient way of identifying the scope of a variable."}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["Variable Syntax from the user guide ",(0,a.jsx)(n.a,{href:"https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#variable-priorities-and-scopes",children:"variable-priorities-and-scopes"})]}),"\n"]}),"\n",(0,a.jsxs)(n.table,{children:[(0,a.jsx)(n.thead,{children:(0,a.jsxs)(n.tr,{children:[(0,a.jsx)(n.th,{children:"Variable Scope"}),(0,a.jsx)(n.th,{style:{textAlign:"center"},children:"Syntax"})]})}),(0,a.jsxs)(n.tbody,{children:[(0,a.jsxs)(n.tr,{children:[(0,a.jsxs)(n.td,{children:[(0,a.jsx)(n.strong,{children:"GLOBAL"})," variables use upper-case letters."]}),(0,a.jsxs)(n.td,{style:{textAlign:"center"},children:[(0,a.jsx)(n.code,{children:"${UPPER CASED}"})," or ",(0,a.jsx)(n.code,{children:"${UPPER_CASED}"})]})]}),(0,a.jsxs)(n.tr,{children:[(0,a.jsxs)(n.td,{children:[(0,a.jsx)(n.strong,{children:"SUITE"})," variables use upper-case letters."]}),(0,a.jsxs)(n.td,{style:{textAlign:"center"},children:[(0,a.jsx)(n.code,{children:"${UPPER CASED}"})," or ",(0,a.jsx)(n.code,{children:"${UPPER_CASED}"})]})]}),(0,a.jsxs)(n.tr,{children:[(0,a.jsxs)(n.td,{children:[(0,a.jsx)(n.strong,{children:"TEST"})," variables use upper-case letters."]}),(0,a.jsxs)(n.td,{style:{textAlign:"center"},children:[(0,a.jsx)(n.code,{children:"${UPPER CASED}"})," or ",(0,a.jsx)(n.code,{children:"${UPPER_CASED}"})]})]}),(0,a.jsxs)(n.tr,{children:[(0,a.jsxs)(n.td,{children:[(0,a.jsx)(n.strong,{children:"LOCAL"})," variables use lower-case letters."]}),(0,a.jsxs)(n.td,{style:{textAlign:"center"},children:[(0,a.jsx)(n.code,{children:"${lower cased}"})," or ",(0,a.jsx)(n.code,{children:"${lower_cased}"})]})]}),(0,a.jsxs)(n.tr,{children:[(0,a.jsx)(n.td,{children:"Keyword arguments use lower-case letters."}),(0,a.jsxs)(n.td,{style:{textAlign:"center"},children:[(0,a.jsx)(n.code,{children:"${lower cased}"})," or ",(0,a.jsx)(n.code,{children:"${lower_cased}"})]})]})]})]}),"\n",(0,a.jsx)(n.h4,{id:"declaring-variable-scope-properly",children:"Declaring Variable Scope Properly"}),"\n",(0,a.jsx)(n.p,{children:"It is advised to not reuse GLOBAL or SUITE variable names in lower scoped contexts."}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.em,{children:"Example:"})}),"\n",(0,a.jsxs)(n.p,{children:["Robot Framework ignores casing therefore ",(0,a.jsx)(n.code,{children:"${I AM A VARIABLE}"})," is the same as ",(0,a.jsx)(n.code,{children:"${i am a variable}"}),"."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Variables ***\n${I AM A VARIABLE} This is a SUITE scoped variables\n\n\n*** Test Cases ***\nVariable Casing Test\n [Documentation] Robot Framework ignores casing.\n Log To Console ${I AM A VARIABLE}\n Should Be Equal ${I AM A VARIABLE} ${i am a variable}\n\nSame Variable Different Scope Test\n [Documentation] The SUITE variable is overwritten by an argument then TEST scoped variable of same name.\n A Keyword With Arguments This will be printed.\n Should Not Be Equal ${I AM A VARIABLE} This is a SUITE scoped variables\n\n\n*** Keywords ***\nA Keyword With Arguments\n [Documentation] The argument will take precedence then the SUITE level variable will be overwritten by a TEST scope variable.\n [Arguments] ${i am a variable}\n Log To Console ${i am a variable}\n Set Test Variable ${i am a variable}\n"})}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"variable-assignment-syntax",children:"Variable Assignment Syntax"}),"\n",(0,a.jsx)(n.p,{children:"There are two favored syntaxes for assigning a value to a variable:"}),"\n",(0,a.jsxs)(i.A,{children:[(0,a.jsx)(r.A,{value:"By Spacing Only",label:"Style 1",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Variables ***\n${VARIABLE} value\n\n\n*** Keywords ***\nVariable Keyword\n ${variable} Set Variable value\n Log To Console ${variable}\n"})})}),(0,a.jsx)(r.A,{value:"By '=' sign (syntactic sugar method)",label:"Style 2",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Variables ***\n${VARIABLE} = Value\n\n\n*** Keywords ***\nVariable Keyword\n ${variable} = Set Variable Value\n Log To Console ${variable}\n"})})})]}),"\n",(0,a.jsxs)(n.p,{children:["If you prefer using equals ('=') signs, then be sure that it is formatted ",(0,a.jsx)(n.code,{children:"${var}\xb7=\xb7\xb7\xb7\xb7"})," where each ",(0,a.jsx)(n.code,{children:"\xb7"})," is a space.\nThe reason for a space immediately after a variable is to make the variable more readable."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nSetting Variables\n ${var}\xb7=\xb7\xb7\xb7\xb7Set Variable good\n ${var}=\xb7\xb7\xb7\xb7Set Variable not great, but seen commonly\n"})}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nNever Like This Ever\n [Documentation] You will throw a syntax error!\n ${var}\xb7\xb7=\xb7\xb7\xb7\xb7Set Variable do not do this\n"})}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"spaces-or-underscores-variables",children:"Spaces Or Underscores Variables"}),"\n",(0,a.jsx)(n.p,{children:"Referring back to who will be involved with reading and understanding test cases, it may be best to use spaces instead of underscores."}),"\n",(0,a.jsxs)(n.p,{children:["In the user guide there are existing examples of this syntax ",(0,a.jsx)(n.a,{href:"https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#built-in-variables",children:"built-in-variables"})]}),"\n",(0,a.jsx)(n.p,{children:"Since Robot Framework treats spaces and underscores the same and in most cases not even necessary, each of these variable names are the same:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Variables ***\n${VARIABLE_ONE} same\n${VARIABLE ONE} same\n${VARIABLEONE} same\n"})}),"\n",(0,a.jsx)(n.h4,{id:"using-variables-with-spaces-within-python-code-blocks",children:"Using Variables With Spaces Within Python Code Blocks"}),"\n",(0,a.jsx)(n.p,{children:"If you are using variables containing spaces within python code blocks (Inline script, Evaluate keyword, python module, etc...) replace the space with an underscore."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nPython Syntax With Underscores\n [Argument] ${argument variable}\n ${upper value} Evaluate $argument_variable.upper()\n RETURN ${upper value}\n"})}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nPython Inline Syntax With Underscores\n [Argument] ${argument variable}\n RETURN ${{$argument_variable.upper()}}\n"})}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"variables-within-settings-section",children:"Variables Within Settings Section"}),"\n",(0,a.jsx)(n.p,{children:"Variables can be used within the settings section."}),"\n",(0,a.jsx)(n.p,{children:"They are useful for dynamic file paths and other values."}),"\n",(0,a.jsx)(n.p,{children:"Typically they are Suite or Global scoped variables. (i.e. Always UPPER CASED, UPPER_CASED)"}),"\n",(0,a.jsxs)(n.p,{children:["These variables may come from the Command Line, Resource Files, Variable Files, or the current ",(0,a.jsx)(n.code,{children:"*** Variables ***"})," section"]}),"\n",(0,a.jsxs)(n.p,{children:["It is a good idea to set a default value for a variable used in the ",(0,a.jsx)(n.code,{children:"*** Settings ***"})," section to prevent import errors."]}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.em,{children:"Example:"})}),"\n",(0,a.jsxs)(i.A,{children:[(0,a.jsx)(r.A,{value:"With Spaces",label:"style 1",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Settings ***\nResource ${RESOURCE PATH}/Resource.resource\nVariables ${VARIABLES PATH}/Variables.yaml\n\n\n*** Variables ***\n${RELATIVE PATH} ../../..\n${RESOURCE PATH} ${RELATIVE PATH}/Resources\n${VARIABLES PATH} ${RESOURCE PATH}/Variables\n"})})}),(0,a.jsx)(r.A,{value:"With Underscores",label:"style 2",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Settings ***\nResource ${RESOURCE_PATH}/Resource.resource\nVariables ${VARIABLES_PATH}/Variables.yaml\n\n\n*** Variables ***\n${RELATIVE_PATH} ../../..\n${RESOURCE_PATH} ${RELATIVE_PATH}/Resources\n${VARIABLES_PATH} ${RESOURCE_PATH}/Variables\n"})})})]}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"variables-section",children:"Variables Section"}),"\n",(0,a.jsxs)(n.p,{children:["Variables declared within the ",(0,a.jsx)(n.code,{children:"*** Variables ***"})," section are Suite level in scope. (i.e. Always UPPER CASED, UPPER_CASED)"]}),"\n",(0,a.jsx)(n.p,{children:"Be sure to use the correct indicators of type of Variables:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"Scalar ($)"}),"\n",(0,a.jsx)(n.li,{children:"List (@)"}),"\n",(0,a.jsx)(n.li,{children:"Dictionary (&)"}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:"Consult the Style Guide Line Continuation Section in regards to how to handle the values of these types."}),"\n",(0,a.jsxs)(n.admonition,{type:"note",children:[(0,a.jsxs)(n.p,{children:["You can build variables in the ",(0,a.jsx)(n.code,{children:"*** Variables ***"})," section by combining previously assigned variables."]}),(0,a.jsx)(n.p,{children:"Order of the variable assignments is important."})]}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.em,{children:"Example:"})}),"\n",(0,a.jsxs)(i.A,{children:[(0,a.jsx)(r.A,{value:"Incorrect Order",label:"style 1",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Variables ***\n${RESOURCE PATH} ${RELATIVE PATH}/Resources # This line calls ${RELATIVE PATH} that has not been declared yet.\n${VARIABLES PATH} ${RESOURCE PATH}/Variables # This line calls ${VARIABLES PATH} that has not been declared yet.\n${RELATIVE PATH} ../../..\n"})})}),(0,a.jsx)(r.A,{value:"Correct Order",label:"style 2",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Variables ***\n${RELATIVE PATH} ../../..\n${RESOURCE PATH} ${RELATIVE PATH}/Resources\n${VARIABLES PATH} ${RESOURCE PATH}/Variables\n"})})})]}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"test-cases-or-tasks-2",children:"Test Cases Or Tasks"}),"\n",(0,a.jsx)(n.p,{children:"Variables assigned within a test/task should be treated as Test Variables in scope. (i.e. Always UPPER CASED, UPPER_CASED)"}),"\n",(0,a.jsx)(n.p,{children:"The ocassional exception would be if there are FOR LOOP or WHILE LOOP structures then in those cases it would be acceptable."}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.em,{children:"FOR LOOP and WHILE LOOP structures should be avoided in test cases."})}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"keywords-1",children:"Keywords"}),"\n",(0,a.jsxs)(n.p,{children:["A majority of Keyword level variables will be local variables (i.e. lower cased, lower_cased).\nBut other scopes can be assigned using ",(0,a.jsx)(n.code,{children:"BuiltIn keywords"}),", make sure you case variables according to how they are assigned."]}),"\n",(0,a.jsxs)(i.A,{children:[(0,a.jsx)(r.A,{value:"With Spaces",label:"style 1",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nA Keyword of Variables\n [Documentation] This keyword will create these variables:\n ... ${TEST VARIABLE}\n ... ${SUITE VARIABLE}\n ... ${GLOBAL VARIABLE}\n [Arguments] ${this is an argument}\n Set Local Variable ${local variable} use lower case\n ${assigned local variable} Set Variable use lower case also\n Set Test Variable ${TEST VARIABLE} USE UPPER CASE\n Set Suite Variable ${SUITE VARIABLE} USE UPPER CASE\n ${GLOBAL VARIABLE} Create List BETTER USE UPPER CASE\n Set Global Variable ${GLOBAL VARIABLE}\n"})})}),(0,a.jsx)(r.A,{value:"With Underscores",label:"style 2",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nA Keyword of Variables\n [Documentation] This keyword will create these variables:\n ... ${TEST_VARIABLE}\n ... ${SUITE_VARIABLE}\n ... ${GLOBAL_VARIABLE}\n [Arguments] ${this_is_an_argument}\n Set Local Variable ${local_variable} use lower case\n ${assigned_local_variable} Set Variable use lower case also\n Set Test Variable ${TEST_VARIABLE} USE UPPER CASE\n Set Suite Variable ${SUITE_VARIABLE} USE UPPER CASE\n ${GLOBAL_VARIABLE} Create List BETTER USE UPPER CASE\n Set Global Variable ${GLOBAL_VARIABLE}\n"})})})]}),"\n",(0,a.jsx)(n.p,{children:"Treat keyword arguments as local variables for naming purposes."}),"\n",(0,a.jsx)(n.p,{children:"If setting Suite and Global Variables within keywords from resource files.\nSetting Test Variables should be reserved to test cases if at all possible.\nIn either case document non-local scoped variables."}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"special-cases",children:"Special Cases"}),"\n",(0,a.jsx)(n.h4,{id:"variable-files",children:"Variable Files"}),"\n",(0,a.jsx)(n.p,{children:"Assume variables declared within variable files to be at minimum SUITE in scope. (i.e. Always UPPER CASED, UPPER_CASED)"}),"\n",(0,a.jsx)(n.p,{children:"The examples given are using variables with spaces."}),"\n",(0,a.jsx)(n.h5,{id:"resource-variable-files",children:".resource Variable Files"}),"\n",(0,a.jsx)(n.p,{children:"Assume variables declared within the Variable section of a resource files to be at minimum SUITE in scope. (i.e. Always UPPER CASED, UPPER_CASED)"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Variables ***\n${STRING VARIABLE} Hello I am a resource variable.\n${INT VARIABLE} ${42}\n@{LIST VARIABLE} one two\n&{DICT VARIABLE} one=yksi two=kaksi with spaces=kolme\n"})}),"\n",(0,a.jsx)(n.h5,{id:"python-variable-files",children:"Python Variable Files"}),"\n",(0,a.jsx)(n.p,{children:"Assume variables declared within python variable files to be at minimum SUITE in scope. (i.e. Always UPPER CASED, UPPER_CASED)"}),"\n",(0,a.jsx)(n.p,{children:"Note that syntactically you cannot declare python variables with a space, but when you use them in Robot Framework you can use a space."}),"\n",(0,a.jsx)(n.p,{children:"Python libraries that declare variables are handled according to use case."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-python",children:'STRING_VARIABLE = "Hello I am a python variable."\nINT_VARIABLE = 42\nLIST_VARIABLE = ["one", "two"]\nDICT_VARIABLE = {"one": "yksi", "two": "kaksi", "with spaces": "kolme"}\n'})}),"\n",(0,a.jsx)(n.h5,{id:"yaml-variable-files",children:"Yaml Variable Files"}),"\n",(0,a.jsx)(n.p,{children:"Assume variables declared within yaml variable files to be at minimum SUITE in scope. (i.e. Always UPPER CASED, UPPER_CASED)"}),"\n",(0,a.jsx)(n.p,{children:"When using a Yaml file you should follow Yaml Specifications for the key and value formatting."}),"\n",(0,a.jsx)(n.p,{children:"As with python variables when you use them in Robot Framework you can use a space."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:"STRING VARIABLE: Hello I am a yaml variable.\nINT VARIABLE: 42\nLIST VARIABLE:\n - one\n - two\nDICT VARIABLE:\n one: yksi\n two: kaksi\n with spaces: kolme\n"})}),"\n",(0,a.jsx)(n.h4,{id:"json-variable-files",children:"Json Variable Files"}),"\n",(0,a.jsx)(n.p,{children:"Assume variables declared within json variable files to be at minimum SUITE in scope. (i.e. Always UPPER CASED, UPPER_CASED)"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-json",children:'{\n "STRING VARIABLE": "Hello I am a json variable.",\n "INTEGER VARIABLE": 42,\n "LIST VARIABLE": [\n "one",\n "two"\n ],\n "DICT VARIABLE": {\n "one": "yksi",\n "two": "kaksi",\n "with spaces": "kolme"\n }\n}\n'})}),"\n",(0,a.jsx)(n.h4,{id:"commandline-variables",children:"Commandline Variables"}),"\n",(0,a.jsx)(n.p,{children:"Commandline Variables and by extension variable files should be treated as Global Variables. (i.e. Always UPPER CASED, UPPER_CASED)"}),"\n",(0,a.jsx)(n.h4,{id:"environment-variables",children:"Environment Variables"}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.a,{href:"https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#environment-variables",children:"https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#environment-variables"})}),"\n",(0,a.jsx)(n.p,{children:"Environment Variables should be treated as Global Variables. (i.e. Always UPPER CASED, UPPER_CASED)"}),"\n",(0,a.jsx)(n.p,{children:"It is also possible that the variable casing needs to match how the variable has been declared outside of Robot Framework's context."}),"\n",(0,a.jsx)(n.h4,{id:"deviation-when-context-is-more-important",children:"Deviation When Context Is More Important"}),"\n",(0,a.jsx)(n.p,{children:"Sometimes variables should mimic the parameters of an API. This is especially true when interacting with REST API json bodies."}),"\n",(0,a.jsx)(n.p,{children:"You have a couple of choices:"}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.em,{children:"Given this example body:"})}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-json",children:'{\n "firstName": "value",\n "lastName": "value"\n}\n'})}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.em,{children:"Then choose either:"})}),"\n",(0,a.jsxs)(i.A,{children:[(0,a.jsx)(r.A,{value:"Using normal variable syntax",label:"style 1",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nCreate Json Body Option One\n [Documentation] This one is an 'OK' example.\n [Arguments] ${first name} ${last name}\n ${json body} Create Dictionary firstName=${first name} lastName=${last name}\n RETURN ${json body}\n"})})}),(0,a.jsx)(r.A,{value:"Matching variables to Json keys",label:"style 2",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nCreate Json Body Option Two\n [Documentation] This is also an 'OK' example.\n [Arguments] ${firstName} ${lastName}\n ${json body} Create Dictionary firstName=${firstName} lastName=${lastName}\n RETURN ${json body}\n"})})})]}),"\n",(0,a.jsx)(n.h4,{id:"embedded-variables",children:"Embedded Variables"}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.a,{href:"https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#variables-inside-variables",children:"variables-inside-variables"})}),"\n",(0,a.jsx)(n.p,{children:"Be careful to not embed more than one variable within a variable."}),"\n",(0,a.jsx)(n.p,{children:"Keep it simple."}),"\n",(0,a.jsx)(n.p,{children:"Readability becomes an issue with more than one embedded variable."}),"\n",(0,a.jsxs)(i.A,{children:[(0,a.jsx)(r.A,{value:"With Spaces",label:"style 1",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nSet Suite Variables\n Set Suite Variable ${EMBED VAR} embedded\n Set Suite Variable ${VARIABLE ${EMBED VAR}} good embedded variable\n Set Suite Variable ${FOO} eggs\n Set Suite Variable ${BAR} spam\n Set Suite Variable ${VARIABLE ${FOO} ${BAR}} questionable variable\n Set Suite Variable ${VAR} one\n Set Suite Variable ${WITHIN ${VAR}} two\n Set Suite Variable ${VARIABLES ${WITHIN ${VAR}}} three\n Set Suite Variable ${INCEPTION ${VARIABLES ${WITHIN ${VAR}}}} do not do this\n"})})}),(0,a.jsx)(r.A,{value:"With Underscores",label:"style 2",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Keywords ***\nSet Suite Variables\n Set Suite Variable ${EMBED_VAR} embedded\n Set Suite Variable ${VARIABLE_${EMBED_VAR}} good embedded variable\n Set Suite Variable ${FOO} eggs\n Set Suite Variable ${BAR} spam\n Set Suite Variable ${VARIABLE_${FOO}_${BAR}} questionable variable\n Set Suite Variable ${VAR} one\n Set Suite Variable ${WITHIN_${VAR}} two\n Set Suite Variable ${VARIABLES_${WITHIN_${VAR}}} three\n Set Suite Variable ${INCEPTION_${VARIABLES_${WITHIN_${VAR}}}} do not do this\n"})})})]}),"\n",(0,a.jsx)(n.h4,{id:"variables-with-attributes",children:"Variables with Attributes"}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.a,{href:"https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#extended-variable-assignment",children:"extended-variable-assignment"})}),"\n",(0,a.jsx)(n.p,{children:"Attributes to variables can be any casing and usually follow the use case.\nThe variable itself should follow the casing rules of its scope."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"Attribute Variables\n ${local variable.name} Set Variable this is a variable\n ${local variable.foo} Set Variable this is a local attribute\n Set Suite Variable ${SUITE VARIABLE.name} this is a suite variable\n ${SUITE VARIABLE.bar} Set Variable this is a suite attribute\n"})}),"\n",(0,a.jsx)(n.h2,{id:"test-templates",children:"Test Templates"}),"\n",(0,a.jsxs)(n.p,{children:["User Guide Reference:\n",(0,a.jsx)(n.a,{href:"https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#test-templates",children:"Test Templates"})]}),"\n",(0,a.jsx)(n.p,{children:"General rules"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"Any two column should be separated by 4 spaces from each other."}),"\n",(0,a.jsx)(n.li,{children:"Each column should be left-aligned."}),"\n",(0,a.jsx)(n.li,{children:"Data columns should have titles."}),"\n",(0,a.jsx)(n.li,{children:"The titles should be capitalised."}),"\n",(0,a.jsx)(n.li,{children:"The titles should be left-aligned with respect to the data columns."}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:"The Template Keyword follows the same common rules as any other Keyword."}),"\n",(0,a.jsx)(n.hr,{}),"\n",(0,a.jsx)(n.h3,{id:"test-cases-or-tasks-3",children:"Test Cases Or Tasks"}),"\n",(0,a.jsx)(n.p,{children:"Templated test cases and tasks share the same guidelines. Below are examples for the\ndifferent cases, depending on how templates are used."}),"\n",(0,a.jsxs)(i.A,{children:[(0,a.jsx)(r.A,{value:"One test",label:"Example 1",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Settings ***\nDocumentation Templated test case.\nTest Template Template Keyword\n\n\n*** Test Cases *** COLUMN1 COLUMN2 COLUMN3\nTest Case 00000 aaaaa AAAAAAAAAA\n 1111111111 bbb BBBBBBBBBBBBBB\n ${EMPTY} aaaa AAAAAAA\n ${EMPTY} bbbbbbb BBB\n ${NONE} a AAAAAAAAAA\n ${NONE} bbb BBBBBBBBBBBBBB\n\n\n*** Keywords ***\nTemplate Keyword\n [Arguments] ${arg1} ${arg2} ${arg3}\n Log Many ${arg1} ${arg2} ${arg3}\n"})})}),(0,a.jsx)(r.A,{value:"Two tests",label:"Example 2",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Settings ***\nDocumentation Two templated tasks.\nTask Template Template Keyword\n\n\n*** Tasks *** COLUMN1 COLUMN2 COLUMN3\nFirst Task 00000 aaaaa AAAAAAAAAA\n 1111111111 bbb BBBBBBBBBBBBBB\n ${EMPTY} aaaa AAAAAAA\n ${EMPTY} bbbbbbb BBB\n ${NONE} a AAAAAAAAAA\n ${NONE} bbb BBBBBBBBBBBBBB\n\nAnother Task With Longer Name 00000 a AAAAAAAAAA\n 1111111111 bbbbbbbbbbb BBBBBBBBBBBBBB\n ${EMPTY} aa AAAAAAA\n ${EMPTY} bbbb BBB\n ${NONE} aaaaaaaaaa AAAAAAAAAA\n ${NONE} bb BBBBBBBBBBBBBB\n\n\n*** Keywords ***\nTemplate Keyword\n [Arguments] ${arg1} ${arg2} ${arg3}\n Log Many ${arg1} ${arg2} ${arg3}\n"})})}),(0,a.jsx)(r.A,{value:"Each test named",label:"Example 3",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Settings ***\nDocumentation Individually named test cases.\n... Tests sorted according to ARG values.\nTest Template Template Keyword\n\n\n*** Test Cases *** ARG SECOND ARG ANOTHER ARG\nTest abc123 aaaa AAAAAAAAAA\nAnother Test 1111111111 bbb BBBBBBBBBBBBBB\nOne More Test With Long Name 222 cc CCCCCCCCCCCCCCC\n\nTest With Empty ${EMPTY} aaaa AAAAAAAAAA\nAnother Test With Empty ${EMPTY} bbb BBBBBBBBBBBBBB\nOne More Test With Empty ${EMPTY} cc CCCCCCCCCCCCCCC\n\nTest With None ${NONE} aaaa AAAAAAAAAA\nAnother Test With None ${NONE} bbb BBBBBBBBBBBBBB\nOne More Test With None ${NONE} cc CCCCCCCCCCCCCCC\n\n\n*** Keywords ***\nTemplate Keyword\n [Arguments] ${arg1} ${arg2} ${arg3}\n Log Many ${arg1} ${arg2} ${arg3}\n"})})}),(0,a.jsx)(r.A,{value:"Two tests two templates",label:"Example 4",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Settings ***\nDocumentation Eeach test case using different template.\n\n\n*** Test Cases ***\nTest Case With Template A\n [Template] Template A\n aa 123\n a Hello Word!\n aaaaaa ${5}\n aaa ${NONE}\n\nTest Case With Template B\n [Template] Template B\n bbbbbbbbbbbbb 456 ${1.5}\n bbbbbbbb ${EMPTY} anything\n bbb something 7899999999999\n bbbbbbbbbbb ${2} ${EMPTY}\n\n\n*** Keywords ***\nTemplate A\n [Documentation] This is first template.\n [Tags] A\n [Arguments] ${arg1} ${arg2}\n Log Many ${arg1} ${arg2}\n\nTemplate B\n [Documentation] This is second template.\n [Tags] B\n [Arguments] ${arg_one} ${arg_two} ${arg_three}\n Log Many ${arg_one} ${arg_two} ${arg_three}\n"})})})]}),"\n",(0,a.jsxs)(n.p,{children:["In ",(0,a.jsx)(n.strong,{children:"Example 1"}),", section name ",(0,a.jsx)(n.code,{children:"*** Test Cases ***"})," and ",(0,a.jsx)(n.code,{children:"COLUMN1"})," are separated by 4 spaces, as well as following\ncolumns. The distance is measured between the longest item in the given column and the start of the following column.\nFor example, the longest item in the first column is ",(0,a.jsx)(n.code,{children:"1111111111"}),", therefore, corresponding item in the next\ncolumn, ",(0,a.jsx)(n.code,{children:"bbb"})," is separated by 4 spaces from it."]}),"\n",(0,a.jsxs)(n.p,{children:["In ",(0,a.jsx)(n.strong,{children:"Example 2"}),", there are two tasks in one file, and the\ndata in all tasks are aligned with respect to each other. In each task, for easier navigation, data rows with constant\nvalues are listed first, next with ",(0,a.jsx)(n.code,{children:"${EMPTY}"})," and ",(0,a.jsx)(n.code,{children:"${NONE}"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["If the number of iterations, or the number of test cases/tasks grow, it is a good idea to sort rows in certain logical\norder if applicable. This will ease finding the relevant raws when adding or removing data. Empty lines can be used to\nseparate tests into logical groups as in ",(0,a.jsx)(n.strong,{children:"Example 3"}),". When dealing with large data, consider using\n",(0,a.jsx)(n.a,{href:"https://docs.robotframework.org/docs/testcase_styles/datadriven#using-datadriver-library",children:"DataDriver library"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["In ",(0,a.jsx)(n.strong,{children:"Example 4"}),", there are different templates set for different test cases. The data is aligned within ",(0,a.jsx)(n.em,{children:"each"})," test\ncase. This is because they are using different templates and therefore, are independent. Note that the columns are not\ntitled - this is an exception in the per-test case templates because title placement on the same line as test names, and\n",(0,a.jsx)(n.code,{children:"[Template]"})," setting between the columns titles and the data, would make the tests unreadable."]}),"\n",(0,a.jsx)(n.h3,{id:"note-on-documentation-and-tags",children:"Note On Documentation And Tags"}),"\n",(0,a.jsx)(n.p,{children:"In special cases, there might be a need to specify Documentation and Tags for each test case.\nTo achieve consistent formatting, they can be represented in columns just like test data,\nby passing them as arguments to the Template Keyword:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-robot",children:"*** Settings ***\nDocumentation Different Tags and Documentation for each test case.\nTest Template Template Keyword\n\n\n*** Test Cases *** ARG1 ARG2 [Documentation] [Tags]\nTestA aaa AAA Prints some message tagA\nTestB bbb BBB Prints another message tagB\n\n\n*** Keywords ***\nTemplate Keyword\n [Arguments] ${arg1} ${arg2} ${documentation} ${tag}\n [Setup] Set Tags And Documentation ${documentation} ${tag}\n Log Many ${arg1} ${arg2}\n\nSet Tags And Documentation\n [Arguments] ${documentation} ${tag}\n Set Test Documentation ${documentation}\n Set Tags ${tag}\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Square brackets around the column titles, ",(0,a.jsx)(n.code,{children:"[Documentation]"})," and ",(0,a.jsx)(n.code,{children:"[Tags]"}),", are merely to resemble the Settings\nsyntax. This is to distinguish them from the test data."]})]})}function b(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(u,{...e})}):u(e)}},9365:(e,n,s)=>{s.d(n,{A:()=>r});s(6540);var a=s(8215);const t={tabItem:"tabItem_Ymn6"};var i=s(4848);function r(e){let{children:n,hidden:s,className:r}=e;return(0,i.jsx)("div",{role:"tabpanel",className:(0,a.A)(t.tabItem,r),hidden:s,children:n})}},1470:(e,n,s)=>{s.d(n,{A:()=>y});var a=s(6540),t=s(8215),i=s(3104),r=s(6347),l=s(205),o=s(7485),d=s(1682),c=s(679);function h(e){return a.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function u(e){const{values:n,children:s}=e;return(0,a.useMemo)((()=>{const e=n??function(e){return h(e).map((e=>{let{props:{value:n,label:s,attributes:a,default:t}}=e;return{value:n,label:s,attributes:a,default:t}}))}(s);return function(e){const n=(0,d.X)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,s])}function b(e){let{value:n,tabValues:s}=e;return s.some((e=>e.value===n))}function m(e){let{queryString:n=!1,groupId:s}=e;const t=(0,r.W6)(),i=function(e){let{queryString:n=!1,groupId:s}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!s)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return s??null}({queryString:n,groupId:s});return[(0,o.aZ)(i),(0,a.useCallback)((e=>{if(!i)return;const n=new URLSearchParams(t.location.search);n.set(i,e),t.replace({...t.location,search:n.toString()})}),[i,t])]}function p(e){const{defaultValue:n,queryString:s=!1,groupId:t}=e,i=u(e),[r,o]=(0,a.useState)((()=>function(e){let{defaultValue:n,tabValues:s}=e;if(0===s.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!b({value:n,tabValues:s}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${s.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const a=s.find((e=>e.default))??s[0];if(!a)throw new Error("Unexpected error: 0 tabValues");return a.value}({defaultValue:n,tabValues:i}))),[d,h]=m({queryString:s,groupId:t}),[p,g]=function(e){let{groupId:n}=e;const s=function(e){return e?`docusaurus.tab.${e}`:null}(n),[t,i]=(0,c.Dv)(s);return[t,(0,a.useCallback)((e=>{s&&i.set(e)}),[s,i])]}({groupId:t}),x=(()=>{const e=d??p;return b({value:e,tabValues:i})?e:null})();(0,l.A)((()=>{x&&o(x)}),[x]);return{selectedValue:r,selectValue:(0,a.useCallback)((e=>{if(!b({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);o(e),h(e),g(e)}),[h,g,i]),tabValues:i}}var g=s(2303);const x={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var j=s(4848);function w(e){let{className:n,block:s,selectedValue:a,selectValue:r,tabValues:l}=e;const o=[],{blockElementScrollPositionUntilNextRender:d}=(0,i.a_)(),c=e=>{const n=e.currentTarget,s=o.indexOf(n),t=l[s].value;t!==a&&(d(n),r(t))},h=e=>{let n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const s=o.indexOf(e.currentTarget)+1;n=o[s]??o[0];break}case"ArrowLeft":{const s=o.indexOf(e.currentTarget)-1;n=o[s]??o[o.length-1];break}}n?.focus()};return(0,j.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,t.A)("tabs",{"tabs--block":s},n),children:l.map((e=>{let{value:n,label:s,attributes:i}=e;return(0,j.jsx)("li",{role:"tab",tabIndex:a===n?0:-1,"aria-selected":a===n,ref:e=>o.push(e),onKeyDown:h,onClick:c,...i,className:(0,t.A)("tabs__item",x.tabItem,i?.className,{"tabs__item--active":a===n}),children:s??n},n)}))})}function A(e){let{lazy:n,children:s,selectedValue:t}=e;const i=(Array.isArray(s)?s:[s]).filter(Boolean);if(n){const e=i.find((e=>e.props.value===t));return e?(0,a.cloneElement)(e,{className:"margin-top--md"}):null}return(0,j.jsx)("div",{className:"margin-top--md",children:i.map(((e,n)=>(0,a.cloneElement)(e,{key:n,hidden:e.props.value!==t})))})}function T(e){const n=p(e);return(0,j.jsxs)("div",{className:(0,t.A)("tabs-container",x.tabList),children:[(0,j.jsx)(w,{...n,...e}),(0,j.jsx)(A,{...n,...e})]})}function y(e){const n=(0,g.A)();return(0,j.jsx)(T,{...e,children:h(e.children)},String(n))}},8453:(e,n,s)=>{s.d(n,{R:()=>r,x:()=>l});var a=s(6540);const t={},i=a.createContext(t);function r(e){const n=a.useContext(i);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),a.createElement(i.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/runtime~main.ad95e994.js b/assets/js/runtime~main.87782e46.js
similarity index 66%
rename from assets/js/runtime~main.ad95e994.js
rename to assets/js/runtime~main.87782e46.js
index 77d3f671..3129d967 100644
--- a/assets/js/runtime~main.ad95e994.js
+++ b/assets/js/runtime~main.87782e46.js
@@ -1 +1 @@
-(()=>{"use strict";var e,a,t,r,d,c={},f={};function b(e){var a=f[e];if(void 0!==a)return a.exports;var t=f[e]={exports:{}};return c[e].call(t.exports,t,t.exports,b),t.exports}b.m=c,e=[],b.O=(a,t,r,d)=>{if(!t){var c=1/0;for(i=0;i=d)&&Object.keys(b.O).every((e=>b.O[e](t[o])))?t.splice(o--,1):(f=!1,d0&&e[i-1][2]>d;i--)e[i]=e[i-1];e[i]=[t,r,d]},b.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return b.d(a,{a:a}),a},t=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,b.t=function(e,r){if(1&r&&(e=this(e)),8&r)return e;if("object"==typeof e&&e){if(4&r&&e.__esModule)return e;if(16&r&&"function"==typeof e.then)return e}var d=Object.create(null);b.r(d);var c={};a=a||[null,t({}),t([]),t(t)];for(var f=2&r&&e;"object"==typeof f&&!~a.indexOf(f);f=t(f))Object.getOwnPropertyNames(f).forEach((a=>c[a]=()=>e[a]));return c.default=()=>e,b.d(d,c),d},b.d=(e,a)=>{for(var t in a)b.o(a,t)&&!b.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:a[t]})},b.f={},b.e=e=>Promise.all(Object.keys(b.f).reduce(((a,t)=>(b.f[t](e,a),a)),[])),b.u=e=>"assets/js/"+({308:"4edc808e",377:"1e97172b",649:"3966c8c2",849:"0058b4c6",924:"06d554fa",957:"c141421f",963:"8eaefd7d",1070:"676949b8",1071:"7f054a2a",1235:"a7456010",1316:"d335e700",1363:"095b8897",1990:"2abe96bb",2067:"3d107528",2089:"caefbe75",2138:"1a4e3797",2348:"16d94906",2634:"c4f5d8e4",2736:"03a26634",3331:"41b8106b",3695:"2219eefb",3742:"d41c70b6",4012:"629c335b",4017:"a6354d69",4134:"393be207",4354:"a35b9c0d",4425:"88d9cf00",4738:"78b86cd7",4968:"e6e478e3",5294:"ed9667d2",5554:"4a676520",5742:"aba21aa0",5758:"3dad4aae",5963:"15a8aaa8",6061:"1f391b9e",6191:"cffd46d3",6507:"c948127d",6532:"08a7e062",6571:"f041c855",7098:"a7bd4aaa",7115:"e370ae18",7135:"c6452a81",7350:"09bf824f",7367:"08b0fd35",7635:"48956893",7758:"192704f0",7846:"379aa617",7939:"a7077ceb",8097:"4397b8f1",8374:"71d14268",8401:"17896441",8508:"c0c65583",8528:"85218b1d",8981:"380dfa00",9048:"a94703ab",9647:"5e95c892",9918:"4974b2de"}[e]||e)+"."+{308:"ed08a4c9",377:"6445d6b0",416:"36a683d5",649:"e2285c83",849:"baeb9a27",924:"878c76c3",957:"94fe8bc5",963:"0abe5b6b",1070:"6166643f",1071:"9d53c40f",1235:"7b4b0a20",1316:"8fc1b4ed",1363:"ec2200db",1990:"8c230408",2067:"093b52d6",2089:"b00b6adc",2138:"92e1f722",2237:"9d50d804",2348:"e8c69296",2634:"c0342bce",2736:"e6c0f2b5",3331:"b050b309",3695:"d9988371",3742:"9f5311dd",4012:"ccdb357c",4017:"798add9e",4134:"12ec61c2",4354:"91eb6cef",4425:"b2b0c32d",4738:"3ff76de8",4968:"98cea84e",5294:"510bfcb2",5394:"0b3e82e5",5554:"b3ba0f2e",5742:"9ac6642b",5758:"bcde05ba",5963:"9a0ce681",6061:"0d7187e0",6191:"f9f6196d",6507:"cf1825fb",6532:"1803efac",6571:"4cb3019c",6870:"fd7b5847",6906:"950d99df",7098:"dc097708",7115:"386ef3b1",7135:"d32070f0",7350:"c8a30bf9",7367:"32313c62",7635:"698d4ecf",7758:"dccd25fd",7846:"416f5171",7939:"aafa8bf1",7958:"87e4428d",8097:"44f36960",8374:"1bfe1d8b",8401:"d2a62255",8508:"56360eb7",8528:"b158fd78",8913:"83bce4ad",8981:"877c0a24",9048:"a57082d5",9462:"b5f9db17",9647:"722c003c",9918:"da6d6dac"}[e]+".js",b.miniCssF=e=>{},b.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),b.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),r={},d="website:",b.l=(e,a,t,c)=>{if(r[e])r[e].push(a);else{var f,o;if(void 0!==t)for(var n=document.getElementsByTagName("script"),i=0;i{f.onerror=f.onload=null,clearTimeout(s);var d=r[e];if(delete r[e],f.parentNode&&f.parentNode.removeChild(f),d&&d.forEach((e=>e(t))),a)return a(t)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:f}),12e4);f.onerror=l.bind(null,f.onerror),f.onload=l.bind(null,f.onload),o&&document.head.appendChild(f)}},b.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},b.p="/",b.gca=function(e){return e={17896441:"8401",48956893:"7635","4edc808e":"308","1e97172b":"377","3966c8c2":"649","0058b4c6":"849","06d554fa":"924",c141421f:"957","8eaefd7d":"963","676949b8":"1070","7f054a2a":"1071",a7456010:"1235",d335e700:"1316","095b8897":"1363","2abe96bb":"1990","3d107528":"2067",caefbe75:"2089","1a4e3797":"2138","16d94906":"2348",c4f5d8e4:"2634","03a26634":"2736","41b8106b":"3331","2219eefb":"3695",d41c70b6:"3742","629c335b":"4012",a6354d69:"4017","393be207":"4134",a35b9c0d:"4354","88d9cf00":"4425","78b86cd7":"4738",e6e478e3:"4968",ed9667d2:"5294","4a676520":"5554",aba21aa0:"5742","3dad4aae":"5758","15a8aaa8":"5963","1f391b9e":"6061",cffd46d3:"6191",c948127d:"6507","08a7e062":"6532",f041c855:"6571",a7bd4aaa:"7098",e370ae18:"7115",c6452a81:"7135","09bf824f":"7350","08b0fd35":"7367","192704f0":"7758","379aa617":"7846",a7077ceb:"7939","4397b8f1":"8097","71d14268":"8374",c0c65583:"8508","85218b1d":"8528","380dfa00":"8981",a94703ab:"9048","5e95c892":"9647","4974b2de":"9918"}[e]||e,b.p+b.u(e)},(()=>{var e={5354:0,1869:0};b.f.j=(a,t)=>{var r=b.o(e,a)?e[a]:void 0;if(0!==r)if(r)t.push(r[2]);else if(/^(1869|5354)$/.test(a))e[a]=0;else{var d=new Promise(((t,d)=>r=e[a]=[t,d]));t.push(r[2]=d);var c=b.p+b.u(a),f=new Error;b.l(c,(t=>{if(b.o(e,a)&&(0!==(r=e[a])&&(e[a]=void 0),r)){var d=t&&("load"===t.type?"missing":t.type),c=t&&t.target&&t.target.src;f.message="Loading chunk "+a+" failed.\n("+d+": "+c+")",f.name="ChunkLoadError",f.type=d,f.request=c,r[1](f)}}),"chunk-"+a,a)}},b.O.j=a=>0===e[a];var a=(a,t)=>{var r,d,c=t[0],f=t[1],o=t[2],n=0;if(c.some((a=>0!==e[a]))){for(r in f)b.o(f,r)&&(b.m[r]=f[r]);if(o)var i=o(b)}for(a&&a(t);n{"use strict";var e,a,t,d,r,c={},f={};function b(e){var a=f[e];if(void 0!==a)return a.exports;var t=f[e]={exports:{}};return c[e].call(t.exports,t,t.exports,b),t.exports}b.m=c,e=[],b.O=(a,t,d,r)=>{if(!t){var c=1/0;for(i=0;i=r)&&Object.keys(b.O).every((e=>b.O[e](t[o])))?t.splice(o--,1):(f=!1,r0&&e[i-1][2]>r;i--)e[i]=e[i-1];e[i]=[t,d,r]},b.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return b.d(a,{a:a}),a},t=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,b.t=function(e,d){if(1&d&&(e=this(e)),8&d)return e;if("object"==typeof e&&e){if(4&d&&e.__esModule)return e;if(16&d&&"function"==typeof e.then)return e}var r=Object.create(null);b.r(r);var c={};a=a||[null,t({}),t([]),t(t)];for(var f=2&d&&e;"object"==typeof f&&!~a.indexOf(f);f=t(f))Object.getOwnPropertyNames(f).forEach((a=>c[a]=()=>e[a]));return c.default=()=>e,b.d(r,c),r},b.d=(e,a)=>{for(var t in a)b.o(a,t)&&!b.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:a[t]})},b.f={},b.e=e=>Promise.all(Object.keys(b.f).reduce(((a,t)=>(b.f[t](e,a),a)),[])),b.u=e=>"assets/js/"+({308:"4edc808e",377:"1e97172b",649:"3966c8c2",849:"0058b4c6",924:"06d554fa",957:"c141421f",963:"8eaefd7d",1070:"676949b8",1071:"7f054a2a",1235:"a7456010",1316:"d335e700",1363:"095b8897",1990:"2abe96bb",2067:"3d107528",2089:"caefbe75",2138:"1a4e3797",2348:"16d94906",2634:"c4f5d8e4",2736:"03a26634",3331:"41b8106b",3695:"2219eefb",3742:"d41c70b6",4012:"629c335b",4017:"a6354d69",4134:"393be207",4354:"a35b9c0d",4425:"88d9cf00",4738:"78b86cd7",4968:"e6e478e3",5294:"ed9667d2",5554:"4a676520",5742:"aba21aa0",5758:"3dad4aae",5963:"15a8aaa8",6061:"1f391b9e",6191:"cffd46d3",6507:"c948127d",6532:"08a7e062",6571:"f041c855",7098:"a7bd4aaa",7115:"e370ae18",7135:"c6452a81",7350:"09bf824f",7367:"08b0fd35",7635:"48956893",7758:"192704f0",7846:"379aa617",7939:"a7077ceb",8097:"4397b8f1",8374:"71d14268",8401:"17896441",8508:"c0c65583",8528:"85218b1d",8981:"380dfa00",9048:"a94703ab",9647:"5e95c892",9918:"4974b2de"}[e]||e)+"."+{308:"ed08a4c9",377:"6445d6b0",416:"36a683d5",649:"e2285c83",849:"dce21e24",924:"878c76c3",957:"94fe8bc5",963:"0abe5b6b",1070:"6166643f",1071:"9d53c40f",1235:"7b4b0a20",1316:"8fc1b4ed",1363:"ec2200db",1990:"8c230408",2067:"093b52d6",2089:"b00b6adc",2138:"92e1f722",2237:"9d50d804",2348:"e8c69296",2634:"c0342bce",2736:"e6c0f2b5",3331:"b050b309",3695:"d9988371",3742:"9f5311dd",4012:"ccdb357c",4017:"798add9e",4134:"12ec61c2",4354:"91eb6cef",4425:"b2b0c32d",4738:"3ff76de8",4968:"98cea84e",5294:"510bfcb2",5394:"0b3e82e5",5554:"b3ba0f2e",5742:"9ac6642b",5758:"bcde05ba",5963:"9a0ce681",6061:"0d7187e0",6191:"f9f6196d",6507:"cf1825fb",6532:"1803efac",6571:"4cb3019c",6870:"fd7b5847",6906:"950d99df",7098:"dc097708",7115:"386ef3b1",7135:"d32070f0",7350:"c8a30bf9",7367:"32313c62",7635:"698d4ecf",7758:"dccd25fd",7846:"416f5171",7939:"aafa8bf1",7958:"87e4428d",8097:"d2afc8af",8374:"1bfe1d8b",8401:"d2a62255",8508:"56360eb7",8528:"b158fd78",8913:"83bce4ad",8981:"877c0a24",9048:"a57082d5",9462:"b5f9db17",9647:"722c003c",9918:"da6d6dac"}[e]+".js",b.miniCssF=e=>{},b.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),b.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),d={},r="website:",b.l=(e,a,t,c)=>{if(d[e])d[e].push(a);else{var f,o;if(void 0!==t)for(var n=document.getElementsByTagName("script"),i=0;i{f.onerror=f.onload=null,clearTimeout(s);var r=d[e];if(delete d[e],f.parentNode&&f.parentNode.removeChild(f),r&&r.forEach((e=>e(t))),a)return a(t)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:f}),12e4);f.onerror=l.bind(null,f.onerror),f.onload=l.bind(null,f.onload),o&&document.head.appendChild(f)}},b.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},b.p="/",b.gca=function(e){return e={17896441:"8401",48956893:"7635","4edc808e":"308","1e97172b":"377","3966c8c2":"649","0058b4c6":"849","06d554fa":"924",c141421f:"957","8eaefd7d":"963","676949b8":"1070","7f054a2a":"1071",a7456010:"1235",d335e700:"1316","095b8897":"1363","2abe96bb":"1990","3d107528":"2067",caefbe75:"2089","1a4e3797":"2138","16d94906":"2348",c4f5d8e4:"2634","03a26634":"2736","41b8106b":"3331","2219eefb":"3695",d41c70b6:"3742","629c335b":"4012",a6354d69:"4017","393be207":"4134",a35b9c0d:"4354","88d9cf00":"4425","78b86cd7":"4738",e6e478e3:"4968",ed9667d2:"5294","4a676520":"5554",aba21aa0:"5742","3dad4aae":"5758","15a8aaa8":"5963","1f391b9e":"6061",cffd46d3:"6191",c948127d:"6507","08a7e062":"6532",f041c855:"6571",a7bd4aaa:"7098",e370ae18:"7115",c6452a81:"7135","09bf824f":"7350","08b0fd35":"7367","192704f0":"7758","379aa617":"7846",a7077ceb:"7939","4397b8f1":"8097","71d14268":"8374",c0c65583:"8508","85218b1d":"8528","380dfa00":"8981",a94703ab:"9048","5e95c892":"9647","4974b2de":"9918"}[e]||e,b.p+b.u(e)},(()=>{var e={5354:0,1869:0};b.f.j=(a,t)=>{var d=b.o(e,a)?e[a]:void 0;if(0!==d)if(d)t.push(d[2]);else if(/^(1869|5354)$/.test(a))e[a]=0;else{var r=new Promise(((t,r)=>d=e[a]=[t,r]));t.push(d[2]=r);var c=b.p+b.u(a),f=new Error;b.l(c,(t=>{if(b.o(e,a)&&(0!==(d=e[a])&&(e[a]=void 0),d)){var r=t&&("load"===t.type?"missing":t.type),c=t&&t.target&&t.target.src;f.message="Loading chunk "+a+" failed.\n("+r+": "+c+")",f.name="ChunkLoadError",f.type=r,f.request=c,d[1](f)}}),"chunk-"+a,a)}},b.O.j=a=>0===e[a];var a=(a,t)=>{var d,r,c=t[0],f=t[1],o=t[2],n=0;if(c.some((a=>0!==e[a]))){for(d in f)b.o(f,d)&&(b.m[d]=f[d]);if(o)var i=o(b)}for(a&&a(t);nWelcome to | ROBOT FRAMEWORK
-
+
diff --git a/docs/about/about_us.html b/docs/about/about_us.html
index ec2b1dd9..050db736 100644
--- a/docs/about/about_us.html
+++ b/docs/about/about_us.html
@@ -5,7 +5,7 @@
About RF Guides | ROBOT FRAMEWORK
-
+
diff --git a/docs/about/contribute.html b/docs/about/contribute.html
index b8291936..c94b7164 100644
--- a/docs/about/contribute.html
+++ b/docs/about/contribute.html
@@ -5,7 +5,7 @@
How to contribute | ROBOT FRAMEWORK
-
+
diff --git a/docs/different_libraries/appium.html b/docs/different_libraries/appium.html
index 360da02c..27aa4295 100644
--- a/docs/different_libraries/appium.html
+++ b/docs/different_libraries/appium.html
@@ -5,7 +5,7 @@
Appium Library | ROBOT FRAMEWORK
-
+
diff --git a/docs/different_libraries/browser.html b/docs/different_libraries/browser.html
index 2c8b2f69..6eccb642 100644
--- a/docs/different_libraries/browser.html
+++ b/docs/different_libraries/browser.html
@@ -5,7 +5,7 @@
Browser Library | ROBOT FRAMEWORK
-
+
diff --git a/docs/different_libraries/database.html b/docs/different_libraries/database.html
index 267b6ab3..a6fcb615 100644
--- a/docs/different_libraries/database.html
+++ b/docs/different_libraries/database.html
@@ -5,7 +5,7 @@
Database Library | ROBOT FRAMEWORK
-
+
diff --git a/docs/different_libraries/how_to_find_library.html b/docs/different_libraries/how_to_find_library.html
index 9073078e..ce5c9947 100644
--- a/docs/different_libraries/how_to_find_library.html
+++ b/docs/different_libraries/how_to_find_library.html
@@ -5,7 +5,7 @@
How to find the right library | ROBOT FRAMEWORK
-
+
diff --git a/docs/different_libraries/overview.html b/docs/different_libraries/overview.html
index 709a7564..772153af 100644
--- a/docs/different_libraries/overview.html
+++ b/docs/different_libraries/overview.html
@@ -5,7 +5,7 @@
Library Overview | ROBOT FRAMEWORK
-
+
diff --git a/docs/different_libraries/requests.html b/docs/different_libraries/requests.html
index b5c35bc1..186ae168 100644
--- a/docs/different_libraries/requests.html
+++ b/docs/different_libraries/requests.html
@@ -5,7 +5,7 @@
Requests Library | ROBOT FRAMEWORK
-
+
diff --git a/docs/different_libraries/rpa.html b/docs/different_libraries/rpa.html
index 211da2f5..c20a84fd 100644
--- a/docs/different_libraries/rpa.html
+++ b/docs/different_libraries/rpa.html
@@ -5,7 +5,7 @@
RPA Framework | ROBOT FRAMEWORK
-
+
diff --git a/docs/different_libraries/selenium.html b/docs/different_libraries/selenium.html
index 9fbbcc0c..df677e19 100644
--- a/docs/different_libraries/selenium.html
+++ b/docs/different_libraries/selenium.html
@@ -5,7 +5,7 @@
Selenium Library | ROBOT FRAMEWORK
-
+
diff --git a/docs/different_libraries/standard.html b/docs/different_libraries/standard.html
index a3587202..ffb7e8fa 100644
--- a/docs/different_libraries/standard.html
+++ b/docs/different_libraries/standard.html
@@ -5,7 +5,7 @@
Standard Library | ROBOT FRAMEWORK
-
+
diff --git a/docs/examples/insurance.html b/docs/examples/insurance.html
index bf3f8eae..3991dc54 100644
--- a/docs/examples/insurance.html
+++ b/docs/examples/insurance.html
@@ -5,7 +5,7 @@
Vehicle Insurance App | ROBOT FRAMEWORK
-
+
diff --git a/docs/examples/mfa_login.html b/docs/examples/mfa_login.html
index 445059d7..e0d4d000 100644
--- a/docs/examples/mfa_login.html
+++ b/docs/examples/mfa_login.html
@@ -5,7 +5,7 @@
Login with Multi Factor Authentication | ROBOT FRAMEWORK
-
+
diff --git a/docs/examples/overview.html b/docs/examples/overview.html
index 2685b2c1..3d96c36b 100644
--- a/docs/examples/overview.html
+++ b/docs/examples/overview.html
@@ -5,7 +5,7 @@
Examples Overview | ROBOT FRAMEWORK
-
+
diff --git a/docs/examples/project_structure.html b/docs/examples/project_structure.html
index bffd6a92..f0426d07 100644
--- a/docs/examples/project_structure.html
+++ b/docs/examples/project_structure.html
@@ -5,7 +5,7 @@
Project Structure | ROBOT FRAMEWORK
-
+
diff --git a/docs/examples/restfulbooker.html b/docs/examples/restfulbooker.html
index a93638fd..017a8ace 100644
--- a/docs/examples/restfulbooker.html
+++ b/docs/examples/restfulbooker.html
@@ -5,7 +5,7 @@
Restful Booker | ROBOT FRAMEWORK
-
+
diff --git a/docs/examples/todo.html b/docs/examples/todo.html
index 26eaaba1..75f6d300 100644
--- a/docs/examples/todo.html
+++ b/docs/examples/todo.html
@@ -5,7 +5,7 @@
TodoMVC | ROBOT FRAMEWORK
-
+
diff --git a/docs/extending_robot_framework/custom-libraries/non-python_library.html b/docs/extending_robot_framework/custom-libraries/non-python_library.html
index 15d18a91..81cdafa2 100644
--- a/docs/extending_robot_framework/custom-libraries/non-python_library.html
+++ b/docs/extending_robot_framework/custom-libraries/non-python_library.html
@@ -5,7 +5,7 @@
Non-Python Libraries | ROBOT FRAMEWORK
-
+
diff --git a/docs/extending_robot_framework/custom-libraries/python_library.html b/docs/extending_robot_framework/custom-libraries/python_library.html
index c8ea79d8..c3f19b1f 100644
--- a/docs/extending_robot_framework/custom-libraries/python_library.html
+++ b/docs/extending_robot_framework/custom-libraries/python_library.html
@@ -5,7 +5,7 @@
Python Libraries | ROBOT FRAMEWORK
-
+
diff --git a/docs/extending_robot_framework/custom-libraries/releasing_your_own_libraries.html b/docs/extending_robot_framework/custom-libraries/releasing_your_own_libraries.html
index eb5a4e6c..c9a89e29 100644
--- a/docs/extending_robot_framework/custom-libraries/releasing_your_own_libraries.html
+++ b/docs/extending_robot_framework/custom-libraries/releasing_your_own_libraries.html
@@ -5,7 +5,7 @@
Package and Release Your Own Libraries | ROBOT FRAMEWORK
-
+
diff --git a/docs/extending_robot_framework/listeners_prerun_api/listeners.html b/docs/extending_robot_framework/listeners_prerun_api/listeners.html
index 4ebacf1c..78a8c4d8 100644
--- a/docs/extending_robot_framework/listeners_prerun_api/listeners.html
+++ b/docs/extending_robot_framework/listeners_prerun_api/listeners.html
@@ -5,7 +5,7 @@
Listener Interface | ROBOT FRAMEWORK
-
+
diff --git a/docs/extending_robot_framework/listeners_prerun_api/overview.html b/docs/extending_robot_framework/listeners_prerun_api/overview.html
index 531bb91a..cbcd7e11 100644
--- a/docs/extending_robot_framework/listeners_prerun_api/overview.html
+++ b/docs/extending_robot_framework/listeners_prerun_api/overview.html
@@ -5,7 +5,7 @@
Overview | ROBOT FRAMEWORK
-
+
diff --git a/docs/extending_robot_framework/listeners_prerun_api/prerunmodifier.html b/docs/extending_robot_framework/listeners_prerun_api/prerunmodifier.html
index 761bf6c3..541cdf01 100644
--- a/docs/extending_robot_framework/listeners_prerun_api/prerunmodifier.html
+++ b/docs/extending_robot_framework/listeners_prerun_api/prerunmodifier.html
@@ -5,7 +5,7 @@
PreRunModifier | ROBOT FRAMEWORK
-
+
diff --git a/docs/extending_robot_framework/listeners_prerun_api/rf-api.html b/docs/extending_robot_framework/listeners_prerun_api/rf-api.html
index 3ebd8ec7..0b247105 100644
--- a/docs/extending_robot_framework/listeners_prerun_api/rf-api.html
+++ b/docs/extending_robot_framework/listeners_prerun_api/rf-api.html
@@ -5,7 +5,7 @@
Robot Framework API | ROBOT FRAMEWORK
-
+
diff --git a/docs/flaky_tests.html b/docs/flaky_tests.html
index 14edb318..f983a878 100644
--- a/docs/flaky_tests.html
+++ b/docs/flaky_tests.html
@@ -5,7 +5,7 @@
Re-Execute failed tests | ROBOT FRAMEWORK
-
+
diff --git a/docs/getting_started/ide.html b/docs/getting_started/ide.html
index 535ad784..807c5682 100644
--- a/docs/getting_started/ide.html
+++ b/docs/getting_started/ide.html
@@ -5,7 +5,7 @@
Set up your IDE | ROBOT FRAMEWORK
-
+
diff --git a/docs/getting_started/rpa.html b/docs/getting_started/rpa.html
index 8a873134..b55c2101 100644
--- a/docs/getting_started/rpa.html
+++ b/docs/getting_started/rpa.html
@@ -5,7 +5,7 @@
I'm looking for RPA | ROBOT FRAMEWORK
-
+
diff --git a/docs/getting_started/testing.html b/docs/getting_started/testing.html
index 3e2aeb61..b65e5dc9 100644
--- a/docs/getting_started/testing.html
+++ b/docs/getting_started/testing.html
@@ -5,7 +5,7 @@
I'm looking for testing | ROBOT FRAMEWORK
-
+
diff --git a/docs/getting_started/videos.html b/docs/getting_started/videos.html
index bd91fe3b..d7291177 100644
--- a/docs/getting_started/videos.html
+++ b/docs/getting_started/videos.html
@@ -5,7 +5,7 @@
Videos and Tutorials | ROBOT FRAMEWORK
-
+
diff --git a/docs/parallel.html b/docs/parallel.html
index b14bcfb3..6670211d 100644
--- a/docs/parallel.html
+++ b/docs/parallel.html
@@ -5,7 +5,7 @@
Running tests in parallel | ROBOT FRAMEWORK
-
+
diff --git a/docs/parsing_results.html b/docs/parsing_results.html
index 4d7042a9..a030ff56 100644
--- a/docs/parsing_results.html
+++ b/docs/parsing_results.html
@@ -5,7 +5,7 @@
Parsing Test Results | ROBOT FRAMEWORK
-
+
diff --git a/docs/reporting_alternatives.html b/docs/reporting_alternatives.html
index 319aca32..a6fa6d0a 100644
--- a/docs/reporting_alternatives.html
+++ b/docs/reporting_alternatives.html
@@ -5,7 +5,7 @@
Reporting Test Results | ROBOT FRAMEWORK
-
+
diff --git a/docs/style_guide.html b/docs/style_guide.html
index 54e57edb..d89a7759 100644
--- a/docs/style_guide.html
+++ b/docs/style_guide.html
@@ -3,14 +3,14 @@
-Style Guide | ROBOT FRAMEWORK
+Style Guide | ROBOT FRAMEWORK
-
+
Attributes to variables can be any casing and usually follow the use case.
The variable itself should follow the casing rules of its scope.
-
Attribute Variables ${local variable.name} Set Variable this is a variable ${local variable.foo} Set Variable this is a local attribute Set Suite Variable ${SUITE VARIABLE.name} this is a suite variable ${SUITE VARIABLE.bar} Set Variable this is a suite attribute
Attribute Variables ${local variable.name} Set Variable this is a variable ${local variable.foo} Set Variable this is a local attribute Set Suite Variable ${SUITE VARIABLE.name} this is a suite variable ${SUITE VARIABLE.bar} Set Variable this is a suite attribute
Templated test cases and tasks share the same guidelines. Below are examples for the
+different cases, depending on how templates are used.
+
Example 1
Example 2
Example 3
Example 4
*** Settings *** DocumentationTemplated test case. Test Template Template Keyword *** Test Cases *** COLUMN1 COLUMN2 COLUMN3 Test Case 00000 aaaaa AAAAAAAAAA 1111111111 bbb BBBBBBBBBBBBBB ${EMPTY} aaaa AAAAAAA ${EMPTY} bbbbbbb BBB ${NONE} a AAAAAAAAAA ${NONE} bbb BBBBBBBBBBBBBB *** Keywords *** Template Keyword [Arguments]${arg1}${arg2}${arg3} Log Many${arg1}${arg2}${arg3}
*** Settings *** DocumentationTwo templated tasks. Task Template Template Keyword *** Tasks *** COLUMN1 COLUMN2 COLUMN3 First Task 00000 aaaaa AAAAAAAAAA 1111111111 bbb BBBBBBBBBBBBBB ${EMPTY} aaaa AAAAAAA ${EMPTY} bbbbbbb BBB ${NONE} a AAAAAAAAAA ${NONE} bbb BBBBBBBBBBBBBB Another Task With Longer Name 00000 a AAAAAAAAAA 1111111111 bbbbbbbbbbb BBBBBBBBBBBBBB ${EMPTY} aa AAAAAAA ${EMPTY} bbbb BBB ${NONE} aaaaaaaaaa AAAAAAAAAA ${NONE} bb BBBBBBBBBBBBBB *** Keywords *** Template Keyword [Arguments]${arg1}${arg2}${arg3} Log Many${arg1}${arg2}${arg3}
*** Settings *** DocumentationIndividually named test cases. ... Tests sorted according to ARG values. Test Template Template Keyword *** Test Cases *** ARG SECOND ARG ANOTHER ARG Test abc123 aaaa AAAAAAAAAA Another Test 1111111111 bbb BBBBBBBBBBBBBB One More Test With Long Name 222 cc CCCCCCCCCCCCCCC Test With Empty${EMPTY} aaaa AAAAAAAAAA Another Test With Empty${EMPTY} bbb BBBBBBBBBBBBBB One More Test With Empty${EMPTY} cc CCCCCCCCCCCCCCC Test With None${NONE} aaaa AAAAAAAAAA Another Test With None${NONE} bbb BBBBBBBBBBBBBB One More Test With None${NONE} cc CCCCCCCCCCCCCCC *** Keywords *** Template Keyword [Arguments]${arg1}${arg2}${arg3} Log Many${arg1}${arg2}${arg3}
*** Settings *** DocumentationEeach test case using different template. *** Test Cases *** Test Case With Template A [Template] Template A aa 123 a Hello Word! aaaaaa${5} aaa${NONE} Test Case With Template B [Template] Template B bbbbbbbbbbbbb 456 ${1.5} bbbbbbbb${EMPTY} anything bbb something 7899999999999 bbbbbbbbbbb${2}${EMPTY} *** Keywords *** Template A [Documentation]This is first template. [Tags] A [Arguments]${arg1}${arg2} Log Many${arg1}${arg2} Template B [Documentation]This is second template. [Tags] B [Arguments]${arg_one}${arg_two}${arg_three} Log Many${arg_one}${arg_two}${arg_three}
+
In Example 1, section name *** Test Cases *** and COLUMN1 are separated by 4 spaces, as well as following
+columns. The distance is measured between the longest item in the given column and the start of the following column.
+For example, the longest item in the first column is 1111111111, therefore, corresponding item in the next
+column, bbb is separated by 4 spaces from it.
+
In Example 2, there are two tasks in one file, and the
+data in all tasks are aligned with respect to each other. In each task, for easier navigation, data rows with constant
+values are listed first, next with ${EMPTY} and ${NONE}.
+
If the number of iterations, or the number of test cases/tasks grow, it is a good idea to sort rows in certain logical
+order if applicable. This will ease finding the relevant raws when adding or removing data. Empty lines can be used to
+separate tests into logical groups as in Example 3. When dealing with large data, consider using
+DataDriver library.
+
In Example 4, there are different templates set for different test cases. The data is aligned within each test
+case. This is because they are using different templates and therefore, are independent. Note that the columns are not
+titled - this is an exception in the per-test case templates because title placement on the same line as test names, and
+[Template] setting between the columns titles and the data, would make the tests unreadable.
In special cases, there might be a need to specify Documentation and Tags for each test case.
+To achieve consistent formatting, they can be represented in columns just like test data,
+by passing them as arguments to the Template Keyword:
+
*** Settings *** DocumentationDifferent Tags and Documentation for each test case. Test Template Template Keyword *** Test Cases *** ARG1 ARG2 [Documentation] [Tags] TestA aaa AAA Prints some message tagA TestB bbb BBB Prints another message tagB *** Keywords *** Template Keyword [Arguments]${arg1}${arg2}${documentation}${tag} [Setup] Set Tags And Documentation ${documentation}${tag} Log Many${arg1}${arg2} Set Tags And Documentation [Arguments]${documentation}${tag} Set Test Documentation${documentation} Set Tags${tag}
+
Square brackets around the column titles, [Documentation] and [Tags], are merely to resemble the Settings
+syntax. This is to distinguish them from the test data.