robot.model.visitor
¶
Interface to ease traversing through a test suite structure.
Visitors make it easy to modify test suite structures or to collect information
from them. They work both with the :mod:executable model <robot.running.model>
and the :mod:result model <robot.result.model>, but the objects passed to
the visitor methods are slightly different depending on the model they are
used with. The main differences are that on the execution side keywords do
not have child keywords nor messages, and that only the result objects have
status related attributes like :attr:status and :attr:start_time.
This module contains :class:SuiteVisitor that implements the core logic to
visit a test suite structure, and the :mod:~robot.result package contains
:class:~robot.result.visitor.ResultVisitor that supports visiting the whole
test execution result structure. Both of these visitors should be imported
via the :mod:robot.api package when used by external code.
Visitor algorithm¶
All suite, test, keyword and message objects have a :meth:visit method that
accepts a visitor instance. These methods will then call the correct visitor
method :meth:~SuiteVisitor.visit_suite, :meth:~SuiteVisitor.visit_test,
:meth:~SuiteVisitor.visit_keyword or :meth:~SuiteVisitor.visit_message,
depending on the instance where the :meth:visit method exists.
The recommended and definitely the easiest way to implement a visitor is extending
the :class:SuiteVisitor base class. The default implementation of its
:meth:visit_x methods take care of traversing child elements of the object
:obj:x recursively. A :meth:visit_x method first calls a corresponding
:meth:start_x method (e.g. :meth:visit_suite calls :meth:start_suite),
then calls :meth:visit for all child objects of the :obj:x object, and
finally calls the corresponding :meth:end_x method. The default
implementations of :meth:start_x and :meth:end_x do nothing.
All items that can appear inside tests have their own visit methods. These
include :meth:visit_keyword, :meth:visit_message (only applicable with
results, not with executable data), :meth:visit_for, :meth:visit_if, and
so on, as well as their appropriate start/end methods like :meth:start_keyword
and :meth:end_for. If there is a need to visit all these items, it is possible to
implement only :meth:start_body_item and :meth:end_body_item methods that are,
by default, called by the appropriate start/end methods. These generic methods
are new in Robot Framework 5.0.
Visitors extending the :class:SuiteVisitor can stop visiting at a certain
level either by overriding suitable :meth:visit_x method or by returning
an explicit False from any :meth:start_x method.
Examples¶
The following example visitor modifies the test suite structure it visits.
It could be used, for example, with Robot Framework's --prerunmodifier
option to modify test data before execution.
.. literalinclude:: ../../../doc/api/code_examples/SelectEveryXthTest.py :language: python
For more examples it is possible to look at the source code of visitors used
internally by Robot Framework itself. Some good examples are
:class:~robot.model.tagsetter.TagSetter and
:mod:keyword removers <robot.result.keywordremover>.
Type hints¶
Visitor methods have type hints to give more information about the model objects
they receive to editors. Because visitors can be used with both running and result
models, the types that are used as type hints are base classes from the
:mod:robot.model module. Actual visitor implementations can import appropriate
types from the :mod:robot.running or the :mod:robot.result module instead.
For example, this visitor uses the result side model objects::
1 2 3 4 5 6 7 8 9 10 11 12 | |
Type hints were added in Robot Framework 6.1. They are optional and can be removed altogether if they get in the way.
SuiteVisitor
¶
Abstract class to ease traversing through the suite structure.
See the :mod:module level <robot.model.visitor> documentation for more
information and an example.
visit_suite
¶
Implements traversing through suites.
Can be overridden to allow modifying the passed in suite without
calling :meth:start_suite or :meth:end_suite nor visiting child
suites, tests or setup and teardown at all.
Source code in src/robot/model/visitor.py
start_suite
¶
Called when a suite starts. Default implementation does nothing.
Can return explicit False to stop visiting.
end_suite
¶
visit_test
¶
Implements traversing through tests.
Can be overridden to allow modifying the passed in test without calling
:meth:start_test or :meth:end_test nor visiting the body of the test.
Source code in src/robot/model/visitor.py
start_test
¶
Called when a test starts. Default implementation does nothing.
Can return explicit False to stop visiting.
end_test
¶
visit_keyword
¶
Implements traversing through keywords.
Can be overridden to allow modifying the passed in kw without
calling :meth:start_keyword or :meth:end_keyword nor visiting
the body of the keyword
Source code in src/robot/model/visitor.py
start_keyword
¶
Called when a keyword starts.
By default, calls :meth:start_body_item which, by default, does nothing.
Can return explicit False to stop visiting.
Source code in src/robot/model/visitor.py
end_keyword
¶
Called when a keyword ends.
By default, calls :meth:end_body_item which, by default, does nothing.
visit_for
¶
Implements traversing through FOR loops.
Can be overridden to allow modifying the passed in for_ without
calling :meth:start_for or :meth:end_for nor visiting body.
Source code in src/robot/model/visitor.py
start_for
¶
Called when a FOR loop starts.
By default, calls :meth:start_body_item which, by default, does nothing.
Can return explicit False to stop visiting.
Source code in src/robot/model/visitor.py
end_for
¶
Called when a FOR loop ends.
By default, calls :meth:end_body_item which, by default, does nothing.
visit_for_iteration
¶
Implements traversing through single FOR loop iteration.
This is only used with the result side model because on the running side there are no iterations.
Can be overridden to allow modifying the passed in iteration without
calling :meth:start_for_iteration or :meth:end_for_iteration nor visiting
body.
Source code in src/robot/model/visitor.py
start_for_iteration
¶
Called when a FOR loop iteration starts.
By default, calls :meth:start_body_item which, by default, does nothing.
Can return explicit False to stop visiting.
Source code in src/robot/model/visitor.py
end_for_iteration
¶
Called when a FOR loop iteration ends.
By default, calls :meth:end_body_item which, by default, does nothing.
visit_if
¶
Implements traversing through IF/ELSE structures.
Notice that if_ does not have any data directly. Actual IF/ELSE
branches are in its body and they are visited separately using
:meth:visit_if_branch.
Can be overridden to allow modifying the passed in if_ without
calling :meth:start_if or :meth:end_if nor visiting branches.
Source code in src/robot/model/visitor.py
start_if
¶
Called when an IF/ELSE structure starts.
By default, calls :meth:start_body_item which, by default, does nothing.
Can return explicit False to stop visiting.
Source code in src/robot/model/visitor.py
end_if
¶
Called when an IF/ELSE structure ends.
By default, calls :meth:end_body_item which, by default, does nothing.
visit_if_branch
¶
Implements traversing through single IF/ELSE branch.
Can be overridden to allow modifying the passed in branch without
calling :meth:start_if_branch or :meth:end_if_branch nor visiting body.
Source code in src/robot/model/visitor.py
start_if_branch
¶
Called when an IF/ELSE branch starts.
By default, calls :meth:start_body_item which, by default, does nothing.
Can return explicit False to stop visiting.
Source code in src/robot/model/visitor.py
end_if_branch
¶
Called when an IF/ELSE branch ends.
By default, calls :meth:end_body_item which, by default, does nothing.
visit_try
¶
Implements traversing through TRY/EXCEPT structures.
This method is used with the TRY/EXCEPT root element. Actual TRY, EXCEPT, ELSE
and FINALLY branches are visited separately using :meth:visit_try_branch.
Source code in src/robot/model/visitor.py
start_try
¶
Called when a TRY/EXCEPT structure starts.
By default, calls :meth:start_body_item which, by default, does nothing.
Can return explicit False to stop visiting.
Source code in src/robot/model/visitor.py
end_try
¶
Called when a TRY/EXCEPT structure ends.
By default, calls :meth:end_body_item which, by default, does nothing.
visit_try_branch
¶
Visits individual TRY, EXCEPT, ELSE and FINALLY branches.
start_try_branch
¶
Called when TRY, EXCEPT, ELSE or FINALLY branches start.
By default, calls :meth:start_body_item which, by default, does nothing.
Can return explicit False to stop visiting.
Source code in src/robot/model/visitor.py
end_try_branch
¶
Called when TRY, EXCEPT, ELSE and FINALLY branches end.
By default, calls :meth:end_body_item which, by default, does nothing.
visit_while
¶
Implements traversing through WHILE loops.
Can be overridden to allow modifying the passed in while_ without
calling :meth:start_while or :meth:end_while nor visiting body.
Source code in src/robot/model/visitor.py
start_while
¶
Called when a WHILE loop starts.
By default, calls :meth:start_body_item which, by default, does nothing.
Can return explicit False to stop visiting.
Source code in src/robot/model/visitor.py
end_while
¶
Called when a WHILE loop ends.
By default, calls :meth:end_body_item which, by default, does nothing.
visit_while_iteration
¶
Implements traversing through single WHILE loop iteration.
This is only used with the result side model because on the running side there are no iterations.
Can be overridden to allow modifying the passed in iteration without
calling :meth:start_while_iteration or :meth:end_while_iteration nor visiting
body.
Source code in src/robot/model/visitor.py
start_while_iteration
¶
Called when a WHILE loop iteration starts.
By default, calls :meth:start_body_item which, by default, does nothing.
Can return explicit False to stop visiting.
Source code in src/robot/model/visitor.py
end_while_iteration
¶
Called when a WHILE loop iteration ends.
By default, calls :meth:end_body_item which, by default, does nothing.
visit_var
¶
start_var
¶
Called when a VAR element starts.
By default, calls :meth:start_body_item which, by default, does nothing.
Can return explicit False to stop visiting.
Source code in src/robot/model/visitor.py
end_var
¶
Called when a VAR element ends.
By default, calls :meth:end_body_item which, by default, does nothing.
visit_return
¶
start_return
¶
Called when a RETURN element starts.
By default, calls :meth:start_body_item which, by default, does nothing.
Can return explicit False to stop visiting.
Source code in src/robot/model/visitor.py
end_return
¶
Called when a RETURN element ends.
By default, calls :meth:end_body_item which, by default, does nothing.
visit_continue
¶
start_continue
¶
Called when a CONTINUE element starts.
By default, calls :meth:start_body_item which, by default, does nothing.
Can return explicit False to stop visiting.
Source code in src/robot/model/visitor.py
end_continue
¶
Called when a CONTINUE element ends.
By default, calls :meth:end_body_item which, by default, does nothing.
visit_break
¶
start_break
¶
Called when a BREAK element starts.
By default, calls :meth:start_body_item which, by default, does nothing.
Can return explicit False to stop visiting.
Source code in src/robot/model/visitor.py
end_break
¶
Called when a BREAK element ends.
By default, calls :meth:end_body_item which, by default, does nothing.
visit_error
¶
Visits body items resulting from invalid syntax.
Examples include syntax like END or ELSE in wrong place and
invalid setting like [Invalid].
Source code in src/robot/model/visitor.py
start_error
¶
Called when a ERROR element starts.
By default, calls :meth:start_body_item which, by default, does nothing.
Can return explicit False to stop visiting.
Source code in src/robot/model/visitor.py
end_error
¶
Called when a ERROR element ends.
By default, calls :meth:end_body_item which, by default, does nothing.
visit_message
¶
Implements visiting messages.
Can be overridden to allow modifying the passed in msg without
calling :meth:start_message or :meth:end_message.
Source code in src/robot/model/visitor.py
start_message
¶
Called when a message starts.
By default, calls :meth:start_body_item which, by default, does nothing.
Can return explicit False to stop visiting.
Source code in src/robot/model/visitor.py
end_message
¶
Called when a message ends.
By default, calls :meth:end_body_item which, by default, does nothing.
start_body_item
¶
Called, by default, when keywords, messages or control structures start.
More specific :meth:start_keyword, :meth:start_message, :meth:start_for`,
etc. can be implemented to visit only keywords, messages or specific control
structures.
Can return explicit False to stop visiting. Default implementation does
nothing.
Source code in src/robot/model/visitor.py
end_body_item
¶
Called, by default, when keywords, messages or control structures end.
More specific :meth:end_keyword, :meth:end_message, :meth:end_for`,
etc. can be implemented to visit only keywords, messages or specific control
structures.
Default implementation does nothing.