From 395c651e61b9fca5cbf0e4df74865cefb4a9ceb2 Mon Sep 17 00:00:00 2001 From: Atsushi Mori Date: Sat, 9 Nov 2019 22:01:19 +0900 Subject: [PATCH 01/15] Use appium/events as endpoint to get events --- appium/webdriver/mobilecommand.py | 2 ++ appium/webdriver/webdriver.py | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/appium/webdriver/mobilecommand.py b/appium/webdriver/mobilecommand.py index eac5bda2..7e5c80c7 100644 --- a/appium/webdriver/mobilecommand.py +++ b/appium/webdriver/mobilecommand.py @@ -77,6 +77,8 @@ class MobileCommand(object): EXECUTE_DRIVER = 'executeDriver' + GET_EVENTS = 'getLogEvents' + # Android OPEN_NOTIFICATIONS = 'openNotifications' START_ACTIVITY = 'startActivity' diff --git a/appium/webdriver/webdriver.py b/appium/webdriver/webdriver.py index 1cf2f257..a13286d3 100644 --- a/appium/webdriver/webdriver.py +++ b/appium/webdriver/webdriver.py @@ -416,8 +416,7 @@ def events(self): `dict containing events timing information from the current session` """ try: - session = self.session - return session['events'] + return self.execute(Command.GET_EVENTS)['value'] except Exception as e: logger.warning('Could not find events information in the session. Error:', e) return {} @@ -440,6 +439,8 @@ def _addCommands(self): ('POST', '/session/$sessionId/touch/multi/perform') self.command_executor._commands[Command.SET_IMMEDIATE_VALUE] = \ ('POST', '/session/$sessionId/appium/element/$id/value') + self.command_executor._commands[Command.GET_EVENTS] = \ + ('POST', '/session/$sessionId/appium/events') # TODO Move commands for element to webelement self.command_executor._commands[Command.REPLACE_KEYS] = \ From 5700d14023292eb3ad2aeb58e8d53dd89fb92783 Mon Sep 17 00:00:00 2001 From: Atsushi Mori Date: Sat, 9 Nov 2019 22:08:07 +0900 Subject: [PATCH 02/15] Removed unnecessary codes --- appium/webdriver/webdriver.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/appium/webdriver/webdriver.py b/appium/webdriver/webdriver.py index a13286d3..a1aeaeec 100644 --- a/appium/webdriver/webdriver.py +++ b/appium/webdriver/webdriver.py @@ -389,20 +389,24 @@ def battery_info(self): @property def session(self): """ Retrieves session information from the current session + Usage: session = driver.session + Returns: - `dict containing information from the current session` + `dict`: containing information from the current session """ return self.execute(Command.GET_SESSION)['value'] @property def all_sessions(self): """ Retrieves all sessions that are open + Usage: sessions = driver.all_sessions + Returns: - `dict containing all open sessions` + `dict`: containing all open sessions """ return self.execute(Command.GET_ALL_SESSIONS)['value'] @@ -413,13 +417,9 @@ def events(self): events = driver.events Returns: - `dict containing events timing information from the current session` + `dict`: containing events timing information from the current session` """ - try: - return self.execute(Command.GET_EVENTS)['value'] - except Exception as e: - logger.warning('Could not find events information in the session. Error:', e) - return {} + return self.execute(Command.GET_EVENTS)['value'] # pylint: disable=protected-access From 8b4d35ea746c741a185eebcca46e5a845f2c6eb9 Mon Sep 17 00:00:00 2001 From: Atsushi Mori Date: Sat, 9 Nov 2019 22:34:01 +0900 Subject: [PATCH 03/15] Update unittest along to changes --- test/unit/webdriver/webdriver_test.py | 40 ++------------------------- 1 file changed, 3 insertions(+), 37 deletions(-) diff --git a/test/unit/webdriver/webdriver_test.py b/test/unit/webdriver/webdriver_test.py index 0bcee0eb..d2e6790d 100644 --- a/test/unit/webdriver/webdriver_test.py +++ b/test/unit/webdriver/webdriver_test.py @@ -231,47 +231,13 @@ def test_get_session(self): def test_get_events(self): driver = ios_w3c_driver() httpretty.register_uri( - httpretty.GET, - appium_command('/session/1234567890'), - body=json.dumps({'value': {'events': {'simStarted': [1234567890]}}}) + httpretty.POST, + appium_command('/session/1234567890/appium/events'), + body=json.dumps({'value': {'simStarted': [1234567890]}}) ) events = driver.events assert events['simStarted'] == [1234567890] - @httpretty.activate - def test_get_events_catches_missing_events(self): - driver = ios_w3c_driver() - httpretty.register_uri( - httpretty.GET, - appium_command('/session/1234567890'), - body=json.dumps({'value': {}}) - ) - events = driver.events - assert events == {} - httpretty.register_uri( - httpretty.GET, - appium_command('/session/1234567890'), - body=json.dumps({}) - ) - events = driver.events - assert events == {} - - @httpretty.activate - @patch("appium.webdriver.webdriver.logger.warning") - def test_session_catches_error(self, mock_warning): - def exceptionCallback(request, uri, headers): - raise Exception() - - driver = ios_w3c_driver() - httpretty.register_uri( - httpretty.GET, - appium_command('/session/1234567890'), - body=exceptionCallback - ) - events = driver.events - mock_warning.assert_called_once() - assert events == {} - class SubWebDriver(WebDriver): def __init__(self, command_executor, desired_capabilities, direct_connection=False): From f2b54b53dd524bc98157636f5cc2b1ff0e893b16 Mon Sep 17 00:00:00 2001 From: Atsushi Mori Date: Sun, 10 Nov 2019 13:44:21 +0900 Subject: [PATCH 04/15] Update docstring --- appium/webdriver/webdriver.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/appium/webdriver/webdriver.py b/appium/webdriver/webdriver.py index a1aeaeec..795d0da9 100644 --- a/appium/webdriver/webdriver.py +++ b/appium/webdriver/webdriver.py @@ -413,11 +413,17 @@ def all_sessions(self): @property def events(self): """ Retrieves events information from the current session + (Since Appium 1.16.0) + Usage: events = driver.events Returns: - `dict`: containing events timing information from the current session` + `dict`: A dictionary of events timing information containing the following entries + commands: (`list` of `dict`) List of dictionaries containing the following entries + cmd: (str) Sent command to appium server + startTime: (int) Received time + endTime: (init)Response time """ return self.execute(Command.GET_EVENTS)['value'] From f0325483f18ef006e7c77561bea68c0d4e044210 Mon Sep 17 00:00:00 2001 From: Atsushi Mori Date: Sun, 10 Nov 2019 13:47:57 +0900 Subject: [PATCH 05/15] Created LogEvents class --- appium/webdriver/extensions/log_events.py | 43 +++++++++++++++++++++++ appium/webdriver/webdriver.py | 21 ++--------- 2 files changed, 45 insertions(+), 19 deletions(-) create mode 100644 appium/webdriver/extensions/log_events.py diff --git a/appium/webdriver/extensions/log_events.py b/appium/webdriver/extensions/log_events.py new file mode 100644 index 00000000..e95e99fe --- /dev/null +++ b/appium/webdriver/extensions/log_events.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from selenium import webdriver + +from ..mobilecommand import MobileCommand as Command + + +class LogEvents(webdriver.Remote): + + @property + def events(self): + """ Retrieves events information from the current session + (Since Appium 1.16.0) + + Usage: + events = driver.events + + Returns: + `dict`: A dictionary of events timing information containing the following entries + commands: (`list` of `dict`) List of dictionaries containing the following entries + cmd: (str) Sent command to appium server + startTime: (int) Received time + endTime: (init)Response time + """ + return self.execute(Command.GET_EVENTS)['value'] + + # pylint: disable=protected-access + + def _addCommands(self): + self.command_executor._commands[Command.GET_EVENTS] = \ + ('POST', '/session/$sessionId/appium/events') diff --git a/appium/webdriver/webdriver.py b/appium/webdriver/webdriver.py index 795d0da9..50c3f2cd 100644 --- a/appium/webdriver/webdriver.py +++ b/appium/webdriver/webdriver.py @@ -46,6 +46,7 @@ from .extensions.ime import IME from .extensions.keyboard import Keyboard from .extensions.location import Location +from .extensions.log_events import LogEvents from .extensions.remote_fs import RemoteFS from .extensions.screen_record import ScreenRecord from .extensions.search_context import AppiumSearchContext @@ -125,6 +126,7 @@ class WebDriver( IME, Keyboard, Location, + LogEvents, Network, Performance, Power, @@ -410,23 +412,6 @@ def all_sessions(self): """ return self.execute(Command.GET_ALL_SESSIONS)['value'] - @property - def events(self): - """ Retrieves events information from the current session - (Since Appium 1.16.0) - - Usage: - events = driver.events - - Returns: - `dict`: A dictionary of events timing information containing the following entries - commands: (`list` of `dict`) List of dictionaries containing the following entries - cmd: (str) Sent command to appium server - startTime: (int) Received time - endTime: (init)Response time - """ - return self.execute(Command.GET_EVENTS)['value'] - # pylint: disable=protected-access def _addCommands(self): @@ -445,8 +430,6 @@ def _addCommands(self): ('POST', '/session/$sessionId/touch/multi/perform') self.command_executor._commands[Command.SET_IMMEDIATE_VALUE] = \ ('POST', '/session/$sessionId/appium/element/$id/value') - self.command_executor._commands[Command.GET_EVENTS] = \ - ('POST', '/session/$sessionId/appium/events') # TODO Move commands for element to webelement self.command_executor._commands[Command.REPLACE_KEYS] = \ From fb97f96219378788b127c00d4f97a88c020ebfff Mon Sep 17 00:00:00 2001 From: Atsushi Mori Date: Sun, 10 Nov 2019 19:33:41 +0900 Subject: [PATCH 06/15] Support log_event --- appium/webdriver/extensions/log_events.py | 40 +++++++++++++++++++++++ appium/webdriver/mobilecommand.py | 1 + 2 files changed, 41 insertions(+) diff --git a/appium/webdriver/extensions/log_events.py b/appium/webdriver/extensions/log_events.py index e95e99fe..09f577b2 100644 --- a/appium/webdriver/extensions/log_events.py +++ b/appium/webdriver/extensions/log_events.py @@ -36,8 +36,48 @@ def events(self): """ return self.execute(Command.GET_EVENTS)['value'] + def log_event(self, vendor, event): + """Log a custom event on the Appium server. + (Since Appium 1.16.0) + + Args: + vendor: The vendor to log + event: The event to log + + Usage: + driver.log_event('appium', 'funEvent') + + Returns: + `appium.webdriver.webdriver.WebDriver` + + Note: + When below commands are called, + + ``` + driver.log_event('appium', 'funEvent') + print(driver.events) + ``` + + output is as below. + + ``` + {'commands': [{'cmd': 'getWindowRect', 'startTime': 12345, 'endTime': 12346}], + 'appium:funEvent': [12347]} + + ``` + + """ + data = { + 'vendor': vendor, + 'event': event + } + self.execute(Command.LOG_EVENT, data) + return self + # pylint: disable=protected-access def _addCommands(self): self.command_executor._commands[Command.GET_EVENTS] = \ ('POST', '/session/$sessionId/appium/events') + self.command_executor._commands[Command.LOG_EVENT] = \ + ('POST', '/session/$sessionId/appium/log_event') diff --git a/appium/webdriver/mobilecommand.py b/appium/webdriver/mobilecommand.py index 7e5c80c7..f6d90679 100644 --- a/appium/webdriver/mobilecommand.py +++ b/appium/webdriver/mobilecommand.py @@ -78,6 +78,7 @@ class MobileCommand(object): EXECUTE_DRIVER = 'executeDriver' GET_EVENTS = 'getLogEvents' + LOG_EVENT = 'logCustomEvent' # Android OPEN_NOTIFICATIONS = 'openNotifications' From 93f0b632700d76795a17208cbc6f1bbddac42f92 Mon Sep 17 00:00:00 2001 From: Atsushi Mori Date: Sun, 10 Nov 2019 19:49:28 +0900 Subject: [PATCH 07/15] Add unittest for log_event --- appium/webdriver/extensions/log_events.py | 1 - test/unit/webdriver/log_events_test.py | 54 +++++++++++++++++++++++ test/unit/webdriver/webdriver_test.py | 11 ----- 3 files changed, 54 insertions(+), 12 deletions(-) create mode 100644 test/unit/webdriver/log_events_test.py diff --git a/appium/webdriver/extensions/log_events.py b/appium/webdriver/extensions/log_events.py index 09f577b2..7e0b80f9 100644 --- a/appium/webdriver/extensions/log_events.py +++ b/appium/webdriver/extensions/log_events.py @@ -63,7 +63,6 @@ def log_event(self, vendor, event): ``` {'commands': [{'cmd': 'getWindowRect', 'startTime': 12345, 'endTime': 12346}], 'appium:funEvent': [12347]} - ``` """ diff --git a/test/unit/webdriver/log_events_test.py b/test/unit/webdriver/log_events_test.py new file mode 100644 index 00000000..dd231204 --- /dev/null +++ b/test/unit/webdriver/log_events_test.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import json + +import httpretty + +from appium.webdriver.webdriver import WebDriver +from test.unit.helper.test_helper import ( + appium_command, + get_httpretty_request_body, + ios_w3c_driver +) + + +class TestWebDriverLogEvents(object): + + @httpretty.activate + def test_get_events(self): + driver = ios_w3c_driver() + httpretty.register_uri( + httpretty.POST, + appium_command('/session/1234567890/appium/events'), + body=json.dumps({'value': {'simStarted': [1234567890]}}) + ) + events = driver.events + assert events['simStarted'] == [1234567890] + + @httpretty.activate + def test_log_event(self): + driver = ios_w3c_driver() + httpretty.register_uri( + httpretty.POST, + appium_command('/session/1234567890/appium/log_event'), + body="" + ) + vendor_name = 'appium' + event_name = 'funEvent' + assert isinstance(driver.log_event(vendor_name, event_name), WebDriver) + + d = get_httpretty_request_body(httpretty.last_request()) + assert d['vendor'] == vendor_name + assert d['event'] == event_name diff --git a/test/unit/webdriver/webdriver_test.py b/test/unit/webdriver/webdriver_test.py index d2e6790d..f55d59a8 100644 --- a/test/unit/webdriver/webdriver_test.py +++ b/test/unit/webdriver/webdriver_test.py @@ -227,17 +227,6 @@ def test_get_session(self): assert session['deviceName'] == 'iPhone Simulator' assert session['events']['simStarted'] == [1234567890] - @httpretty.activate - def test_get_events(self): - driver = ios_w3c_driver() - httpretty.register_uri( - httpretty.POST, - appium_command('/session/1234567890/appium/events'), - body=json.dumps({'value': {'simStarted': [1234567890]}}) - ) - events = driver.events - assert events['simStarted'] == [1234567890] - class SubWebDriver(WebDriver): def __init__(self, command_executor, desired_capabilities, direct_connection=False): From b2a8c554b87055b0d60adf23877952435e831567 Mon Sep 17 00:00:00 2001 From: Atsushi Mori Date: Sun, 10 Nov 2019 19:59:24 +0900 Subject: [PATCH 08/15] Add functional test for log_event and get_event --- .../{log_events.py => log_event.py} | 2 +- appium/webdriver/webdriver.py | 4 +-- ci-jobs/functional_test.yml | 2 +- test/functional/android/log_event_tests.py | 31 +++++++++++++++++++ 4 files changed, 35 insertions(+), 4 deletions(-) rename appium/webdriver/extensions/{log_events.py => log_event.py} (98%) create mode 100644 test/functional/android/log_event_tests.py diff --git a/appium/webdriver/extensions/log_events.py b/appium/webdriver/extensions/log_event.py similarity index 98% rename from appium/webdriver/extensions/log_events.py rename to appium/webdriver/extensions/log_event.py index 7e0b80f9..cbe1c07f 100644 --- a/appium/webdriver/extensions/log_events.py +++ b/appium/webdriver/extensions/log_event.py @@ -17,7 +17,7 @@ from ..mobilecommand import MobileCommand as Command -class LogEvents(webdriver.Remote): +class LogEvent(webdriver.Remote): @property def events(self): diff --git a/appium/webdriver/webdriver.py b/appium/webdriver/webdriver.py index 50c3f2cd..06ed1b29 100644 --- a/appium/webdriver/webdriver.py +++ b/appium/webdriver/webdriver.py @@ -46,7 +46,7 @@ from .extensions.ime import IME from .extensions.keyboard import Keyboard from .extensions.location import Location -from .extensions.log_events import LogEvents +from .extensions.log_event import LogEvent from .extensions.remote_fs import RemoteFS from .extensions.screen_record import ScreenRecord from .extensions.search_context import AppiumSearchContext @@ -126,7 +126,7 @@ class WebDriver( IME, Keyboard, Location, - LogEvents, + LogEvent, Network, Performance, Power, diff --git a/ci-jobs/functional_test.yml b/ci-jobs/functional_test.yml index 6c26a74b..117c595b 100644 --- a/ci-jobs/functional_test.yml +++ b/ci-jobs/functional_test.yml @@ -85,6 +85,6 @@ jobs: name: 'func_test_android8' vmImage: ${{ parameters.vmImage }} pytestOpt: ${{ parameters.pytestOpt }} - testFiles: 'network_connection_tests.py' + testFiles: 'network_connection_tests.py log_event_tests.py' sdkVer: ${{ parameters.androidSdkVer }} CI: ${{ parameters.ci }} diff --git a/test/functional/android/log_event_tests.py b/test/functional/android/log_event_tests.py new file mode 100644 index 00000000..01e19a19 --- /dev/null +++ b/test/functional/android/log_event_tests.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import unittest + +from .helper.test_helper import BaseTestCase + + +class LogEventTests(BaseTestCase): + def test_log_event(self): + vendor = 'appium' + event = 'funEvent' + self.driver.log_event(vendor, event) + assert '{}:{}'.format(vendor, event) in self.driver.events.keys() + + +if __name__ == '__main__': + suite = unittest.TestLoader().loadTestsFromTestCase(LogEventTests) + unittest.TextTestRunner(verbosity=2).run(suite) From 174758c6575a2cba49abcd8065b70695d518194a Mon Sep 17 00:00:00 2001 From: Atsushi Mori Date: Sun, 10 Nov 2019 21:18:09 +0900 Subject: [PATCH 09/15] review comments --- appium/webdriver/extensions/log_event.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/appium/webdriver/extensions/log_event.py b/appium/webdriver/extensions/log_event.py index cbe1c07f..f0c5e5f2 100644 --- a/appium/webdriver/extensions/log_event.py +++ b/appium/webdriver/extensions/log_event.py @@ -30,9 +30,9 @@ def events(self): Returns: `dict`: A dictionary of events timing information containing the following entries commands: (`list` of `dict`) List of dictionaries containing the following entries - cmd: (str) Sent command to appium server + cmd: (str) The command name that has been sent to the appium server startTime: (int) Received time - endTime: (init)Response time + endTime: (init) Response time """ return self.execute(Command.GET_EVENTS)['value'] @@ -41,8 +41,8 @@ def log_event(self, vendor, event): (Since Appium 1.16.0) Args: - vendor: The vendor to log - event: The event to log + vendor (str): The vendor to log + event (str): The event to log Usage: driver.log_event('appium', 'funEvent') @@ -51,14 +51,14 @@ def log_event(self, vendor, event): `appium.webdriver.webdriver.WebDriver` Note: - When below commands are called, + The below commands ``` driver.log_event('appium', 'funEvent') print(driver.events) ``` - output is as below. + produce the following output ``` {'commands': [{'cmd': 'getWindowRect', 'startTime': 12345, 'endTime': 12346}], From c4efc7d44b96904aae41b1378f51ce5d19663fb6 Mon Sep 17 00:00:00 2001 From: Atsushi Mori Date: Sun, 10 Nov 2019 21:38:28 +0900 Subject: [PATCH 10/15] Restore events API --- appium/webdriver/extensions/log_event.py | 7 ++-- appium/webdriver/webdriver.py | 15 ++++++++ test/functional/android/log_event_tests.py | 2 +- test/unit/webdriver/log_events_test.py | 2 +- test/unit/webdriver/webdriver_test.py | 45 ++++++++++++++++++++++ 5 files changed, 65 insertions(+), 6 deletions(-) diff --git a/appium/webdriver/extensions/log_event.py b/appium/webdriver/extensions/log_event.py index f0c5e5f2..bbc7416e 100644 --- a/appium/webdriver/extensions/log_event.py +++ b/appium/webdriver/extensions/log_event.py @@ -19,13 +19,12 @@ class LogEvent(webdriver.Remote): - @property - def events(self): + def get_events(self): """ Retrieves events information from the current session (Since Appium 1.16.0) Usage: - events = driver.events + events = driver.get_events() Returns: `dict`: A dictionary of events timing information containing the following entries @@ -55,7 +54,7 @@ def log_event(self, vendor, event): ``` driver.log_event('appium', 'funEvent') - print(driver.events) + print(driver.get_events()) ``` produce the following output diff --git a/appium/webdriver/webdriver.py b/appium/webdriver/webdriver.py index 06ed1b29..737ba874 100644 --- a/appium/webdriver/webdriver.py +++ b/appium/webdriver/webdriver.py @@ -414,6 +414,21 @@ def all_sessions(self): # pylint: disable=protected-access + @property + def events(self): + """ Retrieves events information from the current session + Usage: + events = driver.events + Returns: + `dict containing events timing information from the current session` + """ + try: + session = self.session + return session['events'] + except Exception as e: + logger.warning('Could not find events information in the session. Error:', e) + return {} + def _addCommands(self): # call the overridden command binders from all mixin classes except for # appium.webdriver.webdriver.WebDriver and its sub-classes diff --git a/test/functional/android/log_event_tests.py b/test/functional/android/log_event_tests.py index 01e19a19..8067e9f7 100644 --- a/test/functional/android/log_event_tests.py +++ b/test/functional/android/log_event_tests.py @@ -23,7 +23,7 @@ def test_log_event(self): vendor = 'appium' event = 'funEvent' self.driver.log_event(vendor, event) - assert '{}:{}'.format(vendor, event) in self.driver.events.keys() + assert '{}:{}'.format(vendor, event) in self.driver.get_events().keys() if __name__ == '__main__': diff --git a/test/unit/webdriver/log_events_test.py b/test/unit/webdriver/log_events_test.py index dd231204..1ec0bc0d 100644 --- a/test/unit/webdriver/log_events_test.py +++ b/test/unit/webdriver/log_events_test.py @@ -34,7 +34,7 @@ def test_get_events(self): appium_command('/session/1234567890/appium/events'), body=json.dumps({'value': {'simStarted': [1234567890]}}) ) - events = driver.events + events = driver.get_events() assert events['simStarted'] == [1234567890] @httpretty.activate diff --git a/test/unit/webdriver/webdriver_test.py b/test/unit/webdriver/webdriver_test.py index f55d59a8..0bcee0eb 100644 --- a/test/unit/webdriver/webdriver_test.py +++ b/test/unit/webdriver/webdriver_test.py @@ -227,6 +227,51 @@ def test_get_session(self): assert session['deviceName'] == 'iPhone Simulator' assert session['events']['simStarted'] == [1234567890] + @httpretty.activate + def test_get_events(self): + driver = ios_w3c_driver() + httpretty.register_uri( + httpretty.GET, + appium_command('/session/1234567890'), + body=json.dumps({'value': {'events': {'simStarted': [1234567890]}}}) + ) + events = driver.events + assert events['simStarted'] == [1234567890] + + @httpretty.activate + def test_get_events_catches_missing_events(self): + driver = ios_w3c_driver() + httpretty.register_uri( + httpretty.GET, + appium_command('/session/1234567890'), + body=json.dumps({'value': {}}) + ) + events = driver.events + assert events == {} + httpretty.register_uri( + httpretty.GET, + appium_command('/session/1234567890'), + body=json.dumps({}) + ) + events = driver.events + assert events == {} + + @httpretty.activate + @patch("appium.webdriver.webdriver.logger.warning") + def test_session_catches_error(self, mock_warning): + def exceptionCallback(request, uri, headers): + raise Exception() + + driver = ios_w3c_driver() + httpretty.register_uri( + httpretty.GET, + appium_command('/session/1234567890'), + body=exceptionCallback + ) + events = driver.events + mock_warning.assert_called_once() + assert events == {} + class SubWebDriver(WebDriver): def __init__(self, command_executor, desired_capabilities, direct_connection=False): From c876452920bd8bafe2ce8a0aad8769998e084989 Mon Sep 17 00:00:00 2001 From: Atsushi Mori Date: Sun, 10 Nov 2019 21:53:42 +0900 Subject: [PATCH 11/15] Add type as arg to get_events --- appium/webdriver/extensions/log_event.py | 11 +++++++++-- test/unit/webdriver/log_events_test.py | 21 +++++++++++++++++++-- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/appium/webdriver/extensions/log_event.py b/appium/webdriver/extensions/log_event.py index bbc7416e..e38411d0 100644 --- a/appium/webdriver/extensions/log_event.py +++ b/appium/webdriver/extensions/log_event.py @@ -19,10 +19,14 @@ class LogEvent(webdriver.Remote): - def get_events(self): + def get_events(self, type=None): """ Retrieves events information from the current session (Since Appium 1.16.0) + Args: + type: (Not implemented yet) + https://github.com/appium/appium-base-driver/blob/master/lib/basedriver/commands/event.js + Usage: events = driver.get_events() @@ -33,7 +37,10 @@ def get_events(self): startTime: (int) Received time endTime: (init) Response time """ - return self.execute(Command.GET_EVENTS)['value'] + data = {} + if type is not None: + data['type'] = type + return self.execute(Command.GET_EVENTS, data)['value'] def log_event(self, vendor, event): """Log a custom event on the Appium server. diff --git a/test/unit/webdriver/log_events_test.py b/test/unit/webdriver/log_events_test.py index 1ec0bc0d..5f8ab2b9 100644 --- a/test/unit/webdriver/log_events_test.py +++ b/test/unit/webdriver/log_events_test.py @@ -32,10 +32,27 @@ def test_get_events(self): httpretty.register_uri( httpretty.POST, appium_command('/session/1234567890/appium/events'), - body=json.dumps({'value': {'simStarted': [1234567890]}}) + body=json.dumps({'value': {'appium:funEvent': [12347]}}) ) events = driver.get_events() - assert events['simStarted'] == [1234567890] + assert events['appium:funEvent'] == [12347] + + d = get_httpretty_request_body(httpretty.last_request()) + assert 'type' not in d.keys() + + @httpretty.activate + def test_get_events_args(self): + driver = ios_w3c_driver() + httpretty.register_uri( + httpretty.POST, + appium_command('/session/1234567890/appium/events'), + body=json.dumps({'value': {'appium:funEvent': [12347]}}) + ) + events = driver.get_events(type='TYPE') + assert events['appium:funEvent'] == [12347] + + d = get_httpretty_request_body(httpretty.last_request()) + assert d['type'] == 'TYPE' @httpretty.activate def test_log_event(self): From 00d53785832011298f53202b315cbf4d4d55f38c Mon Sep 17 00:00:00 2001 From: Atsushi Mori Date: Sun, 10 Nov 2019 21:58:08 +0900 Subject: [PATCH 12/15] tweak --- appium/webdriver/webdriver.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/appium/webdriver/webdriver.py b/appium/webdriver/webdriver.py index 737ba874..cb20e996 100644 --- a/appium/webdriver/webdriver.py +++ b/appium/webdriver/webdriver.py @@ -370,7 +370,7 @@ def battery_info(self): """Retrieves battery information for the device under test. Returns: - A dictionary containing the following entries + `dict`: containing the following entries level: Battery level in range [0.0, 1.0], where 1.0 means 100% charge. Any value lower than 0 means the level cannot be retrieved state: Platform-dependent battery state value. @@ -417,10 +417,12 @@ def all_sessions(self): @property def events(self): """ Retrieves events information from the current session + Usage: events = driver.events + Returns: - `dict containing events timing information from the current session` + `dict`: containing events timing information from the current session """ try: session = self.session @@ -429,6 +431,8 @@ def events(self): logger.warning('Could not find events information in the session. Error:', e) return {} + # pylint: disable=protected-access + def _addCommands(self): # call the overridden command binders from all mixin classes except for # appium.webdriver.webdriver.WebDriver and its sub-classes From 0a8406965cde76302cb1d19767d3722ad444de30 Mon Sep 17 00:00:00 2001 From: Atsushi Mori Date: Sun, 10 Nov 2019 22:00:47 +0900 Subject: [PATCH 13/15] Removed type arg from get_events It isn't implemented yet for now --- appium/webdriver/extensions/log_event.py | 11 ++--------- test/unit/webdriver/log_events_test.py | 17 ----------------- 2 files changed, 2 insertions(+), 26 deletions(-) diff --git a/appium/webdriver/extensions/log_event.py b/appium/webdriver/extensions/log_event.py index e38411d0..bbc7416e 100644 --- a/appium/webdriver/extensions/log_event.py +++ b/appium/webdriver/extensions/log_event.py @@ -19,14 +19,10 @@ class LogEvent(webdriver.Remote): - def get_events(self, type=None): + def get_events(self): """ Retrieves events information from the current session (Since Appium 1.16.0) - Args: - type: (Not implemented yet) - https://github.com/appium/appium-base-driver/blob/master/lib/basedriver/commands/event.js - Usage: events = driver.get_events() @@ -37,10 +33,7 @@ def get_events(self, type=None): startTime: (int) Received time endTime: (init) Response time """ - data = {} - if type is not None: - data['type'] = type - return self.execute(Command.GET_EVENTS, data)['value'] + return self.execute(Command.GET_EVENTS)['value'] def log_event(self, vendor, event): """Log a custom event on the Appium server. diff --git a/test/unit/webdriver/log_events_test.py b/test/unit/webdriver/log_events_test.py index 5f8ab2b9..7e26379d 100644 --- a/test/unit/webdriver/log_events_test.py +++ b/test/unit/webdriver/log_events_test.py @@ -37,23 +37,6 @@ def test_get_events(self): events = driver.get_events() assert events['appium:funEvent'] == [12347] - d = get_httpretty_request_body(httpretty.last_request()) - assert 'type' not in d.keys() - - @httpretty.activate - def test_get_events_args(self): - driver = ios_w3c_driver() - httpretty.register_uri( - httpretty.POST, - appium_command('/session/1234567890/appium/events'), - body=json.dumps({'value': {'appium:funEvent': [12347]}}) - ) - events = driver.get_events(type='TYPE') - assert events['appium:funEvent'] == [12347] - - d = get_httpretty_request_body(httpretty.last_request()) - assert d['type'] == 'TYPE' - @httpretty.activate def test_log_event(self): driver = ios_w3c_driver() From fee6c7ccebcca1db422fdc14657bd10a6ffccd18 Mon Sep 17 00:00:00 2001 From: Atsushi Mori Date: Mon, 11 Nov 2019 07:26:33 +0900 Subject: [PATCH 14/15] Add type arg to get_event The value isn't passed to the server for now. --- appium/webdriver/extensions/log_event.py | 12 ++++++++++-- test/unit/webdriver/log_events_test.py | 17 +++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/appium/webdriver/extensions/log_event.py b/appium/webdriver/extensions/log_event.py index bbc7416e..73b1c129 100644 --- a/appium/webdriver/extensions/log_event.py +++ b/appium/webdriver/extensions/log_event.py @@ -19,10 +19,14 @@ class LogEvent(webdriver.Remote): - def get_events(self): + def get_events(self, type=None): """ Retrieves events information from the current session (Since Appium 1.16.0) + Args: + type: (Not implemented yet) + https://github.com/appium/appium-base-driver/blob/master/lib/basedriver/commands/event.js + Usage: events = driver.get_events() @@ -33,7 +37,11 @@ def get_events(self): startTime: (int) Received time endTime: (init) Response time """ - return self.execute(Command.GET_EVENTS)['value'] + data = {} + if type is not None: + data['type'] = None + # data['type'] = type # TODO Use here when type is ready on the appium server + return self.execute(Command.GET_EVENTS, data)['value'] def log_event(self, vendor, event): """Log a custom event on the Appium server. diff --git a/test/unit/webdriver/log_events_test.py b/test/unit/webdriver/log_events_test.py index 7e26379d..d2fa713b 100644 --- a/test/unit/webdriver/log_events_test.py +++ b/test/unit/webdriver/log_events_test.py @@ -37,6 +37,23 @@ def test_get_events(self): events = driver.get_events() assert events['appium:funEvent'] == [12347] + d = get_httpretty_request_body(httpretty.last_request()) + assert 'type' not in d.keys() + + @httpretty.activate + def test_get_events_args(self): + driver = ios_w3c_driver() + httpretty.register_uri( + httpretty.POST, + appium_command('/session/1234567890/appium/events'), + body=json.dumps({'value': {'appium:funEvent': [12347]}}) + ) + events = driver.get_events(type='TYPE') + assert events['appium:funEvent'] == [12347] + + d = get_httpretty_request_body(httpretty.last_request()) + assert 'type' in d.keys() + @httpretty.activate def test_log_event(self): driver = ios_w3c_driver() From 9db5d0ced19013c1ae255cb8886f79d8776f0345 Mon Sep 17 00:00:00 2001 From: Atsushi Mori Date: Sun, 17 Nov 2019 00:05:08 +0900 Subject: [PATCH 15/15] Updated along to type --- appium/webdriver/extensions/log_event.py | 23 +++-------------------- test/unit/webdriver/log_events_test.py | 5 +++-- 2 files changed, 6 insertions(+), 22 deletions(-) diff --git a/appium/webdriver/extensions/log_event.py b/appium/webdriver/extensions/log_event.py index 73b1c129..383664d6 100644 --- a/appium/webdriver/extensions/log_event.py +++ b/appium/webdriver/extensions/log_event.py @@ -24,11 +24,11 @@ def get_events(self, type=None): (Since Appium 1.16.0) Args: - type: (Not implemented yet) - https://github.com/appium/appium-base-driver/blob/master/lib/basedriver/commands/event.js + type (:obj:`list` of :obj:`str`): The event type to filter with Usage: events = driver.get_events() + events = driver.get_events(['appium:funEvent']) Returns: `dict`: A dictionary of events timing information containing the following entries @@ -39,8 +39,7 @@ def get_events(self, type=None): """ data = {} if type is not None: - data['type'] = None - # data['type'] = type # TODO Use here when type is ready on the appium server + data['type'] = type return self.execute(Command.GET_EVENTS, data)['value'] def log_event(self, vendor, event): @@ -56,22 +55,6 @@ def log_event(self, vendor, event): Returns: `appium.webdriver.webdriver.WebDriver` - - Note: - The below commands - - ``` - driver.log_event('appium', 'funEvent') - print(driver.get_events()) - ``` - - produce the following output - - ``` - {'commands': [{'cmd': 'getWindowRect', 'startTime': 12345, 'endTime': 12346}], - 'appium:funEvent': [12347]} - ``` - """ data = { 'vendor': vendor, diff --git a/test/unit/webdriver/log_events_test.py b/test/unit/webdriver/log_events_test.py index d2fa713b..be5a514f 100644 --- a/test/unit/webdriver/log_events_test.py +++ b/test/unit/webdriver/log_events_test.py @@ -48,11 +48,12 @@ def test_get_events_args(self): appium_command('/session/1234567890/appium/events'), body=json.dumps({'value': {'appium:funEvent': [12347]}}) ) - events = driver.get_events(type='TYPE') + events_to_filter = ['appium:funEvent'] + events = driver.get_events(events_to_filter) assert events['appium:funEvent'] == [12347] d = get_httpretty_request_body(httpretty.last_request()) - assert 'type' in d.keys() + assert d['type'] == events_to_filter @httpretty.activate def test_log_event(self):