Skip to content

Commit

Permalink
fix: added logs_types property to configure webdriver logs types #178
Browse files Browse the repository at this point in the history
  • Loading branch information
rgonalo committed Aug 30, 2020
1 parent 07263af commit 3ea34ae
Show file tree
Hide file tree
Showing 6 changed files with 108 additions and 10 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.rst
Expand Up @@ -8,6 +8,7 @@ v1.7.2

- Move utils.py and path_utils.py files to utils folder maintaining backwards compatibility
- Fix input text when element has a shadowroot and text contains quotation marks
- New config property 'logs_types' in [Server] section to configure webdriver log types that should be downloaded

v1.7.1
------
Expand Down
11 changes: 10 additions & 1 deletion docs/remote_configuration.rst
Expand Up @@ -18,6 +18,7 @@ section in properties.cfg file::
password: SERVER_PASSWORD
video_enabled: false
logs_enabled: false
logs_types: all

enabled
~~~~~~~
Expand Down Expand Up @@ -50,7 +51,7 @@ video_enabled
| This property is only valid using `Selenium Grid Extras <https://github.com/groupon/Selenium-Grid-Extras>`_ or
| `GGR with Selenoid <https://github.com/aerokube/ggr>`_ as remote server, that allow recording videos of test
| executions.
|
| *true*: remote video recording is enabled, a video of the test execution will be recorded and saved locally
| *false*: remote video recording is disabled
Expand All @@ -59,6 +60,14 @@ logs_enabled
| *true*: webdriver and GGR logs are downloaded and saved to local files after test execution
| *false*: webdriver and GGR logs are downloaded and saved to local files only if the test fails
logs_types
~~~~~~~~~~
| Comma-separated list of webdriver log types that will be downloaded if remote test fails or if *logs_enabled* is true
|
| *all*: all available log types in remote server will be downloaded (default value)
| '': setting an empty string, any log types will be downloaded
| *client,server*: in this example, only client and server logs will be downloaded

Remote Driver Capabilities
--------------------------
Expand Down
19 changes: 11 additions & 8 deletions docs/tests_result_analysis.rst
Expand Up @@ -59,15 +59,18 @@ Webdriver logs
--------------

When a test fails during a remote execution, Toolium downloads webdriver logs into the folder *output*. Depending on
the driver type, the webdriver has different log types: client, server, browser and logcat.
the driver type, the webdriver will contain different log types, for instance, *client*, *server*, *browser*, *driver*,
*performance*, *profiler*, *logcat*, *bugreport*, etc.

In order to download webdriver logs even if the test passes, configure the property *logs_enabled* in *[Server]* section in
properties.cfg file ::
By default, when a test fails, toolium will download all log types available in current webdriver. But it can be also
configured to download only a set of log types setting the property `logs_types <https://toolium.readthedocs.io/en/latest/remote_configuration.html#logs-types>`_
in *[Server]* section in properties.cfg file ::

[Server]
logs_enabled: true
logs_types: client,server

In order to download webdriver logs even if the test passes, configure the property `logs_enabled <https://toolium.readthedocs.io/en/latest/remote_configuration.html#logs-enabled>`_
in *[Server]* section in properties.cfg file ::

logs_enabled
~~~~~~~~~~~~
| *true*: webdriver and GGR logs are downloaded and saved to local files after test execution
| *false*: webdriver and GGR logs are downloaded and saved to local files only if the test fails
[Server]
logs_enabled: true
1 change: 1 addition & 0 deletions toolium/test/conf/properties.cfg
Expand Up @@ -30,6 +30,7 @@ host: localhost
port: 4444
video_enabled: false
logs_enabled: false
logs_types: all

[VisualTests]
enabled: false
Expand Down
80 changes: 80 additions & 0 deletions toolium/test/utils/test_driver_utils.py
Expand Up @@ -88,6 +88,86 @@ def utils():
return Utils()


def test_save_webdriver_logs_one_log_type(driver_wrapper, utils):
# Configure mock
Utils.save_webdriver_logs_by_type = mock.MagicMock()
log_types_mock = mock.PropertyMock(return_value=['client', 'server'])
type(driver_wrapper.driver).log_types = log_types_mock

driver_wrapper.config.set('Server', 'log_types', 'client')

utils.save_webdriver_logs('test_name')
log_types_mock.assert_not_called()
Utils.save_webdriver_logs_by_type.assert_called_once_with('client', 'test_name')


def test_save_webdriver_logs_multiple_log_types(driver_wrapper, utils):
# Configure mock
Utils.save_webdriver_logs_by_type = mock.MagicMock()
log_types_mock = mock.PropertyMock(return_value=['client', 'server'])
type(driver_wrapper.driver).log_types = log_types_mock

driver_wrapper.config.set('Server', 'log_types', 'client,server,browser')

utils.save_webdriver_logs('test_name')
log_types_mock.assert_not_called()
Utils.save_webdriver_logs_by_type.assert_has_calls(
[mock.call('client', 'test_name'), mock.call('server', 'test_name'), mock.call('browser', 'test_name')])


def test_save_webdriver_logs_multiple_log_types_with_spaces(driver_wrapper, utils):
# Configure mock
Utils.save_webdriver_logs_by_type = mock.MagicMock()
log_types_mock = mock.PropertyMock(return_value=['client', 'server'])
type(driver_wrapper.driver).log_types = log_types_mock

driver_wrapper.config.set('Server', 'log_types', 'client, server , browser')

utils.save_webdriver_logs('test_name')
log_types_mock.assert_not_called()
Utils.save_webdriver_logs_by_type.assert_has_calls(
[mock.call('client', 'test_name'), mock.call('server', 'test_name'), mock.call('browser', 'test_name')])


def test_save_webdriver_logs_none_log_type(driver_wrapper, utils):
# Configure mock
Utils.save_webdriver_logs_by_type = mock.MagicMock()
log_types_mock = mock.PropertyMock(return_value=['client', 'server'])
type(driver_wrapper.driver).log_types = log_types_mock

driver_wrapper.config.set('Server', 'log_types', '')

utils.save_webdriver_logs('test_name')
log_types_mock.assert_not_called()
Utils.save_webdriver_logs_by_type.assert_not_called()


def test_save_webdriver_logs_all_log_type(driver_wrapper, utils):
# Configure mock
Utils.save_webdriver_logs_by_type = mock.MagicMock()
log_types_mock = mock.PropertyMock(return_value=['client', 'server'])
type(driver_wrapper.driver).log_types = log_types_mock

driver_wrapper.config.set('Server', 'log_types', 'all')

utils.save_webdriver_logs('test_name')
log_types_mock.assert_called_once_with()
Utils.save_webdriver_logs_by_type.assert_has_calls([mock.call('client', 'test_name'),
mock.call('server', 'test_name')])


def test_save_webdriver_logs_without_log_types(driver_wrapper, utils):
# Configure mock
Utils.save_webdriver_logs_by_type = mock.MagicMock()
log_types_mock = mock.PropertyMock(return_value=['client', 'server'])
type(driver_wrapper.driver).log_types = log_types_mock

utils.save_webdriver_logs('test_name')
log_types_mock.assert_called_once_with()
Utils.save_webdriver_logs_by_type.assert_has_calls([mock.call('client', 'test_name'),
mock.call('server', 'test_name')])


def test_get_remote_node(driver_wrapper, utils):
# Configure mock
driver_wrapper.driver.session_id = '5af'
Expand Down
6 changes: 5 additions & 1 deletion toolium/utils/driver_utils.py
Expand Up @@ -87,7 +87,11 @@ def save_webdriver_logs(self, test_name):
:param test_name: test that has generated these logs
"""
try:
log_types = self.driver_wrapper.driver.log_types
configured_log_types = self.driver_wrapper.config.get_optional('Server', 'log_types')
if configured_log_types is None or configured_log_types == 'all':
log_types = self.driver_wrapper.driver.log_types
else:
log_types = [log_type.strip() for log_type in configured_log_types.split(',') if log_type.strip() != '']
except Exception:
# geckodriver does not implement log_types, but it implements get_log for client and server
log_types = ['client', 'server']
Expand Down

0 comments on commit 3ea34ae

Please sign in to comment.