Robotframework

Latest version: v7.0

Safety actively analyzes 629678 Python packages for vulnerabilities to keep your Python projects secure.

Scan your dependencies

Page 13 of 14

2.9b2

Robot Framework 2.9 beta 2

RF 2.9 beta 2 is the fifth preview version of the forthcoming RF 2.9 release. It contains, for example, high priority enhancements related to variables and supports creating keywords with embedded arguments in test libraries. After this release the work continues with the first release candidate. All issues targeted for RF 2.9 can be found from the [issue tracker](https://github.com/robotframework/robotframework/issues?q=milestone%3A2.9).

Most important new features in beta 2 over beta 1 are the new for-in-zip and for-in-enumerate loops (1952) and change in syntax to adding variables to evaluation namespace of `Evaluate`, `Run Keyword If`, and other built-in keywords (2040). The issue list at the end of this release note mentions for each feature in which preview it came, but otherwise the notes here describe the changes in 2.9 over 2.8.7, therefore containing also previous preview changes.

Questions and comments related to this release can be sent to the [robotframework-users](http://groups.google.com/group/robotframework-users) and possible bugs submitted to the [issue tracker](https://github.com/robotframework/robotframework/issues).

We have not generated windows installers for this preview, but the source distribution is available from [PyPI](https://pypi.python.org/pypi/robotframework/2.9b2) and the standalone jar with Jython 2.7 can be found from downloads below these release notes.

If you have pip just run `pip install --upgrade --pre robotframework` to install or upgrade to the latest version or use `pip install robotframework==2.9b2` to install exactly this version. For more details and other installation approaches see [installation instructions](https://github.com/robotframework/robotframework/blob/master/INSTALL.rst).

Robot Framework 2.9 beta 2 was released on Thursday July 2, 2015.

Compatibility with other projects

Robot Framework 2.9 should, for most parts, be compatible with other projects in the larger Robot Framework ecosystem. It may, however, take some time before tools support new syntax like dictionary variables or keyword tags. Additionally, big internal changes may affect tools that have used internal APIs. Libraries and tools know not to be compatible with Robot Framework 2.9 will be listed here.
- RIDE 1.4 and older is not compatible with new syntax added in Robot Framework 2.9.
- Selenium2Library 1.7 and older [use an internal API](https://github.com/rtomac/robotframework-selenium2library/issues/429) that was removed in Robot Framework 2.9 beta 1. Selenium2Library 1.7.1 is fully compatible with Robot Framework 2.9.
- Robot Framework Jenkins plugin 1.6.0 and older [can not parse the new output.xml](https://issues.jenkins-ci.org/browse/JENKINS-29178) A new version of Jenkins plugin with fixed output parsing should be released shortly after beta 2 is out.

Most important enhancements

Dictionary variable type (1450)

The most noticeable feature in RF 2.9 is the new syntax to create and use dictionary (a.k.a map or hashtable) variables. Dictionaries can be returned from keywords or created in variable files, but they can also be created in the variable table:

robotframework
*** Variables ***
&{DICT} key=value second=2 third=${3}


The above example will create a dictionary variable `&{DICT}` with Python dictionary `{'key': 'value', 'second': '2', 'third': 3}` as the value. If a dictionary variable is used as a scalar variable like `${DICT}`, it will be passed forward as a single argument containing the whole dictionary. If it used like `&{DICT}`, individual items are passed as named arguments. For example, these two examples are equivalent:

robotframework
*** Test Cases ***
Example 1
My Keyword key=value second=2 third=${3}
Example 2
My Keyword &{DICT}


Individual dictionary variable items can be accessed either using special `&{DICT}[key]` syntax similarly as individual list variable items can be accessed like `{LIST}[0]`. As a special feature, dictionary variables are ordered and allow accessing values also using attribute access like `${DICT.key}`. For more information about dictionary variables, see Variables section in the [User Guide](http://robotframework.org/robotframework/#user-guide).

**NOTE**: RIDE editor does not currently support dictionary variables.

Python style `**kwargs` support with user keywords using `&{kwargs}` syntax (1561)

New dictionary variable syntax can be used with user keywords to accept free keyword arguments similarly as Python based keywords can accept `**kwargs`. This can be accomplished simply by having a dictionary variable like `&{kwargs}` as the last argument in user keyword argument specification:

robotframework
*** Keywords ***
Run My Process
[Arguments] {arguments} &{configuration}
Run Process myproc.exe {arguments} &{configuration}


Also this new functionality is explained with further examples in the [User Guide](http://robotframework.org/robotframework/#user-guide).

Embedded arguments in keywords defined in test libraries (1818)

User keywords have supported embedded arguments since RF 2.1.1 (370), and finally this functionality is supported also by library keywords. This is accomplished by giving a custom name to a keyword by setting `robot_name` attribute manually or by using `robot.api.deco.keyword' decorator (1835), and using`${args}` in the name similarly as with user keywords. The implementing method or function must also accept same number of arguments as there are embedded argument.

python
from robot.api.deco import keyword

keyword(name='User "${user}" selects "${item}" from webshop')
def select_item(user, item):
...


The [User Guide](http://robotframework.org/robotframework/#user-guide) is, again, the place where to find more information and examples.

Keyword categorization (i.e. tagging) support

Keywords can now have tags (925). The tags can be added to user keywords either by new `[Tags]` setting, or by adding them to the last line of documentation.

robotframework
*** Keywords ***
My keyword
[Tags] tag1 tag2
No Operation
My other keyword
[Documentation] Tags can also be added as last line of documentation.
... Tags: tag1, tag2
No Operation


Library keywords can also use documentation to specify their tags or they can be added to `robot_tags`attribute for each method. The `keyword` decorator provides a handy shortcut for specifying tags for each method.

python
from robot.api.deco import keyword

keyword(tags=['tag1', 'tag2'])
def select_item(user, item):
...


Libdoc will show keywords by tags (1840) and tags can also be used to specify keywords for `--removekeywords` and `--flattenkeywords` commandline options (1935).

Programmatic modifications of test data and results as part of normal execution

It is now possible to specify modifiers to preprocess the test data before the test run and to modify the results before generation of log and report. The modifiers can be taken into use with `--prerunmodifier` and `--prerebotmodifier`. See the issue 1976 for an example and more details.

Less verbose and quiet console outputs (317)

New option `--console` allows changing the console output type. Possible values are `verbose` (default), `dotted` (x-unit like output where each passing test prints only a dot), `quiet` (no output except warnings and errors) and `none` (no output whatsoever). Dotted output has a shortcut `--dotted` or `-.` as a short option.

Variables are added to evaluation namespace of `Evaluate`, `Run Keyword If`, ... (2040)

Robot´s variables are now available with `$`-prefix as Python variables in evaluation namespace of BuiltIn library keywords.

The two rows below are now equivalent (assuming value of `${my var}` is a string):

robotframework
*** Keywords ***
My keyword
Run keyword if "${my var}" != "Foo" ... old syntax
Run keyword if $my_var != "Foo" ... new syntax in 2.9


_NOTE:_ The syntax was changed in beta 2 to require the `$` prefix.

`FOR ... IN ZIP ...` and `FOR ... IN ENUMERATE` (1952)

New for loop syntax allows use of for-in-zip and for-in-enumarete loops.

robotframework
*** Keywords ***
For in zip example take elements from both lists
:FOR ${number} ${name} IN ZIP ${NUMBERS} ${NAMES}
\ Number Should Be Named ${number} ${name}
For in enumerate example take an item and an increasing index number
:FOR ${index} ${item} IN ENUMERATE {LIST}
\ My Keyword ${index} ${item}


See the [userguide](http://robotframework.org/robotframework/2.9b2/RobotFrameworkUserGuide.html#for-loops) for more details.

Other high priority enhancements and fixes
- Scalar and list variables stored in same namespace (1905)
- Standard libraries do not mask third party Python modules (1737)
- Fixed sporadic failures with timeouts on IronPython (1931)
- `--ExitOnFailure` does not work if test/suite setup/teardown fails (2004)
- Support yaml files as first class variable file (1965)
- Run Keyword If Test (Failed / Passed) will detect failure in teardown ( 1270)
- DateTime: DST problems when calculating with dates (2018)
- Use lighter and more neutral colors for report and log html page (1943)

Backwards incompatible changes

Being a major release, RF 2.9 contains lot of changes and some of them are backwards incompatible.

List and scalar variables stored in same namespace (1905)

It has been possible to use a list variable `{list}` as a scalar variable `${list}` since RF 2.0.3 (117), and scalar variables containing lists have been usable as list variables since RF 2.8 (483). It has, however, been possible to also create scalar and list variables with same base name, for example, in the variable table:

robotframework
*** Variables ***
${VAR} Scalar variable
{VAR} List variable


This caused a lot of confusion, and the addition of `&{dictionary}` variables (1450) would have made situation even more complicated. As a result it was decided to store all variables in the same namespace (1905) and decide how they are used depending on the format (e.g. `${var}` for scalar, `{var}` for list, and `&{var}` for dictionary).

As a result of this change, tests using scalar and list variables with same base name will need to be updated. Unfortunately there is no other good way to detect these problems than running tests with the new version and seeing does anything break.

Variables no longer leak to lower level keywords (532)

Local variables used to leak from test to keywords and from keywords to lower level keywords. The example below shows variable leaking from test to keyword:

robotframework
*** Test Case ***
Example
${x}= Set Variable hello
My keyword

*** Keywords ***
My keyword
Should be equal ${x} hello


This behaviour was never intended, but fixing the bug can break tests where this was used either intentionally or by accident.

Drop Python/Jython 2.5 support (1928)

With the official Jython 2.7 version out, we dropped the support for Python and Jython 2.5 series. The standalone jar contains Jython 2.7 from now on.

PYTHONPATH environment variable is not processed with Jython or IronPython anymore (1983)

Robot Framework used to add PYTHONPATH to JYTHONPATH for Jython and to IRONPYTHONPATH for IronPython. In RF 2.9 Jython and IronPython will ignore PYTHONPATH and you need to use the correct path environment variable for your executor.

Execution directory not added automatically to module search path (2019)

The directory where execution is started from is not anymore added to the module search path. If it is needed, `PYTHONPATH`, `JYTHONPATH` or `IRONPYTHONPATH` environment variable can be explicitly set to `.` before execution.

Standard libraries not importable in Python w/o `robot.libraries` prefix (1737)

It used to be possible to import Robot Framework's standard libraries in Python code by just using the library name like `import DateTime`. This caused problems in with standard libraries having same name as third party Python modules like [DateTime](https://pypi.python.org/pypi/DateTime/4.0.1).

To avoid these problems, standard libraries are not anymore directly importable in Python code. They are still importable with the `robot.libraries` prefix like `from robot.libraries import DateTime`. This has also always been the recommended way and the one used in examples in the User Guide.

Disabling command line options accepting no values by using same option again not supported anymore

Earlier it was possible to disable options accepting no values like `--dryrun` by giving the option again like `--dryrun --other options --dryrun`. This was rather confusing, and nowadays it is possible to do that by using the same option with `no` prefix like `--nodryrun` instead (1865). If option is used with and without the `no` prefix, the last used value has precedence. Having same option multiple times has no special functionality anymore.

Possible equal signs in arguments to `BuiltIn.Call Method` need to be escaped

`Call Method` nowadays supports `**kwags` (1603) and thus possible equal signs in normal arguments need to be escaped with a backslash like `hello\=world`.

Unused internal functions, classes, etc. removed

See issue 1924 for a detailed list of changes to internal APIs. These changes should not affect libraries or tools using Robot Framework's public APIs.

Other backwards incompatible changes

These changes should generally not cause problems in real life. See linked issues for more details if you think you may be affected.
- Empty elements or attributes are not written to output.xml (2020)
- Not possible to use keyword with embedded arguments as a normal keyword (1962)
- When assigning keyword return values to multiple scalar variables, an exact number of values is required (1910)
- `Create Dictionary` keyword moved from Collections to BuiltIn (1913)
- Keyword name conflict involving Remote library keyword causes failure and not warning (1815)
- Possibility to set scalar variables with lists value using `Set Test/Suite/Global Variable` keyword removed (1919)
- Variable assignment is not anymore be part of keyword name with --removekeywords, in logs, in listener interface, or in other APIs (1611)
- Deprecated syntax for repeating single keyword removed (1775)
- Deprecated `--runmode` option removed (1923)
- Deprecated `--xunitfile` option removed in favor of `--xunit` (1925)
- Deprecated way to exit for loops using custom exception with `ROBOT_EXIT_FOR_LOOP` attribute has been removed (1440)
- Run Keyword If Test (Failed / Passed) did not detect failure in teardown (1270)
- DateTime: DST problems when calculating with dates (2018)
- `FAIL` is no longer useable as a normal log level (2016)
- Console colors and markers: Fail if given value is invalid and remove outdated `FORCE` color value (2031)
- OperatingSystem and Dialogs: Remove partial support for running without Robot Framework itself (2039)

Deprecated features

Robot Framework 2.9 also deprecates some features that will be removed in the future releases. See linked issues for more details.
- `OperatingSystem.Start Process` keyword deprecated in favor of much more flexible `Process.Start Process` (1773)
- Listener interface version 1.0 deprecated (1841)
- `--runfailed` and `--rerunmerge` options deprecated in favor of `--rerunfailed` and `--merge`, respectively (1642)
- Old `Meta: Name` syntax for specifying test suite metadata deprecated (1918)
- `DeprecatedBuiltIn` and `DeprecatedOperatingSystem` officially deprecated (1774)
- Deprecate `--monitorxxx` options in favor of `--consolexxx` (2027)

Acknowledgements

Big thanks for all following contributors. Jared Hellman (hellmanj) implemented both support for embedded arguments with library keywords (1818) and custom library keyword names (1835) required by it. Vinicius K. Ruoso (vkruoso) implemented support for adding support for multiple listeners per library (1970). Joseph Lorenzini exposed `ERROR` log level for keywords (1916). Guillaume Grossetie contributed new styles for logs and report (1943). Ed Brannin implemented FOR ... IN ZIP, FOR ... IN ENUMERATE syntax (1954). Moon SungHoon did new Get Regexp Matches keyword to String library (1985). Hélio Guilherme did the support for partial match with Get Lines Matching Regexp also in String library (1836).

Full list of fixes and enhancements

| ID | Type | Priority | Summary | Added In |
| --- | --- | --- | --- | --- |
| 532 | bug | critical | Variables should not leak to lower level keywords | alpha 3 |
| 1450 | enhancement | critical | Dictionary variable type | alpha 1 |
| 1561 | enhancement | critical | Support Python style `**kwargs` with user keywords using `&{kwargs}` syntax | alpha 1 |
| 1905 | enhancement | critical | Store list and scalar variables in same namespace | alpha 1 |
| 925 | enhancement | critical | Keyword categorization (i.e. tagging) support | alpha 2 |
| 1270 | bug | high | Run Keyword If Test (Failed / Passed) does not detect failure in teardown | alpha 3 |
| 1737 | bug | high | Standard libraries should not be importable in Python w/o `robot.libraries` prefix | alpha 1 |
| 1931 | bug | high | Timeouts can cause sporadic failures with IronPython | alpha 1 |
| 2004 | bug | high | `--ExitOnFailure` does not work if test/suite setup/teardown fails | alpha 2 |
| 2018 | bug | high | DateTime: DST problems when calculating with dates | alpha 3 |
| 1818 | enhancement | high | Embedded arguments in keywords defined in test libraries | alpha 1 |
| 1840 | enhancement | high | Libdoc: Show keywords by tags | alpha 2 |
| 1928 | enhancement | high | Drop Python/Jython 2.5 support to ease adding support for Python 3 | alpha 1 |
| 1943 | enhancement | high | Use lighter and more neutral colors for report and log html page | beta 1 |
| 1952 | enhancement | high | `FOR ... IN ZIP ...` and `FOR ... IN ENUMERATE` | beta 2 |
| 1965 | enhancement | high | Support yaml files as first class variable file | alpha 2 |
| 1976 | enhancement | high | Support programmatic modifications of test data and results as part of normal execution | alpha 2 |
| 1991 | enhancement | high | Include Jython 2.7 in standalone jar | alpha 2 |
| 2040 | enhancement | high | Add variables to evaluation namespace of `Evaluate`, `Run Keyword If`, ... | beta 2 |
| 293 | enhancement | high | Support reloading library | alpha 2 |
| 317 | enhancement | high | Less verbose and quiet console outputs | alpha 3 |
| 1611 | bug | medium | Variable assignment should not be part of keyword name with `--removekeywords`, in logs, in listener interface, or in other APIs | alpha 2 |
| 1900 | bug | medium | Log messages lost if library `__init__` imports or initializes other libraries | alpha 1 |
| 1908 | bug | medium | Telnet option negotiation loop | alpha 1 |
| 1992 | bug | medium | Listeners are not unregistered when using `TestSuite.run` API | alpha 2 |
| 1440 | enhancement | medium | Remove attribute ROBOT_EXIT_FOR_LOOP depracated in 2.8 | alpha 1 |
| 1603 | enhancement | medium | Support `**kwargs` with `BuiltIn.Call Method` keywords | alpha 1 |
| 1728 | enhancement | medium | Support setting child suite variables with `Set Suite Variable` | beta 1 |
| 1743 | enhancement | medium | Make keyword prefix (library name) less visible than keywords in HTML reports | alpha 2 |
| 1773 | enhancement | medium | Deprecate `OperatingSystem.Start Process` keyword | alpha 1 |
| 1774 | enhancement | medium | Officially deprecate `DeprecatedBuiltIn` and `DeprecatedOperatingSystem` | alpha 1 |
| 1826 | enhancement | medium | Process: Better support on Jython 2.7 (termination, signals, pid) | alpha 1 |
| 1834 | enhancement | medium | String: Support partial match with `Get Lines Matching RegExp` | beta 2 |
| 1835 | enhancement | medium | Allow giving a custom name to keywords implemented using the static and the hybrid APIs | alpha 1 |
| 1841 | enhancement | medium | Deprecate old listener API | alpha 1 |
| 1865 | enhancement | medium | Support disabling command line options accepting no values using `no` prefix (e.g. `--dryrun` -> `--nodryrun`) | alpha 1 |
| 1910 | enhancement | medium | Require exact number of keyword return value when assigning multiple scalar variables | alpha 1 |
| 1911 | enhancement | medium | Accept list variable as a wildcard anywhere when assigning variables | alpha 1 |
| 1913 | enhancement | medium | Move `Create Dictionary` to BuiltIn and enhance to preserve order, allow accessing keys as attributes, etc. | alpha 1 |
| 1914 | enhancement | medium | Catenate cell values when creating scalar variable in variable table | alpha 1 |
| 1916 | enhancement | medium | Expose `ERROR` log level to custom libraries | alpha 3 |
| 1927 | enhancement | medium | Remote: Support accessing keys of returned dicts using attribute access | alpha 1 |
| 1935 | enhancement | medium | Support keyword tags with `--flattenkeywords` and `--removekeywords` | alpha 2 |
| 1958 | enhancement | medium | `Log Many`: Support logging `&{dictionary}` variable items | alpha 1 |
| 1959 | enhancement | medium | `Wait Until Keyword Succeeds`: Support giving wait time as number of times to retry | alpha 1 |
| 1962 | enhancement | medium | Disallow using keyword with embedded arguments as normal keywords | alpha 1 |
| 1969 | enhancement | medium | Allow giving listener and model modifier instances to `robot.run` and `TestSuite.run` | alpha 3 |
| 1970 | enhancement | medium | Enhance ROBOT_LIBRARY_LISTENER to accept a list of listeners | alpha 2 |
| 1983 | enhancement | medium | PYTHONPATH environment variable should not be processed with Jython or IronPython | alpha 2 |
| 1985 | enhancement | medium | String: New `Get Regexp Matches` keyword | beta 2 |
| 1990 | enhancement | medium | Avoid Python 3 incompatible type checks | beta 2 |
| 1998 | enhancement | medium | Pass keyword and library names separately to listeners | alpha 2 |
| 2020 | enhancement | medium | Do not write empty elements or attributes to output.xml | alpha 3 |
| 2027 | enhancement | medium | Deprecate `--monitorxxx` options in favor of `--consolexxx` | alpha 3 |
| 2028 | enhancement | medium | Tag patterns starting with `NOT` | alpha 3 |
| 2029 | enhancement | medium | When exiting gracefully, skipped tests should get automatic `robot-exit` tag | alpha 3 |
| 2030 | enhancement | medium | Notify listeners about library, resource and variable file imports | beta 2 |
| 2032 | enhancement | medium | Document that test and keyword tags with `robot-` prefix are reserved | alpha 3 |
| 2036 | enhancement | medium | `BuiltIn.Get Variables`: Support getting variables without `${}` decoration | beta 1 |
| 2038 | enhancement | medium | Consistent usage of Boolean arguments in standard libraries | beta 1 |
| 1815 | bug | low | Keyword name conflict involving Remote keyword should cause failure, not warning | alpha 1 |
| 1906 | bug | low | Free keyword arguments (**kwargs) names cannot contain equal signs or trailing backslashes | alpha 1 |
| 1922 | bug | low | Screenshot library causes deprecation warning with wxPython 3.x | alpha 1 |
| 1997 | bug | low | User Guide has outdated links to test templates | beta 2 |
| 2002 | bug | low | Keyword and test names with urls or quotes create invalid html on log and report | alpha 2 |
| 2003 | bug | low | Checking is stdout/stderr stream terminal causes exception if stream's buffer is detached | alpha 2 |
| 2016 | bug | low | `FAIL` should not be useable as a normal log level | alpha 3 |
| 2019 | bug | low | Execution directory should not be added to module search path (`PYTHONPATH`) | alpha 2 |
| 2043 | bug | low | BuiltIn: Some `Should` keyword only consider Python `True` true and other values false | beta 1 |
| 1642 | enhancement | low | Deprecate `--runfailed` and `--rerunmerge` options | alpha 1 |
| 1775 | enhancement | low | Remove deprecated syntax for repeating single keyword | alpha 1 |
| 1897 | enhancement | low | Clean-up reference to RF 2.6 and older from User Guide and other documentation | alpha 1 |
| 1898 | enhancement | low | Improve error message for "Else" instead of "ELSE" | alpha 3 |
| 1918 | enhancement | low | Deprecate old `Meta: Name` syntax for specifying test suite metadata | alpha 1 |
| 1919 | enhancement | low | Remove possibility to setting scalar variables with lists value using `Set Test/Suite/Global Variable` keyword | alpha 1 |
| 1921 | enhancement | low | More flexible syntax to deprecate keywords | alpha 1 |
| 1923 | enhancement | low | Remove deprecated `--runmode` option | alpha 1 |
| 1924 | enhancement | low | Remove unused internal functions, classes, etc. | alpha 1 |
| 1925 | enhancement | low | Remove deprecated `--xunitfile` option | alpha 1 |
| 1929 | enhancement | low | OperatingSystem: Enhance documentation about path separators | alpha 1 |
| 1945 | enhancement | low | Enhance documentation of `Run Keyword If` return values | alpha 1 |
| 2021 | enhancement | low | Update XSD schemas | alpha 3 |
| 2022 | enhancement | low | Document that preformatted text with spaces in Robot data requires escaping | beta 1 |
| 2031 | enhancement | low | Console colors and markers: Fail if given value is invalid and remove outdated `FORCE` color value | alpha 3 |
| 2033 | enhancement | low | Use `setuptools` for installation when available | beta 1 |
| 2037 | enhancement | low | `BuiltIn.Evaluate`: Support any mapping as a custom namespace | beta 1 |
| 2039 | enhancement | low | OperatingSystem and Dialogs: Remove partial support for running without Robot Framework itself | beta 1 |
| 2041 | enhancement | low | Collections: New keyword `Convert To Dictionary` | beta 1 |
| 2045 | enhancement | low | BuiltIn: Log argument types in DEBUG level not INFO | beta 1 |

Altogether 89 issues. See on [issue tracker](https://github.com/robotframework/robotframework/issues?q=milestone%3A2.9).

2.9b1

Robot Framework 2.9 beta 1

RF 2.9 beta 1 is the fourth preview version of the forthcoming RF 2.9 release. It contains, for example, high priority enhancements related to variables and supports creating keywords with embedded arguments in test libraries. After this release the work continues with the first release candidate. All issues targeted for RF 2.9 can be found from the [issue tracker](https://github.com/robotframework/robotframework/issues?q=milestone%3A2.9).

Most important new features in beta 1 over alpha 3 are lighter and more neutral colors for report and log html page (1943) and adding variables to evaluation namespace of `Evaluate`, `Run Keyword If`, and other built-in keywords (2040). The issue list at the end of this release note mentions for each feature in which preview it came, but otherwise the notes here describe the changes in 2.9 over 2.8.7, therefore containing also previous preview changes.

Questions and comments related to this release can be sent to the [robotframework-users](http://groups.google.com/group/robotframework-users) and possible bugs submitted to the [issue tracker](https://github.com/robotframework/robotframework/issues).

We have not generated windows installers for this preview, but the source distribution is available from [PyPI](https://pypi.python.org/pypi/robotframework/2.9b1) and the standalone jar with Jython 2.7 can be found from downloads below these release notes.

If you have pip just run `pip install --upgrade --pre robotframework` to install or upgrade to the latest version or use `pip install robotframework==2.9b1` to install exactly this version. For more details and other installation approaches see [installation instructions](https://github.com/robotframework/robotframework/blob/master/INSTALL.rst).

Robot Framework 2.9 beta 1 was released on Friday June 26, 2015.

Compatibility with other projects

Robot Framework 2.9 should, for most parts, be compatible with other projects in the larger Robot Framework ecosystem. It may, however, take some time before tools support new syntax like dictionary variables or keyword tags. Additionally, big internal changes may affect tools that have used internal APIs. Libraries and tools know not to be compatible with Robot Framework 2.9 will be listed here.
- RIDE 1.4 and older is not compatible with new syntax added in Robot Framework 2.9.
- Selenium2Library 1.7 and older [use an internal API](https://github.com/rtomac/robotframework-selenium2library/issues/429) that was removed in Robot Framework 2.9 beta 1. Selenium2Library 1.7.1 is fully compatible with Robot Framework 2.9.

Most important enhancements

Dictionary variable type (1450)

The most noticeable feature in RF 2.9 is the new syntax to create and use dictionary (a.k.a map or hashtable) variables. Dictionaries can be returned from keywords or created in variable files, but they can also be created in the variable table:

robotframework
*** Variables ***
&{DICT} key=value second=2 third=${3}


The above example will create a dictionary variable `&{DICT}` with Python dictionary `{'key': 'value', 'second': '2', 'third': 3}` as the value. If a dictionary variable is used as a scalar variable like `${DICT}`, it will be passed forward as a single argument containing the whole dictionary. If it used like `&{DICT}`, individual items are passed as named arguments. For example, these two examples are equivalent:

robotframework
*** Test Cases ***
Example 1
My Keyword key=value second=2 third=${3}
Example 2
My Keyword &{DICT}


Individual dictionary variable items can be accessed either using special `&{DICT}[key]` syntax similarly as individual list variable items can be accessed like `{LIST}[0]`. As a special feature, dictionary variables are ordered and allow accessing values also using attribute access like `${DICT.key}`. For more information about dictionary variables, see Variables section in the [User Guide](http://robotframework.org/robotframework/#user-guide).

**NOTE**: RIDE editor does not currently support dictionary variables.

Python style `**kwargs` support with user keywords using `&{kwargs}` syntax (1561)

New dictionary variable syntax can be used with user keywords to accept free keyword arguments similarly as Python based keywords can accept `**kwargs`. This can be accomplished simply by having a dictionary variable like `&{kwargs}` as the last argument in user keyword argument specification:

robotframework
*** Keywords ***
Run My Process
[Arguments] {arguments} &{configuration}
Run Process myproc.exe {arguments} &{configuration}


Also this new functionality is explained with further examples in the [User Guide](http://robotframework.org/robotframework/#user-guide).

Embedded arguments in keywords defined in test libraries (1818)

User keywords have supported embedded arguments since RF 2.1.1 (370), and finally this functionality is supported also by library keywords. This is accomplished by giving a custom name to a keyword by setting `robot_name` attribute manually or by using `robot.api.deco.keyword' decorator (1835), and using`${args}` in the name similarly as with user keywords. The implementing method or function must also accept same number of arguments as there are embedded argument.

python
from robot.api.deco import keyword

keyword(name='User "${user}" selects "${item}" from webshop')
def select_item(user, item):
...


The [User Guide](http://robotframework.org/robotframework/#user-guide) is, again, the place where to find more information and examples.

Keyword categorization (i.e. tagging) support

Keywords can now have tags (925). The tags can be added to user keywords either by new `[Tags]` setting, or by adding them to the last line of documentation.

robotframework
*** Keywords ***
My keyword
[Tags] tag1 tag2
No Operation
My other keyword
[Documentation] Tags can also be added as last line of documentation.
... Tags: tag1, tag2
No Operation


Library keywords can also use documentation to specify their tags or they can be added to `robot_tags`attribute for each method. The `keyword` decorator provides a handy shortcut for specifying tags for each method.

python
from robot.api.deco import keyword

keyword(tags=['tag1', 'tag2'])
def select_item(user, item):
...


Libdoc will show keywords by tags (1840) and tags can also be used to specify keywords for `--removekeywords` and `--flattenkeywords` commandline options (1935).

Programmatic modifications of test data and results as part of normal execution

It is now possible to specify modifiers to preprocess the test data before the test run and to modify the results before generation of log and report. The modifiers can be taken into use with `--prerunmodifier` and `--prerebotmodifier`. See the issue 1976 for an example and more details.

Less verbose and quiet console outputs (317)

New option `--console` allows changing the console output type. Possible values are `verbose` (default), `dotted` (x-unit like output where each passing test prints only a dot), `quiet` (no output except warnings and errors) and `none` (no output whatsoever). Dotted output has a shortcut `--dotted` or `-.` as a short option.

Variables are added to evaluation namespace of `Evaluate`, `Run Keyword If`, ... (2040)

Robot´s variables are now available as Python variables in evaluation namespace of BuiltIn library keywords.

The two rows below are now equivalent (assuming value of `${my var}` is a string):

robotframework
*** Keywords ***
My keyword
Run keyword if "${my var}" != "Foo" ... old syntax
Run keyword if my_var != "Foo" ... new syntax in 2.9


_NOTE:_ The syntax will be changed in beta 2 so that a `$` prefix is required like in `$my_var`.

Other high priority enhancements and fixes
- Scalar and list variables stored in same namespace (1905)
- Standard libraries do not mask third party Python modules (1737)
- Fixed sporadic failures with timeouts on IronPython (1931)
- `--ExitOnFailure` does not work if test/suite setup/teardown fails (2004)
- Support yaml files as first class variable file (1965)
- Run Keyword If Test (Failed / Passed) will detect failure in teardown ( 1270)
- DateTime: DST problems when calculating with dates (2018)
- Use lighter and more neutral colors for report and log html page (1943)

Backwards incompatible changes

Being a major release, RF 2.9 contains lot of changes and some of them are backwards incompatible.

List and scalar variables stored in same namespace (1905)

It has been possible to use a list variable `{list}` as a scalar variable `${list}` since RF 2.0.3 (117), and scalar variables containing lists have been usable as list variables since RF 2.8 (483). It has, however, been possible to also create scalar and list variables with same base name, for example, in the variable table:

robotframework
*** Variables ***
${VAR} Scalar variable
{VAR} List variable


This caused a lot of confusion, and the addition of `&{dictionary}` variables (1450) would have made situation even more complicated. As a result it was decided to store all variables in the same namespace (1905) and decide how they are used depending on the format (e.g. `${var}` for scalar, `{var}` for list, and `&{var}` for dictionary).

As a result of this change, tests using scalar and list variables with same base name will need to be updated. Unfortunately there is no other good way to detect these problems than running tests with the new version and seeing does anything break.

Variables no longer leak to lower level keywords (532)

Local variables used to leak from test to keywords and from keywords to lower level keywords. The example below shows variable leaking from test to keyword:

robotframework
*** Test Case ***
Example
${x}= Set Variable hello
My keyword

*** Keywords ***
My keyword
Should be equal ${x} hello


This behaviour was never intended, but fixing the bug can break tests where this was used either intentionally or by accident.

Drop Python/Jython 2.5 support (1928)

With the official Jython 2.7 version out, we dropped the support for Python and Jython 2.5 series. The standalone jar contains Jython 2.7 from now on.

PYTHONPATH environment variable is not processed with Jython or IronPython anymore (1983)

Robot Framework used to add PYTHONPATH to JYTHONPATH for Jython and to IRONPYTHONPATH for IronPython. In RF 2.9 Jython and IronPython will ignore PYTHONPATH and you need to use the correct path environment variable for your executor.

Execution directory not added automatically to module search path (2019)

The directory where execution is started from is not anymore added to the module search path. If it is needed, `PYTHONPATH`, `JYTHONPATH` or `IRONPYTHONPATH` environment variable can be explicitly set to `.` before execution.

Standard libraries not importable in Python w/o `robot.libraries` prefix (1737)

It used to be possible to import Robot Framework's standard libraries in Python code by just using the library name like `import DateTime`. This caused problems in with standard libraries having same name as third party Python modules like [DateTime](https://pypi.python.org/pypi/DateTime/4.0.1).

To avoid these problems, standard libraries are not anymore directly importable in Python code. They are still importable with the `robot.libraries` prefix like `from robot.libraries import DateTime`. This has also always been the recommended way and the one used in examples in the User Guide.

Disabling command line options accepting no values by using same option again not supported anymore

Earlier it was possible to disable options accepting no values like `--dryrun` by giving the option again like `--dryrun --other options --dryrun`. This was rather confusing, and nowadays it is possible to do that by using the same option with `no` prefix like `--nodryrun` instead (1865). If option is used with and without the `no` prefix, the last used value has precedence. Having same option multiple times has no special functionality anymore.

Possible equal signs in arguments to `BuiltIn.Call Method` need to be escaped

`Call Method` nowadays supports `**kwags` (1603) and thus possible equal signs in normal arguments need to be escaped with a backslash like `hello\=world`.

Unused internal functions, classes, etc. removed

See issue 1924 for a detailed list of changes to internal APIs. These changes should not affect libraries or tools using Robot Framework's public APIs.

Other backwards incompatible changes

These changes should generally not cause problems in real life. See linked issues for more details if you think you may be affected.
- Empty elements or attributes are not written to output.xml (2020)
- Not possible to use keyword with embedded arguments as a normal keyword (1962)
- When assigning keyword return values to multiple scalar variables, an exact number of values is required (1910)
- `Create Dictionary` keyword moved from Collections to BuiltIn (1913)
- Keyword name conflict involving Remote library keyword causes failure and not warning (1815)
- Possibility to set scalar variables with lists value using `Set Test/Suite/Global Variable` keyword removed (1919)
- Variable assignment is not anymore be part of keyword name with --removekeywords, in logs, in listener interface, or in other APIs (1611)
- Deprecated syntax for repeating single keyword removed (1775)
- Deprecated `--runmode` option removed (1923)
- Deprecated `--xunitfile` option removed in favor of `--xunit` (1925)
- Deprecated way to exit for loops using custom exception with `ROBOT_EXIT_FOR_LOOP` attribute has been removed (1440)
- Run Keyword If Test (Failed / Passed) did not detect failure in teardown (1270)
- DateTime: DST problems when calculating with dates (2018)
- `FAIL` is no longer useable as a normal log level (2016)
- Console colors and markers: Fail if given value is invalid and remove outdated `FORCE` color value (2031)
- OperatingSystem and Dialogs: Remove partial support for running without Robot Framework itself (2039)

Deprecated features

Robot Framework 2.9 also deprecates some features that will be removed in the future releases. See linked issues for more details.
- `OperatingSystem.Start Process` keyword deprecated in favor of much more flexible `Process.Start Process` (1773)
- Listener interface version 1.0 deprecated (1841)
- `--runfailed` and `--rerunmerge` options deprecated in favor of `--rerunfailed` and `--merge`, respectively (1642)
- Old `Meta: Name` syntax for specifying test suite metadata deprecated (1918)
- `DeprecatedBuiltIn` and `DeprecatedOperatingSystem` officially deprecated (1774)
- Deprecate `--monitorxxx` options in favor of `--consolexxx` (2027)

Acknowledgements

Big thanks for all following contributors. Jared Hellman (hellmanj) implemented both support for embedded arguments with library keywords (1818) and custom library keyword names (1835) required by it. Vinicius K. Ruoso (vkruoso) implemented support for adding support for multiple listeners per library (1970). Joseph Lorenzini exposed `ERROR` log level for keywords (1916). Guillaume Grossetie contributed new styles for logs and report (1943).

Full list of fixes and enhancements

| ID | Type | Priority | Summary | Added In |
| --- | --- | --- | --- | --- |
| 532 | bug | critical | Variables should not leak to lower level keywords | alpha 3 |
| 1450 | enhancement | critical | Dictionary variable type | alpha 1 |
| 1561 | enhancement | critical | Support Python style `**kwargs` with user keywords using `&{kwargs}` syntax | alpha 1 |
| 1905 | enhancement | critical | Store list and scalar variables in same namespace | alpha 1 |
| 925 | enhancement | critical | Keyword categorization (i.e. tagging) support | alpha 2 |
| 1270 | bug | high | Run Keyword If Test (Failed / Passed) does not detect failure in teardown | alpha 3 |
| 1737 | bug | high | Standard libraries should not be importable in Python w/o `robot.libraries` prefix | alpha 1 |
| 1931 | bug | high | Timeouts can cause sporadic failures with IronPython | alpha 1 |
| 2004 | bug | high | `--ExitOnFailure` does not work if test/suite setup/teardown fails | alpha 2 |
| 2018 | bug | high | DateTime: DST problems when calculating with dates | alpha 3 |
| 1818 | enhancement | high | Embedded arguments in keywords defined in test libraries | alpha 1 |
| 1840 | enhancement | high | Libdoc: Show keywords by tags | alpha 2 |
| 1928 | enhancement | high | Drop Python/Jython 2.5 support to ease adding support for Python 3 | alpha 1 |
| 1943 | enhancement | high | Use lighter and more neutral colors for report and log html page | beta 1 |
| 1965 | enhancement | high | Support yaml files as first class variable file | alpha 2 |
| 1976 | enhancement | high | Support programmatic modifications of test data and results as part of normal execution | alpha 2 |
| 1991 | enhancement | high | Include Jython 2.7 in standalone jar | alpha 2 |
| 2040 | enhancement | high | Add variables to evaluation namespace of `Evaluate`, `Run Keyword If`, ... | beta 1 |
| 293 | enhancement | high | Support reloading library | alpha 2 |
| 317 | enhancement | high | Less verbose and quiet console outputs | alpha 3 |
| 1611 | bug | medium | Variable assignment should not be part of keyword name with `--removekeywords`, in logs, in listener interface, or in other APIs | alpha 2 |
| 1900 | bug | medium | Log messages lost if library `__init__` imports or initializes other libraries | alpha 1 |
| 1908 | bug | medium | Telnet option negotiation loop | alpha 1 |
| 1992 | bug | medium | Listeners are not unregistered when using `TestSuite.run` API | alpha 2 |
| 1440 | enhancement | medium | Remove attribute ROBOT_EXIT_FOR_LOOP depracated in 2.8 | alpha 1 |
| 1603 | enhancement | medium | Support `**kwargs` with `BuiltIn.Call Method` keywords | alpha 1 |
| 1728 | enhancement | medium | Support setting child suite variables with `Set Suite Variable` | beta 1 |
| 1743 | enhancement | medium | Make keyword prefix (library name) less visible than keywords in HTML reports | alpha 2 |
| 1773 | enhancement | medium | Deprecate `OperatingSystem.Start Process` keyword | alpha 1 |
| 1774 | enhancement | medium | Officially deprecate `DeprecatedBuiltIn` and `DeprecatedOperatingSystem` | alpha 1 |
| 1826 | enhancement | medium | Process: Better support on Jython 2.7 (termination, signals, pid) | alpha 1 |
| 1835 | enhancement | medium | Allow giving a custom name to keywords implemented using the static and the hybrid APIs | alpha 1 |
| 1841 | enhancement | medium | Deprecate old listener API | alpha 1 |
| 1865 | enhancement | medium | Support disabling command line options accepting no values using `no` prefix (e.g. `--dryrun` -> `--nodryrun`) | alpha 1 |
| 1910 | enhancement | medium | Require exact number of keyword return value when assigning multiple scalar variables | alpha 1 |
| 1911 | enhancement | medium | Accept list variable as a wildcard anywhere when assigning variables | alpha 1 |
| 1913 | enhancement | medium | Move `Create Dictionary` to BuiltIn and enhance to preserve order, allow accessing keys as attributes, etc. | alpha 1 |
| 1914 | enhancement | medium | Catenate cell values when creating scalar variable in variable table | alpha 1 |
| 1916 | enhancement | medium | Expose `ERROR` log level to custom libraries | alpha 3 |
| 1927 | enhancement | medium | Remote: Support accessing keys of returned dicts using attribute access | alpha 1 |
| 1935 | enhancement | medium | Support keyword tags with `--flattenkeywords` and `--removekeywords` | alpha 2 |
| 1958 | enhancement | medium | `Log Many`: Support logging `&{dictionary}` variable items | alpha 1 |
| 1959 | enhancement | medium | `Wait Until Keyword Succeeds`: Support giving wait time as number of times to retry | alpha 1 |
| 1962 | enhancement | medium | Disallow using keyword with embedded arguments as normal keywords | alpha 1 |
| 1969 | enhancement | medium | Allow giving listener and model modifier instances to `robot.run` and `TestSuite.run` | alpha 3 |
| 1970 | enhancement | medium | Enhance ROBOT_LIBRARY_LISTENER to accept a list of listeners | alpha 2 |
| 1983 | enhancement | medium | PYTHONPATH environment variable should not be processed with Jython or IronPython | alpha 2 |
| 1998 | enhancement | medium | Pass keyword and library names separately to listeners | alpha 2 |
| 2020 | enhancement | medium | Do not write empty elements or attributes to output.xml | alpha 3 |
| 2027 | enhancement | medium | Deprecate `--monitorxxx` options in favor of `--consolexxx` | alpha 3 |
| 2028 | enhancement | medium | Tag patterns starting with `NOT` | alpha 3 |
| 2029 | enhancement | medium | When exiting gracefully, skipped tests should get automatic `robot-exit` tag | alpha 3 |
| 2032 | enhancement | medium | Document that test and keyword tags with `robot-` prefix are reserved | alpha 3 |
| 2036 | enhancement | medium | `BuiltIn.Get Variables`: Support getting variables without `${}` decoration | beta 1 |
| 2038 | enhancement | medium | Consistent usage of Boolean arguments in standard libraries | beta 1 |
| 1815 | bug | low | Keyword name conflict involving Remote keyword should cause failure, not warning | alpha 1 |
| 1906 | bug | low | Free keyword arguments (**kwargs) names cannot contain equal signs or trailing backslashes | alpha 1 |
| 1922 | bug | low | Screenshot library causes deprecation warning with wxPython 3.x | alpha 1 |
| 2002 | bug | low | Keyword and test names with urls or quotes create invalid html on log and report | alpha 2 |
| 2003 | bug | low | Checking is stdout/stderr stream terminal causes exception if stream's buffer is detached | alpha 2 |
| 2016 | bug | low | `FAIL` should not be useable as a normal log level | alpha 3 |
| 2019 | bug | low | Execution directory should not be added to module search path (`PYTHONPATH`) | alpha 2 |
| 2043 | bug | low | BuiltIn: Some `Should` keyword only consider Python `True` true and other values false | beta 1 |
| 1642 | enhancement | low | Deprecate `--runfailed` and `--rerunmerge` options | alpha 1 |
| 1775 | enhancement | low | Remove deprecated syntax for repeating single keyword | alpha 1 |
| 1897 | enhancement | low | Clean-up reference to RF 2.6 and older from User Guide and other documentation | alpha 1 |
| 1898 | enhancement | low | Improve error message for "Else" instead of "ELSE" | alpha 3 |
| 1918 | enhancement | low | Deprecate old `Meta: Name` syntax for specifying test suite metadata | alpha 1 |
| 1919 | enhancement | low | Remove possibility to setting scalar variables with lists value using `Set Test/Suite/Global Variable` keyword | alpha 1 |
| 1921 | enhancement | low | More flexible syntax to deprecate keywords | alpha 1 |
| 1923 | enhancement | low | Remove deprecated `--runmode` option | alpha 1 |
| 1924 | enhancement | low | Remove unused internal functions, classes, etc. | alpha 1 |
| 1925 | enhancement | low | Remove deprecated `--xunitfile` option | alpha 1 |
| 1929 | enhancement | low | OperatingSystem: Enhance documentation about path separators | alpha 1 |
| 1945 | enhancement | low | Enhance documentation of `Run Keyword If` return values | alpha 1 |
| 2021 | enhancement | low | Update XSD schemas | alpha 3 |
| 2022 | enhancement | low | Document that preformatted text with spaces in Robot data requires escaping | beta 1 |
| 2031 | enhancement | low | Console colors and markers: Fail if given value is invalid and remove outdated `FORCE` color value | alpha 3 |
| 2033 | enhancement | low | Use `setuptools` for installation when available | beta 1 |
| 2037 | enhancement | low | `BuiltIn.Evaluate`: Support any mapping as a custom namespace | beta 1 |
| 2039 | enhancement | low | OperatingSystem and Dialogs: Remove partial support for running without Robot Framework itself | beta 1 |
| 2041 | enhancement | low | Collections: New keyword `Convert To Dictionary` | beta 1 |
| 2045 | enhancement | low | BuiltIn: Log argument types in DEBUG level not INFO | beta 1 |

Altogether 83 issues. See on [issue tracker](https://github.com/robotframework/robotframework/issues?q=milestone%3A2.9).

2.9a3

Robot Framework 2.9 alpha 3

RF 2.9 alpha 3 is the third preview version of the forthcoming RF 2.9 release. It contains, for example, high priority enhancements related to variables and supports creating keywords with embedded arguments in test libraries. After this release the work continues with beta 1. All issues targeted for RF 2.9 can be found from the [issue tracker](https://github.com/robotframework/robotframework/issues?q=milestone%3A2.9).

Most important new features in alpha 3 over alpha 2 are that the variables no longer leak to lower level keywords (532) and the new less verbose console output (317). The issue list at the end of this release note mentions for each feature in which preview it came, but otherwise the notes here describe the changes in 2.9 over 2.8.7, therefore containing also the alpha 1 and 2 changes.

Questions and comments related to this release can be sent to the [robotframework-users](http://groups.google.com/group/robotframework-users) and possible bugs submitted to the [issue tracker](https://github.com/robotframework/robotframework/issues).

We have not generated windows installers for this preview, but the source distribution is available from [PyPI](https://pypi.python.org/pypi/robotframework/2.9a3) and the standalone jar with Jython 2.7 can be found from downloads below these release notes.

If you have pip just run `pip install --upgrade --pre robotframework` to install or upgrade to the latest version or use `pip install robotframework==2.9a3` to install exactly this version. For more details and other installation approaches see [installation instructions](https://github.com/robotframework/robotframework/blob/master/INSTALL.rst).

Robot Framework 2.9 alpha 3 was released on Thursday June 18, 2015.

Compatibility with other projects

Robot Framework 2.9 should, for most parts, be compatible with other projects in the larger Robot Framework ecosystem. It may, however, take some time before tools support new syntax like dictionary variables or keyword tags. Additionally, big internal changes may affect tools that have used internal APIs. Libraries and tools know not to be compatible with Robot Framework 2.9 will be listed here.
- RIDE 1.4 and older is not compatible with new syntax added in Robot Framework 2.9.
- Selenium2Library 1.7 and older [use an internal API](https://github.com/rtomac/robotframework-selenium2library/issues/429) that was removed in Robot Framework 2.9 beta 1. Selenium2Library 1.7.1 is fully compatible with Robot Framework 2.9.

Most important enhancements

Dictionary variable type (1450)

The most noticeable feature in RF 2.9 is the new syntax to create and use dictionary (a.k.a map or hashtable) variables. Dictionaries can be returned from keywords or created in variable files, but they can also be created in the variable table:

robotframework
*** Variables ***
&{DICT} key=value second=2 third=${3}


The above example will create a dictionary variable `&{DICT}` with Python dictionary `{'key': 'value', 'second': '2', 'third': 3}` as the value. If a dictionary variable is used as a scalar variable like `${DICT}`, it will be passed forward as a single argument containing the whole dictionary. If it used like `&{DICT}`, individual items are passed as named arguments. For example, these two examples are equivalent:

robotframework
*** Test Cases ***
Example 1
My Keyword key=value second=2 third=${3}
Example 2
My Keyword &{DICT}


Individual dictionary variable items can be accessed either using special `&{DICT}[key]` syntax similarly as individual list variable items can be accessed like `{LIST}[0]`. As a special feature, dictionary variables are ordered and allow accessing values also using attribute access like `${DICT.key}`. For more information about dictionary variables, see Variables section in the [User Guide](http://robotframework.org/robotframework/#user-guide).

**NOTE**: RIDE editor does not currently support dictionary variables.

Python style `**kwargs` support with user keywords using `&{kwargs}` syntax (1561)

New dictionary variable syntax can be used with user keywords to accept free keyword arguments similarly as Python based keywords can accept `**kwargs`. This can be accomplished simply by having a dictionary variable like `&{kwargs}` as the last argument in user keyword argument specification:

robotframework
*** Keywords ***
Run My Process
[Arguments] {arguments} &{configuration}
Run Process myproc.exe {arguments} &{configuration}


Also this new functionality is explained with further examples in the [User Guide](http://robotframework.org/robotframework/#user-guide).

Embedded arguments in keywords defined in test libraries (1818)

User keywords have supported embedded arguments since RF 2.1.1 (370), and finally this functionality is supported also by library keywords. This is accomplished by giving a custom name to a keyword by setting `robot_name` attribute manually or by using `robot.api.deco.keyword' decorator (1835), and using`${args}` in the name similarly as with user keywords. The implementing method or function must also accept same number of arguments as there are embedded argument.

python
from robot.api.deco import keyword

keyword(name='User "${user}" selects "${item}" from webshop')
def select_item(user, item):
...


The [User Guide](http://robotframework.org/robotframework/#user-guide) is, again, the place where to find more information and examples.

Keyword categorization (i.e. tagging) support

Keywords can now have tags (925). The tags can be added to user keywords either by new `[Tags]` setting, or by adding them to the last line of documentation.

robotframework
*** Keywords ***
My keyword
[Tags] tag1 tag2
No Operation
My other keyword
[Documentation] Tags can also be added as last line of documentation.
... Tags: tag1, tag2
No Operation


Library keywords can also use documentation to specify their tags or they can be added to `robot_tags`attribute for each method. The `keyword` decorator provides a handy shortcut for specifying tags for each method.

python
from robot.api.deco import keyword

keyword(tags=['tag1', 'tag2'])
def select_item(user, item):
...


Libdoc will show keywords by tags (1840) and tags can also be used to specify keywords for `--removekeywords` and `--flattenkeywords` commandline options (1935).

Programmatic modifications of test data and results as part of normal execution

It is now possible to specify modifiers to preprocess the test data before the test run and to modify the results before generation of log and report. The modifiers can be taken into use with `--prerunmodifier` and `--prerebotmodifier`. See the issue 1976 for an example and more details.

Less verbose and quiet console outputs (317)

New option `--console` allows changing the console output type. Possible values are `verbose` (default), `dotted` (x-unit like output where each passing test prints only a dot), `quiet` (no output except warnings and errors) and `none` (no output whatsoever). Dotted output has a shortcut `--dotted` or `-.` as a short option.

Other high priority enhancements and fixes
- Scalar and list variables stored in same namespace (1905)
- Standard libraries do not mask third party Python modules (1737)
- Fixed sporadic failures with timeouts on IronPython (1931)
- `--ExitOnFailure` does not work if test/suite setup/teardown fails (2004)
- Support yaml files as first class variable file (1965)
- Run Keyword If Test (Failed / Passed) will detect failure in teardown ( 1270)
- DateTime: DST problems when calculating with dates (2018)

Backwards incompatible changes

Being a major release, RF 2.9 contains lot of changes and some of them are backwards incompatible.

List and scalar variables stored in same namespace (1905)

It has been possible to use a list variable `{list}` as a scalar variable `${list}` since RF 2.0.3 (117), and scalar variables containing lists have been usable as list variables since RF 2.8 (483). It has, however, been possible to also create scalar and list variables with same base name, for example, in the variable table:

robotframework
*** Variables ***
${VAR} Scalar variable
{VAR} List variable


This caused a lot of confusion, and the addition of `&{dictionary}` variables (1450) would have made situation even more complicated. As a result it was decided to store all variables in the same namespace (1905) and decide how they are used depending on the format (e.g. `${var}` for scalar, `{var}` for list, and `&{var}` for dictionary).

As a result of this change, tests using scalar and list variables with same base name will need to be updated. Unfortunately there is no other good way to detect these problems than running tests with the new version and seeing does anything break.

Variables no longer leak to lower level keywords (532)

Local variables used to leak from test to keywords and from keywords to lower level keywords. The example below shows variable leaking from test to keyword:

robotframework
*** Test Case ***
Example
${x}= Set Variable hello
My keyword

*** Keywords ***
My keyword
Should be equal ${x} hello


This behaviour was never intended, but fixing the bug can break tests where this was used either intentionally or by accident.

Drop Python/Jython 2.5 support (1928)

With the official Jython 2.7 version out, we dropped the support for Python and Jython 2.5 series. The standalone jar contains Jython 2.7 from now on.

PYTHONPATH environment variable is not processed with Jython or IronPython anymore (1983)

Robot Framework used to add PYTHONPATH to JYTHONPATH for Jython and to IRONPYTHONPATH for IronPython. In RF 2.9 Jython and IronPython will ignore PYTHONPATH and you need to use the correct path environment variable for your executor.

Execution directory not added automatically to module search path (2019)

The directory where execution is started from is not anymore added to the module search path. If it is needed, `PYTHONPATH`, `JYTHONPATH` or `IRONPYTHONPATH` environment variable can be explicitly set to `.` before execution.

Standard libraries not importable in Python w/o `robot.libraries` prefix (1737)

It used to be possible to import Robot Framework's standard libraries in Python code by just using the library name like `import DateTime`. This caused problems in with standard libraries having same name as third party Python modules like [DateTime](https://pypi.python.org/pypi/DateTime/4.0.1).

To avoid these problems, standard libraries are not anymore directly importable in Python code. They are still importable with the `robot.libraries` prefix like `from robot.libraries import DateTime`. This has also always been the recommended way and the one used in examples in the User Guide.

Disabling command line options accepting no values by using same option again not supported anymore

Earlier it was possible to disable options accepting no values like `--dryrun` by giving the option again like `--dryrun --other options --dryrun`. This was rather confusing, and nowadays it is possible to do that by using the same option with `no` prefix like `--nodryrun` instead (1865). If option is used with and without the `no` prefix, the last used value has precedence. Having same option multiple times has no special functionality anymore.

Possible equal signs in arguments to `BuiltIn.Call Method` need to be escaped

`Call Method` nowadays supports `**kwags` (1603) and thus possible equal signs in normal arguments need to be escaped with a backslash like `hello\=world`.

Unused internal functions, classes, etc. removed

See issue 1924 for a detailed list of changes to internal APIs. These changes should not affect libraries or tools using Robot Framework's public APIs.

Other backwards incompatible changes

These changes should generally not cause problems in real life. See linked issues for more details if you think you may be affected.
- Empty elements or attributes are not written to output.xml (2020)
- Not possible to use keyword with embedded arguments as a normal keyword (1962)
- When assigning keyword return values to multiple scalar variables, an exact number of values is required (1910)
- `Create Dictionary` keyword moved from Collections to BuiltIn (1913)
- Keyword name conflict involving Remote library keyword causes failure and not warning (1815)
- Possibility to set scalar variables with lists value using `Set Test/Suite/Global Variable` keyword removed (1919)
- Variable assignment is not anymore be part of keyword name with --removekeywords, in logs, in listener interface, or in other APIs (1611)
- Deprecated syntax for repeating single keyword removed (1775)
- Deprecated `--runmode` option removed (1923)
- Deprecated `--xunitfile` option removed in favor of `--xunit` (1925)
- Deprecated way to exit for loops using custom exception with `ROBOT_EXIT_FOR_LOOP` attribute has been removed (1440)
- Run Keyword If Test (Failed / Passed) did not detect failure in teardown (1270)
- DateTime: DST problems when calculating with dates (2018)
- `FAIL` is no longer useable as a normal log level (2016)
- Console colors and markers: Fail if given value is invalid and remove outdated `FORCE` color value (2031)

Deprecated features

Robot Framework 2.9 also deprecates some features that will be removed in the future releases. See linked issues for more details.
- `OperatingSystem.Start Process` keyword deprecated in favor of much more flexible `Process.Start Process` (1773)
- Listener interface version 1.0 deprecated (1841)
- `--runfailed` and `--rerunmerge` options deprecated in favor of `--rerunfailed` and `--merge`, respectively (1642)
- Old `Meta: Name` syntax for specifying test suite metadata deprecated (1918)
- `DeprecatedBuiltIn` and `DeprecatedOperatingSystem` officially deprecated (1774)
- Deprecate `--monitorxxx` options in favor of `--consolexxx` (2027)

Acknowledgements

Big thanks for all following contributors. Jared Hellman (hellmanj) implemented both support for embedded arguments with library keywords (1818) and custom library keyword names (1835) required by it. Vinicius K. Ruoso (vkruoso) implemented support for adding support for multiple listeners per library (1970). Joseph Lorenzini exposed `ERROR` log level for keywords (1916).

Full list of fixes and enhancements

| ID | Type | Priority | Summary | Added In |
| --- | --- | --- | --- | --- |
| 532 | bug | critical | Variables should not leak to lower level keywords | alpha 3 |
| 1450 | enhancement | critical | Dictionary variable type | alpha 1 |
| 1561 | enhancement | critical | Support Python style `**kwargs` with user keywords using `&{kwargs}` syntax | alpha 1 |
| 1905 | enhancement | critical | Store list and scalar variables in same namespace | alpha 1 |
| 925 | enhancement | critical | Keyword categorization (i.e. tagging) support | alpha 2 |
| 1270 | bug | high | Run Keyword If Test (Failed / Passed) does not detect failure in teardown | alpha 3 |
| 1737 | bug | high | Standard libraries should not be importable in Python w/o `robot.libraries` prefix | alpha 1 |
| 1931 | bug | high | Timeouts can cause sporadic failures with IronPython | alpha 1 |
| 2004 | bug | high | `--ExitOnFailure` does not work if test/suite setup/teardown fails | alpha 2 |
| 2018 | bug | high | DateTime: DST problems when calculating with dates | alpha 3 |
| 1818 | enhancement | high | Embedded arguments in keywords defined in test libraries | alpha 1 |
| 1840 | enhancement | high | Libdoc: Show keywords by tags | alpha 2 |
| 1928 | enhancement | high | Drop Python/Jython 2.5 support to ease adding support for Python 3 | alpha 1 |
| 1965 | enhancement | high | Support yaml files as first class variable file | alpha 2 |
| 1976 | enhancement | high | Support programmatic modifications of test data and results as part of normal execution | alpha 2 |
| 1991 | enhancement | high | Include Jython 2.7 in standalone jar | alpha 2 |
| 293 | enhancement | high | Support reloading library | alpha 2 |
| 317 | enhancement | high | Less verbose and quiet console outputs | alpha 3 |
| 1611 | bug | medium | Variable assignment should not be part of keyword name with `--removekeywords`, in logs, in listener interface, or in other APIs | alpha 2 |
| 1900 | bug | medium | Log messages lost if library `__init__` imports or initializes other libraries | alpha 1 |
| 1908 | bug | medium | Telnet option negotiation loop | alpha 1 |
| 1992 | bug | medium | Listeners are not unregistered when using `TestSuite.run` API | alpha 2 |
| 1440 | enhancement | medium | Remove attribute ROBOT_EXIT_FOR_LOOP depracated in 2.8 | alpha 1 |
| 1603 | enhancement | medium | Support `**kwargs` with `BuiltIn.Call Method` keywords | alpha 1 |
| 1743 | enhancement | medium | Make keyword prefix (library name) less visible than keywords in HTML reports | alpha 2 |
| 1773 | enhancement | medium | Deprecate `OperatingSystem.Start Process` keyword | alpha 1 |
| 1774 | enhancement | medium | Officially deprecate `DeprecatedBuiltIn` and `DeprecatedOperatingSystem` | alpha 1 |
| 1826 | enhancement | medium | Process: Better support on Jython 2.7 (termination, signals, pid) | alpha 1 |
| 1835 | enhancement | medium | Allow giving a custom name to keywords implemented using the static and the hybrid APIs | alpha 1 |
| 1841 | enhancement | medium | Deprecate old listener API | alpha 1 |
| 1865 | enhancement | medium | Support disabling command line options accepting no values using `no` prefix (e.g. `--dryrun` -> `--nodryrun`) | alpha 1 |
| 1910 | enhancement | medium | Require exact number of keyword return value when assigning multiple scalar variables | alpha 1 |
| 1911 | enhancement | medium | Accept list variable as a wildcard anywhere when assigning variables | alpha 1 |
| 1913 | enhancement | medium | Move `Create Dictionary` to BuiltIn and enhance to preserve order, allow accessing keys as attributes, etc. | alpha 1 |
| 1914 | enhancement | medium | Catenate cell values when creating scalar variable in variable table | alpha 1 |
| 1916 | enhancement | medium | Expose `ERROR` log level to custom libraries | alpha 3 |
| 1927 | enhancement | medium | Remote: Support accessing keys of returned dicts using attribute access | alpha 1 |
| 1935 | enhancement | medium | Support keyword tags with `--flattenkeywords` and `--removekeywords` | alpha 2 |
| 1958 | enhancement | medium | `Log Many`: Support logging `&{dictionary}` variable items | alpha 1 |
| 1959 | enhancement | medium | `Wait Until Keyword Succeeds`: Support giving wait time as number of times to retry | alpha 1 |
| 1962 | enhancement | medium | Disallow using keyword with embedded arguments as normal keywords | alpha 1 |
| 1969 | enhancement | medium | Allow giving listener and model modifier instances to `robot.run` and `TestSuite.run` | alpha 3 |
| 1970 | enhancement | medium | Enhance ROBOT_LIBRARY_LISTENER to accept a list of listeners | alpha 2 |
| 1983 | enhancement | medium | PYTHONPATH environment variable should not be processed with Jython or IronPython | alpha 2 |
| 1998 | enhancement | medium | Pass keyword and library names separately to listeners | alpha 2 |
| 2020 | enhancement | medium | Do not write empty elements or attributes to output.xml | alpha 3 |
| 2027 | enhancement | medium | Deprecate `--monitorxxx` options in favor of `--consolexxx` | alpha 3 |
| 2029 | enhancement | medium | When exiting gracefully, skipped tests should get automatic `robot-exit` tag | alpha 3 |
| 2032 | enhancement | medium | Document that test and keyword tags with `robot-` prefix are reserved | alpha 3 |
| 1815 | bug | low | Keyword name conflict involving Remote keyword should cause failure, not warning | alpha 1 |
| 1906 | bug | low | Free keyword arguments (**kwargs) names cannot contain equal signs or trailing backslashes | alpha 1 |
| 1922 | bug | low | Screenshot library causes deprecation warning with wxPython 3.x | alpha 1 |
| 2002 | bug | low | Keyword and test names with urls or quotes create invalid html on log and report | alpha 2 |
| 2003 | bug | low | Checking is stdout/stderr stream terminal causes exception if stream's buffer is detached | alpha 2 |
| 2016 | bug | low | `FAIL` should not be useable as a normal log level | alpha 3 |
| 2019 | bug | low | Execution directory should not be added to module search path (`PYTHONPATH`) | alpha 2 |
| 1642 | enhancement | low | Deprecate `--runfailed` and `--rerunmerge` options | alpha 1 |
| 1775 | enhancement | low | Remove deprecated syntax for repeating single keyword | alpha 1 |
| 1897 | enhancement | low | Clean-up reference to RF 2.6 and older from User Guide and other documentation | alpha 1 |
| 1898 | enhancement | low | Improve error message for "Else" instead of "ELSE" | alpha 3 |
| 1918 | enhancement | low | Deprecate old `Meta: Name` syntax for specifying test suite metadata | alpha 1 |
| 1919 | enhancement | low | Remove possibility to setting scalar variables with lists value using `Set Test/Suite/Global Variable` keyword | alpha 1 |
| 1921 | enhancement | low | More flexible syntax to deprecate keywords | alpha 1 |
| 1923 | enhancement | low | Remove deprecated `--runmode` option | alpha 1 |
| 1924 | enhancement | low | Remove unused internal functions, classes, etc. | alpha 1 |
| 1925 | enhancement | low | Remove deprecated `--xunitfile` option | alpha 1 |
| 1929 | enhancement | low | OperatingSystem: Enhance documentation about path separators | alpha 1 |
| 1945 | enhancement | low | Enhance documentation of `Run Keyword If` return values | alpha 1 |
| 2021 | enhancement | low | Update XSD schemas | alpha 3 |
| 2028 | enhancement | low | Tag patterns starting with NOT | alpha 3 |
| 2031 | enhancement | low | Console colors and markers: Fail if given value is invalid and remove outdated `FORCE` color value | alpha 3 |

Altogether 71 issues. See on [issue tracker](https://github.com/robotframework/robotframework/issues?q=milestone%3A2.9).

2.9a2

Robot Framework 2.9 alpha 2

RF 2.9 alpha 2 is the second preview version of the forthcoming RF 2.9 release. It contains, for example, high priority enhancements related to variables and supports creating keywords with embedded arguments in test libraries. After this release the work continues with alpha 3. All issues targeted for RF 2.9 can be found from the [issue tracker](https://github.com/robotframework/robotframework/issues?q=milestone%3A2.9).

Most important new feature in alpha 2 over alpha 1 is the keyword tags support (925). The issue list at the end of this release note mentions for each feature whether it came in alpha 1 or 2, but otherwise the notes here describe the changes in 2.9 over 2.8.7, therefore containing also the alpha 1 changes.

Questions and comments related to this release can be sent to the [robotframework-users](http://groups.google.com/group/robotframework-users) and possible bugs submitted to the [issue tracker](https://github.com/robotframework/robotframework/issues).

We have not generated windows installers for this preview, but the source distribution is available from [PyPI](https://pypi.python.org/pypi/robotframework/2.9a2) and the standalone jar with Jython 2.7 can be found from downloads below these release notes.

If you have pip just run `pip install --update --pre robotframework` to install or upgrade to the latest version or use `pip install robotframework==2.9a2` to install exactly this version. For more details and other installation approaches see [installation instructions](https://github.com/robotframework/robotframework/blob/master/INSTALL.rst).

Robot Framework 2.9 alpha 2 was released on Friday June 05, 2015.

Most important enhancements

Dictionary variable type (1450)

The most noticeable feature in RF 2.9 is the new syntax to create and use dictionary (a.k.a map or hashtable) variables. Dictionaries can be returned from keywords or created in variable files, but they can also be created in the variable table:

robotframework
*** Variables ***
&{DICT} key=value second=2 third=${3}


The above example will create a dictionary variable `&{DICT}` with Python dictionary `{'key': 'value', 'second': '2', 'third': 3}` as the value. If a dictionary variable is used as a scalar variable like `${DICT}`, it will be passed forward as a single argument containing the whole dictionary. If it used like `&{DICT}`, individual items are passed as named arguments. For example, these two examples are equivalent:

robotframework
*** Test Cases ***
Example 1
My Keyword key=value second=2 third=${3}
Example 2
My Keyword &{DICT}


Individual dictionary variable items can be accessed either using special `&{DICT}[key]` syntax similarly as individual list variable items can be accessed like `{LIST}[0]`. As a special feature, dictionary variables are ordered and allow accessing values also using attribute access like `${DICT.key}`. For more information about dictionary variables, see Variables section the [User Guide](http://robotframework.org/robotframework/#user-guide).

**NOTE**: RIDE editor does not currently support dictionary variables.

Python style `**kwargs` support with user keywords using `&{kwargs}` syntax (1561)

New dictionary variable syntax can be used with user keywords to accept free keyword arguments similarly as Python based keywords can accept `**kwargs`. This can be accomplished simply by having a dictionary variable like `&{kwargs}` as the last argument in user keyword argument specification:

robotframework
*** Keywords ***
Run My Process
[Arguments] {arguments} &{configuration}
Run Process myproc.exe {arguments} &{configuration}


Also this new functionality is explained with further examples in the [User Guide](http://robotframework.org/robotframework/#user-guide).

Embedded arguments in keywords defined in test libraries (1818)

User keywords have supported embedded arguments since RF 2.1.1 (370), and finally this functionality is supported also by library keywords. This is accomplished by giving a custom name to a keyword by setting `robot_name` attribute manually or by using `robot.api.deco.keyword' decorator (1835), and using`${args}` in the name similarly as with user keywords. The implementing method or function must also accept same number of arguments as there are embedded argument.

python
from robot.api.deco import keyword

keyword(name='User "${user}" selects "${item}" from webshop')
def select_item(user, item):
...


The [User Guide](http://robotframework.org/robotframework/#user-guide) is, again, the place where to find more information and examples.

Keyword categorization (i.e. tagging) support

Keywords can now have tags (925). The tags can be added to user keywords either by new `[Tags]` setting, or by adding them to the last line of documentation.

robotframework
*** Keywords ***
My keyword
[Tags] tag1 tag2
No Operation
My other keyword
[Documentation] Tags can also be added as last line of documentation.
... Tags: tag1, tag2
No Operation


Library keywords can also use documentation to specify their tags or they can be added to `robot_tags`attribute for each method. The `keyword` decorator provides a handy shortcut for specifying tags for each method.

python
from robot.api.deco import keyword

keyword(tags=['tag1', 'tag2'])
def select_item(user, item):
...


Libdoc will show keywords by tags (1840) and tags can also be used to specify keywords for `--removekeywords` and `--flattenkeywords` commandline options (1935).

Programmatic modifications of test data and results as part of normal execution

It is now possible to specify modifiers to preprocess the test data before the test run and to modify the results before generation of log and report. The modifiers can be taken into use with `--prerunmodifier` and `--prerebotmodifier`. See the issue 1976 for an example and more details.

Other high priority enhancements and fixes
- Scalar and list variables stored in same namespace (1905)
- Standard libraries do not mask third party Python modules (1737)
- Fixed sporadic failures with timeouts on IronPython (1931)
- `--ExitOnFailure` does not work if test/suite setup/teardown fails (2004)
- Support yaml files as first class variable file (1965)

Backwards incompatible changes

Being a major release, RF 2.9 contains lot of changes and some of them are backwards incompatible.

List and scalar variables stored in same namespace (1905)

It has been possible to use a list variable `{list}` as a scalar variable `${list}` since RF 2.0.3 (117), and scalar variables containing lists have been usable as list variables since RF 2.8 (483). It has, however, been possible to also create scalar and list variables with same base name, for example, in the variable table:

robotframework
*** Variables ***
${VAR} Scalar variable
{VAR} List variable


This caused a lot of confusion, and the addition of `&{dictionary}` variables (1450) would have made situation even more complicated. As a result it was decided to store all variables in the same namespace (1905) and decide how they are used depending on the format (e.g. `${var}` for scalar, `{var}` for list, and `&{var}` for dictionary).

As a result of this change, tests using scalar and list variables with same base name will need to be updated. Unfortunately there is no other good way to detect these problems than running tests with the new version and seeing does anything break.

PYTHONPATH environment variable is not processed with Jython or IronPython anymore (1983)

Robot Framework used to add PYTHONPATH to JYTHONPATH for Jython and to IRONPYTHONPATH for IronPython. In RF 2.9 Jython and IronPython will ignore PYTHONPATH and you need to use the correct path environment variable for your executor.

Execution directory not added automatically to module search path (2019)

The directory where execution is started from is not anymore added to the module search path. If it is needed, `PYTHONPATH`, `JYTHONPATH` or `IRONPYTHONPATH` environment variable can be explicitly set to `.` before execution.

Standard libraries not importable in Python w/o `robot.libraries` prefix (1737)

It used to be possible to import Robot Framework's standard libraries in Python code by just using the library name like `import DateTime`. This caused problems in with standard libraries having same name as third party Python modules like [DateTime](https://pypi.python.org/pypi/DateTime/4.0.1).

To avoid these problems, standard libraries are not anymore directly importable in Python code. They are still importable with the `robot.libraries` prefix like `from robot.libraries import DateTime`. This has also always been the recommended way and the one used in examples in the User Guide.

Disabling command line options accepting no values by using same option again not supported anymore

Earlier it was possible to disable options accepting no values like `--dryrun` by giving the option again like `--dryrun --other options --dryrun`. This was rather confusing, and nowadays it is possible to do that by using the same option with `no` prefix like `--nodryrun` instead (1865). If option is used with and without the `no` prefix, the last used value has precedence. Having same option multiple times has no special functionality anymore.

Possible equal signs in arguments to `BuiltIn.Call Method` need to be escaped

`Call Method` nowadays supports `**kwags` (1603) and thus possible equal signs in normal arguments need to be escaped with a backslash like `hello\=world`.

Unused internal functions, classes, etc. removed

See issue 1924 for a detailed list of changes to internal APIs. These changes should not affect libraries or tools using Robot Framework's public APIs.

Other backwards incompatible changes

These changes should generally not cause problems in real life. See linked issues for more details if you think you may be affected.
- Not possible to use keyword with embedded arguments as a normal keyword (1962)
- When assigning keyword return values to multiple scalar variables, an exact number of values is required (1910)
- `Create Dictionary` keyword moved from Collections to BuiltIn (1913)
- Keyword name conflict involving Remote library keyword causes failure and not warning (1815)
- Possibility to set scalar variables with lists value using `Set Test/Suite/Global Variable` keyword removed (1919)
- Variable assignment is not anymore be part of keyword name with --removekeywords, in logs, in listener interface, or in other APIs (1611)
- Deprecated syntax for repeating single keyword removed (1775)
- Deprecated `--runmode` option removed (1923)
- Deprecated `--xunitfile` option removed in favor of `--xunit` (1925)
- Deprecated way to exit for loops using custom exception with `ROBOT_EXIT_FOR_LOOP` attribute has been removed (1440)

Deprecated features

Robot Framework 2.9 also deprecates some features that will be removed in the future releases. See linked issues for more details.
- `OperatingSystem.Start Process` keyword deprecated in favor of much more flexible `Process.Start Process` (1773)
- Listener interface version 1.0 deprecated (1841)
- `--runfailed` and `--rerunmerge` options deprecated in favor of `--rerunfailed` and `--merge`, respectively (1642)
- Old `Meta: Name` syntax for specifying test suite metadata deprecated (1918)
- `DeprecatedBuiltIn` and `DeprecatedOperatingSystem` officially deprecated (1774)

Acknowledgements

Big thanks for all following contributors. Jared Hellman (hellmanj) implemented both support for embedded arguments with library keywords (1818) and custom library keyword names (1835) required by it. Vinicius K. Ruoso (vkruoso) implemented support for adding support for multiple listeners per library (1970).

Full list of fixes and enhancements

| ID | Type | Priority | Summary | Added In |
| --- | --- | --- | --- | --- |
| 1450 | enhancement | critical | Dictionary variable type | alpha 1 |
| 1561 | enhancement | critical | Support Python style `**kwargs` with user keywords using `&{kwargs}` syntax | alpha 1 |
| 1905 | enhancement | critical | Store list and scalar variables in same namespace | alpha 1 |
| 925 | enhancement | critical | Keyword categorization (i.e. tagging) support | alpha 2 |
| 1737 | bug | high | Standard libraries should not be importable in Python w/o `robot.libraries` prefix | alpha 1 |
| 1931 | bug | high | Timeouts can cause sporadic failures with IronPython | alpha 1 |
| 2004 | bug | high | `--ExitOnFailure` does not work if test/suite setup/teardown fails | alpha 2 |
| 1818 | enhancement | high | Embedded arguments in keywords defined in test libraries | alpha 1 |
| 1840 | enhancement | high | Libdoc: Show keywords by tags | alpha 2 |
| 1928 | enhancement | high | Drop Python/Jython 2.5 support to ease adding support for Python 3 | alpha 1 |
| 1965 | enhancement | high | Support yaml files as first class variable file | alpha 2 |
| 1976 | enhancement | high | Support programmatic modifications of test data and results as part of normal execution | alpha 2 |
| 1991 | enhancement | high | Include Jython 2.7 in standalone jar | alpha 2 |
| 293 | enhancement | high | Support reloading library | alpha 2 |
| 1611 | bug | medium | Variable assignment should not be part of keyword name with --removekeywords, in logs, in listener interface, or in other APIs | alpha 2 |
| 1900 | bug | medium | Log messages lost if library `__init__` imports or initializes other libraries | alpha 1 |
| 1908 | bug | medium | Telnet option negotiation loop | alpha 1 |
| 1992 | bug | medium | Listeners are not unregistered when using `TestSuite.run` API | alpha 2 |
| 1440 | enhancement | medium | Remove attribute ROBOT_EXIT_FOR_LOOP depracated in 2.8 | alpha 1 |
| 1603 | enhancement | medium | Support `**kwargs` with `BuiltIn.Call Method` keywords | alpha 1 |
| 1743 | enhancement | medium | Make keyword prefix (library name) less visible than keywords in HTML reports | alpha 2 |
| 1773 | enhancement | medium | Deprecate `OperatingSystem.Start Process` keyword | alpha 1 |
| 1774 | enhancement | medium | Officially deprecate `DeprecatedBuiltIn` and `DeprecatedOperatingSystem` | alpha 1 |
| 1826 | enhancement | medium | Process: Better support on Jython 2.7 (termination, signals, pid) | alpha 1 |
| 1835 | enhancement | medium | Allow giving a custom name to keywords implemented using the static and the hybrid APIs | alpha 1 |
| 1841 | enhancement | medium | Deprecate old listener API | alpha 1 |
| 1865 | enhancement | medium | Support disabling command line options accepting no values using `no` prefix (e.g. `--dryrun` -> `--nodryrun`) | alpha 1 |
| 1910 | enhancement | medium | Require exact number of keyword return value when assigning multiple scalar variables | alpha 1 |
| 1911 | enhancement | medium | Accept list variable as a wildcard anywhere when assigning variables | alpha 1 |
| 1913 | enhancement | medium | Move `Create Dictionary` to BuiltIn and enhance to preserve order, allow accessing keys as attributes, etc. | alpha 1 |
| 1914 | enhancement | medium | Catenate cell values when creating scalar variable in variable table | alpha 1 |
| 1927 | enhancement | medium | Remote: Support accessing keys of returned dicts using attribute access | alpha 1 |
| 1935 | enhancement | medium | Support keyword tags with `--flattenkeywords` and `--removekeywords` | alpha 2 |
| 1958 | enhancement | medium | `Log Many`: Support logging `&{dictionary}` variable items | alpha 1 |
| 1959 | enhancement | medium | `Wait Until Keyword Succeeds`: Support giving wait time as number of times to retry | alpha 1 |
| 1962 | enhancement | medium | Disallow using keyword with embedded arguments as normal keywords | alpha 1 |
| 1970 | enhancement | medium | Enhance ROBOT_LIBRARY_LISTENER to accept a list of listeners | alpha 2 |
| 1983 | enhancement | medium | PYTHONPATH environment variable should not be processed with Jython or IronPython | alpha 2 |
| 1998 | enhancement | medium | Pass keyword and library names separately to listeners | alpha 2 |
| 1815 | bug | low | Keyword name conflict involving Remote keyword should cause failure, not warning | alpha 1 |
| 1906 | bug | low | Free keyword arguments (**kwargs) names cannot contain equal signs or trailing backslashes | alpha 1 |
| 1922 | bug | low | Screenshot library causes deprecation warning with wxPython 3.x | alpha 1 |
| 2002 | bug | low | Keyword and test names with urls or quotes create invalid html on log and report | alpha 2 |
| 2003 | bug | low | Checking is stdout/stderr stream terminal causes exception if stream's buffer is detached | alpha 2 |
| 2019 | bug | low | Execution directory should not be added to module search path (`PYTHONPATH`) | alpha 2 |
| 1642 | enhancement | low | Deprecate `--runfailed` and `--rerunmerge` options | alpha 1 |
| 1775 | enhancement | low | Remove deprecated syntax for repeating single keyword | alpha 1 |
| 1897 | enhancement | low | Clean-up reference to RF 2.6 and older from User Guide and other documentation | alpha 1 |
| 1918 | enhancement | low | Deprecate old `Meta: Name` syntax for specifying test suite metadata | alpha 1 |
| 1919 | enhancement | low | Remove possibility to setting scalar variables with lists value using `Set Test/Suite/Global Variable` keyword | alpha 1 |
| 1921 | enhancement | low | More flexible syntax to deprecate keywords | alpha 1 |
| 1923 | enhancement | low | Remove deprecated `--runmode` option | alpha 1 |
| 1924 | enhancement | low | Remove unused internal functions, classes, etc. | alpha 1 |
| 1925 | enhancement | low | Remove deprecated `--xunitfile` option | alpha 1 |
| 1929 | enhancement | low | OperatingSystem: Enhance documentation about path separators | alpha 1 |
| 1945 | enhancement | low | Enhance documentation of `Run Keyword If` return values | alpha 1 |

Altogether 56 issues. See on [issue tracker](https://github.com/robotframework/robotframework/issues?q=milestone%3A2.9).

2.9a1

Robot Framework 2.9 alpha 1

RF 2.9 alpha 1 is the first preview version of the forthcoming RF 2.9 release. It contains, for example, high priority enhancements related to variables and supports creating keywords with embedded arguments in test libraries. After this release the work continues with alpha 2 with keyword tagging and other interesting new features. All issues targeted for RF 2.9 can be found from the [issue tracker](https://github.com/robotframework/robotframework/issues?q=milestone%3A2.9).

Questions and comments related to this release can be sent to the [robotframework-users](http://groups.google.com/group/robotframework-users) and possible bugs submitted to the [issue tracker](https://github.com/robotframework/robotframework/issues).

We have not generated windows installers or standalone jar for this preview, but the source distribution is available from [PyPI](https://pypi.python.org/pypi/robotframework/2.9a1).

If you have pip just run `pip install --update --pre robotframework` to install or upgrade to the latest version or use `pip install robotframework==2.9a1` to install exactly this version. For more details and other installation approaches see [installation instructions](https://github.com/robotframework/robotframework/blob/master/INSTALL.rst).

Robot Framework 2.9 alpha 1 was released on Friday April 10, 2015.

Most important enhancements

Dictionary variable type (1450)

The most noticeable feature in RF 2.9 is the new syntax to create and use dictionary (a.k.a map or hashtable) variables. Dictionaries can be returned from keywords or created in variable files, but they can also be created in the variable table:

robotframework
*** Variables ***
&{DICT} key=value second=2 third=${3}


The above example will create a dictionary variable `&{DICT}` with Python dictionary `{'key': 'value', 'second': '2', 'third': 3}` as the value. If a dictionary variable is used as a scalar variable like `${DICT}`, it will be passed forward as a single argument containing the whole dictionary. If it used like `&{DICT}`, individual items are passed as named arguments. For example, these two examples are equivalent:

robotframework
*** Test Cases ***
Example 1
My Keyword key=value second=2 third=${3}
Example 2
My Keyword &{DICT}


Individual dictionary variable items can be accessed either using special `&{DICT}[key]` syntax similarly as individual list variable items can be accessed like `{LIST}[0]`. As a special feature, dictionary variables are ordered and allow accessing values also using attribute access like `${DICT.key}`. For more information about dictionary variables, see Variables section the [User Guide](http://robotframework.org/robotframework/#user-guide).

**NOTE**: RIDE editor does not currently support dictionary variables.

Python style `**kwargs` support with user keywords using `&{kwargs}` syntax (1561)

New dictionary variable syntax can be used with user keywords to accept free keyword arguments similarly as Python based keywords can accept `**kwargs`. This can be accomplished simply by having a dictionary variable like `&{kwargs}` as the last argument in user keyword argument specification:

robotframework
*** Keywords ***
Run My Process
[Arguments] {arguments} &{configuration}
Run Process myproc.exe {arguments} &{configuration}


Also this new functionality is explained with further examples in the [User Guide](http://robotframework.org/robotframework/#user-guide).

Embedded arguments in keywords defined in test libraries (1818)

User keywords have supported embedded arguments since RF 2.1.1 (370), and finally this functionality is supported also by library keywords. This is accomplished by giving a custom name to a keyword by setting `robot_name` attribute manually or by using `robot.api.deco.keyword' decorator (1835), and using`${args}` in the name similarly as with user keywords. The implementing method or function must also accept same number of arguments as there are embedded argument.

python
from robot.api.deco import keyword

keyword(name='User "${user}" selects "${item}" from webshop')
def select_item(user, item):
...


The [User Guide](http://robotframework.org/robotframework/#user-guide) is, again, the place where to find more information and examples.

Other high priority enhancements and fixes
- Scalar and list variables stored in same namespace (1905)
- Standard libraries do not mask third party Python modules (1737)
- Fixed sporadic failures with timeouts on IronPython (1931)

Backwards incompatible changes

Being a major release, RF 2.9 contains lot of changes and some of them are backwards incompatible.

List and scalar variables stored in same namespace (1905)

It has been possible to use a list variable `{list}` as a scalar variable `${list}` since RF 2.0.3 (117), and scalar variables containing lists have been usable as list variables since RF 2.8 (483). It has, however, been possible to also create scalar and list variables with same base name, for example, in the variable table:

robotframework
*** Variables ***
${VAR} Scalar variable
{VAR} List variable


This caused a lot of confusion, and the addition of `&{dictionary}` variables (1450) would have made situation even more complicated. As a result it was decided to store all variables in the same namespace (1905) and decide how they are used depending on the format (e.g. `${var}` for scalar, `{var}` for list, and `&{var}` for dictionary).

As a result of this change, tests using scalar and list variables with same base name will need to be updated. Unfortunately there is no other good way to detect these problems than running tests with the new version and seeing does anything break.

Standard libraries not importable in Python w/o `robot.libraries` prefix (1737)

It used to be possible to import Robot Framework's standard libraries in Python code by just using the library name like `import DateTime`. This caused problems in with standard libraries having same name as third party Python modules like [DateTime](https://pypi.python.org/pypi/DateTime/4.0.1).

To avoid these problems, standard libraries are not anymore directly importable in Python code. They are still importable with the `robot.libraries` prefix like `from robot.libraries import DateTime`. This has also always been the recommended way and the one used in examples in the User Guide.

Disabling command line options accepting no values by using same option again not supported anymore

Earlier it was possible to disable options accepting no values like `--dryrun` by giving the option again like `--dryrun --other options --dryrun`. This was rather confusing, and nowadays it is possible to do that by using the same option with `no` prefix like `--nodryrun` instead (1865). If option is used with and without the `no` prefix, the last used value has precedence. Having same option multiple times has no special functionality anymore.

Possible equal signs in arguments to `BuiltIn.Call Method` need to be escaped

`Call Method` nowadays supports `**kwags` (1603) and thus possible equal signs in normal arguments need to be escaped with a backslash like `hello\=world`.

Unused internal functions, classes, etc. removed

See issue 1924 for a detailed list of changes to internal APIs. These changes should not affect libraries or tools using Robot Framework's public APIs.

Other backwards incompatible changes

These changes should generally not cause problems in real life. See linked issues for more details if you think you may be affected.
- Not possible to use keyword with embedded arguments as a normal keyword (1962)
- When assigning keyword return values to multiple scalar variables, an exact number of values is required (1910)
- `Create Dictionary` keyword moved from Collections to BuiltIn (1913)
- Keyword name conflict involving Remote library keyword causes failure and not warning (1815)
- Possibility to set scalar variables with lists value using `Set Test/Suite/Global Variable` keyword removed (1919)
- Deprecated syntax for repeating single keyword removed (1775)
- Deprecated `--runmode` option removed (1923)
- Deprecated `--xunitfile` option removed in favor of `--xunit` (1925)
- Deprecated way to exit for loops using custom exception with `ROBOT_EXIT_FOR_LOOP` attribute has been removed (1440)

Deprecated features

Robot Framework 2.9 also deprecates some features that will be removed in the future releases. See linked issues for more details.
- `OperatingSystem.Start Process` keyword deprecated in favor of much more flexible `Process.Start Process` (1773)
- Listener interface version 1.0 deprecated (1841)
- `--runfailed` and `--rerunmerge` options deprecated in favor of `--rerunfailed` and `--merge`, respectively (1642)
- Old `Meta: Name` syntax for specifying test suite metadata deprecated (1918)
- `DeprecatedBuiltIn` and `DeprecatedOperatingSystem` officially deprecated (1774)

Acknowledgements

Big thanks for Jared Hellman (hellmanj) for implementing both support for embedded arguments with library keywords (1818) and custom library keyword names (1835) required by it.

Full list of fixes and enhancements

| ID | Type | Priority | Summary |
| --- | --- | --- | --- |
| 1450 | enhancement | critical | Dictionary variable type |
| 1561 | enhancement | critical | Support Python style `**kwargs` with user keywords using `&{kwargs}` syntax |
| 1905 | enhancement | critical | Store list and scalar variables in same namespace |
| 1737 | bug | high | Standard libraries should not be importable in Python w/o `robot.libraries` prefix |
| 1931 | bug | high | Timeouts can cause sporadic failures with IronPython |
| 1818 | enhancement | high | Embedded arguments in keywords defined in test libraries |
| 1928 | enhancement | high | Drop Python/Jython 2.5 support to ease adding support for Python 3 |
| 1900 | bug | medium | Log messages lost if library `__init__` imports or initializes other libraries |
| 1908 | bug | medium | Telnet option negotiation loop |
| 1440 | enhancement | medium | Remove attribute ROBOT_EXIT_FOR_LOOP depracated in 2.8 |
| 1603 | enhancement | medium | Support `**kwargs` with `BuiltIn.Call Method` keywords |
| 1773 | enhancement | medium | Deprecate `OperatingSystem.Start Process` keyword |
| 1774 | enhancement | medium | Officially deprecate `DeprecatedBuiltIn` and `DeprecatedOperatingSystem` |
| 1826 | enhancement | medium | Process: Better support on Jython 2.7 (termination, signals, pid) |
| 1835 | enhancement | medium | Allow giving a custom name to keywords implemented using the static and the hybrid APIs |
| 1841 | enhancement | medium | Deprecate old listener API |
| 1865 | enhancement | medium | Support disabling command line options accepting no values using `no` prefix (e.g. `--dryrun` -> `--nodryrun`) |
| 1910 | enhancement | medium | Require exact number of keyword return value when assigning multiple scalar variables |
| 1911 | enhancement | medium | Accept list variable as a wildcard anywhere when assigning variables |
| 1913 | enhancement | medium | Move `Create Dictionary` to BuiltIn and enhance to preserve order, allow accessing keys as attributes, etc. |
| 1914 | enhancement | medium | Catenate cell values when creating scalar variable in variable table |
| 1927 | enhancement | medium | Remote: Support accessing keys of returned dicts using attribute access |
| 1958 | enhancement | medium | `Log Many`: Support logging `&{dictionary}` variable items |
| 1959 | enhancement | medium | `Wait Until Keyword Succeeds`: Support giving wait time as number of times to retry |
| 1962 | enhancement | medium | Disallow using keyword with embedded arguments as normal keywords |
| 1815 | bug | low | Keyword name conflict involving Remote keyword should cause failure, not warning |
| 1906 | bug | low | Free keyword arguments (**kwargs) names cannot contain equal signs or trailing backslashes |
| 1922 | bug | low | Screenshot library causes deprecation warning with wxPython 3.x |
| 1642 | enhancement | low | Deprecate `--runfailed` and `--rerunmerge` options |
| 1775 | enhancement | low | Remove deprecated syntax for repeating single keyword |
| 1897 | enhancement | low | Clean-up reference to RF 2.6 and older from User Guide and other documentation |
| 1918 | enhancement | low | Deprecate old `Meta: Name` syntax for specifying test suite metadata |
| 1919 | enhancement | low | Remove possibility to setting scalar variables with lists value using `Set Test/Suite/Global Variable` keyword |
| 1921 | enhancement | low | More flexible syntax to deprecate keywords |
| 1923 | enhancement | low | Remove deprecated `--runmode` option |
| 1924 | enhancement | low | Remove unused internal functions, classes, etc. |
| 1925 | enhancement | low | Remove deprecated `--xunitfile` option |
| 1929 | enhancement | low | OperatingSystem: Enhance documentation about path separators |
| 1945 | enhancement | low | Enhance documentation of `Run Keyword If` return values |

Altogether 39 issues. See on [issue tracker](https://github.com/robotframework/robotframework/issues?q=milestone%3A2.9).

2.8.7

Robot Framework 2.8.7 is a new minor release with lots of enhancements and bug fixes. It was released on Friday January 16, 2015.

Installation packages are on [PyPI](https://pypi.python.org/pypi/robotframework). If you have [pip](http://pip-installer.org) available, just run `pip install --upgrade robotframework` to install the latest version. Otherwise see [installation instructions](https://github.com/robotframework/robotframework/blob/master/INSTALL.rst).

Questions and comments related to the release can be sent to the [robotframework-users](http://groups.google.com/group/robotframework-users) and possible bugs submitted to the [issue tracker](https://github.com/robotframework/robotframework/issues).

Most important bug fixes
- Installation on Jython/Python 2.5 broken (1842)
- Running Robot on thread failed (1848)
- Testdoc broken (1862)
- Failures in suite teardown ignored with `--rerunfailed` and when generating only report with Rebot (1873)

Most important enhancements
- Libdoc: Support searching keywords by name, arguments, and keywords (1872). See latest [standard library docs](http://robotframework.org/robotframework/) for an example.
- Support floats in FOR IN RANGE loop (1850)

Acknowledgements

This release has the biggest number of external contributions ever! Many thanks to Michael Walle for contributing Telnet.Read Until Prompt strip_prompt option (1874), to Tero Kinnnunen for BDD 'But' prefix (1878), to Heiko Thiery for log level config option for TelnetLibrary (1879), to Nicolae Chedea for float parameters in FOR IN RANGE (1850), and Guy Kisel for making tidy split ELSE, ELSE IF, and AND to own rows (1273).

Also thanks to everyone else who has contributed with bug reports, feature requests, patches, and fixes.

Full list of fixes and enhancements

| ID | Type | Priority | Summary |
| --- | --- | --- | --- |
| 1842 | bug | critical | Installation broken with Jython/Python 2.5 |
| 1848 | bug | high | Running Robot Framework on thread fails because signal handlers cannot be registered |
| 1862 | bug | high | Testdoc broken in 2.8.6 |
| 1873 | bug | high | Failures in suite teardown ignored with `--rerunfailed` and when generating only report with Rebot |
| 1872 | enhancement | high | Libdoc: Support searching keywords by name, arguments, and keywords |
| 1821 | bug | medium | `TestSuite.run` does not remove its log handler from the root logger |
| 1838 | bug | medium | Results get same timestamps if multiple test runs executed programmatically |
| 1866 | bug | medium | Variable file and listener arguments from command line cannot contain colons |
| 1867 | bug | medium | Rebot does not preserve order of keywords and messages in output.xml |
| 1850 | enhancement | medium | Support using floats in `FOR IN RANGE` loop |
| 1860 | enhancement | medium | Redirect messages logged with `robot.api.logger` to Python `logging` when Robot is not running |
| 1878 | enhancement | medium | Ignore also `But` BDD prefix |
| 1879 | enhancement | medium | Telnet: Support configuring log level of `telnetlib` debug messages |
| 1273 | enhancement | medium | Tidy should split `ELSE`, `ELSE IF`, and `AND` to own rows |
| 1859 | bug | low | Cannot set `__doc__` dynamically for library class |
| 1870 | bug | low | Process w/ Jython 2.7: `Terminate Process` fails with IOError if standard streams are used |
| 1883 | bug | low | Reloading report settings from hash fails on IE8 |
| 1884 | bug | low | Variables and escape sequences in suite doc not resolved in console output |
| 1845 | enhancement | low | Document that when matching tags, `AND`, `OR` and `NOT` in tags themselves must be given as lower case |
| 1851 | enhancement | low | UG: Improve documentation about using resource files with initialization files |
| 1861 | enhancement | low | Process: Enhance documentation related to process arguments |
| 1864 | enhancement | low | Testdoc: Support for creating link targets and opening them |
| 1874 | enhancement | low | Add option to Telnet.Read Until Prompt to remove prompt from return value |

Altogether 23 issues. See on [issue tracker](https://github.com/robotframework/robotframework/issues?q=milestone%3A2.8.7).

Page 13 of 14

© 2024 Safety CLI Cybersecurity Inc. All Rights Reserved.