RobotCode
The complete Robot Framework toolkit
Robot Framework testing — same intelligence in your editor, on the command line, and in your CI pipeline. From your first keyword to enterprise scale.
Free and open source, built with the communityEverything for your Robot Framework project
Section titled “Everything for your Robot Framework project”Context-aware completion for keywords (incl. embedded args), variables, libraries and resources. Hover docs, go-to-definition, find references, signature help, and live diagnostics — all powered by Robot Framework's own parser. Optional Robocop integration adds further linting and formatting checks on top. The Documentation Viewer and the Keywords view show the keywords of your libraries and resource files.
Discover and run tests from the editor's test panel or the CLI. Set breakpoints, step through keywords, inspect variables via the Debug Adapter Protocol, and jump straight to failures.
A unified robot.toml with profiles for dev, staging, CI, OS-specific or browser-specific setups. Editor, CLI and CI all read the same configuration — what works locally works in CI.
A complete command-line interface for running, discovering, analyzing and inspecting Robot Framework projects. Every command is project-aware, JSON-friendly, and CI-ready.
Try keywords interactively with
robotcode repl, in a terminal or in VS Code. Great for experimentation, demos, and debugging snippets; attach the debugger at the prompt to stop inside a keyword and inspect its variables.One Robot Framework language server powers VS Code, JetBrains, Neovim and any LSP-capable editor. Choose your IDE — the language features stay aligned.
Turn your AI agent into a Robot Framework engineer
The RobotCode skill teaches your agent to work through your project's own robotcode CLI — so it sees your tests, keywords and results the way Robot Framework resolves them, with the profiles of your project's robot.toml, instead of guessing from files. For tests and RPA tasks alike.
- GitHub Copilot
- Claude Code
- Codex
- Open Plugins agents
I want to test our web shop with the Browser library, but I've never used it. How do I open a page, type into a field and check a text?
- Ran
robotcode doc keywords Browser "new page" "fill text" "keyboard key" "get text"- Fill Text (selector: str, txt: str, force: bool = ${False}) — Clears and fills the given txt into the text field found by selector. - Get Text (selector: str, assertion_operator: …, assertion_expected: …, …) — Returns text attribute of the element found by selector. - Keyboard Key (action: KeyAction, key: str, …) — Press a keyboard key on the virtual keyboard or set a key up or down. - New Page (url: str | None = ${None}, wait_until: PageLoadStates = load) — Open a new Page. Open the shop with
New Page, type withFill Textand press Enter withKeyboard Key.Get Textreads a text and, given an operator, checks it too:Get Text selector == expected.Great. Then write a test for
requirements/SHOP-110.md.- Read
requirements/SHOP-110.md# SHOP-110: Search products 1. The start page has a search field labelled "Search products". 2. When I type a text and press Enter, the shop lists every product whose name contains the text, with its price. 3. The search ignores upper and lower case. 4. When no product matches, the shop shows "No products found".
- Ran
robotcode repl>>> Import Library Browser >>> New Page ${BASE_URL} [ INFO ] Successfully initialized new page object and opened url: http://localhost:8080 >>> Fill Text css=input[aria-label="Search products"] COFF [ INFO ] Fills the text 'COFF' in the given field. >>> Keyboard Key press Enter >>> Get Text css=.product .name [ INFO ] Text: ['coffee'] - Wrote
tests/web_search.robot*** Test Cases *** Search Lists Every Matching Product [Metadata] Requirement SHOP-110 Search Products For e Get Element Count css=.product == 3 Search Ignores Case … Search Without A Match Shows A Message … *** Keywords *** Search Products For Fill Text css=input[aria-label="Search products"] ${text} Keyboard Key press Enter - Ran
robotcode robot -bl "Tests.Web Search"Search Lists Every Matching Product | PASS | Search Ignores Case | PASS | Search Without A Match Shows A Message | PASS | 3 tests, 3 passed, 0 failed
Done:
tests/web_search.robottests criteria 2 to 4 of SHOP-110, each test marked with the requirement, and finds the search field by the label of criterion 1. All three tests pass.Add one of them to the smoke tests.
- Edited
tests/web_search.robotSearch Ignores Case [Documentation] Upper and lower case do not matter. [Metadata] Requirement SHOP-110 + [Tags] smoke - Ran
robotcode discover tests -i smoke- Tests.Cart.Add Item To Cart (tests/cart.robot:15) - Tests.Login.Login Works (tests/login.robot:11) - Tests.Login.Logout Works (tests/login.robot:18) - Tests.Orders.Order Coffee (tests/orders.robot:14) - Tests.Web Search.Search Ignores Case (tests/web_search.robot:19)
Search Ignores Caseis taggedsmokenow; the smoke test has five tests.
Which tests are in our smoke test?
- Ran
robotcode discover tests -i smoke- Tests.Cart.Add Item To Cart (tests/cart.robot:15) - Tests.Login.Login Works (tests/login.robot:11) - Tests.Login.Logout Works (tests/login.robot:18) - Tests.Orders.Order Coffee (tests/orders.robot:14) Suites: 4, Suites with tests: 3, Tests: 4
Four tests are tagged
smoke:Add Item To Cart,Login Works,Logout WorksandOrder Coffee. The search has none yet.Run them against staging.
- Ran
robotcode profiles list| Name | Description | |:-----|:----------------------| | ci | Staging shop | | dev | Local shop in Firefox |
- Ran
robotcode -p ci robot -i smokeAdd Item To Cart | PASS | Login Works | FAIL | Welcome back, alice! != Welcome back, Alice! Logout Works | PASS | Order Coffee | PASS | Tests :: Web shop acceptance tests | FAIL | 4 tests, 3 passed, 1 failed
The
ciprofile points to the staging shop. There, 3 tests passed andLogin Worksfailed:Welcome back, alice! != Welcome back, Alice!. Shall I look into it?
Which tests cover the cart requirements SHOP-201 to SHOP-203?
- Ran
robotcode discover tests -btm "Requirement:SHOP-20?" --show-metadata- Tests.Cart.Add Item To Cart (tests/cart.robot:15) - Metadata: Requirement: SHOP-201 - Tests.Cart.Remove Item From Cart (tests/cart.robot:22) - Metadata: Requirement: SHOP-202 - Tests.Cart.Cart Total Adds Up (tests/cart.robot:29) - Metadata: Requirement: SHOP-203, Risk: high
Each requirement has one test, all in
tests/cart.robot:Add Item To Cart(SHOP-201),Remove Item From Cart(SHOP-202) andCart Total Adds Up(SHOP-203), which is marked as high risk.Which tests are marked as high risk?
- Ran
robotcode discover tests -btm "Risk:high" --show-metadata- Tests.Cart.Cart Total Adds Up (tests/cart.robot:29) - Metadata: Requirement: SHOP-203, Risk: high - Tests.Login.Login With A Wrong Password Fails (tests/login.robot:26) - Metadata: Requirement: SHOP-103, Risk: high - Tests.Orders.Sold Out Product Cannot Be Ordered (tests/orders.robot:27) - Metadata: Requirement: SHOP-303, Risk: high
Three, one each in cart, login and orders:
Cart Total Adds Up,Login With A Wrong Password FailsandSold Out Product Cannot Be Ordered.Does every requirement in
requirements/have a test?- Ran
ls requirementsSHOP-110.md
- Ran
robotcode discover tests -btm "Requirement:SHOP-110"(no tests matched)
No.
requirements/holds one requirement, SHOP-110 (Search products), and no test is marked with it yet. Shall I write one?
Why did
Login Worksfail in last night's run?- Ran
robotcode results summary --failed- ❌ FAIL Tests.Login.Login Works (tests/login.robot:11) > Welcome back, alice! != Welcome back, Alice!
- Ran
robotcode results log -bl "Tests.Login.Login Works"- shop.Open Shop As alice ✅ PASS - shop.Welcome Message Should Be Welcome back, Alice! ❌ FAIL - ${greeting} = ShopLibrary.Greeting ✅ PASS [INFO] ${greeting} = Welcome back, alice! - BuiltIn.Should Be Equal ${greeting} ${expected} ❌ FAIL The login works — the greeting doesn't match: the shop greets with the login name
alice, while the test expectsAlice.Show me in the debugger what the shop returns there.
- Ran
robotcode robot-debug -bl "Tests.Login.Login Works"* exception BuiltIn.Should Be Equal (resources/shop.resource:19) (rdb) .where > #0 BuiltIn.Should Be Equal resources/shop.resource:19 #1 shop.Welcome Message Should Be tests/login.robot:16 #2 Login Works tests/login.robot:11 (rdb) .print ${greeting} ${greeting} = 'Welcome back, alice!' It stops in
Should Be Equal, called byWelcome Message Should Beat login.robot:16. There,${greeting}isWelcome back, alice!.The test is right, Alice is the display name. Fix the shop.
- Edited
libraries/ShopLibrary.py- return f"Welcome back, {self._user}!" + return f"Welcome back, {self._user.capitalize()}!"
- Ran
robotcode robot -bl "Tests.Login.Login Works"Login Works | PASS | 1 test, 1 passed, 0 failed
Fixed:
Greetingnow capitalizes the user name, andLogin Workspasses.
Can the Browser library run our web tests in Firefox?
- Ran
robotcode doc keyword Browser "New Browser"### Keyword New Browser | browser | : SupportedBrowsers | = | chromium | Opens the specified browser. … | headless | : bool | = | ${True} | Set to False if you want a GUI. … … ### SupportedBrowsers (Enum) | chromium | Google Chrome, Microsoft Edge (since 2020), Opera | | firefox | Mozilla Firefox | | webkit | Apple Safari, Mail, AppStore on MacOS and iOS | Since Playwright comes with a pack of builtin binaries for all browsers, no additional drivers e.g. geckodriver are needed. Yes:
New Browser firefox, orwebkit. No driver needed, only the browser itself, once:rfbrowser init firefox. Yourdevprofile already setsBROWSERtofirefox.Then run the web tests in Firefox.
- Edited
tests/web_search.robot-Suite Setup New Page ${BASE_URL} +Suite Setup Open The Shop … +Open The Shop + [Documentation] Opens the shop in the browser of the selected profile. + New Browser ${BROWSER} + New Page ${BASE_URL}
- Ran
robotcode -p dev robot -bl "Tests.Web Search"Search Lists Every Matching Product | PASS | Search Ignores Case | PASS | Search Without A Match Shows A Message | PASS | 3 tests, 3 passed, 0 failed
The suite now opens
New Browser ${BROWSER}; with-p devthat is Firefox, and all three tests pass. Without a profile they keep running in Chromium.
What arguments does our
Create Orderkeyword take?- Ran
robotcode doc keywords resources/orders.resource "create order"# Resource orders - Create Order (product, quantity = 1, express = ${False}) — Creates an order for quantity items of product and returns its id. productis required;quantitydefaults to1andexpressto${False}. It returns the order id.And what does it do to place the order?
- Read
resources/orders.resourceCreate Order [Arguments] ${product} ${quantity}=1 ${express}=${False} Log Ordered ${quantity} x ${product} (express: ${express}) ${id}= Place Order ${product} ${quantity} ${express} RETURN ${id} - Ran
robotcode doc keywords ShopLibrary "place order"# Library ShopLibrary - Place Order (product: str, quantity: int = ${1}, express: bool = ${False}) — Places an order and returns its id. Fails if product is out of stock. It logs the order and calls
Place OrderfromShopLibrary, a Python library:quantityis converted to anint,expressto abool, and it fails if the product is out of stock.Try it out — what happens with a product that is sold out?
- Ran
robotcode repl>>> Import Resource ${CURDIR}/resources/orders.resource >>> ${order}= Create Order coffee quantity=2 [ INFO ] Ordered 2 x coffee (express: False) [ INFO ] ${id} = order-4711 [ INFO ] ${order} = order-4711 >>> Create Order mug [ INFO ] Ordered 1 x mug (express: False) [ FAIL ] mug is out of stock Coffee is ordered as
order-4711. The mug is sold out, soCreate Orderfails withmug is out of stock, which is whatSold Out Product Cannot Be Orderedexpects.
Check the project for problems before I push.
- Ran
robotcode analyze coderesources/orders.resource:31:5: [ERROR] KeywordNotFound: No keyword with name 'Submit Ordr' found. Files: 8, Errors: 1, Warnings: 0, Infos: 0, Hints: 0
One error:
CheckoutcallsSubmit Ordrin orders.resource:31 — a typo forSubmit Order. Shall I fix it?Yes, please.
- Edited
resources/orders.resource- Submit Ordr ${order} + Submit Order ${order}
- Ran
robotcode analyze codeFiles: 8, Errors: 0, Warnings: 0, Infos: 0, Hints: 0
Fixed, the project has no errors now.
Is there anything we don't use anymore?
- Ran
robotcode analyze code --collect-unusedresources/orders.resource:28:1: [WARNING] KeywordNotUsed: Keyword 'Checkout' is not used. Files: 8, Errors: 0, Warnings: 1, Infos: 0, Hints: 0
Only
Checkout(orders.resource:28): no test calls it, which is also why the typo never failed a run. Remove it, or add a test that checks out?
Commands and output from real runs of an example project, abridged.
- Writes tests from your requirementsLearns the libraries you use, tries keywords and locators live in the REPL, then writes the test and runs it.
- Finds out why a test failedFrom the results of the last run, a CI artifact or a colleague's run, without running everything again or loading
output.xmlinto the chat. - Debugs at a real breakpointPauses the real run where it fails, reads the call stack and the variables, and tries keywords right there.
- Knows your projectWhich tests, tasks, tags and suites exist, and which tests cover a requirement, resolved the way Robot Framework does instead of by grepping files.
- Explains libraries and keywordsFrom the versions installed in your environment, including your own resources and Python libraries.
- Runs exactly what you ask forA single test, a tag or a suite, with the profile for staging, CI or another browser.
- Keeps the code cleanFinds unknown keywords, wrong arguments, unresolved variables and unused code before anything runs, and fixes them.
- Compares runsWhat fails for the first time, what passes again, and statistics by tag or suite.
- Sets up your configurationProfiles, variables and paths in
robot.toml, written from each setting's documentation and checked against the effective configuration.
Watch: RoboCon 2024 tutorial
Section titled “Watch: RoboCon 2024 tutorial”This recorded RoboCon 2024 tutorial starts with the RobotCode extension for VS Code and then shows RobotCode's command line tools: the robot.toml configuration, profiles, and querying and checking a project from the console.
- Length: ~2 hours.
- Level: Beginner to advanced — basic knowledge of Robot Framework and Python is recommended.
What you will learn:
- Installing the RobotCode and Even Better TOML extensions in VS Code and setting up a project.
- Writing a first test with the Browser library, built step by step in the Debug Console.
- Looking up library keywords and their documentation in the editor.
- Creating a
robot.tomland running tests from the command line with different profiles, also selecting profiles in VS Code. - Querying a project's suites, tests and tags and checking its quality with
robotcode. - and more...
Latest news
Section titled “Latest news”- What's New in v2.8.0RobotCode v2.8.0 is a big release. It supports Robot Framework 7.5, gives the PyCharm plugin its biggest update yet, with nearly everything the VS Code extension offers, adds a Documentation Viewer to VS Code, and moves the website to a new platform with a new structure, a polished design and new guides, along with much more.
- What's New in v2.7.0RobotCode 2.7.0 adds a wrapper option to run tests inside a prepared environment, makes the analysis cache reliable, and fixes Test Explorer subset runs.
- What's New in v2.6.2Bug fixes in 2.6.1 and 2.6.2: the Test Explorer recovers after server restarts, corrupt caches rebuild, and stale profiles no longer block test runs.
Open source
Free and open source, built with the community
Section titled “Free and open source, built with the community”RobotCode is free and open source under the Apache-2.0 license — developed in close collaboration with the Robot Framework Core team and a worldwide community of testers, developers, and contributors.
Sponsor RobotCode
Section titled “Sponsor RobotCode”Individual:
- GitHub Sponsors – monthly or one-time
- Open Collective – one-time or recurring
Corporate:
- Open Collective – direct, transparent, invoices, public ledger
- Robot Framework Foundation membership – ecosystem support, indirectly benefits RobotCode
See Support & Contribute for non-financial ways to help — bug reports, PRs, community help, and more.
Powered by
Section titled “Powered by”Released under the Apache-2.0. Copyright © 2022-present Daniel Biehl