Changelogs » Robotframework

Robotframework

3.2b1

Robot Framework 3.2 is a new major release with new, enhanced test data parser, handy `library` decorator, inline Python evaluation support, and many other interesting new features and bug fixes. RF 3.2 beta 1 is its second preview release and it already contains majority of the planned new features and fixes, including the new parser.

For more information see the [full release notes](https://github.com/robotframework/robotframework/blob/master/doc/releasenotes/rf-3.2b1.rst).

3.2a1

Robot Framework 3.2 is a new major release with new, enhanced test data parser, inline Python evaluation support, and many other interesting new features and bug fixes. RF 3.2 alpha 1 is its first preview release and it already contains majority of the planned new features and fixes, including the new parser.

For more information see the [full release notes](https://github.com/robotframework/robotframework/blob/master/doc/releasenotes/rf-3.2a1.rst).

3.1.2

RF 3.1.2 contains few important bug fixes and some nice enhancements. It also contains several minor deprecations related to the test data syntax that pave the way towards Robot Framework 3.2 which will contain a new test data parser. For details see the full release notes at https://github.com/robotframework/robotframework/blob/master/doc/releasenotes/rf-3.1.2.rst

3.1.2rc1

RF 3.1.2 rc 1 contains few important bug fixes and some nice enhancements. It also contains several minor deprecations related to the test data syntax that pave the way towards Robot Framework 3.2 which will contain a new test data parser. For details see the full release notes at https://github.com/robotframework/robotframework/blob/master/doc/releasenotes/rf-3.1.2.rst

3.1.1

Robot Framework 3.1.1 fixes few regressions in the recent Robot Framework 3.1 release. For more details see the full release notes at https://github.com/robotframework/robotframework/blob/master/doc/releasenotes/rf-3.1.1.rst

3.1.1rc1

RF 3.1.1 rc 1 fixes few regressions in the recent RF 3.1 release. For more details see the full release notes at https://github.com/robotframework/robotframework/blob/master/doc/releasenotes/rf-3.1.1.rst

3.1

Robot Framework 3.1 is a new major release with Robotic Process Automation (RPA) support, automatic argument type conversion, support for named-only arguments, for loop enhancements, fix for intermittent corruption of `output.xml` files when using timeouts, and several other interesting new features and as various bug fixes. It also starts the deprecation process to remove the support of using test data in HTML format and making test data parsing more strict also otherwise.

For more information see the [full release notes](https://github.com/robotframework/robotframework/blob/master/doc/releasenotes/rf-3.1.rst).

3.1rc2

Robot Framework 3.1 is a new major release with Robotic Process Automation (RPA) support, automatic argument type conversion, support for named-only arguments, for loop enhancements, fix for intermittent corruption of `output.xml` files when using timeouts, and several other interesting new features and as various bug fixes. It also starts the deprecation process to remove the support of using test data in HTML format and making test data parsing more strict also otherwise.

Release candidate 2 only has one small bug fix and few documentation enhancements compared to release candidate 1. For more information about the release see the [full release notes](https://github.com/robotframework/robotframework/blob/master/doc/releasenotes/rf-3.1rc2.rst).

3.1rc1

Robot Framework 3.1 is a new major release with Robotic Process Automation (RPA) support, automatic argument type conversion, support for named-only arguments, for loop enhancements, fix for intermittent corruption of `output.xm`l files when using timeouts, and several other interesting new features and as various bug fixes. It also starts the deprecation process to remove the support of using test data in HTML format and making test data parsing more strict also otherwise.

For more information see the [full release notes](https://github.com/robotframework/robotframework/blob/master/doc/releasenotes/rf-3.1rc1.rst).

3.1b1

Robot Framework 3.1 is a new major release with Robotic Process Automation (RPA) support, automatic type conversion for arguments, support for named-only arguments, fix for intermittent corruption of `output.xml` files when using timeouts, and several other interesting new features and as various bug fixes. It also starts the deprecation process to remove the support of using test data in HTML format and making test data parsing more strict also otherwise. Robot Framework 3.1 beta 1 is the third preview release and contains most of the features and fixes the final release is going to have.

For more information see the [full release notes](https://github.com/robotframework/robotframework/blob/master/doc/releasenotes/rf-3.1b1.rst).

3.1a2

Robot Framework 3.1 is a new major release with Robotic Process Automation (RPA) support, automatic type conversion for arguments, support for named-only arguments, and several other interesting new features as well as various bug fixes. It also starts the deprecation process to remove the support of using test data in HTML format and making test data parsing more strict also otherwise. Robot Framework 3.1 alpha 2 is the second preview and already contains most of the features and fixes the final release is going to have.

For more information see the [full release notes](https://github.com/robotframework/robotframework/blob/master/doc/releasenotes/rf-3.1a2.rst).

3.1a1

Robot Framework 3.1 is a new release with terminology configuration to support Robotic Process Automation (RPA) and several other nice planned features. RF 3.1 alpha 1 is the first preview release which only contains initial RPA support as well as enhancements to installation.

For more information see the [full release notes](https://github.com/robotframework/robotframework/blob/master/doc/releasenotes/rf-3.1a1.rst).

3.0.4

Robot Framework 3.0.4 is a new minor release fixing regressions in Robot Framework 3.0.3 related to using dictionary variables. For more information see the [full release notes](https://github.com/robotframework/robotframework/blob/master/doc/releasenotes/rf-3.0.4.rst).

3.0.4rc1

Robot Framework 3.0.4 is a new minor release fixing regressions in Robot Framework 3.0.3 related to using dictionary variables. This release candidate contains all the planned changes. For more information see the [full release notes](https://github.com/robotframework/robotframework/blob/master/doc/releasenotes/rf-3.0.4.rst).

3.0.3

Robot Framework 3.0.3 is a new release containing mainly bug fixes but also few nice enhancements. See the [full release notes](https://github.com/robotframework/robotframework/blob/master/doc/releasenotes/rf-3.0.3.rst) for more details.

3.0.3rc1

Robot Framework 3.0.3 is a new release containing mainly bug fixes but also few nice enhancements. This release candidate is its first and also last planned preview release. See the [full release notes](https://github.com/robotframework/robotframework/blob/master/doc/releasenotes/rf-3.0.3.rst) for more details.

3.0.2

Robot Framework 3.0.2 is the second minor release in the Robot Framework 3.0.x series. The main motivation for this releases is fixing a performance regression with evaluating expressions using some BuiltIn keywords occurring since RF 2.9 (2523), but there are also few other fixes and several nice enhancements.  For more details about the features and fixes see the [full release notes](https://github.com/robotframework/robotframework/blob/master/doc/releasenotes/rf-3.0.2.rst).

Source distribution is available at [PyPI](https://pypi.python.org/pypi/robotframework/3.0.2) and pip users can simply run `pip install --upgrade robotframework` to install the latest release or `pip install robotframework==3.0.2` to install exactly this version.

This release has been sponsored by the [Robot Framework Foundation](http://robotframework.org/foundation). Additionally Nokia Networks has been sponsoring the work related to performance enhancements.

Robot Framework 3.0.2 was released on Monday February 13, 2017.

3.0.1

Robot Framework 3.0.1 fixes several higher and lower level bugs in the earlier releases, and also adds some really nice enhancements. The most important new features are the ability to limit parsing of test case files to a certain file type (e.g. `--extension robot`, 2365) and case-insensitivity support added to most comparison keywords in the BuiltIn library (2439). Robot Framework also now officially supports [PyPy](http://pypy.org), an alternative and in some contexts faster and more memory efficient implementation of the Python language (2513). For more details about the features and fixes see the [full release notes](https://github.com/robotframework/robotframework/blob/master/doc/releasenotes/rf-3.0.1.rst).

Source distribution is available at [PyPI](https://pypi.python.org/pypi/robotframework/3.0.1) and pip users can simply run `pip install --upgrade robotframework` to install or upgrade to the latest release or `pip install robotframework==3.0.1` to install exactly this version.

This release has been sponsored by the [Robot Framework Foundation](http://robotframework.org/foundation) and would not have been possible with this scope otherwise. Big thanks for all the member companies of the foundation for your support!

Robot Framework 3.0.1 was released on Friday January 6, 2017.

3.0

Robot Framework 3.0 is a new major release with Python 3 support and a new powerful listener interface that allows modifying executed tests as well as execution results. Also start-up scripts have been enhanced and it is now possible to run tests with new `robot` command and like `python -m robot`. See the [full release notes](https://github.com/robotframework/robotframework/blob/master/doc/releasenotes/rf-3.0.rst) for more information about new features, bug fixes, backwards incompatible changes and deprecated features.

Source distribution is available at [PyPI](https://pypi.python.org/pypi/robotframework/) and pip users can simply run `pip install --upgrade robotframework` to install or upgrade to the latest release.

The standalone JAR distribution with Jython 2.7 is available at [Maven central](http://search.maven.org/search%7Cga%7C1%7Ca%3Arobotframework). As discussed in issue 2218, separate Windows installers are not created anymore.

Robot Framework 3.0 was released on Thursday December 31, 2015.

3.0b1

Robot Framework 3.0 beta 1 is the last planned preview release before release candidates and the final 3.0 release. The biggest enhancements in Robot Framework 3.0 are Python 3 support and a new listener interface that allows modifying executed tests as well as execution results. Also start-up scripts have been enhanced and it is now possible to run tests with `robot` command and like `python -m robot`. See the [full release notes](https://github.com/robotframework/robotframework/blob/master/doc/releasenotes/rf-3.0b1.rst) for more information about new features, bug fixes, backwards incompatible changes and deprecated features in Robot Framework 3.0.

Source distribution is available at [PyPI](https://pypi.python.org/pypi/robotframework/3.0b1) and pip users can simply run `pip install --upgrade --pre robotframework` to install or upgrade to the latest release or `pip install robotframework==3.0b1` to install exactly this version.

Separate Windows installers are not created and the plan is not to create them even for final releases in the future (2218). The standalone jar distribution can be created and added here if there are requests, but we only upload final releases to the [Maven central](http://search.maven.org/search%7Cga%7C1%7Ca%3Arobotframework).

Robot Framework 3.0 beta 1 was released on Wednesday December 23, 2015.

3.0a2

Robot Framework 3.0 alpha 2 is the second preview of the next Robot Framework major version. The biggest enhancement it contains is Python 3 support, but also new generic `robot` start-up script have been introduced.

Biggest change in alpha 2 over alpha 1 is improvement in the execution speed when using listeners. The issue list at the end of [full release notes](https://github.com/robotframework/robotframework/blob/master/doc/releasenotes/rf-3.0a2.rst) mentions for each issue whether it came in alpha 1 or 2.

Source distribution is available at [PyPI](https://pypi.python.org/pypi/robotframework/3.0a2) and pip users can simply run `pip install --upgrade --pre robotframework` to install or upgrade to the latest release or `pip install robotframework==3.0a2` to install exactly this version.

Separate Windows installers are not created and the plan is not to create them even for final releases in the future (2218). The standalone jar distribution can be created and added here if there are requests, but we only upload final releases to the [Maven central](http://search.maven.org/search%7Cga%7C1%7Ca%3Arobotframework).

Robot Framework 3.0 alpha 2 was released on Thursday December 10, 2015.

3.0a1

Robot Framework 3.0 alpha 1 is the first preview of the next Robot Framework major version. The biggest enhancement it contains is Python 3 support, but also new generic `robot` start-up script have been introduced. For more details see the [full release notes](https://github.com/robotframework/robotframework/blob/master/doc/releasenotes/rf-3.0a1.rst).

Source distribution is available at [PyPI](https://pypi.python.org/pypi/robotframework/3.0a1) and pip users can simply run `pip install --upgrade --pre robotframework` to install or upgrade to the latest release or `pip install robotframework==3.0a1` to install exactly this version.

Separate Windows installers are not created and the plan is not to create them even for final releases in the future (2218). The standalone jar distribution can be created and added here if there are requests, but we only upload final releases to the [Maven central](http://search.maven.org/search%7Cga%7C1%7Ca%3Arobotframework).

Robot Framework 3.0 alpha 1 was released on Thursday November 19, 2015.

2.9.2

Robot Framework 2.9.2  fixes broken AutoItLibrary support, adds IronPython support to the Dialogs library, and contains several other fixes and enhancements. For more details see the [full release notes](https://github.com/robotframework/robotframework/blob/master/doc/releasenotes/rf-2.9.2.rst).

Source distribution and Windows installers are available at [PyPI](https://pypi.python.org/pypi/robotframework/2.9.2) and the standalone JAR with Jython 2.7 at [Maven central](http://search.maven.org/search%7Cga%7C1%7Ca%3Arobotframework). Pip users can simply run `pip install --upgrade robotframework` to install or upgrade to the latest release or `pip install robotframework==2.9.2` to install exactly this version.

Robot Framework 2.9.2 was released on Friday October 9, 2015.

2.9.1

Robot Framework 2.9.1 is a bug fix release that fixes few high priority bugs in
Robot Framework 2.9. For more details see the [full release notes](https://github.com/robotframework/robotframework/blob/master/doc/releasenotes/rf-2.9.1.rst).

Source distribution and Windows installers are available at [PyPI](https://pypi.python.org/pypi/robotframework/2.9.1) and the standalone JAR with Jython 2.7 at [Maven central](http://search.maven.org/search%7Cga%7C1%7Ca%3Arobotframework). Pip users can simply run `pip install --upgrade robotframework` to install or upgrade to the latest release or `pip install robotframework==2.9.1` to install exactly this version.

Robot Framework 2.9.1 was released on Friday August 28, 2015.

2.9

Robot Framework 2.9 is a new major version with nearly 100 fixed issues. It contains, for example, high priority enhancements related to variables, support for creating keywords with embedded arguments in test libraries, and possibility to tag keywords. The most visible enhancement is the new fresh look in logs and reports. For more details see the [full release notes](https://github.com/robotframework/robotframework/blob/master/doc/releasenotes/rf-2.9.rst).

Source distribution and Windows installers are available at [PyPI](https://pypi.python.org/pypi/robotframework/2.9) and the standalone JAR with Jython 2.7 at [Maven central](http://search.maven.org/search%7Cga%7C1%7Ca%3Arobotframework). Pip users can simply run `pip install --upgrade robotframework` to install or upgrade to the latest release or `pip install robotframework==2.9` to install exactly this version.

Robot Framework 2.9 was released on Friday July 31, 2015.

2.9rc1

Release notes

Robot Framework 2.9 rc 1 is the sixth and hopefully last 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. All issues targeted for RF 2.9 can be found from the [issue tracker](https://github.com/robotframework/robotframework/issues?q=milestone%3A2.9).

This release ought to be very stable, and we hope that it gets as much real life testing as possible. We especially hope that library and tool developers would test how well this new version works with their projects. If no issues are found from the rc 1 release in a week, RF 2.9 final will be be released based on it. If problems arise, rc 2 will be created as soon as possible.

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.9rc1) 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.9rc1` 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 rc 1 was released on Wednesday July 15, 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. Updated version is to be released shortly.
- 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 and newer are compatible with Robot Framework 2.9.
- Also RemoteSwingLibrary 2.0.2 and older use a [removed internal API](https://github.com/robotframework/remoteswinglibrary/issues/24). A fixed version is to be released shortly.
- Robot Framework Jenkins plugin 1.6.0 and older [can not parse the new output.xml](https://issues.jenkins-ci.org/browse/JENKINS-29178). Jenkins plugin 1.6.1 and newer are 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 1.4 and older do not 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.

Lighter and more neutral colors for logs and reports (1943)

Logs and reports have a new fresh look. Go run some tests and see yourself!

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`, etc.  (2040)

Robot´s variables are now available with a `$` prefix as Python variables in evaluation namespace of various 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


`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.htmlfor-loops) for more details.

Contribution guidelines (1805)

We have written guidelines helping to submit issue and contribute code. A link to them appears when submitting and issue or creating a pull request, and they are also [directly available](https://github.com/robotframework/robotframework/blob/master/CONTRIBUTING.rst). We plan to enhance the guidelines in the future, so all kind of comments and enhancement ideas are highly appreciated.

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 files  (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.

Python and Jython 2.5 support dropped (1928)

With the official [Jython 2.7](http://jython.org) version out, we dropped the support for Python and Jython 2.5 series. The standalone JAR distribution contains Jython 2.7 from now on.

Empty elements or attributes are not written to output.xml  (2020)

For example, every suite, test and keyword used to have `<doc></doc>` element even if they did not have any documentation.Nowadays such empty elements are not written to the output.xml at all. This change may affect tools processing output.xml files, but it also reduced output.xml size up to 10% in our tests.

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 without the `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 (1865)

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. 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 (1603)

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

Unused internal functions, classes, etc. removed (1924)

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)
- Run Keyword If Test (Failed / Passed) detects failures also in teardown  (1270)
- DateTime: DST fixes when calculating with dates  (2018)
- `FAIL` is no longer usable 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 the issues below 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)
- Using same setting multiple times deprecated (2063)
- `DeprecatedBuiltIn` and `DeprecatedOperatingSystem` officially deprecated (1774)
- Deprecate `--monitorxxx` options in favor of `--consolexxx`  (2027)

Acknowledgements

Robot Framework 2.9 got more contributions than any earlier release. Big thanks for the following contributors as wells for anyone who has tested the preview releases, submitted issues, or otherwise helped to make RF 2.9 a great release!
- Jared Hellman (hellmanj)  implemented 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 (jaloren) exposed `ERROR` log level for keywords (1916).
- Guillaume Grossetie (Mogztter) contributed initial versions of log and report styles (1943).
- Ed Brannin (edbrannin) implemented FOR ... IN ZIP, FOR ... IN ENUMERATE syntax (1954).
- Moon SungHoon (MoonSungHoon) added new `Get Regexp Matches` keyword to the String library (1985).
- Hélio Guilherme (HelioGuilherme66) added support for partial match for `Get Lines Matching Regexp` also in the String library (1836).
- Guy Kisel (guykisel) wrote the initial contribution guidelines (1805).

Full list of fixes and enhancements

| ID | Type | Priority | Summary | Added&nbsp;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 |
| 1805 | enhancement | high | Contribution instructions | rc 1 |
| 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 |
| 2062 | bug | medium | Not possible to print to stdout/stderr by listeners or otherwise inside `Run Keyword` variants | rc 1 |
| 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 |
| 1869 | enhancement | medium | Variable errors should not exit `Wait Until Keyword Succeeds`, `Run Keyword And Expect Error`, etc. | rc 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 |
| 1972 | enhancement | medium | User Guide: Switch examples to use plain text format instead of HTML format | rc 1 |
| 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 |
| 2063 | enhancement | medium | Deprecate using same setting multiple times | rc 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 94 issues. See on [issue tracker](https://github.com/robotframework/robotframework/issues?q=milestone%3A2.9).

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.htmlfor-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&nbsp;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&nbsp;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&nbsp;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&nbsp;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).