From 80bb38ebc1a0df02c3f7f3f5141f6488cfc7c833 Mon Sep 17 00:00:00 2001 From: vrunoa Date: Sun, 18 Aug 2019 16:58:04 -0700 Subject: [PATCH 01/17] Bump 0.47 --- appium/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appium/version.py b/appium/version.py index 2ac27b82..9e2aa246 100644 --- a/appium/version.py +++ b/appium/version.py @@ -1 +1 @@ -version = '0.46' +version = '0.47' From c0bf55bb1e15aebfbe43273b7718a2a7ebbfc426 Mon Sep 17 00:00:00 2001 From: vrunoa Date: Sun, 18 Aug 2019 17:44:11 -0700 Subject: [PATCH 02/17] add GET_SESSION --- appium/webdriver/mobilecommand.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/appium/webdriver/mobilecommand.py b/appium/webdriver/mobilecommand.py index 3128a089..c8ce55bc 100644 --- a/appium/webdriver/mobilecommand.py +++ b/appium/webdriver/mobilecommand.py @@ -15,6 +15,8 @@ class MobileCommand(object): # Common + GET_SESSION = 'getSession' + GET_LOCATION = 'getLocation' SET_LOCATION = 'setLocation' From 45bad8a1fea06d74272a2a7520451533a85720be Mon Sep 17 00:00:00 2001 From: vrunoa Date: Sun, 18 Aug 2019 17:45:24 -0700 Subject: [PATCH 03/17] add events property, this property will get the current information of the session and get the events timings --- appium/webdriver/webdriver.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/appium/webdriver/webdriver.py b/appium/webdriver/webdriver.py index 0c261e8f..8fed3c55 100644 --- a/appium/webdriver/webdriver.py +++ b/appium/webdriver/webdriver.py @@ -691,6 +691,24 @@ def battery_info(self): """ return self.execute_script('mobile: batteryInfo') + @property + def events(self): + """ Retrieves event timing information from the current session + Usage: + events = driver.events + + Returns: + `dict containing event timimgs information from the current session` + """ + self.command_executor._commands[Command.GET_SESSION] = \ + ('GET', '/session/$sessionId') + session = self.execute(Command.GET_SESSION) + try: + return session["value"]["events"] + except Exception as e: + logger.warning('Could not find events information in the session. Session: {}').format(str(session)) + return () + # pylint: disable=protected-access def _addCommands(self): From c5258b6a7169b3cdc548e90a528e837c669bf8d6 Mon Sep 17 00:00:00 2001 From: vrunoa Date: Sun, 18 Aug 2019 18:17:17 -0700 Subject: [PATCH 04/17] just updating the version for local development --- appium/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appium/version.py b/appium/version.py index 9e2aa246..52066d38 100644 --- a/appium/version.py +++ b/appium/version.py @@ -1 +1 @@ -version = '0.47' +version = '0.46-dev' From ce43a27cfffda140fb45d2a8e59f6c6b1f2d86fc Mon Sep 17 00:00:00 2001 From: vrunoa Date: Sun, 18 Aug 2019 19:00:14 -0700 Subject: [PATCH 05/17] change return type on missing events --- appium/webdriver/webdriver.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/appium/webdriver/webdriver.py b/appium/webdriver/webdriver.py index 8fed3c55..040e6fc0 100644 --- a/appium/webdriver/webdriver.py +++ b/appium/webdriver/webdriver.py @@ -706,8 +706,8 @@ def events(self): try: return session["value"]["events"] except Exception as e: - logger.warning('Could not find events information in the session. Session: {}').format(str(session)) - return () + logger.warning('Could not find events information in the session. Session: {}'.format(session)) + return {} # pylint: disable=protected-access From 3e417f75070d619e84158d5a6b3164d6055ee684 Mon Sep 17 00:00:00 2001 From: vrunoa Date: Sun, 18 Aug 2019 19:00:57 -0700 Subject: [PATCH 06/17] add unit test for events property --- test/unit/webdriver/webdriver_test.py | 30 +++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/test/unit/webdriver/webdriver_test.py b/test/unit/webdriver/webdriver_test.py index fbe83108..fafe0cc3 100644 --- a/test/unit/webdriver/webdriver_test.py +++ b/test/unit/webdriver/webdriver_test.py @@ -21,6 +21,7 @@ from appium.webdriver.webdriver import WebDriver from test.unit.helper.test_helper import ( android_w3c_driver, + ios_w3c_driver, appium_command, get_httpretty_request_body ) @@ -255,6 +256,35 @@ def test_create_session_register_uridirect_no_direct_connect_path(self): assert 'http://localhost:4723/wd/hub' == driver.command_executor._url assert ['NATIVE_APP', 'CHROMIUM'] == driver.contexts + @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 == {} + class SubWebDriver(WebDriver): def __init__(self, command_executor, desired_capabilities, direct_connection=False): From 0b9b53da52506a3502c4bc830ec663c94d61c750 Mon Sep 17 00:00:00 2001 From: vrunoa Date: Sun, 18 Aug 2019 19:03:01 -0700 Subject: [PATCH 07/17] rollback version --- appium/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appium/version.py b/appium/version.py index 52066d38..2ac27b82 100644 --- a/appium/version.py +++ b/appium/version.py @@ -1 +1 @@ -version = '0.46-dev' +version = '0.46' From 1fbf265acee102db459d1dfa650eb50155593657 Mon Sep 17 00:00:00 2001 From: vrunoa Date: Mon, 19 Aug 2019 09:33:25 -0700 Subject: [PATCH 08/17] add method for getting session_capabilities --- appium/webdriver/webdriver.py | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/appium/webdriver/webdriver.py b/appium/webdriver/webdriver.py index 040e6fc0..5868a59c 100644 --- a/appium/webdriver/webdriver.py +++ b/appium/webdriver/webdriver.py @@ -691,22 +691,30 @@ def battery_info(self): """ return self.execute_script('mobile: batteryInfo') + @property + def session_capabilities(self): + """ Retrieves session information from the current session + Usage: + session_capabilities = driver.session_capabilities + Returns: + `dict containing information from the current session` + """ + return self.execute(Command.GET_SESSION)["value"] + @property def events(self): - """ Retrieves event timing information from the current session + """ Retrieves events information from the current session Usage: events = driver.events Returns: - `dict containing event timimgs information from the current session` + `dict containing events information from the current session` """ - self.command_executor._commands[Command.GET_SESSION] = \ - ('GET', '/session/$sessionId') - session = self.execute(Command.GET_SESSION) try: - return session["value"]["events"] + session_capabilities = self.session_capabilities + return session_capabilities["events"] except Exception as e: - logger.warning('Could not find events information in the session. Session: {}'.format(session)) + logger.warning('Could not find events information in the session. Session: {}'.format(session_capabilities)) return {} # pylint: disable=protected-access @@ -719,6 +727,8 @@ def _addCommands(self): if hasattr(mixin_class, self._addCommands.__name__): getattr(mixin_class, self._addCommands.__name__, None)(self) + self.command_executor._commands[Command.GET_SESSION] = \ + ('GET', '/session/$sessionId') self.command_executor._commands[Command.TOUCH_ACTION] = \ ('POST', '/session/$sessionId/touch/perform') self.command_executor._commands[Command.MULTI_ACTION] = \ From 25ef025e405f762ab88a0480fc522f277f98887a Mon Sep 17 00:00:00 2001 From: vrunoa Date: Mon, 19 Aug 2019 09:33:35 -0700 Subject: [PATCH 09/17] update unit tests --- test/unit/webdriver/webdriver_test.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/test/unit/webdriver/webdriver_test.py b/test/unit/webdriver/webdriver_test.py index fafe0cc3..207af04a 100644 --- a/test/unit/webdriver/webdriver_test.py +++ b/test/unit/webdriver/webdriver_test.py @@ -256,6 +256,18 @@ def test_create_session_register_uridirect_no_direct_connect_path(self): assert 'http://localhost:4723/wd/hub' == driver.command_executor._url assert ['NATIVE_APP', 'CHROMIUM'] == driver.contexts + @httpretty.activate + def test_get_session_capabilities(self): + driver = ios_w3c_driver() + httpretty.register_uri( + httpretty.GET, + appium_command('/session/1234567890'), + body=json.dumps({'value':{'deviceName':'iPhone Simulator', 'events':{"simStarted":[1234567890]}}}) + ) + session = driver.session_capabilities + assert session["deviceName"] == 'iPhone Simulator' + assert session["events"]["simStarted"] == [1234567890] + @httpretty.activate def test_get_events(self): driver = ios_w3c_driver() From 23bc706fb73809e468041b17036a84eb37238df3 Mon Sep 17 00:00:00 2001 From: vrunoa Date: Mon, 19 Aug 2019 09:36:36 -0700 Subject: [PATCH 10/17] fix typo --- appium/webdriver/webdriver.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/appium/webdriver/webdriver.py b/appium/webdriver/webdriver.py index 5868a59c..0692f3f6 100644 --- a/appium/webdriver/webdriver.py +++ b/appium/webdriver/webdriver.py @@ -708,12 +708,12 @@ def events(self): events = driver.events Returns: - `dict containing events information from the current session` + `dict containing events timing information from the current session` """ try: session_capabilities = self.session_capabilities return session_capabilities["events"] - except Exception as e: + except Exception: logger.warning('Could not find events information in the session. Session: {}'.format(session_capabilities)) return {} From 0b3145ccb5d652438b14ec796f83bfe1d7221b66 Mon Sep 17 00:00:00 2001 From: vrunoa Date: Mon, 19 Aug 2019 20:51:38 -0700 Subject: [PATCH 11/17] use single quotes --- appium/webdriver/webdriver.py | 4 ++-- test/unit/webdriver/webdriver_test.py | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/appium/webdriver/webdriver.py b/appium/webdriver/webdriver.py index 0692f3f6..e565ae13 100644 --- a/appium/webdriver/webdriver.py +++ b/appium/webdriver/webdriver.py @@ -699,7 +699,7 @@ def session_capabilities(self): Returns: `dict containing information from the current session` """ - return self.execute(Command.GET_SESSION)["value"] + return self.execute(Command.GET_SESSION)['value'] @property def events(self): @@ -712,7 +712,7 @@ def events(self): """ try: session_capabilities = self.session_capabilities - return session_capabilities["events"] + return session_capabilities['events'] except Exception: logger.warning('Could not find events information in the session. Session: {}'.format(session_capabilities)) return {} diff --git a/test/unit/webdriver/webdriver_test.py b/test/unit/webdriver/webdriver_test.py index 207af04a..a2350303 100644 --- a/test/unit/webdriver/webdriver_test.py +++ b/test/unit/webdriver/webdriver_test.py @@ -262,11 +262,11 @@ def test_get_session_capabilities(self): httpretty.register_uri( httpretty.GET, appium_command('/session/1234567890'), - body=json.dumps({'value':{'deviceName':'iPhone Simulator', 'events':{"simStarted":[1234567890]}}}) + body=json.dumps({'value': {'deviceName': 'iPhone Simulator', 'events': {'simStarted': [1234567890]}}}) ) session = driver.session_capabilities - assert session["deviceName"] == 'iPhone Simulator' - assert session["events"]["simStarted"] == [1234567890] + assert session['deviceName'] == 'iPhone Simulator' + assert session['events']['simStarted'] == [1234567890] @httpretty.activate def test_get_events(self): @@ -274,10 +274,10 @@ def test_get_events(self): httpretty.register_uri( httpretty.GET, appium_command('/session/1234567890'), - body=json.dumps({'value':{'events':{"simStarted":[1234567890]}}}) + body=json.dumps({'value': {'events': {'simStarted': [1234567890]}}}) ) events = driver.events - assert events["simStarted"] == [1234567890] + assert events['simStarted'] == [1234567890] @httpretty.activate def test_get_events_catches_missing_events(self): @@ -285,7 +285,7 @@ def test_get_events_catches_missing_events(self): httpretty.register_uri( httpretty.GET, appium_command('/session/1234567890'), - body=json.dumps({'value':{}}) + body=json.dumps({'value': {}}) ) events = driver.events assert events == {} From 91728405763942f95ebba196c9b4da39cfedb193 Mon Sep 17 00:00:00 2001 From: vrunoa Date: Wed, 21 Aug 2019 08:59:19 -0700 Subject: [PATCH 12/17] change method property to session, log error --- appium/webdriver/webdriver.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/appium/webdriver/webdriver.py b/appium/webdriver/webdriver.py index e565ae13..766fe6ab 100644 --- a/appium/webdriver/webdriver.py +++ b/appium/webdriver/webdriver.py @@ -692,7 +692,7 @@ def battery_info(self): return self.execute_script('mobile: batteryInfo') @property - def session_capabilities(self): + def session(self): """ Retrieves session information from the current session Usage: session_capabilities = driver.session_capabilities @@ -711,10 +711,10 @@ def events(self): `dict containing events timing information from the current session` """ try: - session_capabilities = self.session_capabilities - return session_capabilities['events'] - except Exception: - logger.warning('Could not find events information in the session. Session: {}'.format(session_capabilities)) + session = self.session + return session['events'] + except Exception as e: + logger.warning('Could not find events information in the session. Error {}'.format(e)) return {} # pylint: disable=protected-access From e51b2562aa7f98af33468f4805d292623d680602 Mon Sep 17 00:00:00 2001 From: vrunoa Date: Wed, 21 Aug 2019 10:32:09 -0700 Subject: [PATCH 13/17] update docstring --- appium/webdriver/webdriver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appium/webdriver/webdriver.py b/appium/webdriver/webdriver.py index 766fe6ab..daa0f790 100644 --- a/appium/webdriver/webdriver.py +++ b/appium/webdriver/webdriver.py @@ -695,7 +695,7 @@ def battery_info(self): def session(self): """ Retrieves session information from the current session Usage: - session_capabilities = driver.session_capabilities + session = driver.session Returns: `dict containing information from the current session` """ From e44d050b16c019935f0275b3c87b660c5dc9043a Mon Sep 17 00:00:00 2001 From: vrunoa Date: Wed, 21 Aug 2019 10:32:20 -0700 Subject: [PATCH 14/17] update unit tests --- test/unit/webdriver/webdriver_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/webdriver/webdriver_test.py b/test/unit/webdriver/webdriver_test.py index a2350303..6eda0dc9 100644 --- a/test/unit/webdriver/webdriver_test.py +++ b/test/unit/webdriver/webdriver_test.py @@ -264,7 +264,7 @@ def test_get_session_capabilities(self): appium_command('/session/1234567890'), body=json.dumps({'value': {'deviceName': 'iPhone Simulator', 'events': {'simStarted': [1234567890]}}}) ) - session = driver.session_capabilities + session = driver.session assert session['deviceName'] == 'iPhone Simulator' assert session['events']['simStarted'] == [1234567890] From 92c0f80cbb7e36e4c265ca0d047b746702595206 Mon Sep 17 00:00:00 2001 From: vrunoa Date: Wed, 21 Aug 2019 12:55:46 -0700 Subject: [PATCH 15/17] update output of error --- appium/webdriver/webdriver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appium/webdriver/webdriver.py b/appium/webdriver/webdriver.py index daa0f790..23c5e8d6 100644 --- a/appium/webdriver/webdriver.py +++ b/appium/webdriver/webdriver.py @@ -714,7 +714,7 @@ def events(self): session = self.session return session['events'] except Exception as e: - logger.warning('Could not find events information in the session. Error {}'.format(e)) + logger.warning('Could not find events information in the session. Error:', e) return {} # pylint: disable=protected-access From 631167c00087096816ab5101474b0daae2113b76 Mon Sep 17 00:00:00 2001 From: vrunoa Date: Wed, 21 Aug 2019 12:56:09 -0700 Subject: [PATCH 16/17] add unit test to catch exception --- test/unit/webdriver/webdriver_test.py | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/test/unit/webdriver/webdriver_test.py b/test/unit/webdriver/webdriver_test.py index 6eda0dc9..41f20e20 100644 --- a/test/unit/webdriver/webdriver_test.py +++ b/test/unit/webdriver/webdriver_test.py @@ -25,7 +25,7 @@ appium_command, get_httpretty_request_body ) - +from mock import patch class TestWebDriverWebDriver(object): @@ -219,6 +219,7 @@ def test_create_session_register_uridirect(self): assert 'http://localhost2:4800/special/path/wd/hub' == driver.command_executor._url assert ['NATIVE_APP', 'CHROMIUM'] == driver.contexts + @httpretty.activate def test_create_session_register_uridirect_no_direct_connect_path(self): httpretty.register_uri( @@ -257,7 +258,7 @@ def test_create_session_register_uridirect_no_direct_connect_path(self): assert ['NATIVE_APP', 'CHROMIUM'] == driver.contexts @httpretty.activate - def test_get_session_capabilities(self): + def test_get_session(self): driver = ios_w3c_driver() httpretty.register_uri( httpretty.GET, @@ -297,6 +298,23 @@ def test_get_events_catches_missing_events(self): 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 bec75c5daf3b4d88e8d025afa26b914182c409d7 Mon Sep 17 00:00:00 2001 From: vrunoa Date: Wed, 21 Aug 2019 17:50:35 -0700 Subject: [PATCH 17/17] fix lint --- test/unit/webdriver/webdriver_test.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/unit/webdriver/webdriver_test.py b/test/unit/webdriver/webdriver_test.py index 41f20e20..c2852b5f 100644 --- a/test/unit/webdriver/webdriver_test.py +++ b/test/unit/webdriver/webdriver_test.py @@ -27,6 +27,7 @@ ) from mock import patch + class TestWebDriverWebDriver(object): @httpretty.activate @@ -219,7 +220,6 @@ def test_create_session_register_uridirect(self): assert 'http://localhost2:4800/special/path/wd/hub' == driver.command_executor._url assert ['NATIVE_APP', 'CHROMIUM'] == driver.contexts - @httpretty.activate def test_create_session_register_uridirect_no_direct_connect_path(self): httpretty.register_uri( @@ -315,7 +315,6 @@ def exceptionCallback(request, uri, headers): assert events == {} - class SubWebDriver(WebDriver): def __init__(self, command_executor, desired_capabilities, direct_connection=False): super(SubWebDriver, self).__init__(