From ebf2ad206e72327a9aea87f250cb3c3eb4dc49ed Mon Sep 17 00:00:00 2001 From: Churikova Tetiana Date: Thu, 18 Nov 2021 16:16:48 +0100 Subject: [PATCH] e2e: new checks, formatting --- test/appium/support/base_test_report.py | 3 +- test/appium/support/testrail_report.py | 27 +-- .../account_management/test_create_account.py | 24 +-- .../atomic/account_management/test_keycard.py | 65 +++---- .../atomic/account_management/test_profile.py | 165 +++++++++++++----- .../test_wallet_management.py | 30 ++-- .../atomic/chats/test_chats_management.py | 74 ++++---- .../tests/atomic/chats/test_commands.py | 15 +- .../tests/atomic/chats/test_communities.py | 18 +- .../tests/atomic/chats/test_group_chat.py | 39 +++-- .../atomic/chats/test_keycard_commands.py | 13 +- .../tests/atomic/chats/test_one_to_one.py | 32 ++-- test/appium/tests/atomic/chats/test_public.py | 37 ++-- .../dapps_and_browsing/test_browsing.py | 21 +-- .../atomic/dapps_and_browsing/test_dapps.py | 3 +- .../dapps_and_browsing/test_deep_links.py | 6 +- test/appium/tests/atomic/test_upgrade.py | 55 +++--- .../transactions/test_dapps_transactions.py | 14 +- .../test_keycard_dapps_transactions.py | 8 +- .../transactions/test_keycard_wallet.py | 36 ++-- .../tests/atomic/transactions/test_wallet.py | 96 +++++----- .../test_multiple_driver_tests.py | 26 +-- test/appium/tests/base_test_case.py | 28 +-- test/appium/tests/marks.py | 2 +- test/appium/tests/test_api.py | 3 - test/appium/tests/test_performance.py | 6 +- test/appium/tests/users.py | 38 ++-- test/appium/views/base_element.py | 48 ++--- test/appium/views/base_view.py | 46 ++--- test/appium/views/chat_view.py | 109 +++++++----- test/appium/views/dapps_view.py | 2 + test/appium/views/home_view.py | 32 ++-- test/appium/views/keycard_view.py | 6 +- test/appium/views/profile_view.py | 49 ++++-- test/appium/views/send_transaction_view.py | 38 ++-- test/appium/views/sign_in_view.py | 18 +- test/appium/views/transactions_view.py | 6 +- test/appium/views/wallet_view.py | 111 +++++++----- test/appium/views/web_views/base_web_view.py | 8 +- .../views/web_views/status_test_dapp.py | 1 + 40 files changed, 775 insertions(+), 583 deletions(-) diff --git a/test/appium/support/base_test_report.py b/test/appium/support/base_test_report.py index 8573d465c8..cd44ad32b5 100644 --- a/test/appium/support/base_test_report.py +++ b/test/appium/support/base_test_report.py @@ -89,7 +89,8 @@ class BaseTestReport: token = self.get_sauce_token(job_id) return 'https://saucelabs.com/jobs/%s?auth=%s' % (job_id, token) - def get_jenkins_link_to_rerun_e2e(self, branch_name="develop", pr_id="", apk_name="", tr_case_ids=""): + @staticmethod + def get_jenkins_link_to_rerun_e2e(branch_name="develop", pr_id="", apk_name="", tr_case_ids=""): return 'https://ci.status.im/job/end-to-end-tests/job/status-app-prs-rerun/parambuild/' \ '?BRANCH_NAME=%s&APK_NAME=%s&PR_ID=%s&TR_CASE_IDS=%s' % (branch_name, apk_name, pr_id, tr_case_ids) diff --git a/test/appium/support/testrail_report.py b/test/appium/support/testrail_report.py index 2c757a777d..09945c5601 100644 --- a/test/appium/support/testrail_report.py +++ b/test/appium/support/testrail_report.py @@ -8,6 +8,7 @@ from os import environ from support.base_test_report import BaseTestReport from sys import argv + class TestrailReport(BaseTestReport): def __init__(self): @@ -45,7 +46,8 @@ class TestrailReport(BaseTestReport): def add_attachment(self, method, path): files = {'attachment': (open(path, 'rb'))} - result = requests.post(self.api_url + method, headers={'Authorization': self.headers['Authorization']}, files=files) + result = requests.post(self.api_url + method, headers={'Authorization': self.headers['Authorization']}, + files=files) files['attachment'].close() return result.json() @@ -84,7 +86,9 @@ class TestrailReport(BaseTestReport): def get_cases(self, section_ids): test_cases = list() for section_id in section_ids: - test_cases.append(self.get('get_cases/%s&suite_id=%s§ion_id=%s' % (self.project_id, self.suite_id, section_id))['cases']) + test_cases.append( + self.get('get_cases/%s&suite_id=%s§ion_id=%s' % (self.project_id, self.suite_id, section_id))[ + 'cases']) return itertools.chain.from_iterable(test_cases) def get_regression_cases(self): @@ -123,12 +127,14 @@ class TestrailReport(BaseTestReport): for i, device in enumerate(last_testrun.jobs): devices += "# [Device %d](%s) \n" % (i + 1, self.get_sauce_job_url(device)) data = {'status_id': self.outcomes['undefined_fail'] if last_testrun.error else self.outcomes['passed'], - 'comment': '%s' % ('# Error: \n %s \n' % emoji.demojize(last_testrun.error)) + devices + test_steps if last_testrun.error + 'comment': '%s' % ('# Error: \n %s \n' % emoji.demojize( + last_testrun.error)) + devices + test_steps if last_testrun.error else devices + test_steps} - result_id =self.post(method, data=data)['id'] + result_id = self.post(method, data=data)['id'] if last_testrun.error: for geth in test.geth_paths.keys(): - self.add_attachment(method='add_attachment_to_result/%s' % str(result_id), path=test.geth_paths[geth]) + self.add_attachment(method='add_attachment_to_result/%s' % str(result_id), + path=test.geth_paths[geth]) self.change_test_run_description() def change_test_run_description(self): @@ -153,12 +159,12 @@ class TestrailReport(BaseTestReport): case_title = '\n' case_title += '-------\n' case_title += "## %s) ID %s: [%s](%s) \n" % (i + 1, test.testrail_case_id, test.name, test_rail_link) - error ="```%s```\n" % last_testrun.error[:255] + error = "```%s```\n" % last_testrun.error[:255] for job_id, f in last_testrun.jobs.items(): - case_info = "Logs for device %d: [steps](%s), [failure screenshot](%s)"\ - % (f, - self.get_sauce_job_url(job_id), - self.get_sauce_final_screenshot_url(job_id)) + case_info = "Logs for device %d: [steps](%s), [failure screenshot](%s)" \ + % (f, + self.get_sauce_job_url(job_id), + self.get_sauce_final_screenshot_url(job_id)) description += case_title + error + case_info description_title += '## Failed tests: %s \n' % ','.join(map(str, ids_failed_test)) @@ -167,7 +173,6 @@ class TestrailReport(BaseTestReport): request_body = {'description': final_description} return self.post('update_run/%s' % self.run_id, request_body) - def get_run_results(self): return self.get('get_results_for_run/%s' % self.run_id)['results'] diff --git a/test/appium/tests/atomic/account_management/test_create_account.py b/test/appium/tests/atomic/account_management/test_create_account.py index bf62ea08b2..7f44403955 100644 --- a/test/appium/tests/atomic/account_management/test_create_account.py +++ b/test/appium/tests/atomic/account_management/test_create_account.py @@ -15,7 +15,7 @@ class TestCreateAccount(SingleDeviceTestCase): sign_in = SignInView(self.driver) sign_in.just_fyi("Creating multiaccount with special char password") - password=basic_user['special_chars_password'] + password = basic_user['special_chars_password'] home = sign_in.create_user(password=password) public_key, default_username = home.get_public_key_and_username(return_username=True) profile = home.get_profile_view() @@ -66,7 +66,8 @@ class TestCreateAccount(SingleDeviceTestCase): passphrase = fill_string_with_char(passphrase.upper(), ' ', 3, True, True) sign_in = SignInView(self.driver) - sign_in.just_fyi("Restore multiaccount from uppercase seed phrase with whitespaces and set password with special chars") + sign_in.just_fyi( + "Restore multiaccount from uppercase seed phrase with whitespaces and set password with special chars") sign_in.recover_access(passphrase, password=password) profile = sign_in.profile_button.click() username = profile.default_username_text.text @@ -99,7 +100,8 @@ class TestCreateAccount(SingleDeviceTestCase): sign_in.get_started_button.click_until_presence_of_element(sign_in.generate_key_button) sign_in.generate_key_button.click() from views.sign_in_view import MultiAccountButton - account_button = sign_in.get_multiaccount_by_position(position=random.randint(1, 4), element_class=MultiAccountButton) + account_button = sign_in.get_multiaccount_by_position(position=random.randint(1, 4), + element_class=MultiAccountButton) username = account_button.username.text account_button.click() sign_in.next_button.click() @@ -130,7 +132,8 @@ class TestCreateAccount(SingleDeviceTestCase): if home.element_by_text(texts[0]).is_element_displayed(): self.errors.append("'%s' text is shown after relogin, but welcome view was closed" % texts[0]) if not home.element_by_translation_id("welcome-blank-message").is_element_displayed(): - self.errors.append("'%s' text is not shown after welcome view was closed" % home.get_translation_by_key("welcome-blank-message")) + self.errors.append("'%s' text is not shown after welcome view was closed" % home.get_translation_by_key( + "welcome-blank-message")) self.errors.verify_no_errors() @@ -154,7 +157,7 @@ class TestCreateAccount(SingleDeviceTestCase): 'phrase': 'a', 'validation message': '', 'words count': 1, - 'popup' : False + 'popup': False }, { 'case': 'mnemonic but checksum validation fails', @@ -173,9 +176,9 @@ class TestCreateAccount(SingleDeviceTestCase): for validation in validations: sign_in.just_fyi("Checking %s" % validation.get('case')) phrase, msg, words_count, popup = validation.get('phrase'), \ - validation.get('validation message'), \ - validation.get('words count'),\ - validation.get('popup') + validation.get('validation message'), \ + validation.get('words count'), \ + validation.get('popup') if sign_in.access_key_button.is_element_displayed(): sign_in.access_key_button.click() if sign_in.enter_seed_phrase_button.is_element_displayed(): @@ -230,7 +233,7 @@ class TestCreateAccount(SingleDeviceTestCase): if sign_in.maybe_later_button.is_element_displayed(10): self.driver.fail('%s %s' % (error, cases[0])) - sign_in.just_fyi('Checking case when %s'% cases[1]) + sign_in.just_fyi('Checking case when %s' % cases[1]) sign_in.create_password_input.send_keys('123456') [field.send_keys('123456') for field in (sign_in.create_password_input, sign_in.confirm_your_password_input)] sign_in.confirm_your_password_input.delete_last_symbols(1) @@ -267,6 +270,3 @@ class TestCreateAccount(SingleDeviceTestCase): profile.delete_profile_button.click() profile.ok_button.click() self.errors.verify_no_errors() - - - diff --git a/test/appium/tests/atomic/account_management/test_keycard.py b/test/appium/tests/atomic/account_management/test_keycard.py index b7d85486bb..2a8805457d 100644 --- a/test/appium/tests/atomic/account_management/test_keycard.py +++ b/test/appium/tests/atomic/account_management/test_keycard.py @@ -71,13 +71,13 @@ class TestCreateAccount(SingleDeviceTestCase): sign_in.lets_go_button.wait_and_click(30) sign_in.just_fyi('Check that after migrating account with assets is restored') - wallet_view = sign_in.wallet_button.click() + wallet = sign_in.wallet_button.click() for asset in ['ETH', 'ADI', 'STT']: - if wallet_view.get_asset_amount_by_name(asset) == 0: + if wallet.get_asset_amount_by_name(asset) == 0: self.errors.append('Asset %s was not restored' % asset) sign_in.just_fyi('Check that after migration wallet address matches expected') - address = wallet_view.get_wallet_address() + address = wallet.get_wallet_address() if address != '0x%s' % basic_user['address']: self.errors.append('Restored address %s does not match expected' % address) @@ -90,7 +90,8 @@ class TestCreateAccount(SingleDeviceTestCase): self.errors.append('Default username %s does not match expected' % default_username) profile.logout() - sign_in.just_fyi('Check that can login with migrated account, keycard banner is not shown and no option to migrate') + sign_in.just_fyi( + 'Check that can login with migrated account, keycard banner is not shown and no option to migrate') sign_in.get_multiaccount_by_position(1).click() if sign_in.get_keycard_banner.is_element_displayed(): self.errors.append("Get a keycard banner is shown on migrated keycard multiaccount") @@ -101,10 +102,10 @@ class TestCreateAccount(SingleDeviceTestCase): sign_in.just_fyi('Check that can add another wallet account and send transaction') home.wallet_button.click() - wallet_view.add_account(account_name="another_keycard_account", keycard=True) - wallet_view.accounts_status_account.click() - transaction_amount_added = wallet_view.get_unique_amount() - wallet_view.send_transaction(amount=transaction_amount_added, recipient=transaction_senders['A']['address'], keycard=True, sign_transaction=True) + wallet.add_account(account_name="another_keycard_account", keycard=True) + transaction_amount_added = wallet.get_unique_amount() + wallet.send_transaction(amount=transaction_amount_added, recipient=transaction_senders['A']['address'], + keycard=True, sign_transaction=True) self.driver.reset() home = sign_in.recover_access(passphrase=seed) contact, nickname, message = transaction_senders['A'], 'my_friend', 'some message' @@ -380,7 +381,6 @@ class TestCreateAccount(SingleDeviceTestCase): self.errors.verify_no_errors() - @marks.testrail_id(6311) @marks.medium def test_same_seed_added_inside_multiaccount_and_keycard(self): @@ -406,30 +406,31 @@ class TestCreateAccount(SingleDeviceTestCase): sign_in.lets_go_button.click() sign_in.just_fyi('Add to wallet seed phrase for restored multiaccount') - wallet_view = sign_in.wallet_button.click() - wallet_view.add_account_button.click() - wallet_view.enter_a_seed_phrase_button.click() - wallet_view.enter_your_password_input.send_keys(common_password) + wallet = sign_in.wallet_button.click() + wallet.add_account_button.click() + wallet.enter_a_seed_phrase_button.click() + wallet.enter_your_password_input.send_keys(common_password) account_name = 'subacc' - wallet_view.account_name_input.send_keys(account_name) - wallet_view.enter_seed_phrase_input.set_value(basic_user['passphrase']) - wallet_view.add_account_generate_account_button.click() - wallet_view.get_account_by_name(account_name).click() + wallet.account_name_input.send_keys(account_name) + wallet.enter_seed_phrase_input.set_value(basic_user['passphrase']) + wallet.add_account_generate_account_button.click() + wallet.get_account_by_name(account_name).click() sign_in.just_fyi('Send transaction from added account and log out') - transaction_amount_added = wallet_view.get_unique_amount() - wallet_view.send_transaction(amount=transaction_amount_added, recipient=recipient, sign_transaction=True) - wallet_view.profile_button.click() + transaction_amount_added = wallet.get_unique_amount() + wallet.send_transaction(from_main_wallet=False, amount=transaction_amount_added, recipient=recipient, + sign_transaction=True) + wallet.profile_button.click() profile_view.logout() sign_in.just_fyi('Login to keycard account and send another transaction') sign_in.back_button.click() sign_in.sign_in(position=2, keycard=True) sign_in.wallet_button.click() - wallet_view.wait_balance_is_changed('ETH') - wallet_view.accounts_status_account.click() - transaction_amount_keycard = wallet_view.get_unique_amount() - wallet_view.send_transaction(amount=transaction_amount_keycard, recipient=recipient, keycard=True, sign_transaction=True) + wallet.wait_balance_is_changed('ETH') + transaction_amount_keycard = wallet.get_unique_amount() + wallet.send_transaction(amount=transaction_amount_keycard, recipient=recipient, keycard=True, + sign_transaction=True) sign_in.just_fyi('Check both transactions from keycard multiaccount and from added account in network') for amount in [transaction_amount_keycard, transaction_amount_added]: @@ -463,7 +464,7 @@ class TestCreateAccount(SingleDeviceTestCase): keycard.enter_another_pin() if not keycard.element_by_translation_id("new-puk-description").is_element_displayed(): self.driver.fail("Screen for setting new puk is not shown!") - [keycard.one_button.click() for _ in range(12)] + [keycard.one_button.click() for _ in range(12)] if not keycard.element_by_translation_id("repeat-puk").is_element_displayed(): self.driver.fail("Confirmation screen for setting new puk is not shown!") [keycard.one_button.click() for _ in range(12)] @@ -475,7 +476,7 @@ class TestCreateAccount(SingleDeviceTestCase): profile.change_pairing_code_button.click() keycard.enter_another_pin() sign_in.create_password_input.set_value(common_password) - sign_in.confirm_your_password_input.set_value(common_password+"1") + sign_in.confirm_your_password_input.set_value(common_password + "1") if not keycard.element_by_translation_id("pairing-code_error1").is_element_displayed(): self.errors.append("No error is shown when pairing codes don't match") sign_in.confirm_your_password_input.delete_last_symbols(1) @@ -507,7 +508,7 @@ class TestCreateAccount(SingleDeviceTestCase): home.just_fyi('Set new PUK') keycard = profile.change_puk_button.click() keycard.enter_default_pin() - [keycard.enter_default_puk() for _ in range (2)] + [keycard.enter_default_puk() for _ in range(2)] keycard.ok_button.click() home.just_fyi("Checking reset with PUK when logged in") @@ -629,10 +630,10 @@ class TestCreateAccount(SingleDeviceTestCase): keycard.enter_another_pin() home.element_by_translation_id("enter-puk-code").click() - for i in range(1,4): + for i in range(1, 4): keycard.enter_default_puk() - sign_in.wait_for_element_starts_with_text('%s attempts left' % str(5-i)) - i+=1 + sign_in.wait_for_element_starts_with_text('%s attempts left' % str(5 - i)) + i += 1 keycard.enter_default_puk() sign_in.element_by_text_part('one attempt').wait_for_element(30) keycard.enter_default_puk() @@ -726,10 +727,10 @@ class TestKeycardCreateMultiaccountMultipleDevice(MultipleDeviceTestCase): device_1.seedphrase_input.click() device_1.seedphrase_input.set_value(seed_phrase) device_1.next_button.click() - device_1.element_by_translation_id(id="unlock", uppercase=True).click() + device_1.element_by_translation_id("unlock", uppercase=True).click() keycard_flow.enter_default_pin() device_1_home = device_1.home_button.click() device_1_home.plus_button.click() if not device_1_home.start_new_chat_button.is_element_displayed(): - self.errors.append("Can't proceed using account after it's re-recover twice.") + self.errors.append("Can't proceed using account after it's re-recover twice.") self.errors.verify_no_errors() diff --git a/test/appium/tests/atomic/account_management/test_profile.py b/test/appium/tests/atomic/account_management/test_profile.py index 4dd33e386c..97a86587ad 100644 --- a/test/appium/tests/atomic/account_management/test_profile.py +++ b/test/appium/tests/atomic/account_management/test_profile.py @@ -3,7 +3,7 @@ import re from tests import marks, bootnode_address, mailserver_address, test_dapp_url, test_dapp_name, mailserver_ams, \ mailserver_gc, mailserver_hk, used_fleet, common_password from tests.base_test_case import SingleDeviceTestCase, MultipleDeviceTestCase -from tests.users import transaction_senders, basic_user, ens_user, ens_user_ropsten +from tests.users import transaction_senders, basic_user, ens_user, ens_user_ropsten, user_mainnet from views.sign_in_view import SignInView from time import time @@ -43,7 +43,8 @@ class TestProfileSingleDevice(SingleDeviceTestCase): if profile.element_by_translation_id("profile-deleted-title").is_element_displayed(): self.driver.fail('Profile is deleted without confirmation with password') profile.delete_my_profile_password_input.set_value(common_password) - profile.delete_profile_button.click_until_presence_of_element(profile.element_by_translation_id("profile-deleted-title")) + profile.delete_profile_button.click_until_presence_of_element( + profile.element_by_translation_id("profile-deleted-title")) profile.ok_button.click() sign_in.just_fyi('Delete last multiaccount') @@ -58,6 +59,55 @@ class TestProfileSingleDevice(SingleDeviceTestCase): self.errors.append('No redirected to carousel view after deleting last multiaccount') self.errors.verify_no_errors() + @marks.testrail_id(695890) + @marks.medium + def test_can_use_another_fleets_and_networks_advanced(self): + user = user_mainnet + sign_in = SignInView(self.driver) + home = sign_in.recover_access(user['passphrase']) + + home.just_fyi("Check that can enable all toggles and still login successfully") + profile = home.profile_button.click() + profile.advanced_button.click() + profile.transaction_management_enabled_toggle.click() + profile.webview_debug_toggle.click() + profile.waku_bloom_toggle.click() + sign_in.sign_in() + + # home.just_fyi("Check tx management") + # TODO: blocked due to 12827 + # wallet = home.wallet_button.click() + # send_tx = wallet.send_transaction_from_main_screen.click() + # from views.send_transaction_view import SendTransactionView + # send_tx = SendTransactionView(self.driver) + # send_tx.amount_edit_box.set_value('0') + # send_tx.set_recipient_address(ens_user['address']) + # send_tx.next_button.click() + # send_tx.advanced_button.click() + # send_tx.nonce_input.set_value('4') + # send_tx.nonce_save_button.click() + + home.just_fyi("Check balance on mainnet") + profile = home.profile_button.click() + profile.switch_network() + wallet = home.wallet_button.click() + wallet.scan_tokens() + [wallet.wait_balance_is_equal_expected_amount(asset, value) for asset, value in user['mainnet'].items()] + + home.just_fyi("Check balance on xDai and default network fee") + profile = home.profile_button.click() + profile.switch_network('xDai Chain') + home.wallet_button.click() + wallet.element_by_text(user['xdai']).wait_for_element(30) + + home.just_fyi("Check balance on BSC and default network fee") + profile = home.profile_button.click() + profile.switch_network('BSC Network') + home.wallet_button.click() + wallet.element_by_text(user['bsc']).wait_for_element(30) + + self.errors.verify_no_errors() + @marks.testrail_id(5323) @marks.critical def test_share_copy_contact_code_and_wallet_address(self): @@ -162,7 +212,7 @@ class TestProfileSingleDevice(SingleDeviceTestCase): profile.current_password_edit_box.clear() profile.current_password_edit_box.set_value(common_password) profile.new_password_edit_box.set_value(new_password) - profile.confirm_new_password_edit_box.set_value(new_password+'1') + profile.confirm_new_password_edit_box.set_value(new_password + '1') profile.next_button.click() profile.just_fyi("Delete last symbol and check that can reset password") @@ -235,7 +285,7 @@ class TestProfileSingleDevice(SingleDeviceTestCase): 'scanning_ens_with_stateofus_domain_deep_link': { 'contact_code': 'https://join.status.im/u/%s.stateofus.eth' % ens_user_ropsten['ens'], 'username': ens_user_ropsten['username'] - }, + }, 'scanning_public_key': { 'contact_code': transaction_senders['A']['public_key'], 'username': transaction_senders['A']['username'], @@ -272,7 +322,8 @@ class TestProfileSingleDevice(SingleDeviceTestCase): self.errors.append('In %s case username not found in contact view after scanning' % key) if 'nickname' in users[key]: if not profile.element_by_text(users[key]['nickname']).is_element_displayed(): - self.errors.append('In %s case nickname %s not found in contact view after scanning' % (key, users[key]['nickname'])) + self.errors.append('In %s case nickname %s not found in contact view after scanning' % (key, + users[key]['nickname'])) home.just_fyi('Remove contact and check that it disappeared') user_to_remove = '@%s' % ens_user['ens_another'] @@ -282,7 +333,8 @@ class TestProfileSingleDevice(SingleDeviceTestCase): if profile.element_by_text(user_to_remove).is_element_displayed(): self.errors.append('Removed user is still shown in contact view') - home.just_fyi('Relogin and open profile view of the contact removed from Contact list to ensure there is no crash') + home.just_fyi( + 'Relogin and open profile view of the contact removed from Contact list to ensure there is no crash') profile.profile_button.click() profile.relogin() one_to_one_chat = home.add_contact(public_key=ens_user['ens_another'], add_in_contacts=False) @@ -336,12 +388,13 @@ class TestProfileSingleDevice(SingleDeviceTestCase): if home.profile_button.counter.is_element_displayed(): self.errors.append('Profile button counter is shown after recovery phrase backup') values_in_logcat = profile.find_values_in_logcat(passphrase1=recovery_phrase[word_number], - passphrase2=recovery_phrase[word_number_1]) + passphrase2=recovery_phrase[word_number_1]) if len(values_in_logcat) == 2: self.driver.fail(values_in_logcat) profile.profile_button.double_click() - home.just_fyi("Try to restore same account from seed phrase (should be possible only to unlock existing account)") + home.just_fyi( + "Try to restore same account from seed phrase (should be possible only to unlock existing account)") profile.logout() sign_in.back_button.click() sign_in.access_key_button.click() @@ -349,7 +402,7 @@ class TestProfileSingleDevice(SingleDeviceTestCase): sign_in.seedphrase_input.click() sign_in.seedphrase_input.set_value(' '.join(recovery_phrase.values())) sign_in.next_button.click() - sign_in.element_by_translation_id(id="unlock", uppercase=True).click() + sign_in.element_by_translation_id(translation_id="unlock", uppercase=True).click() sign_in.password_input.set_value(common_password) chat = sign_in.sign_in_button.click() chat.plus_button.click() @@ -383,7 +436,7 @@ class TestProfileSingleDevice(SingleDeviceTestCase): profile.terms_of_use_button.click() web_page.wait_for_d_aap_to_load() - web_page.swipe_by_custom_coordinates(0.5,0.8,0.5,0.4) + web_page.swipe_by_custom_coordinates(0.5, 0.8, 0.5, 0.4) if not web_page.terms_of_use_summary.is_element_displayed(30): self.errors.append('%s Profile about view!' % no_link_tos_error_msg) web_page.click_system_back_button() @@ -391,9 +444,9 @@ class TestProfileSingleDevice(SingleDeviceTestCase): signin.just_fyi("Checking that version match expected format and can be copied") app_version = profile.app_version_text.text node_version = profile.node_version_text.text - if not re.search(r'\d{1}[.]\d{1,2}[.]\d{1,2}\s[(]\d*[)]', app_version): + if not re.search(r'\d[.]\d{1,2}[.]\d{1,2}\s[(]\d*[)]', app_version): self.errors.append("App version %s didn't match expected format" % app_version) - if not re.search(r'StatusIM\/v.*\/android-\d{3}\/go\d{1}[.]\d{1,}', node_version): + if not re.search(r'StatusIM/v.*/android-\d{3}/go\d[.]\d+', node_version): self.errors.append("Node version %s didn't match expected format" % node_version) profile.app_version_text.click() profile.back_button.click() @@ -414,9 +467,21 @@ class TestProfileSingleDevice(SingleDeviceTestCase): self.errors.append("FAQ is not shown") profile.click_system_back_button() profile.submit_bug_button.click() + + signin.just_fyi("Checking bug submitting form") + profile.bug_description_edit_box.set_value('1234') + profile.bug_submit_button.click() + if not profile.element_by_translation_id("bug-report-too-short-description").is_element_displayed(): + self.errors.append("Can submit big with too short description!") + profile.bug_description_edit_box.clear() + [field.set_value("Something wrong happened!!") for field in + (profile.bug_description_edit_box, profile.bug_steps_edit_box)] + profile.bug_submit_button.click() if not profile.element_by_text_part("Welcome to Gmail").is_element_displayed(30): self.errors.append("Mail client is not opened when submitting bug") - profile.click_system_back_button() + profile.click_system_back_button(2) + + signin.just_fyi("Checking request feature") profile.request_a_feature_button.click() if not profile.element_by_text("#support").is_element_displayed(30): self.errors.append("Support channel is not suggested for requesting a feature") @@ -487,7 +552,7 @@ class TestProfileSingleDevice(SingleDeviceTestCase): home.just_fyi('Set another fleet and check that changes are applied') profile.fleet_setting_button.click() - changed_fleet = 'eth.prod' + changed_fleet = 'wakuv2.prod' profile.element_by_text(changed_fleet).click_until_presence_of_element(profile.confirm_button) profile.confirm_button.click() SignInView(self.driver).sign_in() @@ -509,7 +574,8 @@ class TestProfileSingleDevice(SingleDeviceTestCase): profile.just_fyi('pin history node') profile.sync_settings_button.click() - node_gc, node_ams, node_hk = [profile.return_mailserver_name(history_node_name, used_fleet) for history_node_name in (mailserver_gc, mailserver_ams, mailserver_hk)] + node_gc, node_ams, node_hk = [profile.return_mailserver_name(history_node_name, used_fleet) for + history_node_name in (mailserver_gc, mailserver_ams, mailserver_hk)] h_node = node_ams profile.mail_server_button.click() profile.mail_server_auto_selection_button.click() @@ -557,7 +623,7 @@ class TestProfileSingleDevice(SingleDeviceTestCase): dapp.element_by_translation_id("ens-primary-username").click() message_to_check = 'Your messages are displayed to others with' if not dapp.element_by_text('%s\n@%s' % (message_to_check, ens_main)).is_element_displayed(): - self.errors.append('%s ENS username is not set as primary by default' % ens_main) + self.errors.append('%s ENS username is not set as primary by default' % ens_main) home.just_fyi('check view in chat settings ENS from other domain: %s after set new primary ENS' % ens_second) dapp.set_primary_ens_username(ens_second).click() @@ -566,7 +632,6 @@ class TestProfileSingleDevice(SingleDeviceTestCase): self.errors.verify_no_errors() - class TestProfileMultipleDevice(MultipleDeviceTestCase): @marks.testrail_id(6646) @marks.high @@ -599,7 +664,8 @@ class TestProfileMultipleDevice(MultipleDeviceTestCase): public_chat_1 = home_1.join_public_chat(public_chat_name) public_chat_1.chat_message_input.send_keys(message) public_chat_1.send_message_button.click() - if not public_chat_2.chat_element_by_text(message).member_photo.is_element_image_similar_to_template('sauce_logo.png'): + if not public_chat_2.chat_element_by_text(message).member_photo.is_element_image_similar_to_template( + 'sauce_logo.png'): self.drivers[0].fail('Profile picture was not updated in chat') profile_1.just_fyi("Set user Profile image by taking Photo") @@ -609,7 +675,8 @@ class TestProfileMultipleDevice(MultipleDeviceTestCase): public_chat_1.chat_message_input.send_keys(message) public_chat_1.send_message_button.click() - if public_chat_2.chat_element_by_text(message).member_photo.is_element_image_similar_to_template('sauce_logo.png'): + if public_chat_2.chat_element_by_text(message).member_photo.is_element_image_similar_to_template( + 'sauce_logo.png'): self.drivers[0].fail('Profile picture was not updated in chat after making photo') @marks.testrail_id(6636) @@ -617,11 +684,12 @@ class TestProfileMultipleDevice(MultipleDeviceTestCase): @marks.flaky def test_show_profile_picture_of_setting(self): self.create_drivers(2) - home_1, home_2 = SignInView(self.drivers[0]).create_user(), SignInView(self.drivers[1]).create_user(enable_notifications=True) + home_1, home_2 = SignInView(self.drivers[0]).create_user(), SignInView(self.drivers[1]).create_user( + enable_notifications=True) profile_1, profile_2 = home_1.profile_button.click(), home_2.profile_button.click() public_key_1, default_username_1 = profile_1.get_public_key_and_username(return_username=True) public_key_2, default_username_2 = profile_2.get_public_key_and_username(return_username=True) - logo_online, logo_default, logo_chats, logo_group= 'logo_new.png', 'sauce_logo.png', 'logo_chats_view.png', 'group_logo.png' + logo_online, logo_default, logo_chats, logo_group = 'logo_new.png', 'sauce_logo.png', 'logo_chats_view.png', 'group_logo.png' [profile.home_button.click() for profile in (profile_1, profile_2)] home_1.add_contact(public_key_2) @@ -643,14 +711,16 @@ class TestProfileMultipleDevice(MultipleDeviceTestCase): one_to_one_chat_2 = home_2.add_contact(public_key_1, add_in_contacts=False) one_to_one_chat_2.chat_message_input.set_value('@' + default_username_1) one_to_one_chat_2.chat_message_input.click() - if one_to_one_chat_2.user_profile_image_in_mentions_list(default_username_1).is_element_image_similar_to_template(logo_default): + if one_to_one_chat_2.user_profile_image_in_mentions_list( + default_username_1).is_element_image_similar_to_template(logo_default): self.errors.append('Profile picture is updated in 1-1 chat mentions list of contact not in Contacts list') profile_1.just_fyi('Check profile image is in mentions because now user was added in contacts') one_to_one_chat_2.add_to_contacts.click() one_to_one_chat_2.chat_message_input.set_value('@' + default_username_1) one_to_one_chat_2.chat_message_input.click() - if not one_to_one_chat_2.user_profile_image_in_mentions_list(default_username_1).is_element_image_similar_to_template(logo_default): + if not one_to_one_chat_2.user_profile_image_in_mentions_list( + default_username_1).is_element_image_similar_to_template(logo_default): self.errors.append('Profile picture was not updated in 1-1 chat mentions list') one_to_one_chat_2.get_back_to_home_view() @@ -667,20 +737,21 @@ class TestProfileMultipleDevice(MultipleDeviceTestCase): self.errors.append('User profile picture was not updated on Chats view') profile_1.just_fyi('Check profile image updated in user profile view in Group chat views') - group_chat_name, group_chat_message = 'new_group_chat', 'Trololo' + group_chat_name, group_chat_message = 'new_group_chat', 'Trololo' group_chat_2 = home_2.create_group_chat(user_names_to_add=[default_username_1]) group_chat_2.send_message('Message') group_chat_1 = home_1.get_chat(group_chat_name).click() group_chat_1.join_chat_button.click() group_chat_1.send_message(group_chat_message) - if not group_chat_2.chat_element_by_text(group_chat_message).member_photo.is_element_image_similar_to_template(logo_default): + if not group_chat_2.chat_element_by_text(group_chat_message).member_photo.is_element_image_similar_to_template( + logo_default): self.errors.append('User profile picture was not updated in message Group chat view') home_2.put_app_to_background() profile_1.just_fyi('Check profile image updated in group chat invite') home_1.get_back_to_home_view() new_group_chat = 'new_gr' - group_chat_1 = home_1.create_group_chat(user_names_to_add=[default_username_2], group_chat_name=new_group_chat) + home_1.create_group_chat(user_names_to_add=[default_username_2], group_chat_name=new_group_chat) home_2.click_system_back_button() home_2.open_notification_bar() @@ -694,10 +765,12 @@ class TestProfileMultipleDevice(MultipleDeviceTestCase): home_1.profile_button.click() profile_1.logout() sign_in_1 = home_1.get_sign_in_view() - if not sign_in_1.get_multiaccount_by_position(1).account_logo.is_element_image_similar_to_template(logo_default): + if not sign_in_1.get_multiaccount_by_position(1).account_logo.is_element_image_similar_to_template( + logo_default): self.errors.append('User profile picture was not updated on Multiaccounts list select login view') sign_in_1.element_by_text(default_username_1).click() - if not sign_in_1.get_multiaccount_by_position(1).account_logo.is_element_image_similar_to_template(logo_default): + if not sign_in_1.get_multiaccount_by_position(1).account_logo.is_element_image_similar_to_template( + logo_default): self.errors.append('User profile picture was not updated on account login view') sign_in_1.password_input.set_value(common_password) sign_in_1.sign_in_button.click() @@ -865,7 +938,7 @@ class TestProfileMultipleDevice(MultipleDeviceTestCase): @marks.flaky def test_can_not_connect_to_mailserver(self): self.create_drivers(2) - home_1, home_2= SignInView(self.drivers[0]).create_user(), SignInView(self.drivers[1]).create_user() + home_1, home_2 = SignInView(self.drivers[0]).create_user(), SignInView(self.drivers[1]).create_user() profile_1 = home_1.profile_button.click() profile_1.just_fyi('add non-working mailserver and connect to it') @@ -875,14 +948,14 @@ class TestProfileMultipleDevice(MultipleDeviceTestCase): profile_1.plus_button.click() server_name = 'test' profile_1.specify_name_input.set_value(server_name) - profile_1.mail_server_address_input.set_value(mailserver_address.replace('4','5')) + profile_1.mail_server_address_input.set_value(mailserver_address.replace('4', '5')) profile_1.save_button.click() profile_1.mail_server_by_name(server_name).click() profile_1.mail_server_connect_button.click() profile_1.confirm_button.click() profile_1.just_fyi('check that popup "Error connecting" will not reappear if tap on "Cancel"') - profile_1.element_by_translation_id(id='mailserver-error-title').wait_for_element(120) + profile_1.element_by_translation_id('mailserver-error-title').wait_for_element(120) profile_1.cancel_button.click() profile_1.home_button.click() @@ -936,7 +1009,8 @@ class TestProfileMultipleDevice(MultipleDeviceTestCase): public_chat_2 = home_2.join_public_chat(public_chat_name) public_chat_2.send_message(message) - profile_1.just_fyi('disable use_history_node and check that no history is fetched but you can still send messages') + profile_1.just_fyi( + 'disable use_history_node and check that no history is fetched but you can still send messages') profile_1.sync_settings_button.click() profile_1.mail_server_button.click() profile_1.use_history_node_button.click() @@ -949,7 +1023,7 @@ class TestProfileMultipleDevice(MultipleDeviceTestCase): self.errors.append('Message sent when use_history_node is disabled was not received') public_chat_1.profile_button.click() profile_1.relogin() - home_1.get_chat('#%s'%public_chat_name).click() + home_1.get_chat('#%s' % public_chat_name).click() if public_chat_1.chat_element_by_text(message).is_element_displayed(30): self.drivers[0].fail('History was fetched after relogin when use_history_node is disabled') @@ -979,7 +1053,7 @@ class TestProfileMultipleDevice(MultipleDeviceTestCase): home_1.just_fyi('check ENS name wallet address and public key') profile_1.element_by_text(user_1['ens']).click() - for text in (user_1['address'].lower(), user_1['public_key'] ): + for text in (user_1['address'].lower(), user_1['public_key']): if not profile_1.element_by_text_part(text).is_element_displayed(40): self.errors.append('%s text is not shown' % text) profile_1.home_button.click() @@ -992,27 +1066,29 @@ class TestProfileMultipleDevice(MultipleDeviceTestCase): ens_name = '@' + user_1['ens'] profile_1.element_by_translation_id("ens-your-your-name").click() if profile_1.username_in_ens_chat_settings_text.text != ens_name: - self.errors.append('ENS username is not shown in ENS usernames Chat Settings after enabling') + self.errors.append('ENS username is not shown in ENS usernames Chat Settings after enabling') profile_1.back_button.click() profile_1.home_button.click() home_1.get_chat('#' + chat_name).click() message_text_2 = 'message test text 1' public_1.send_message(message_text_2) if not public_2.wait_for_element_starts_with_text(ens_name): - self.errors.append('ENS username is not shown in public chat') + self.errors.append('ENS username is not shown in public chat') home_1.put_app_to_background() home_2.just_fyi('check that can mention user with ENS name') public_2.select_mention_from_suggestion_list(user_1['ens']) if public_2.chat_message_input.text != ens_name + ' ': - self.errors.append('ENS username is not resolved in chat input after selecting it in mention suggestions list!') + self.errors.append( + 'ENS username is not resolved in chat input after selecting it in mention suggestions list!') public_2.send_message_button.click() - public_2.element_starts_with_text(ens_name,'button').click() + public_2.element_starts_with_text(ens_name, 'button').click() for element in (public_2.element_by_text(user_1['username']), public_2.profile_add_to_contacts): if not element.is_element_displayed(): self.errors.append('Was not redirected to user profile after tapping on mention!') - home_1.just_fyi('check that PN is received and after tap you are redirected to public chat, mention is highligted') + home_1.just_fyi( + 'check that PN is received and after tap you are redirected to public chat, mention is highligted') home_1.open_notification_bar() home_1.element_by_text_part(username_2).click() if home_1.element_starts_with_text(user_1['ens']).is_element_differs_from_template('mentioned.png', 2): @@ -1021,7 +1097,8 @@ class TestProfileMultipleDevice(MultipleDeviceTestCase): # Close Device1 driver session since it's not needed anymore self.drivers[0].quit() - home_2.just_fyi('check that ENS name is shown in 1-1 chat without adding user as contact in header, profile, options') + home_2.just_fyi( + 'check that ENS name is shown in 1-1 chat without adding user as contact in header, profile, options') one_to_one_2 = public_2.profile_send_message.click() if one_to_one_2.user_name_text.text != ens_name: self.errors.append('ENS username is not shown in 1-1 chat header') @@ -1077,7 +1154,7 @@ class TestProfileMultipleDevice(MultipleDeviceTestCase): home_2.mobile_connection_off_icon.wait_for_visibility_of_element(20) for element in home_2.continue_syncing_button, home_2.stop_syncing_button, home_2.remember_my_choice_checkbox: if not element.is_element_displayed(10): - self.drivers[0].fail('Element %s is not not shown in "Syncing mobile" bottom sheet' % element.locator) + self.drivers[0].fail('Element %s is not not shown in "Syncing mobile" bottom sheet' % element.locator) home_2.stop_syncing_button.click() if not home_2.mobile_connection_off_icon.is_element_displayed(): self.drivers[0].fail('No mobile connection OFF icon is shown') @@ -1104,7 +1181,7 @@ class TestProfileMultipleDevice(MultipleDeviceTestCase): home_2.mobile_connection_on_icon.wait_for_visibility_of_element(10) if not home_2.mobile_connection_on_icon.is_element_displayed(): self.errors.append('No mobile connection ON icon is shown') - home_2.get_chat('#%s'% public_chat_name).click() + home_2.get_chat('#%s' % public_chat_name).click() if not public_2.chat_element_by_text(public_chat_message).is_element_displayed(180): self.errors.append("Chat history was not fetched with mobile data fetching ON") @@ -1113,7 +1190,8 @@ class TestProfileMultipleDevice(MultipleDeviceTestCase): home_2.mobile_connection_on_icon.click() home_2.connection_settings_button.click() if not home_2.element_by_translation_id("mobile-network-use-mobile").is_element_displayed(): - self.errors.append("Was not redirected to sync settings after tapping on Settings in connection bottom sheet") + self.errors.append( + "Was not redirected to sync settings after tapping on Settings in connection bottom sheet") home_1.just_fyi("Check default preferences in Sync settings") profile_1 = home_1.profile_button.click() @@ -1139,7 +1217,6 @@ class TestProfileMultipleDevice(MultipleDeviceTestCase): self.errors.verify_no_errors() - @marks.testrail_id(5680) @marks.high @marks.skip diff --git a/test/appium/tests/atomic/account_management/test_wallet_management.py b/test/appium/tests/atomic/account_management/test_wallet_management.py index fedab4e1b9..502eeb1903 100644 --- a/test/appium/tests/atomic/account_management/test_wallet_management.py +++ b/test/appium/tests/atomic/account_management/test_wallet_management.py @@ -21,7 +21,7 @@ class TestWalletManagement(SingleDeviceTestCase): send_transaction_view = wallet.send_transaction_button.click() send_transaction_view.amount_edit_box.click() send_transaction_view.amount_edit_box.set_value("0") - send_transaction_view.set_recipient_address("0x"+transaction_senders['A']['address']) + send_transaction_view.set_recipient_address("0x" + transaction_senders['A']['address']) send_transaction_view.sign_transaction_button.click() texts = list(map(sign_in.get_translation_by_key, @@ -135,7 +135,7 @@ class TestWalletManagement(SingleDeviceTestCase): wallet.close_send_transaction_view_button.double_click() wallet.just_fyi('Check "Open in OpenSea" (that user is signed in)') - wallet.element_by_translation_id("check-on-opensea").click_until_presence_of_element((web_view.browser_previous_page_button)) + wallet.element_by_translation_id("check-on-opensea").click_until_presence_of_element(web_view.browser_previous_page_button) web_view.wait_for_d_aap_to_load(10) wallet.element_by_text('e2ecryptokitty').wait_for_element(60) @@ -208,7 +208,8 @@ class TestWalletManagement(SingleDeviceTestCase): for asset in user['collectibles']: wallet.get_collectibles_amount(asset).scroll_to_element() if wallet.get_collectibles_amount(asset).text != user['collectibles'][asset]: - self.errors.append('%s %s is not shown in Collectibles for Rinkeby!' % (user['collectibles'][asset], asset)) + self.errors.append( + '%s %s is not shown in Collectibles for Rinkeby!' % (user['collectibles'][asset], asset)) @marks.testrail_id(6224) @marks.critical @@ -226,7 +227,7 @@ class TestWalletManagement(SingleDeviceTestCase): wallet.enter_your_password_input.send_keys('000000') wallet.add_account_generate_account_button.click() if not wallet.element_by_text_part('Password seems to be incorrect').is_element_displayed(): - self.driver.fail("Incorrect password validation is not performed") + self.driver.fail("Incorrect password validation is not performed") wallet.enter_your_password_input.clear() wallet.enter_your_password_input.send_keys(common_password) wallet.add_account_generate_account_button.click() @@ -271,7 +272,8 @@ class TestWalletManagement(SingleDeviceTestCase): self.errors.append('No "Watch-only" label is shown on watch-only wallet') wallet.receive_transaction_button.click_until_presence_of_element(wallet.address_text) if wallet.address_text.text[2:] != basic_user['address']: - self.errors.append('Wrong address %s is shown in "Receive" popup for watch-only account ' % wallet.address_text.text) + self.errors.append( + 'Wrong address %s is shown in "Receive" popup for watch-only account ' % wallet.address_text.text) wallet.close_share_popup() wallet.get_account_options_by_name(account_name).click() wallet.account_settings_button.click() @@ -314,7 +316,7 @@ class TestWalletManagement(SingleDeviceTestCase): wallet.just_fyi('Check that overall balance is changed after adding account from private key') for asset in ('ETH', 'ADI', 'LXS', 'STT'): wallet.wait_balance_is_changed(asset) - initial_STT = wallet.get_asset_amount_by_name('STT') + initial_stt = wallet.get_asset_amount_by_name('STT') wallet.just_fyi('Check individual account view (imported from private key), receive option') wallet.get_account_by_name(account_name_private).scroll_and_click(direction="up") @@ -347,7 +349,7 @@ class TestWalletManagement(SingleDeviceTestCase): self.driver.fail('Account was not added') wallet.just_fyi('Check that overall balance is changed after adding account from seed phrase') - wallet.wait_balance_is_changed('STT', initial_balance=initial_STT) + wallet.wait_balance_is_changed('STT', initial_balance=initial_stt) wallet.wait_balance_is_changed('MDS') wallet.just_fyi('Check account view and send option (imported from seed phrase)') @@ -373,13 +375,15 @@ class TestWalletManagement(SingleDeviceTestCase): wallet.show_account_by_name_button(account_name_seed).click() wallet.wallet_button.double_click() if wallet.get_account_by_name(account_name_seed).is_element_displayed(): - self.errors.append("Hidden %s is shown on main wallet view after hiding via 'Show icon'" % account_name_seed) + self.errors.append( + "Hidden %s is shown on main wallet view after hiding via 'Show icon'" % account_name_seed) wallet.multiaccount_more_options.click() wallet.manage_accounts_button.click() wallet.hidden_account_by_name_button(account_name_seed).click() wallet.wallet_button.double_click() if not wallet.get_account_by_name(account_name_seed).is_element_displayed(): - self.errors.append("Unhidden %s is shown on main wallet view after hiding via 'Show icon'" % account_name_seed) + self.errors.append( + "Unhidden %s is shown on main wallet view after hiding via 'Show icon'" % account_name_seed) wallet.just_fyi("Delete unhidden account in wallet") wallet.get_account_by_name(account_name_seed).click() @@ -389,7 +393,7 @@ class TestWalletManagement(SingleDeviceTestCase): wallet.password_delete_account_input.wait_for_element(30) wallet.password_delete_account_input.set_value(common_password) wallet.delete_account_confirm_button.click() - if wallet.get_account_by_name(account_name_seed).is_element_displayed(): + if wallet.get_account_by_name(account_name_seed).is_element_displayed(): self.errors.append("Deleted %s is shown on main wallet view" % account_name_seed) self.errors.verify_no_errors() @@ -421,7 +425,7 @@ class TestWalletManagement(SingleDeviceTestCase): search_results = [element.text for element in search_elements] if search_results != search_list_assets[keyword]: self.errors.append("'%s' is shown on the home screen after searching by '%s' keyword" % - (', '.join(search_results), keyword)) + (', '.join(search_results), keyword)) home.cancel_button.click() wallet.close_button.click() @@ -439,8 +443,8 @@ class TestWalletManagement(SingleDeviceTestCase): self.errors.append('No search results after searching by %s keyword' % keyword) search_results = [element.text for element in search_elements] if search_results != search_list_currencies[keyword]: - self.errors.append("'%s' is shown on the home screen after searching by '%s' keyword" % - (', '.join(search_results), keyword)) + self.errors.append("'%s' is shown on the home screen after searching by '%s' keyword" % + (', '.join(search_results), keyword)) home.cancel_button.click() self.errors.verify_no_errors() diff --git a/test/appium/tests/atomic/chats/test_chats_management.py b/test/appium/tests/atomic/chats/test_chats_management.py index 56a54eee68..5cfa166d36 100644 --- a/test/appium/tests/atomic/chats/test_chats_management.py +++ b/test/appium/tests/atomic/chats/test_chats_management.py @@ -3,7 +3,7 @@ import random import emoji from tests import marks, background_service_message -from tests.users import basic_user, dummy_user, ens_user_ropsten, ens_user, ens_user_message_sender +from tests.users import basic_user, dummy_user, ens_user_ropsten, ens_user from tests.base_test_case import SingleDeviceTestCase, MultipleDeviceTestCase from views.sign_in_view import SignInView from views.chat_view import ChatView @@ -32,7 +32,7 @@ class TestChatManagement(SingleDeviceTestCase): chat.send_message(messages[i]) chat.get_back_to_home_view() home.leave_chat_long_press(chat_name) if chat_name == group else home.delete_chat_long_press(chat_name) - i+=1 + i += 1 home.relogin() for chat_name in one_to_one, public, group: if home.get_chat_from_home_view(chat_name).is_element_displayed(): @@ -56,7 +56,6 @@ class TestChatManagement(SingleDeviceTestCase): home.join_public_chat(public[1:]) chat.get_back_to_home_view() - home.just_fyi("Deleting 3 chats via delete button and check they will not reappear after relaunching app") i = 0 for chat_name in one_to_one, public, group: @@ -64,7 +63,7 @@ class TestChatManagement(SingleDeviceTestCase): chat = home.get_chat(chat_name).click() chat.send_message(message) chat.leave_chat() if chat_name == group else chat.delete_chat() - i+=1 + i += 1 chat.get_back_to_home_view() for chat_name in one_to_one, public, group: if home.get_chat_from_home_view(chat_name).is_element_displayed(): @@ -147,7 +146,8 @@ class TestChatManagement(SingleDeviceTestCase): chat = home.get_chat(public_options).click() chat.clear_history() if chat.element_by_text(message).is_element_displayed(): - self.errors.append('Messages in %s chat are still shown after clearing history via options' % public_options) + self.errors.append( + 'Messages in %s chat are still shown after clearing history via options' % public_options) home.just_fyi("Recheck that history won't reappear after relogin") home.relogin() @@ -222,7 +222,7 @@ class TestChatManagement(SingleDeviceTestCase): if 'home_not_shown' in search_list[keyword]: if home.element_by_text(search_list[keyword]['home_not_shown']).is_element_displayed(): self.errors.append('%s is shown on home view while searching for %s' % ( - search_list[keyword]['home_not_shown'], keyword)) + search_list[keyword]['home_not_shown'], keyword)) for text in search_list[keyword]['home']: if not home.element_by_text(text).is_element_displayed(): self.errors.append('%s is not shown on home view while searching for %s' % (text, keyword)) @@ -510,7 +510,7 @@ class TestChatManagementMultipleDevice(MultipleDeviceTestCase): expected_username = '%s %s' % (nickname, username_2) if chat_element.username.text != expected_username: self.errors.append('Username %s in public chat does not match expected %s' % ( - chat_element.username.text, expected_username)) + chat_element.username.text, expected_username)) device_1.just_fyi('Add user to contacts, mention it by nickname check contact list in Profile') chat_element.member_photo.click() @@ -689,7 +689,6 @@ class TestChatManagementMultipleDevice(MultipleDeviceTestCase): chat_public_2 = home_2.get_chat_view() [chat_public_2.send_message(message_after_block_2) for _ in range(2)] - device_1.just_fyi("check that new messages and push notifications don't arrive from blocked user") device_1.open_notification_bar() if device_1.element_by_text_part(message_after_block_2).is_element_displayed(): @@ -872,22 +871,22 @@ class TestChatManagementMultipleDevice(MultipleDeviceTestCase): device_1_chat.just_fyi('Set several emojis as sender and receiver and check counters in public chat') message_sender = chat_public_1.chat_element_by_text(message_from_sender) emojis_from_sender = ['thumbs-down', 'love', 'laugh'] - [chat_public_1.set_reaction(message_from_sender, emoji) for emoji in emojis_from_sender] + [chat_public_1.set_reaction(message_from_sender, reaction) for reaction in emojis_from_sender] emojis_from_receiver = ['angry', 'sad'] - [chat_public_2.set_reaction(message_from_sender, emoji) for emoji in emojis_from_receiver] + [chat_public_2.set_reaction(message_from_sender, reaction) for reaction in emojis_from_receiver] message_receiver = chat_public_2.chat_element_by_text(message_from_sender) - for emoji in emojis_from_sender: - if message_sender.emojis_below_message(emoji) != 1: + for reaction in emojis_from_sender: + if message_sender.emojis_below_message(reaction) != 1: self.errors.append( - 'Counter is not updated on own message after tapping %s for sender in pub chat' % emoji) - if message_receiver.emojis_below_message(emoji, own=False) != 1: + 'Counter is not updated on own message after tapping %s for sender in pub chat' % reaction) + if message_receiver.emojis_below_message(reaction, own=False) != 1: self.errors.append( - 'Counter is not updated on received message after tapping %s for receiver in pub chat' % emoji) - for emoji in emojis_from_receiver: - if message_sender.emojis_below_message(emoji, own=False) != 1: + 'Counter is not updated on received message after tapping %s for receiver in pub chat' % reaction) + for reaction in emojis_from_receiver: + if message_sender.emojis_below_message(reaction, own=False) != 1: self.errors.append( 'Counter is not updated on own message after tapping %s for receiver in pub chat' % emoji) - if message_receiver.emojis_below_message(emoji) != 1: + if message_receiver.emojis_below_message(reaction) != 1: self.errors.append( 'Counter is not updated on received message after tapping %s for sender in pub chat' % emoji) @@ -1030,8 +1029,8 @@ class TestChatManagementMultipleDevice(MultipleDeviceTestCase): self.create_drivers(2) device_1, device_2 = SignInView(self.drivers[0]), SignInView(self.drivers[1]) message_from_sender = "Message sender" - GroupChat1Name = "GroupChat1" - GroupChat2Name = "GroupChat2" + group_chat_name_1 = "GroupChat1" + group_chat_name_2 = "GroupChat2" home_1, home_2 = device_1.create_user(), device_2.create_user() device_1.just_fyi('Device1 sets permissions to accept chat requests only from trusted contacts') @@ -1048,15 +1047,17 @@ class TestChatManagementMultipleDevice(MultipleDeviceTestCase): one_to_one_device_2 = home_2.add_contact(public_key_user_1) one_to_one_device_2.send_message(message_from_sender) one_to_one_device_2.home_button.click() - home_2.create_group_chat([username_1], group_chat_name=GroupChat1Name) + home_2.create_group_chat([username_1], group_chat_name=group_chat_name_1) device_1.just_fyi('Device1 check there are no any chats in Activity Center nor Chats view') home_1.home_button.click() - if home_1.element_by_text_part(username_2).is_element_displayed() or home_1.element_by_text_part(GroupChat1Name).is_element_displayed(): + if home_1.element_by_text_part(username_2).is_element_displayed() or home_1.element_by_text_part( + group_chat_name_1).is_element_displayed(): self.errors.append("Chats are present on Chats view despite they created by non-contact") home_1.notifications_button.click() - if home_1.element_by_text_part(username_2).is_element_displayed() or home_1.element_by_text_part(GroupChat1Name).is_element_displayed(): + if home_1.element_by_text_part(username_2).is_element_displayed() or home_1.element_by_text_part( + group_chat_name_1).is_element_displayed(): self.errors.append("Chats are present in Activity Center view despite they created by non-contact") device_1.just_fyi('Device1 adds Device2 in Contacts so chat requests should be visible now') @@ -1068,12 +1069,13 @@ class TestChatManagementMultipleDevice(MultipleDeviceTestCase): home_2.get_chat_from_home_view(username_1).click() one_to_one_device_2.send_message(message_from_sender) one_to_one_device_2.home_button.click() - home_2.create_group_chat([username_1], group_chat_name=GroupChat2Name) + home_2.create_group_chat([username_1], group_chat_name=group_chat_name_2) device_1.just_fyi('Device1 verifies 1-1 chat Group chats are visible') home_1.home_button.click() - if not home_1.element_by_text_part(username_2).is_element_displayed() or not home_1.element_by_text_part(GroupChat2Name).is_element_displayed(): + if not home_1.element_by_text_part(username_2).is_element_displayed() or not home_1.element_by_text_part( + group_chat_name_2).is_element_displayed(): self.errors.append("Chats are not present on Chats view while they have to!") self.errors.verify_no_errors() @@ -1084,8 +1086,8 @@ class TestChatManagementMultipleDevice(MultipleDeviceTestCase): self.create_drivers(2) device_1, device_2 = SignInView(self.drivers[0]), SignInView(self.drivers[1]) message_from_sender = "Message sender" - GroupChat1Name = "GroupChat1" - GroupChat2Name = "GroupChat2" + group_chat_name_1 = "GroupChat1" + group_chat_name_2 = "GroupChat2" home_1, home_2 = device_1.create_user(), device_2.create_user() device_1.just_fyi('Device1 adds Devices and creates 1-1 and Group chat with it') @@ -1096,7 +1098,7 @@ class TestChatManagementMultipleDevice(MultipleDeviceTestCase): device_1_one_to_one_chat.send_message(message_from_sender) device_1_one_to_one_chat.home_button.click() - home_1.create_group_chat([username_2], group_chat_name=GroupChat1Name) + home_1.create_group_chat([username_2], group_chat_name=group_chat_name_1) home_1.home_button.click() home_2.home_button.click() @@ -1104,29 +1106,29 @@ class TestChatManagementMultipleDevice(MultipleDeviceTestCase): home_2.notifications_button.click() home_2.notifications_select_button.click() home_2.element_by_text_part(username_1[:10]).click() - home_2.element_by_text_part(GroupChat1Name).click() + home_2.element_by_text_part(group_chat_name_1).click() home_2.notifications_reject_and_delete_button.click() if home_2.element_by_text_part(username_1[:20]).is_element_displayed(2): self.errors.append("1-1 chat is on Activity Center view after action made on it") - if home_2.element_by_text_part(GroupChat1Name).is_element_displayed(2): + if home_2.element_by_text_part(group_chat_name_1).is_element_displayed(2): self.errors.append("Group chat is on Activity Center view after action made on it") home_2.home_button.click() if home_2.element_by_text_part(username_1[:20]).is_element_displayed(2): self.errors.append("1-1 chat is added on home after rejection") - if home_2.element_by_text_part(GroupChat1Name).is_element_displayed(2): + if home_2.element_by_text_part(group_chat_name_1).is_element_displayed(2): self.errors.append("Group chat is added on home after rejection") home_2.just_fyi("Verify there are still no chats after relogin") home_2.relogin() if home_2.element_by_text_part(username_1[:20]).is_element_displayed(2): self.errors.append("1-1 chat appears on Chats view after relogin") - if home_2.element_by_text_part(GroupChat1Name).is_element_displayed(2): + if home_2.element_by_text_part(group_chat_name_1).is_element_displayed(2): self.errors.append("Group chat appears on Chats view after relogin") home_2.notifications_button.click() if home_2.element_by_text_part(username_1[:20]).is_element_displayed(2): self.errors.append("1-1 chat request reappears back in Activity Center view after relogin") - if home_2.element_by_text_part(GroupChat1Name).is_element_displayed(2): + if home_2.element_by_text_part(group_chat_name_1).is_element_displayed(2): self.errors.append("Group chat request reappears back in Activity Center view after relogin") home_2.home_button.click() @@ -1134,7 +1136,7 @@ class TestChatManagementMultipleDevice(MultipleDeviceTestCase): home_1.get_chat_from_home_view(username_2).click() device_1_one_to_one_chat.send_message('Some text here') device_1_one_to_one_chat.home_button.click() - home_1.create_group_chat([username_2], group_chat_name=GroupChat2Name) + home_1.create_group_chat([username_2], group_chat_name=group_chat_name_2) device_1.just_fyi('Device2 accepts both chats (via Select All button) and verifies they disappeared ' 'from activity center view but present on Chats view') @@ -1145,13 +1147,13 @@ class TestChatManagementMultipleDevice(MultipleDeviceTestCase): if home_2.element_by_text_part(username_1[:20]).is_element_displayed(2): self.errors.append("1-1 chat request stays on Activity Center view after it was accepted") - if home_2.element_by_text_part(GroupChat2Name).is_element_displayed(2): + if home_2.element_by_text_part(group_chat_name_2).is_element_displayed(2): self.errors.append("Group chat request stays on Activity Center view after it was accepted") home_2.home_button.click() if not home_2.element_by_text_part(username_1[:20]).is_element_displayed(2): self.errors.append("1-1 chat is not added on home after accepted from Activity Center") - if not home_2.element_by_text_part(GroupChat2Name).is_element_displayed(2): + if not home_2.element_by_text_part(group_chat_name_2).is_element_displayed(2): self.errors.append("Group chat is not added on home after accepted from Activity Center") self.errors.verify_no_errors() diff --git a/test/appium/tests/atomic/chats/test_commands.py b/test/appium/tests/atomic/chats/test_commands.py index 987537553d..37ae59bbea 100644 --- a/test/appium/tests/atomic/chats/test_commands.py +++ b/test/appium/tests/atomic/chats/test_commands.py @@ -56,7 +56,8 @@ class TestCommandsMultipleDevices(MultipleDeviceTestCase): self.drivers[0].fail("Required options accept or share are not shown") select_account_bottom_sheet = receiver_message.accept_and_share_address.click() - if not select_account_bottom_sheet.get_account_in_select_account_bottom_sheet_button(account_name).is_element_displayed(): + if not select_account_bottom_sheet.get_account_in_select_account_bottom_sheet_button( + account_name).is_element_displayed(): self.errors.append('Not expected value in "From" in "Select account": "Status" is expected') select_account_bottom_sheet.select_button.click() receiver_message.transaction_status.wait_for_element_text(receiver_message.shared_account) @@ -91,7 +92,7 @@ class TestCommandsMultipleDevices(MultipleDeviceTestCase): [message.transaction_status.wait_for_element_text(message.confirmed, 60) for message in (sender_message, receiver_message)] - #TODO: should be added PNs for receiver after getting more stable feature + # TODO: should be added PNs for receiver after getting more stable feature self.errors.verify_no_errors() @marks.testrail_id(6263) @@ -112,7 +113,7 @@ class TestCommandsMultipleDevices(MultipleDeviceTestCase): wallet_1.home_button.click() home_2 = device_2.recover_access(passphrase=sender['passphrase']) wallet_2 = home_2.wallet_button.click() - initial_amount_STT = wallet_2.get_asset_amount_by_name('STT') + initial_amount_stt = wallet_2.get_asset_amount_by_name('STT') wallet_2.home_button.click() device_2.just_fyi('Add recipient to contact and send 1 message') @@ -157,11 +158,11 @@ class TestCommandsMultipleDevices(MultipleDeviceTestCase): home_1.get_chat(sender['username']).click() home_2.get_chat(recipient_username).click() [message.transaction_status.wait_for_element_text(message.confirmed, wait_time=120) for message in - (chat_2_sender_message, chat_1_request_message)] + (chat_2_sender_message, chat_1_request_message)] home_1.just_fyi('Check that can find tx in history and balance is updated after offline') home_2.wallet_button.click() - wallet_2.wait_balance_is_changed('STT', initial_amount_STT) + wallet_2.wait_balance_is_changed('STT', initial_amount_stt) wallet_2.find_transaction_in_history(amount=amount, asset='STT') self.errors.verify_no_errors() @@ -202,7 +203,6 @@ class TestCommandsMultipleDevices(MultipleDeviceTestCase): [message.transaction_status.wait_for_element_text(message.declined) for message in (chat_1_sender_message, chat_2_receiver_message)] - home_1.just_fyi('Decline transaction request and check that state is changed') request_amount = chat_1.get_unique_amount() chat_1.commands_button.click() @@ -274,7 +274,8 @@ class TestCommandsMultipleDevices(MultipleDeviceTestCase): self.create_drivers(2) sign_in_1, sign_in_2 = SignInView(self.drivers[0]), SignInView(self.drivers[1]) sender, reciever = transaction_senders['E'], ens_user - home_1, home_2 = sign_in_1.recover_access(sender['passphrase']), sign_in_2.recover_access(reciever['passphrase']) + home_1, home_2 = sign_in_1.recover_access(sender['passphrase']), sign_in_2.recover_access( + reciever['passphrase']) home_2.just_fyi("Start chat with sender") profile_2 = home_2.profile_button.click() diff --git a/test/appium/tests/atomic/chats/test_communities.py b/test/appium/tests/atomic/chats/test_communities.py index 5fe9170b3d..fb40f144a4 100644 --- a/test/appium/tests/atomic/chats/test_communities.py +++ b/test/appium/tests/atomic/chats/test_communities.py @@ -3,6 +3,7 @@ from tests.base_test_case import MultipleDeviceTestCase from views.sign_in_view import SignInView from views.chat_view import CommunityView + class TestCommunitiesMultipleDevices(MultipleDeviceTestCase): @marks.testrail_id(695842) @@ -16,7 +17,8 @@ class TestCommunitiesMultipleDevices(MultipleDeviceTestCase): message, message_member = "message", "from member" userkey_2, username_2 = home_2.get_public_key_and_username(return_username=True) home_2.home_button.click() - community_1 = home_1.create_community(community_name, community_description, set_image=True, file_name=community_pic) + community_1 = home_1.create_community(community_name, community_description, set_image=True, + file_name=community_pic) channel_1 = community_1.add_channel(channel_name) channel_1.send_message(message) home_1.home_button.double_click() @@ -35,9 +37,11 @@ class TestCommunitiesMultipleDevices(MultipleDeviceTestCase): pub_2.element_by_text(community_name).wait_for_element(330) community_message_2 = pub_2.get_community_link_preview_by_text(community_link_text) if community_message_2.community_description != community_description: - self.errors.append("Community description '%s' does not match expected" % community_message_2.community_description) + self.errors.append( + "Community description '%s' does not match expected" % community_message_2.community_description) if community_message_2.community_members_amount != 1: - self.errors.append("Members amount in resolved message '%s' does not match expected" % str(community_message_2.community_members_amount)) + self.errors.append("Members amount in resolved message '%s' does not match expected" % str( + community_message_2.community_members_amount)) community_message_2.view() community_2 = CommunityView(self.drivers[1]) community_2.request_access_button.click() @@ -50,7 +54,8 @@ class TestCommunitiesMultipleDevices(MultipleDeviceTestCase): community_1.community_info_button.click() community_1.community_membership_request_value.wait_for_element(60) if community_1.community_membership_request_value.text != '1': - self.drivers[0].fail("Membership request value '%s' is not equal expected" % community_1.community_membership_request_value) + self.drivers[0].fail( + "Membership request value '%s' is not equal expected" % community_1.community_membership_request_value) home_1.just_fyi("Approve membership") community_1.handle_membership_request(username_2, approve=True) @@ -73,7 +78,6 @@ class TestCommunitiesMultipleDevices(MultipleDeviceTestCase): self.errors.verify_no_errors() - @marks.testrail_id(695845) @marks.medium def test_notification_in_activity_center_for_mention_in_community_and_group_chat(self): @@ -161,8 +165,8 @@ class TestCommunitiesMultipleDevices(MultipleDeviceTestCase): home_1.just_fyi("Check there are no unread messages counters on chats after message read") if (home_1.notifications_unread_badge.is_element_present() or - home_1.get_chat_from_home_view(pub_chat_name).new_messages_counter.text == "1" or - home_1.get_chat_from_home_view(community_name).new_messages_counter.text == "1"): + home_1.get_chat_from_home_view(pub_chat_name).new_messages_counter.text == "1" or + home_1.get_chat_from_home_view(community_name).new_messages_counter.text == "1"): self.errors.append("Unread message indicator is kept after all messages read in chats") home_1.just_fyi("Check there is an empty view on Activity Center") diff --git a/test/appium/tests/atomic/chats/test_group_chat.py b/test/appium/tests/atomic/chats/test_group_chat.py index 9f872bb907..6d1c36330a 100644 --- a/test/appium/tests/atomic/chats/test_group_chat.py +++ b/test/appium/tests/atomic/chats/test_group_chat.py @@ -2,7 +2,8 @@ from tests import marks from tests.base_test_case import MultipleDeviceTestCase, SingleDeviceTestCase from tests.users import transaction_senders, ens_user from views.sign_in_view import SignInView -import random, emoji +import random +import emoji class TestGroupChatMultipleDevice(MultipleDeviceTestCase): @@ -25,7 +26,7 @@ class TestGroupChatMultipleDevice(MultipleDeviceTestCase): home_1.just_fyi('Check default placeholder when trying to create group chat without contacts') home_1.new_group_chat_button.click() if not home_1.element_by_translation_id("invite-friends").is_element_displayed(): - self.errors.append("No placeholder is shown when there are no contacts") + self.errors.append("No placeholder is shown when there are no contacts") home_1.get_back_to_home_view() device_2.just_fyi('Create group chat with new user, check system messages for sender') @@ -39,7 +40,8 @@ class TestGroupChatMultipleDevice(MultipleDeviceTestCase): home_2.just_fyi('check that PN invite to group chat is received and after tap you are redirected to group chat') home_2.open_notification_bar() - pns = [chat_1.pn_invited_to_group_chat(username_1, chat_name), chat_1.pn_wants_you_to_join_to_group_chat(username_1, chat_name)] + pns = [chat_1.pn_invited_to_group_chat(username_1, chat_name), + chat_1.pn_wants_you_to_join_to_group_chat(username_1, chat_name)] for pn in pns: if not home_2.get_pn(pn).is_element_displayed(30): self.errors.append('%s is not shown after invite to group chat' % pn) @@ -68,7 +70,8 @@ class TestGroupChatMultipleDevice(MultipleDeviceTestCase): if not chat_2.chat_element_by_text(message): self.errors.append('%s system message is not shown' % message) - device_2.just_fyi('Join to group chat, check system messages and send messages to group chat, check message status is delivered') + device_2.just_fyi( + 'Join to group chat, check system messages and send messages to group chat, check message status is delivered') chat_2.join_chat_button.click() for chat in (chat_1, chat_2): if not chat.chat_element_by_text(join_system_message).is_element_displayed(30): @@ -77,7 +80,8 @@ class TestGroupChatMultipleDevice(MultipleDeviceTestCase): message_1 = "Message from device: %s" % chat_1.driver.number chat_1.send_message(message_1) if chat_1.chat_element_by_text(message_1).status != 'delivered': - self.errors.append('Message status is not delivered, it is %s!' % chat_1.chat_element_by_text(message_1).status) + self.errors.append( + 'Message status is not delivered, it is %s!' % chat_1.chat_element_by_text(message_1).status) home_2.put_app_to_background() @@ -147,7 +151,8 @@ class TestGroupChatMultipleDevice(MultipleDeviceTestCase): chat_2.decline_invitation_button.click() left_system_message = chat_2.leave_system_message(username_2) if chat_1.chat_element_by_text(left_system_message).is_element_displayed(): - self.errors.append('System message after user left the group chat is shown if declined before accepting in Activity Centre') + self.errors.append( + 'System message after user left the group chat is shown if declined before accepting in Activity Centre') if home_2.element_by_text(chat_name).is_element_displayed(): self.errors.append("Group chat '%s' is shown, but user has left" % chat_name) @@ -233,9 +238,11 @@ class TestGroupChatMultipleDevice(MultipleDeviceTestCase): new_chat_name = device_1_chat.get_random_chat_name() device_1_chat.rename_chat_via_group_info(new_chat_name) for chat in (device_1_chat, device_2_chat): - if not chat.element_by_text(chat.create_system_message(device_1_username, initial_chat_name)).is_element_displayed(): + if not chat.element_by_text( + chat.create_system_message(device_1_username, initial_chat_name)).is_element_displayed(): self.errors.append('Initial system message about creating chta was changed!') - if not chat.element_by_text(chat.changed_group_name_system_message(device_1_username, new_chat_name)).is_element_displayed(): + if not chat.element_by_text( + chat.changed_group_name_system_message(device_1_username, new_chat_name)).is_element_displayed(): self.errors.append('Message about changing chat name is not shown') device_2.just_fyi('Check that you can navigate to renamed chat') @@ -274,7 +281,8 @@ class TestGroupChatMultipleDevice(MultipleDeviceTestCase): chat_1.element_by_text('Done').click() chat_1.close_button.click() if chat_1.user_name_text.text != full_ens: - self.errors.append('Nickname was not removed! real chat name is %s instead of %s' % (chat_1.user_name_text.text, full_ens)) + self.errors.append( + 'Nickname was not removed! real chat name is %s instead of %s' % (chat_1.user_name_text.text, full_ens)) home_1.just_fyi('Adding ENS user to contacts and start group chat with him') group_name = 'ens_group' @@ -315,18 +323,20 @@ class TestGroupChatMultipleDevice(MultipleDeviceTestCase): if not chat_1.chat_element_by_text(message_text).is_element_displayed(): self.errors.append("ENS name was not replaced with nickname on sent message") chat_1.chat_message_input.send_keys('@') - if not chat_1.element_by_text('%s %s' %(nickname, full_ens)).is_element_displayed(): + if not chat_1.element_by_text('%s %s' % (nickname, full_ens)).is_element_displayed(): self.errors.append("ENS name with nickname is not shown in mention input after set") if not chat_1.element_by_text(username_2).is_element_displayed(): self.errors.append("3-random name is not shown in mention input after set from group info") chat_1.chat_message_input.clear() - chat_1.select_mention_from_suggestion_list('%s %s' %(nickname, full_ens), typed_search_pattern=username_2[:2]) + chat_1.select_mention_from_suggestion_list('%s %s' % (nickname, full_ens), typed_search_pattern=username_2[:2]) if chat_1.chat_message_input.text != '@' + ens + ' ': - self.errors.append('ENS is not resolved in chat input after setting nickname in mention suggestions list (search by 3-random name)!') + self.errors.append( + 'ENS is not resolved in chat input after setting nickname in mention suggestions list (search by 3-random name)!') chat_1.chat_message_input.clear() chat_1.select_mention_from_suggestion_list('%s %s' % (nickname, full_ens), typed_search_pattern=nickname[:2]) if chat_1.chat_message_input.text != '@' + ens + ' ': - self.errors.append('ENS is not resolved in chat input after setting nickname in mention suggestions list (search by nickname)!') + self.errors.append( + 'ENS is not resolved in chat input after setting nickname in mention suggestions list (search by nickname)!') chat_1.chat_message_input.clear() home_1.just_fyi('Can delete nickname via group info and recheck received messages') @@ -389,6 +399,7 @@ class TestGroupChatMultipleDevice(MultipleDeviceTestCase): self.errors.verify_no_errors() + class TestCommandsSingleDevices(SingleDeviceTestCase): @marks.testrail_id(5721) @@ -423,4 +434,4 @@ class TestCommandsSingleDevices(SingleDeviceTestCase): if not group_info_view.element_by_text_part('20 members').is_element_displayed(): self.errors.append('Amount of users is not shown on Group info screen') - self.errors.verify_no_errors() \ No newline at end of file + self.errors.verify_no_errors() diff --git a/test/appium/tests/atomic/chats/test_keycard_commands.py b/test/appium/tests/atomic/chats/test_keycard_commands.py index dba921bd1a..24fc75d65c 100644 --- a/test/appium/tests/atomic/chats/test_keycard_commands.py +++ b/test/appium/tests/atomic/chats/test_keycard_commands.py @@ -1,10 +1,11 @@ import time from tests import marks -from tests.users import transaction_senders, transaction_recipients, ens_user_ropsten +from tests.users import transaction_senders, ens_user_ropsten from tests.base_test_case import MultipleDeviceTestCase, SingleDeviceTestCase from views.sign_in_view import SignInView + class TestCommandsMultipleDevices(MultipleDeviceTestCase): @marks.testrail_id(6293) @@ -50,7 +51,8 @@ class TestCommandsMultipleDevices(MultipleDeviceTestCase): self.drivers[0].fail("Required options accept or share are not shown") select_account_bottom_sheet = receiver_message.accept_and_share_address.click() - if not select_account_bottom_sheet.get_account_in_select_account_bottom_sheet_button(account_name).is_element_displayed(): + if not select_account_bottom_sheet.get_account_in_select_account_bottom_sheet_button( + account_name).is_element_displayed(): self.errors.append('Not expected value in "From" in "Select account": "Status" is expected') select_account_bottom_sheet.select_button.click() receiver_message.transaction_status.wait_for_element_text(receiver_message.shared_account) @@ -95,7 +97,7 @@ class TestCommandsMultipleDevices(MultipleDeviceTestCase): home_2 = device_2.recover_access(passphrase=sender['passphrase'], keycard=True, enable_notifications=True) wallet_2 = home_2.wallet_button.click() - initial_amount_STT = wallet_2.get_asset_amount_by_name('STT') + initial_amount_stt = wallet_2.get_asset_amount_by_name('STT') wallet_2.home_button.click() device_2.just_fyi('Add recipient to contact and send 1 message') @@ -127,7 +129,7 @@ class TestCommandsMultipleDevices(MultipleDeviceTestCase): transaction_request_pn = 'Request transaction' device_2.open_notification_bar() if not device_2.element_by_text(transaction_request_pn).is_element_displayed(60): - self.errors.append("Push notification is not received after going back from offline") + self.errors.append("Push notification is not received after going back from offline") device_2.element_by_text(transaction_request_pn).click() home_2.connection_offline_icon.wait_for_invisibility_of_element(120) home_2.get_chat(recipient_username).click() @@ -151,13 +153,12 @@ class TestCommandsMultipleDevices(MultipleDeviceTestCase): home_1.just_fyi('Check that can find tx in history and balance is updated after offline') [home.wallet_button.click() for home in (home_1, home_2)] - wallet_2.wait_balance_is_changed('STT', initial_amount_STT) + wallet_2.wait_balance_is_changed('STT', initial_amount_stt) wallet_1.wait_balance_is_changed('STT', scan_tokens=True) [wallet.find_transaction_in_history(amount=amount, asset='STT') for wallet in (wallet_1, wallet_2)] self.errors.verify_no_errors() - class TestCommandsSingleDevices(SingleDeviceTestCase): @marks.testrail_id(6295) diff --git a/test/appium/tests/atomic/chats/test_one_to_one.py b/test/appium/tests/atomic/chats/test_one_to_one.py index 7843bc24fa..903a344549 100644 --- a/test/appium/tests/atomic/chats/test_one_to_one.py +++ b/test/appium/tests/atomic/chats/test_one_to_one.py @@ -1,9 +1,6 @@ -import time - import emoji import random import string -from selenium.common.exceptions import TimeoutException from tests import marks from tests.base_test_case import MultipleDeviceTestCase, SingleDeviceTestCase @@ -216,9 +213,10 @@ class TestMessagesOneToOneChatMultiple(MultipleDeviceTestCase): if not public_chat_1.element_by_text_part("⌫ Edited").is_element_displayed(): self.errors.append('No mark in message bubble about this message was edited') - device_2.just_fyi("Device 1 sends text message and edits it in 1-1 chat. Device2 checks edited message is shown") + device_2.just_fyi( + "Device 1 sends text message and edits it in 1-1 chat. Device2 checks edited message is shown") chat_private_2 = home_2.add_contact(public_key_1) - message_before_edit_1_1, message_after_edit_1_1= "Message before edit 1-1", "AFTER" + message_before_edit_1_1, message_after_edit_1_1 = "Message before edit 1-1", "AFTER" chat_private_2.send_message(message_before_edit_1_1) home_1.home_button.click() @@ -261,7 +259,7 @@ class TestMessagesOneToOneChatMultiple(MultipleDeviceTestCase): chat_private_2.just_fyi("Check for that edited message is shown for Device 2 and delete message in public chat") [home.home_button.double_click() for home in (home_1, home_2)] - public_chat_1, public_chat_2 = home_1.get_chat('#%s' %chat_name).click(), home_2.join_public_chat(chat_name) + public_chat_1, public_chat_2 = home_1.get_chat('#%s' % chat_name).click(), home_2.join_public_chat(chat_name) if not public_chat_2.element_by_text_part("⌫ Edited").is_element_displayed(): self.errors.append('No mark in message bubble about this message was edited') if not public_chat_2.element_by_text_part(message_after_edit).is_element_displayed(): @@ -484,7 +482,7 @@ class TestMessagesOneToOneChatMultiple(MultipleDeviceTestCase): chat_1 = home_1.add_contact(public_key_2) home_1.just_fyi("Check that Device1 can pin own message in 1-1 chat") - message_1, message_2, message_3 ,message_4 = "Message1", "Message2", "Message3", "Message4", + message_1, message_2, message_3, message_4 = "Message1", "Message2", "Message3", "Message4", chat_1.send_message(message_1) chat_1.send_message(message_2) chat_1.pin_message(message_1) @@ -506,15 +504,15 @@ class TestMessagesOneToOneChatMultiple(MultipleDeviceTestCase): chat_1.view_profile_button.click() chat_1.pinned_messages_button.click() if not (chat_1.chat_element_by_text(message_1).pinned_by_label.is_element_present() and - chat_1.chat_element_by_text(message_2).pinned_by_label.is_element_present() and - chat_1.chat_element_by_text(message_1).is_element_present() and - chat_1.chat_element_by_text(message_2).is_element_present()): + chat_1.chat_element_by_text(message_2).pinned_by_label.is_element_present() and + chat_1.chat_element_by_text(message_1).is_element_present() and + chat_1.chat_element_by_text(message_2).is_element_present()): self.drivers[0].fail("Something missed on Pinned messaged on Device 1!") chat_2.pinned_messages_button.click() if not (chat_1.chat_element_by_text(message_1).pinned_by_label.is_element_present() and - chat_2.chat_element_by_text(message_2).pinned_by_label.is_element_present() and - chat_2.chat_element_by_text(message_1).is_element_present() and - chat_2.chat_element_by_text(message_2).is_element_present()): + chat_2.chat_element_by_text(message_2).pinned_by_label.is_element_present() and + chat_2.chat_element_by_text(message_1).is_element_present() and + chat_2.chat_element_by_text(message_2).is_element_present()): self.drivers[0].fail("Something missed on Pinned messaged on Device 2!") chat_1.close_button.click() @@ -629,7 +627,7 @@ class TestMessagesOneToOneChatMultiple(MultipleDeviceTestCase): 'url': 'https://www.youtube.com/watch?v=XN-SVmuJH2g&list=PLbrz7IuP1hrgNtYe9g6YHwHO6F3OqNMao', 'txt': 'Status & Keycard – Hardware-Enforced Security', 'subtitle': 'YouTube'}, - 'twitter':{ + 'twitter': { 'url': 'https://twitter.com/ethdotorg/status/1445161651771162627?s=20', 'txt': "We've rethought how we translate content, allowing us to translate", 'subtitle': 'Twitter' @@ -741,7 +739,6 @@ class TestMessagesOneToOneChatMultiple(MultipleDeviceTestCase): "audio": device_2_sends_audio, } - for key, value in sending_list.items(): navigate_to_start_state_of_both_devices() sending_list[key]() @@ -760,7 +757,7 @@ class TestMessagesOneToOneChatMultiple(MultipleDeviceTestCase): self.errors.append("Counter of reaction is not re-set on %s for message receiver!" % key) chat_2.just_fyi("Sending Emoji/Tag/Links in chat") - ## TODO: add link and tag messages after #11168 is fixed + # TODO: add link and tag messages after #11168 is fixed navigate_to_start_state_of_both_devices() emoji_name = random.choice(list(emoji.EMOJI_UNICODE)) @@ -1165,7 +1162,8 @@ class TestMessagesOneToOneChatSingle(SingleDeviceTestCase): wallet.home_button.click() if 'dapp' in key: home.open_in_status_button.click() - if not (chat.allow_button.is_element_displayed() or chat.element_by_text("Can't find web3 library").is_element_displayed()): + if not (chat.allow_button.is_element_displayed() or chat.element_by_text( + "Can't find web3 library").is_element_displayed()): self.errors.append('No allow button is shown in case of navigating to Status dapp!') chat.dapp_tab_button.click() chat.home_button.click() diff --git a/test/appium/tests/atomic/chats/test_public.py b/test/appium/tests/atomic/chats/test_public.py index ecf33de5c6..d79010e9e5 100644 --- a/test/appium/tests/atomic/chats/test_public.py +++ b/test/appium/tests/atomic/chats/test_public.py @@ -48,7 +48,8 @@ class TestPublicChatMultipleDevice(MultipleDeviceTestCase): chat.verify_message_is_under_today_text(message, self.errors) timestamp = chat.chat_element_by_text(message).timestamp_message.text if timestamp not in sent_time_variants: - self.errors.append("Timestamp is not shown, expected '%s', in fact '%s'" % (sent_time_variants.join(','), timestamp)) + self.errors.append( + "Timestamp is not shown, expected '%s', in fact '%s'" % (sent_time_variants.join(','), timestamp)) if chat_2.chat_element_by_text(message).username.text != default_username_1: self.errors.append("Default username '%s' is not shown next to the received message" % default_username_1) @@ -76,7 +77,8 @@ class TestPublicChatMultipleDevice(MultipleDeviceTestCase): message, message_2 = 'test message', 'test message2' chat_2.send_message(message) - home_1.just_fyi("Check unread message indicator on home, on chat element and that it is not shown after reading messages") + home_1.just_fyi( + "Check unread message indicator on home, on chat element and that it is not shown after reading messages") if not home_1.home_button.public_unread_messages.is_element_displayed(): self.errors.append('New messages public chat badge is not shown on Home button') chat_element = home_1.get_chat('#' + chat_name) @@ -97,7 +99,7 @@ class TestPublicChatMultipleDevice(MultipleDeviceTestCase): self.errors.append('New messages public chat badge is shown on Home button') if chat_element.new_messages_public_chat.is_element_displayed(): self.errors.append('Unread messages badge is shown in public chat while there are no unread messages') - [home.get_chat('#' + chat_name).click() for home in (home_1,home_2)] + [home.get_chat('#' + chat_name).click() for home in (home_1, home_2)] chat_1.send_message(message_2) chat_2.chat_element_by_text(message_2).wait_for_element(20) @@ -139,7 +141,6 @@ class TestPublicChatMultipleDevice(MultipleDeviceTestCase): self.errors.verify_no_errors() - @marks.testrail_id(6275) @marks.medium def test_receive_message_while_in_different_tab_and_emoji_messages_long_press(self): @@ -192,9 +193,9 @@ class TestPublicChatMultipleDevice(MultipleDeviceTestCase): home_1.just_fyi('Set status in profile') statuses = { - '*formatted text*':'formatted text', - 'https://www.youtube.com/watch?v=JjPWmEh2KhA' : 'Status Town Hall', - emoji.emojize(emoji_message) : emoji_unicode, + '*formatted text*': 'formatted text', + 'https://www.youtube.com/watch?v=JjPWmEh2KhA': 'Status Town Hall', + emoji.emojize(emoji_message): emoji_unicode, } timeline_1 = device_1.status_button.click() @@ -228,7 +229,8 @@ class TestPublicChatMultipleDevice(MultipleDeviceTestCase): chat_2.element_by_text_part(statuses['*formatted text*']).scroll_to_element() expected_value = statuses[status] if not chat_2.element_by_text_part(expected_value).is_element_displayed(): - self.errors.append("Expected value %s is not shown in other user profile without adding to contacts" % expected_value) + self.errors.append( + "Expected value %s is not shown in other user profile without adding to contacts" % expected_value) home_2.just_fyi('Add device1 to contacts and check that status will be shown in timeline_1') chat_2.close_button.scroll_and_click(direction='up') @@ -237,10 +239,11 @@ class TestPublicChatMultipleDevice(MultipleDeviceTestCase): for status in statuses: expected_value = statuses[status] if not timeline_2.element_by_text_part(expected_value).is_element_displayed(): - self.errors.append("Expected value %s is not shown in timeline_1 after adding user to contacts" % expected_value) + self.errors.append( + "Expected value %s is not shown in timeline_1 after adding user to contacts" % expected_value) profile_1.just_fyi('Checking message tag and reactions on statuses') - #TODO: no way to tap into tag message from timeline_1 + # TODO: no way to tap into tag message from timeline_1 # tag_status = '#public-chat-to-redirect-long-name' # timeline_1.set_new_status(tag_status) # #timeline_2 = profile_1.get_chat_view() @@ -267,10 +270,12 @@ class TestPublicChatMultipleDevice(MultipleDeviceTestCase): timeline_1.set_reaction(text_status) status_with_reaction_1 = timeline_1.chat_element_by_text(text_status) if status_with_reaction_1.emojis_below_message() != 0: - self.errors.append("Counter of reaction is not updated after removing reaction on your own status in timeline_1!") + self.errors.append( + "Counter of reaction is not updated after removing reaction on your own status in timeline_1!") status_with_reaction_2 = chat_2.chat_element_by_text(text_status) if status_with_reaction_2.emojis_below_message(own=False) != 0: - self.errors.append("Counter of reaction is not updated after removing on status of another user in profile!") + self.errors.append( + "Counter of reaction is not updated after removing on status of another user in profile!") profile_1.just_fyi("Remove user from contacts and check there is no his status in timeline_1 anymore") chat_2.remove_from_contacts.click() @@ -320,9 +325,9 @@ class TestPublicChatSingleDevice(SingleDeviceTestCase): if not home_view.element_by_text(tag_message).is_element_displayed(): self.errors.append('Could not find the public chat in user chat list.') times = { - "three-days" : '5 days', - "one-week" : '12 days', - "one-month" : ['43 days', '42 days', '41 days', '40 days'], + "three-days": '5 days', + "one-week": '12 days', + "one-month": ['43 days', '42 days', '41 days', '40 days'], } signin.just_fyi("Check that can fetch more history") @@ -343,7 +348,7 @@ class TestPublicChatSingleDevice(SingleDeviceTestCase): chat.element_by_text_part(fetch_more).wait_for_invisibility_of_element(120) res = any(profile.element_by_text_part(variant).is_element_displayed(30) for variant in variants) if not res: - self.errors.append("History is not fetched for one month!" ) + self.errors.append("History is not fetched for one month!") home_view.profile_button.click(desired_element_text=profile.get_translation_by_key("default-sync-period")) self.errors.verify_no_errors() diff --git a/test/appium/tests/atomic/dapps_and_browsing/test_browsing.py b/test/appium/tests/atomic/dapps_and_browsing/test_browsing.py index 5122c66eb9..5aecbf040d 100644 --- a/test/appium/tests/atomic/dapps_and_browsing/test_browsing.py +++ b/test/appium/tests/atomic/dapps_and_browsing/test_browsing.py @@ -48,7 +48,6 @@ class TestBrowsing(SingleDeviceTestCase): if not element_on_start_page.is_element_displayed(30): self.driver.fail("Page failed to be refreshed") - @marks.testrail_id(6210) @marks.high def test_open_blocked_secure_not_secure_inlalid_offline_urls(self): @@ -71,7 +70,8 @@ class TestBrowsing(SingleDeviceTestCase): dapp.just_fyi('Checking connection is not secure warning') web_page = dapp.open_url('http://www.dvwa.co.uk') - web_page.url_edit_box_lock_icon.click_until_presence_of_element(web_page.element_by_translation_id("browser-not-secure")) + web_page.url_edit_box_lock_icon.click_until_presence_of_element( + web_page.element_by_translation_id("browser-not-secure")) dapp_detail.open_tabs_button.click() dapp_detail.empty_tab_button.click() @@ -79,7 +79,8 @@ class TestBrowsing(SingleDeviceTestCase): dapp.just_fyi('Checking connection is secure for %s' % url) web_page = dapp.open_url(url) web_page.wait_for_d_aap_to_load() - web_page.url_edit_box_lock_icon.click_until_presence_of_element(web_page.element_by_translation_id("browser-secure")) + web_page.url_edit_box_lock_icon.click_until_presence_of_element( + web_page.element_by_translation_id("browser-secure")) dapp_detail.open_tabs_button.click() dapp_detail.empty_tab_button.click() @@ -111,7 +112,7 @@ class TestBrowsing(SingleDeviceTestCase): urls = { 'google.com': 'Google', 'status.im': 'Status - Private', - 'bbc.com' : 'bbc.com' + 'bbc.com': 'bbc.com' } for url in urls: browsing_view = dapp_view.open_url(url) @@ -123,7 +124,7 @@ class TestBrowsing(SingleDeviceTestCase): home_view.dapp_tab_button.click() browsing_view.open_tabs_button.click() if browsing_view.element_by_text_part(urls['bbc.com']).is_element_displayed(): - self.errors.append('Closed tab is present after re-login') + self.errors.append('Closed tab is present after re-login') home_view.just_fyi('Close all tabs via "Close all", relogin and check that it is not reappearing') browsing_view.close_all_button.click() @@ -207,7 +208,7 @@ class TestBrowsing(SingleDeviceTestCase): profile.dapp_permissions_button.click() if not profile.element_by_text('wikipedia.org').is_element_displayed(): self.errors.append("Permissions are not granted") - profile.dapp_tab_button.click(desired_element_text = wiki_texts[0]) + profile.dapp_tab_button.click(desired_element_text=wiki_texts[0]) browsing.options_button.click() browsing.connected_account_button.click() browsing.element_by_translation_id("revoke-access").click() @@ -215,12 +216,12 @@ class TestBrowsing(SingleDeviceTestCase): if not browsing.connect_account_button.is_element_displayed(): self.errors.append("Permission for account is not removed if using 'Revoke access' from dapp view") browsing.click_system_back_button() - browsing.profile_button.click(desired_element_text = 'DApp permissions') + browsing.profile_button.click(desired_element_text='DApp permissions') if profile.element_by_text('wikipedia.org').is_element_displayed(): self.errors.append("Permissions are not revoked") web_view.just_fyi("Check that can open chat view and send some message") - profile.dapp_tab_button.click(desired_element_text = wiki_texts[0]) + profile.dapp_tab_button.click(desired_element_text=wiki_texts[0]) browsing.options_button.click() browsing.open_chat_from_dapp_button.click() public_chat = browsing.get_chat_view() @@ -228,7 +229,7 @@ class TestBrowsing(SingleDeviceTestCase): self.driver.fail("No redirect to public chat") message = public_chat.get_random_message() public_chat.send_message(message) - public_chat.dapp_tab_button.click(desired_element_text = wiki_texts[0]) + public_chat.dapp_tab_button.click(desired_element_text=wiki_texts[0]) browsing.options_button.click() browsing.open_chat_from_dapp_button.click() if not public_chat.chat_element_by_text(message).is_element_displayed(): @@ -243,7 +244,7 @@ class TestBrowsing(SingleDeviceTestCase): self.errors.verify_no_errors() - #TODO: waiting mode + # TODO: waiting mode @marks.testrail_id(6300) @marks.skip @marks.medium diff --git a/test/appium/tests/atomic/dapps_and_browsing/test_dapps.py b/test/appium/tests/atomic/dapps_and_browsing/test_dapps.py index f2f6d6adf4..12a876a320 100644 --- a/test/appium/tests/atomic/dapps_and_browsing/test_dapps.py +++ b/test/appium/tests/atomic/dapps_and_browsing/test_dapps.py @@ -1,4 +1,4 @@ -from tests import marks, test_dapp_name, test_dapp_url +from tests import marks, test_dapp_name from tests.base_test_case import SingleDeviceTestCase from tests.users import basic_user from views.sign_in_view import SignInView @@ -141,4 +141,3 @@ class TestDApps(SingleDeviceTestCase): if not profile.element_by_text(account_name).is_element_displayed(): self.errors.append("Subaccount is not selected after relogin in Dapps!") self.errors.verify_no_errors() - diff --git a/test/appium/tests/atomic/dapps_and_browsing/test_deep_links.py b/test/appium/tests/atomic/dapps_and_browsing/test_deep_links.py index 192caba36d..d5cf5afa4c 100644 --- a/test/appium/tests/atomic/dapps_and_browsing/test_deep_links.py +++ b/test/appium/tests/atomic/dapps_and_browsing/test_deep_links.py @@ -28,7 +28,7 @@ class TestDeepLinks(SingleDeviceTestCase): def test_open_user_profile_using_deep_link(self): sign_in = SignInView(self.driver) sign_in.create_user() - for user_ident in ens_user['ens'], ens_user['ens_another'], ens_user['public_key'],: + for user_ident in ens_user['ens'], ens_user['ens_another'], ens_user['public_key']: self.driver.close_app() deep_link = 'status-im://u/%s' % user_ident sign_in.open_weblink_and_login(deep_link) @@ -53,7 +53,6 @@ class TestDeepLinks(SingleDeviceTestCase): except NoSuchElementException: self.driver.fail("DApp '%s' is not opened!" % dapp_name) - @marks.testrail_id(5781) @marks.medium def test_deep_link_with_invalid_user_public_key_own_profile_key(self): @@ -67,7 +66,8 @@ class TestDeepLinks(SingleDeviceTestCase): home_view = sign_in_view.get_home_view() home_view.plus_button.click_until_presence_of_element(home_view.start_new_chat_button) if not home_view.start_new_chat_button.is_element_present(): - self.errors.append("Can't navigate to start new chat after app opened from deep link with invalid public key") + self.errors.append( + "Can't navigate to start new chat after app opened from deep link with invalid public key") self.driver.close_app() sign_in_view.just_fyi('Check that no error when opening invalid deep link') diff --git a/test/appium/tests/atomic/test_upgrade.py b/test/appium/tests/atomic/test_upgrade.py index 3e7735f149..02c92ec320 100644 --- a/test/appium/tests/atomic/test_upgrade.py +++ b/test/appium/tests/atomic/test_upgrade.py @@ -1,4 +1,5 @@ -from tests import marks, pytest_config_global, test_dapp_name, staging_fleet, mailserver_hk, mailserver_ams, mailserver_gc +from tests import marks, pytest_config_global, test_dapp_name, staging_fleet, mailserver_hk, mailserver_ams, \ + mailserver_gc from tests.base_test_case import SingleDeviceTestCase, MultipleDeviceTestCase from tests.users import upgrade_users, transaction_recipients, basic_user, ens_user from views.sign_in_view import SignInView @@ -7,6 +8,7 @@ import views.upgrade_dbs.dapps.data as dapp_data import views.upgrade_dbs.pairing.data as sync_data import views.upgrade_dbs.group.data as group + @marks.upgrade class TestUpgradeApplication(SingleDeviceTestCase): @@ -29,7 +31,7 @@ class TestUpgradeApplication(SingleDeviceTestCase): new_version = profile.app_version_text.text if 'release' in pytest_config_global['apk_upgrade']: if new_version == old_version: - self.errors.append('Upgraded app version is %s vs base version is %s ' % (new_version, old_version)) + self.errors.append('Upgraded app version is %s vs base version is %s ' % (new_version, old_version)) home.home_button.click() @@ -72,7 +74,7 @@ class TestUpgradeApplication(SingleDeviceTestCase): public_chat.scroll_to_start_of_history() for key in pub_chat_data['preview_messages']: home.just_fyi("Checking %s preview case in public chat" % key) - data = pub_chat_data['preview_messages'][key] + data = pub_chat_data['preview_messages'][key] if not public_chat.element_by_text_part(data['txt']).is_element_displayed(): public_chat.element_by_text_part(data['txt']).scroll_to_element() message = public_chat.get_preview_message_by_text(data['txt']) @@ -80,9 +82,10 @@ class TestUpgradeApplication(SingleDeviceTestCase): self.errors.append('Preview message is not shown for %s' % key) if 'title' in data: if message.preview_title.text != data['title']: - self.errors.append("Title '%s' does not match expected '%s'" % (message.preview_title.text, data['title'])) + self.errors.append( + "Title '%s' does not match expected '%s'" % (message.preview_title.text, data['title'])) if message.preview_subtitle.text != data['subtitle']: - self.errors.append("Subtitle '%s' does not match expected '%s'" % (message.preview_subtitle.text, data['subtitle'])) + self.errors.append("Subtitle '%s' does not match expected '%s'" % (message.preview_subtitle.text, data['subtitle'])) home.home_button.click() home.just_fyi("Checking markdown messages") @@ -174,7 +177,7 @@ class TestUpgradeApplication(SingleDeviceTestCase): profile = dapps.profile_button.click() profile.privacy_and_security_button.click() profile.dapp_permissions_button.click() - if profile.element_by_text_part( dapp_data.dapps['permissions']['deleted']).is_element_displayed(): + if profile.element_by_text_part(dapp_data.dapps['permissions']['deleted']).is_element_displayed(): self.errors.append('Deleted permissions reappear after upgrade!') profile.element_by_text(test_dapp_name).click() permissions = dapp_data.dapps['permissions']['added'][test_dapp_name] @@ -220,12 +223,9 @@ class TestUpgradeApplication(SingleDeviceTestCase): self.errors.append('Asset %s was not restored' % asset) home.just_fyi('Check that can sign transaction in STT from wallet') - wallet.accounts_status_account.click() transaction_amount = wallet.get_unique_amount() - wallet.send_transaction(amount=transaction_amount, asset_name='STT', - sign_transaction=True, - keycard=True, - recipient=transaction_recipients['I']['address']) + wallet.send_transaction(amount=transaction_amount, asset_name='STT', sign_transaction=True, keycard=True, + recipient=transaction_recipients['I']['address']) self.network_api.find_transaction_by_unique_amount(user['address'], transaction_amount, token=True) wallet.just_fyi('Check that transaction is appeared in transaction history') @@ -241,6 +241,7 @@ class TestUpgradeApplication(SingleDeviceTestCase): send_transaction.sign_transaction(keycard=True) self.errors.verify_no_errors() + @marks.upgrade class TestUpgradeMultipleApplication(MultipleDeviceTestCase): @@ -284,7 +285,7 @@ class TestUpgradeMultipleApplication(MultipleDeviceTestCase): if key == 'outgoing_STT_sign': chat.swipe_up() if not message.sign_and_send.is_element_displayed(): - self.errors.append('No "sign and send" option is shown for %s' % key) + self.errors.append('No "sign and send" option is shown for %s' % key) chat.home_button.click() device_2.just_fyi("Create upgraded and non-upgraded app can exchange messages") @@ -335,7 +336,7 @@ class TestUpgradeMultipleApplication(MultipleDeviceTestCase): self.error.append("Synced public chat '%s' is not shown on secondary device after upgrade!" % chat) device_1.just_fyi("Pairing: check that can send messages to chats and they will appear on secondary device") - main_1_1, secondary_1_1, group = synced['ens'], synced['username_ens'], sync_data.chats['group'] + main_1_1, secondary_1_1, group_name = synced['ens'], synced['username_ens'], sync_data.chats['group'] message = 'Device pairing check' device_1.home_button.click() chat_1 = home_1.get_chat(main_1_1).click() @@ -343,14 +344,16 @@ class TestUpgradeMultipleApplication(MultipleDeviceTestCase): home_2.get_chat(secondary_1_1).wait_for_visibility_of_element() chat_2 = home_2.get_chat(secondary_1_1).click() if not chat_2.chat_element_by_text(message).is_element_displayed(): - self.error.append("Message in 1-1 chat does not appear on device 2 after sending from main device after upgrade") + self.error.append( + "Message in 1-1 chat does not appear on device 2 after sending from main device after upgrade") [chat.home_button.click() for chat in (chat_1, chat_2)] - chat_1 = home_1.get_chat(group).click() + chat_1 = home_1.get_chat(group_name).click() chat_1.send_message(message) - home_2.get_chat(group).wait_for_visibility_of_element() - chat_2 = home_2.get_chat(group).click() + home_2.get_chat(group_name).wait_for_visibility_of_element() + chat_2 = home_2.get_chat(group_name).click() if not chat_2.chat_element_by_text(message).is_element_displayed(): - self.error.append("Message in group chat does not appear on device 2 after sending from main device after upgrade") + self.error.append( + "Message in group chat does not appear on device 2 after sending from main device after upgrade") [chat.home_button.click() for chat in (chat_1, chat_2)] device_1.just_fyi("Pairing: add public chat and check it will appear on secondary device") @@ -375,7 +378,8 @@ class TestUpgradeMultipleApplication(MultipleDeviceTestCase): "Message in new 1-1 chat does not appear on device 2 after sending from main device after upgrade") device_2.just_fyi("Pairing: check that contacts/nicknames are synced") - synced_secondary = {synced['nickname'], synced['username_nickname'], synced['username_ens'], added['name'], added['username']} + synced_secondary = {synced['nickname'], synced['username_nickname'], synced['username_ens'], added['name'], + added['username']} profile_2 = chat_2.profile_button.click() profile_2.contacts_button.click() for username in synced_secondary: @@ -399,17 +403,18 @@ class TestUpgradeMultipleApplication(MultipleDeviceTestCase): device.sign_in() home_1.just_fyi("Check that all group chats are preserved after upgrade") - names = [sub["name"] for sub in (group.main, group.empty_invite, group.make_admin, group.to_join, group.to_remove)] + names = [sub["name"] for sub in + (group.main, group.empty_invite, group.make_admin, group.to_join, group.to_remove)] for home in home_1, home_2: for name in names: if not home.get_chat(name).is_element_displayed(): self.errors.append("%s is not shown on device %s" % (name, home.driver.number)) - if home_2.element_by_text(group.to_delete['name']).is_element_displayed(): + if home_2.element_by_text(group.to_delete['name']).is_element_displayed(): self.errors.append("Deleted group chat reappeared after upgrade") home_1.just_fyi("Check messages in main group chat and resolved ENS") chat_name, messages = group.main["name"], group.main["messages"] - [chat_1, chat_2]= [home.get_chat(chat_name).click() for home in (home_1, home_2)] + [chat_1, chat_2] = [home.get_chat(chat_name).click() for home in (home_1, home_2)] for chat in [chat_1, chat_2]: if not chat.chat_element_by_text(messages["text"]).is_element_displayed(): self.errors.append("Text message in group chat is not shown after upgrade") @@ -457,7 +462,7 @@ class TestUpgradeMultipleApplication(MultipleDeviceTestCase): admins = chat_1.element_by_text('Admin').find_elements() if len(admins) != 2: self.errors.append('Not 2 admins in group chat') - [chat.home_button.double_click()for chat in [chat_1, chat_2]] + [chat.home_button.double_click() for chat in [chat_1, chat_2]] home_1.just_fyi("Check that can see invite and pending membership request after upgrade") chat_name = group.empty_invite['name'] @@ -483,7 +488,6 @@ class TestUpgradeMultipleApplication(MultipleDeviceTestCase): profile_2 = home_2.profile_button.click() public_key_2, username_2 = profile_2.get_public_key_and_username(return_username=True) - device_1.just_fyi("Activity centre: send message to 1-1 and invite member to group chat") chat_1 = home_1.add_contact(public_key_2, add_in_contacts=False) message = home_1.get_random_message() @@ -499,7 +503,8 @@ class TestUpgradeMultipleApplication(MultipleDeviceTestCase): device_1.just_fyi("Check status") timeline = home_1.status_button.click() statuses = group.timeline - for element in timeline.element_by_text(statuses['text']), timeline.image_message_in_chat, timeline.element_by_text(statuses['link']): + for element in timeline.element_by_text( + statuses['text']), timeline.image_message_in_chat, timeline.element_by_text(statuses['link']): if not element.is_element_displayed(): self.errors.append("Status is not shown after upgrade!") timeline.element_by_text(statuses['link']).click() diff --git a/test/appium/tests/atomic/transactions/test_dapps_transactions.py b/test/appium/tests/atomic/transactions/test_dapps_transactions.py index f8245c00e2..6c7a4aa65f 100644 --- a/test/appium/tests/atomic/transactions/test_dapps_transactions.py +++ b/test/appium/tests/atomic/transactions/test_dapps_transactions.py @@ -4,18 +4,17 @@ from tests.users import transaction_senders from views.sign_in_view import SignInView - class TestTransactionDApp(SingleDeviceTestCase): @marks.testrail_id(5309) @marks.critical @marks.transaction - def test_request_stt_from_daap(self): + def test_request_stt_from_dapp(self): sender = transaction_senders['K'] home = SignInView(self.driver).recover_access(sender['passphrase'], unique_password) wallet = home.wallet_button.click() wallet.scan_tokens() - initial_amount_STT = wallet.get_asset_amount_by_name('STT') + initial_amount_stt = wallet.get_asset_amount_by_name('STT') status_test_dapp = home.open_status_test_dapp() status_test_dapp.wait_for_d_aap_to_load() status_test_dapp.assets_button.click() @@ -29,7 +28,7 @@ class TestTransactionDApp(SingleDeviceTestCase): status_test_dapp.wallet_button.click() send_transaction.just_fyi('Verify that wallet balance is updated') - wallet.wait_balance_is_changed('STT', initial_amount_STT, scan_tokens=True) + wallet.wait_balance_is_changed('STT', initial_amount_stt, scan_tokens=True) send_transaction.just_fyi('Check logcat for sensitive data') values_in_logcat = send_transaction.find_values_in_logcat(password=unique_password) @@ -42,7 +41,7 @@ class TestTransactionDApp(SingleDeviceTestCase): def test_sign_message_and_2tx_in_batch_and_transactions_filters_from_daap(self): password = 'password_for_daap' home = SignInView(self.driver).recover_access(passphrase=transaction_senders['W']['passphrase'], - password=password) + password=password) wallet = home.wallet_button.click() status_test_dapp = home.open_status_test_dapp() @@ -86,7 +85,6 @@ class TestTransactionDApp(SingleDeviceTestCase): self.driver.fail("'Test filters' button produced an error") self.errors.verify_no_errors() - @marks.testrail_id(5784) @marks.medium @marks.transaction @@ -106,7 +104,7 @@ class TestTransactionDApp(SingleDeviceTestCase): if not status_test_dapp.element_by_text(user['public_key']).is_element_displayed(): self.errors.append('Public key is not returned') status_test_dapp.get_empty_dapp_tab() - wallet = home.wallet_button.click() + home.wallet_button.click() home.just_fyi("Checking sign typed message") home.open_status_test_dapp(allow_all=True) @@ -123,6 +121,6 @@ class TestTransactionDApp(SingleDeviceTestCase): if not status_test_dapp.element_by_text('Contract deployed at: ').is_element_displayed(180): self.errors.append('Contract was not created') for text in ['Call contract get function', - 'Call contract set function', 'Call function 2 times in a row']: + 'Call contract set function', 'Call function 2 times in a row']: status_test_dapp.element_by_text(text).scroll_to_element() self.errors.verify_no_errors() diff --git a/test/appium/tests/atomic/transactions/test_keycard_dapps_transactions.py b/test/appium/tests/atomic/transactions/test_keycard_dapps_transactions.py index 682193ef09..5a0886f970 100644 --- a/test/appium/tests/atomic/transactions/test_keycard_dapps_transactions.py +++ b/test/appium/tests/atomic/transactions/test_keycard_dapps_transactions.py @@ -15,7 +15,7 @@ class TestTransactionDApp(SingleDeviceTestCase): home_view = sign_in_view.recover_access(sender['passphrase'], keycard=True) wallet_view = home_view.wallet_button.click() wallet_view.scan_tokens() - initial_amount_STT = wallet_view.get_asset_amount_by_name('STT') + initial_amount_stt = wallet_view.get_asset_amount_by_name('STT') status_test_dapp = home_view.open_status_test_dapp() status_test_dapp.wait_for_d_aap_to_load() status_test_dapp.assets_button.click() @@ -24,7 +24,7 @@ class TestTransactionDApp(SingleDeviceTestCase): status_test_dapp.wallet_button.click() send_transaction_view.just_fyi('Verify that wallet balance is updated') - wallet_view.wait_balance_is_changed('STT', initial_amount_STT, scan_tokens=True) + wallet_view.wait_balance_is_changed('STT', initial_amount_stt, scan_tokens=True) send_transaction_view.just_fyi('Check logcat for sensitive data') values_in_logcat = send_transaction_view.find_values_in_logcat(mnemonic=sender['passphrase'], @@ -77,7 +77,6 @@ class TestTransactionDApp(SingleDeviceTestCase): self.errors.verify_no_errors() - @marks.testrail_id(6310) @marks.medium @marks.transaction @@ -106,6 +105,3 @@ class TestTransactionDApp(SingleDeviceTestCase): 'Call contract set function', 'Call function 2 times in a row']: status_test_dapp.element_by_text(text).scroll_to_element() self.errors.verify_no_errors() - - - diff --git a/test/appium/tests/atomic/transactions/test_keycard_wallet.py b/test/appium/tests/atomic/transactions/test_keycard_wallet.py index 012cd57bc4..9e513145a5 100644 --- a/test/appium/tests/atomic/transactions/test_keycard_wallet.py +++ b/test/appium/tests/atomic/transactions/test_keycard_wallet.py @@ -1,5 +1,5 @@ from support.utilities import get_merged_txs_list -from tests import marks, pin, puk, pair_code +from tests import marks from tests.base_test_case import SingleDeviceTestCase from tests.users import transaction_senders, basic_user, wallet_users from views.sign_in_view import SignInView @@ -13,22 +13,17 @@ class TestTransactionWalletSingleDevice(SingleDeviceTestCase): def test_keycard_send_eth_from_wallet_to_address(self): recipient = basic_user sender = transaction_senders['P'] - sign_in_view = SignInView(self.driver) - home_view = sign_in_view.recover_access(sender['passphrase'], keycard=True) - wallet_view = home_view.wallet_button.click() - wallet_view.wait_balance_is_changed() - wallet_view.accounts_status_account.click() - transaction_amount = wallet_view.get_unique_amount() - wallet_view.send_transaction(amount=transaction_amount, - sign_transaction=True, - keycard=True, - recipient='0x%s'%recipient['address']) + sign_in = SignInView(self.driver) + home = sign_in.recover_access(sender['passphrase'], keycard=True) + wallet = home.wallet_button.click() + wallet.wait_balance_is_changed() + transaction_amount = wallet.get_unique_amount() + wallet.send_transaction(amount=transaction_amount, sign_transaction=True, keycard=True, recipient='0x%s' % recipient['address']) - wallet_view.just_fyi('Check that transaction is appeared in transaction history') - transaction = wallet_view.find_transaction_in_history(amount=transaction_amount, return_hash=True) + wallet.just_fyi('Check that transaction is appeared in transaction history') + transaction = wallet.find_transaction_in_history(amount=transaction_amount, return_hash=True) self.network_api.find_transaction_by_hash(transaction) - @marks.testrail_id(6291) @marks.critical @marks.transaction @@ -88,17 +83,13 @@ class TestTransactionWalletSingleDevice(SingleDeviceTestCase): wallet.click_system_back_button() wallet.just_fyi("Send transaction to new account") - wallet.accounts_status_account.wait_and_click() transaction_amount = '0.004' initial_balance = self.network_api.get_balance(status_account_address) - wallet.send_transaction(account_name=account_name, - amount=transaction_amount, - keycard=True) + wallet.send_transaction(account_name=account_name, amount=transaction_amount, keycard=True) self.network_api.wait_for_confirmation_of_transaction(status_account_address, transaction_amount) self.network_api.verify_balance_is_updated(str(initial_balance), status_account_address) wallet.just_fyi("Verifying previously sent transaction in new account") - wallet.close_button.click() wallet.get_account_by_name(account_name).click() wallet.send_transaction_button.click() wallet.close_send_transaction_view_button.click() @@ -113,13 +104,12 @@ class TestTransactionWalletSingleDevice(SingleDeviceTestCase): transaction_amount_1 = round(float(transaction_amount) * 0.2, 11) wallet.wait_balance_is_changed() wallet.get_account_by_name(account_name).click() - send_transaction = wallet.send_transaction(account_name=wallet.status_account_name, - amount=transaction_amount_1, - keycard=True) + send_transaction = wallet.send_transaction(from_main_wallet=False, account_name=wallet.status_account_name, + amount=transaction_amount_1, keycard=True) wallet.close_button.click() sub_account_address = wallet.get_wallet_address(account_name)[2:] self.network_api.wait_for_confirmation_of_transaction(sub_account_address, transaction_amount_1) - wallet.find_transaction_in_history(amount=format(float(transaction_amount_1),'.11f').rstrip('0')) + wallet.find_transaction_in_history(amount=format(float(transaction_amount_1), '.11f').rstrip('0')) wallet.just_fyi("Check transactions on subaccount") self.network_api.verify_balance_is_updated(updated_balance, status_account_address) diff --git a/test/appium/tests/atomic/transactions/test_wallet.py b/test/appium/tests/atomic/transactions/test_wallet.py index 84e8e8e5c0..2009106ecf 100644 --- a/test/appium/tests/atomic/transactions/test_wallet.py +++ b/test/appium/tests/atomic/transactions/test_wallet.py @@ -4,7 +4,8 @@ import string from support.utilities import get_merged_txs_list from tests import marks, unique_password from tests.base_test_case import SingleDeviceTestCase, MultipleDeviceTestCase -from tests.users import transaction_senders, basic_user, wallet_users, ens_user_ropsten, transaction_recipients, ens_user +from tests.users import transaction_senders, basic_user, wallet_users, ens_user_ropsten, transaction_recipients, \ + ens_user from views.send_transaction_view import SendTransactionView from views.sign_in_view import SignInView @@ -103,15 +104,11 @@ class TestTransactionWalletSingleDevice(SingleDeviceTestCase): home = SignInView(self.driver).recover_access(sender['passphrase']) wallet = home.wallet_button.click() wallet.wait_balance_is_changed(asset='ADI', scan_tokens=True) - wallet.accounts_status_account.click() amount = '0.000%s' % str(random.randint(100, 999)) + '1' - wallet.send_transaction(amount=amount, - recipient='0x%s' % recipient['address'], - asset_name='ADI') + wallet.send_transaction(amount=amount, recipient='0x%s' % recipient['address'], asset_name='ADI') transaction = wallet.find_transaction_in_history(amount=amount, asset='ADI', return_hash=True) self.network_api.find_transaction_by_hash(transaction) - @marks.testrail_id(5412) @marks.high @marks.transaction @@ -215,7 +212,6 @@ class TestTransactionWalletSingleDevice(SingleDeviceTestCase): home.home_button.wait_for_visibility_of_element() home.connection_offline_icon.wait_for_visibility_of_element(20) - @marks.testrail_id(6225) @marks.transaction @marks.medium @@ -231,17 +227,14 @@ class TestTransactionWalletSingleDevice(SingleDeviceTestCase): wallet.add_account(account_name) wallet.just_fyi("Send transaction to new account") - wallet.accounts_status_account.click() initial_balance = self.network_api.get_balance(status_account_address) transaction_amount = '0.003%s' % str(random.randint(10000, 99999)) + '1' - wallet.send_transaction(account_name=account_name, - amount=transaction_amount) + wallet.send_transaction(account_name=account_name, amount=transaction_amount) self.network_api.wait_for_confirmation_of_transaction(status_account_address, transaction_amount) self.network_api.verify_balance_is_updated(str(initial_balance), status_account_address) wallet.just_fyi("Verifying previously sent transaction in new account") - wallet.close_button.click() wallet.get_account_by_name(account_name).click() wallet.send_transaction_button.click() wallet.close_send_transaction_view_button.click() @@ -254,14 +247,14 @@ class TestTransactionWalletSingleDevice(SingleDeviceTestCase): wallet.just_fyi("Sending eth from new account to main account") updated_balance = self.network_api.get_balance(status_account_address) transaction_amount_1 = round(float(transaction_amount) * 0.2, 12) - wallet.send_transaction(account_name=wallet.status_account_name, - amount=transaction_amount_1) + wallet.send_transaction(from_main_wallet=False, account_name=wallet.status_account_name, + amount=transaction_amount_1) wallet.close_button.click() sub_account_address = wallet.get_wallet_address(account_name)[2:] self.network_api.wait_for_confirmation_of_transaction(status_account_address, transaction_amount) self.network_api.verify_balance_is_updated(updated_balance, status_account_address) wallet.find_transaction_in_history(amount=transaction_amount) - wallet.find_transaction_in_history(amount=format(float(transaction_amount_1),'.11f').rstrip('0')) + wallet.find_transaction_in_history(amount=format(float(transaction_amount_1), '.11f').rstrip('0')) wallet.just_fyi("Check transactions on subaccount") self.network_api.verify_balance_is_updated(updated_balance, status_account_address) @@ -338,7 +331,7 @@ class TestTransactionWalletSingleDevice(SingleDeviceTestCase): url_data = { 'ens_for_receiver': { 'url': 'ethereum:0xc55cf4b03948d7ebc8b9e8bad92643703811d162@3/transfer?address=nastya.stateofus.eth&uint256=1e-1', - 'data':{ + 'data': { 'asset': 'STT', 'amount': '0.1', 'address': '0x58d8…F2ff', @@ -429,7 +422,7 @@ class TestTransactionWalletSingleDevice(SingleDeviceTestCase): @marks.high @marks.transaction def test_send_transaction_with_custom_token(self): - contract_address, name, symbol, decimals = '0x101848D5C5bBca18E6b4431eEdF6B95E9ADF82FA', 'Weenus 💪', 'WEENUS', '18' + contract_address, name, symbol, decimals = '0x101848D5C5bBca18E6b4431eEdF6B95E9ADF82FA', 'Weenus 💪', 'WEENUS', '18' home = SignInView(self.driver).recover_access(wallet_users['B']['passphrase']) wallet = home.wallet_button.click() wallet.multiaccount_more_options.click() @@ -447,8 +440,6 @@ class TestTransactionWalletSingleDevice(SingleDeviceTestCase): wallet.asset_by_name(symbol).scroll_to_element() if not wallet.asset_by_name(symbol).is_element_displayed(): self.errors.append('Custom token is not shown on Wallet view') - wallet.accounts_status_account.scroll_to_element(direction='up') - wallet.accounts_status_account.click() recipient = "0x" + basic_user['address'] amount = '0.000%s' % str(random.randint(10000, 99999)) + '1' wallet.send_transaction(asset_name=symbol, amount=amount, recipient=recipient) @@ -547,12 +538,12 @@ class TestTransactionWalletSingleDevice(SingleDeviceTestCase): if not send_tr.element_by_text(name).is_element_displayed(): self.errors.append('%s is not shown in search when searching by namepart' % name) send_tr.element_by_text(basic_add_to_fav_name).click() - if send_tr.enter_recipient_address_text.text != send_tr.get_formatted_recipient_address('0x' + basic_user['address']): + if send_tr.enter_recipient_address_text.text != send_tr.get_formatted_recipient_address( + '0x' + basic_user['address']): self.errors.append('QR scanned address that was added to favourites was not resolved correctly') self.errors.verify_no_errors() - @marks.testrail_id(5437) @marks.medium def test_validation_amount_errors(self): @@ -560,14 +551,14 @@ class TestTransactionWalletSingleDevice(SingleDeviceTestCase): sign_in = SignInView(self.driver) errors = {'send_transaction_screen': { - 'too_precise': 'Amount is too precise. Max number of decimals is 7.', - 'insufficient_funds': 'Insufficient funds' - }, - 'sending_screen': { - 'Amount': 'Insufficient funds', - 'Network fee': 'Not enough ETH for gas' - }, - } + 'too_precise': 'Amount is too precise. Max number of decimals is 7.', + 'insufficient_funds': 'Insufficient funds' + }, + 'sending_screen': { + 'Amount': 'Insufficient funds', + 'Network fee': 'Not enough ETH for gas' + }, + } warning = 'Warning %s is not shown on %s' sign_in.recover_access(sender['passphrase']) @@ -577,21 +568,24 @@ class TestTransactionWalletSingleDevice(SingleDeviceTestCase): screen = 'send transaction screen from wallet' sign_in.just_fyi('Checking %s on %s' % (errors['send_transaction_screen']['too_precise'], screen)) - initial_amount_ADI = wallet.get_asset_amount_by_name('ADI') + initial_amount_adi = wallet.get_asset_amount_by_name('ADI') send_transaction = wallet.send_transaction_button.click() adi_button = send_transaction.asset_by_name('ADI') - send_transaction.select_asset_button.click_until_presence_of_element(send_transaction.eth_asset_in_select_asset_bottom_sheet_button) + send_transaction.select_asset_button.click_until_presence_of_element( + send_transaction.eth_asset_in_select_asset_bottom_sheet_button) adi_button.click() send_transaction.amount_edit_box.click() amount = '0.000%s' % str(random.randint(100000, 999999)) + '1' send_transaction.amount_edit_box.set_value(amount) - if not send_transaction.element_by_text(errors['send_transaction_screen']['too_precise']).is_element_displayed(): + if not send_transaction.element_by_text( + errors['send_transaction_screen']['too_precise']).is_element_displayed(): self.errors.append(warning % (errors['send_transaction_screen']['too_precise'], screen)) sign_in.just_fyi('Checking %s on %s' % (errors['send_transaction_screen']['insufficient_funds'], screen)) send_transaction.amount_edit_box.clear() - send_transaction.amount_edit_box.set_value(str(initial_amount_ADI) + '1') - if not send_transaction.element_by_text(errors['send_transaction_screen']['insufficient_funds']).is_element_displayed(): + send_transaction.amount_edit_box.set_value(str(initial_amount_adi) + '1') + if not send_transaction.element_by_text( + errors['send_transaction_screen']['insufficient_funds']).is_element_displayed(): self.errors.append(warning % (errors['send_transaction_screen']['insufficient_funds'], screen)) wallet.close_send_transaction_view_button.click() wallet.close_button.click() @@ -607,7 +601,7 @@ class TestTransactionWalletSingleDevice(SingleDeviceTestCase): send_transaction.next_button.click() wallet.ok_got_it_button.wait_and_click(30) if not send_transaction.validation_error_element.is_element_displayed(10): - self.errors.append('Validation icon is not shown when testing %s on %s' % (errors['sending_screen']['Network fee'],screen)) + self.errors.append('Validation icon is not shown when testing %s on %s' % (errors['sending_screen']['Network fee'], screen)) if not wallet.element_by_translation_id("tx-fail-description2").is_element_displayed(): self.errors.append("No warning about failing tx is shown!") send_transaction.cancel_button.click() @@ -625,7 +619,7 @@ class TestTransactionWalletSingleDevice(SingleDeviceTestCase): status_test_dapp.send_two_tx_in_batch_button) status_test_dapp.send_two_tx_in_batch_button.click() if not send_transaction.validation_error_element.is_element_displayed(10): - self.errors.append(warning % (errors['sending_screen']['Network fee'],screen)) + self.errors.append(warning % (errors['sending_screen']['Network fee'], screen)) self.errors.verify_no_errors() @marks.testrail_id(695855) @@ -648,31 +642,29 @@ class TestTransactionWalletSingleDevice(SingleDeviceTestCase): send_transaction.network_fee_button.click() send_transaction = wallet.get_send_transaction_view() fee_fields = (send_transaction.per_gas_tip_limit_input, send_transaction.per_gas_price_limit_input) - [default_tip, default_price] = [input.text for input in fee_fields] + [default_tip, default_price] = [field.text for field in fee_fields] default_limit = '21000' - - wallet.just_fyi("Check basic validation") values = { - send_transaction.gas_limit_input : + send_transaction.gas_limit_input: { 'default': default_limit, - 'value' : '22000', - '20999' : 'wallet-send-min-units', + 'value': '22000', + '20999': 'wallet-send-min-units', '@!': 'invalid-number', - }, + }, send_transaction.per_gas_tip_limit_input: { 'default': default_tip, 'value': '2.5', - 'aaaa' : 'invalid-number', + 'aaaa': 'invalid-number', }, send_transaction.per_gas_price_limit_input: { 'default': default_price, 'value': '4,000000001', - '-2' : 'invalid-number', + '-2': 'invalid-number', } } for field in values: @@ -685,18 +677,18 @@ class TestTransactionWalletSingleDevice(SingleDeviceTestCase): field.clear() field.set_value(values[field]['value']) - wallet.just_fyi("Set custom fee and check that it will be applied") send_transaction.save_fee_button.scroll_and_click() if send_transaction.get_network_fee_from_bottom_sheet() != '0.000088': - self.driver.fail("Custom fee is not applied, in fact it is %s " % send_transaction.get_network_fee_from_bottom_sheet()) + self.driver.fail( + "Custom fee is not applied, in fact it is %s " % send_transaction.get_network_fee_from_bottom_sheet()) send_transaction.sign_transaction() self.network_api.wait_for_confirmation_of_transaction(sender['address'], amount, confirmations=3) transaction = wallet.find_transaction_in_history(amount=amount, return_hash=True) - expected_params = { - 'fee_cap' : '4.000000001', + expected_params = { + 'fee_cap': '4.000000001', 'tip_cap': '2.5', - 'gas_limit' : '22000' + 'gas_limit': '22000' } actual_params = self.network_api.get_custom_fee_tx_params(transaction) if actual_params != expected_params: @@ -747,10 +739,7 @@ class TestTransactionWalletMultipleDevice(MultipleDeviceTestCase): receiver = transaction_recipients['K'] self.create_drivers(2) device_1, device_2 = SignInView(self.drivers[0]), SignInView(self.drivers[1]) - - home_1, home_2 = device_1.recover_access(sender['passphrase']), \ - device_2.recover_access(receiver['passphrase']) - + home_1, home_2 = device_1.recover_access(sender['passphrase']), device_2.recover_access(receiver['passphrase']) wallet_sender = home_1.wallet_button.click() wallet_receiver = home_2.wallet_button.click() @@ -761,7 +750,6 @@ class TestTransactionWalletMultipleDevice(MultipleDeviceTestCase): device_1.just_fyi("Sending token amount to device who will use Set Max option for token") amount = '0.012345678912345678' - wallet_sender.accounts_status_account.click() wallet_sender.send_transaction(asset_name='STT', amount=amount, recipient=receiver['address']) wallet_receiver.wait_balance_is_changed(asset='STT', initial_balance=initial_balance, scan_tokens=True) wallet_receiver.accounts_status_account.click() diff --git a/test/appium/tests/atomic/zzz_multiple_drivers_tests/test_multiple_driver_tests.py b/test/appium/tests/atomic/zzz_multiple_drivers_tests/test_multiple_driver_tests.py index d99986b5d4..24075c6fb9 100644 --- a/test/appium/tests/atomic/zzz_multiple_drivers_tests/test_multiple_driver_tests.py +++ b/test/appium/tests/atomic/zzz_multiple_drivers_tests/test_multiple_driver_tests.py @@ -67,7 +67,8 @@ class TestGroupChatMultipleDevice(MultipleDeviceTestCase): @marks.high def test_pair_devices_sync_one_to_one_contacts_nicknames_public_chat(self): self.create_drivers(3) - device_1, device_2, device_3 = SignInView(self.drivers[0]), SignInView(self.drivers[1]), SignInView(self.drivers[2]) + device_1, device_2, device_3 = SignInView(self.drivers[0]), SignInView(self.drivers[1]), SignInView( + self.drivers[2]) no_contact_nickname = 'no_contact_nickname' name_1, name_2 = 'device_%s' % device_1.driver.number, 'device_%s' % device_2.driver.number @@ -132,7 +133,8 @@ class TestGroupChatMultipleDevice(MultipleDeviceTestCase): self.errors.append('"%s" is not found in Contacts after initial sync' % name) profile_2.blocked_users_button.click() if not profile_2.element_by_text(no_contact_nickname).is_element_displayed(): - self.errors.append("'%s' nickname without addeing to contacts is not synced after initial sync" % no_contact_nickname) + self.errors.append( + "'%s' nickname without addeing to contacts is not synced after initial sync" % no_contact_nickname) profile_2.profile_button.double_click() device_1.just_fyi("Contacts(main device): unblock user, send message from unblocked user") @@ -220,7 +222,6 @@ class TestGroupChatMultipleDevice(MultipleDeviceTestCase): self.errors.verify_no_errors() - @marks.testrail_id(6324) @marks.medium def test_invite_to_group_chat_handling(self): @@ -241,7 +242,7 @@ class TestGroupChatMultipleDevice(MultipleDeviceTestCase): chats[0].just_fyi('Member_1, member_2: both users send requests to join group chat') [sign_in.open_weblink_and_login(link) for sign_in in (sign_ins[1], sign_ins[2])] introduction_messages = ['message for retrying'] - for i in range(1,3): + for i in range(1, 3): homes[i].element_by_text_part(chat_name).click() chats[i] = ChatView(self.drivers[i]) introduction_messages.append('Please add me, member_%s to your gorgeous group chat' % str(i)) @@ -275,12 +276,13 @@ class TestGroupChatMultipleDevice(MultipleDeviceTestCase): chats[2].just_fyi('Double check after relogin') if chats[0].group_membership_request_button.is_element_displayed(): self.errors.append('Group membership request is still shown when there are no pending requests anymore') - [homes[i].relogin() for i in range(0,3)] + [homes[i].relogin() for i in range(0, 3)] if homes[2].element_by_text_part(chat_name).is_element_displayed(): self.errors.append('Group chat was not removed when removing after declining group invite') [home.get_chat(chat_name).click() for home in (homes[0], homes[1])] if chats[0].group_membership_request_button.is_element_displayed(): - self.errors.append('Group membership request is shown after relogin when there are no pending requests anymore') + self.errors.append( + 'Group membership request is shown after relogin when there are no pending requests anymore') join_system_message = chats[0].join_system_message(usernames[1]) for chat in (chats[1], chats[0]): if not chat.chat_element_by_text(join_system_message).is_element_displayed(): @@ -298,13 +300,13 @@ class TestGroupChatMultipleDevice(MultipleDeviceTestCase): public_keys[key], usernames[key] = sign_in_view.get_public_key_and_username(True) sign_in_view.home_button.click() chat_name = homes[0].get_random_chat_name() - for i in range(1,3): + for i in range(1, 3): homes[0].add_contact(public_keys[i]) homes[0].get_back_to_home_view() chats[0] = homes[0].create_group_chat([usernames[1], - usernames[2]], chat_name) + usernames[2]], chat_name) chats[0].just_fyi('Member_1, member_2: both users join to group chat') - for i in range(1,3): + for i in range(1, 3): chats[i] = homes[i].get_chat(chat_name).click() chats[i].join_chat_button.click() chats[0].just_fyi("Admin: get options for device 2 in group chat and remove him") @@ -332,7 +334,8 @@ class TestGroupChatMultipleDevice(MultipleDeviceTestCase): @marks.medium def test_pair_devices_group_chat_different_messages_nicknames(self): self.create_drivers(3) - device_1, device_2, device_3 = SignInView(self.drivers[0]), SignInView(self.drivers[1]), SignInView(self.drivers[2]) + device_1, device_2, device_3 = SignInView(self.drivers[0]), SignInView(self.drivers[1]), SignInView( + self.drivers[2]) home_1 = device_1.create_user() profile_1 = home_1.profile_button.click() profile_1.privacy_and_security_button.click() @@ -347,7 +350,7 @@ class TestGroupChatMultipleDevice(MultipleDeviceTestCase): device_1_name, device_2_name, group_chat_name = 'creator', 'paired', 'some group chat' device_1.just_fyi('Add contact, start group chat') nickname = 'my_tester' - home_1.add_contact(public_key_3,nickname=nickname) + home_1.add_contact(public_key_3, nickname=nickname) home_1.get_back_to_home_view() chat_1 = home_1.create_group_chat([username_3], group_chat_name) chat_3 = home_3.get_chat(group_chat_name).click() @@ -409,4 +412,3 @@ class TestGroupChatMultipleDevice(MultipleDeviceTestCase): if not chat_1.sticker_message.is_element_displayed(30): self.errors.append('Sticker was not sent') self.errors.verify_no_errors() - diff --git a/test/appium/tests/base_test_case.py b/test/appium/tests/base_test_case.py index 2ab24471f6..fd84c58cc0 100644 --- a/test/appium/tests/base_test_case.py +++ b/test/appium/tests/base_test_case.py @@ -19,6 +19,7 @@ from tests import test_suite_data, start_threads, appium_container, pytest_confi import base64 from re import findall + class AbstractTestCase: __metaclass__ = ABCMeta @@ -38,12 +39,14 @@ class AbstractTestCase: def executor_local(self): return 'http://localhost:4723/wd/hub' - def print_sauce_lab_info(self, driver): + @staticmethod + def print_sauce_lab_info(driver): sys.stdout = sys.stderr print("SauceOnDemandSessionID=%s job-name=%s" % (driver.session_id, pytest_config_global['build'])) - def get_translation_by_key(self, key): + @staticmethod + def get_translation_by_key(key): return transl[key] def add_local_devices_to_capabilities(self): @@ -59,7 +62,9 @@ class AbstractTestCase: @property def app_path(self): - app_path='/storage/emulated/0/Android/data/im.status.ethereum.pr/files/Download/' if findall(r'pr\d\d\d\d\d', pytest_config_global['apk']) else '/storage/emulated/0/Android/data/im.status.ethereum/files/Download/' + app_path = '/storage/emulated/0/Android/data/im.status.ethereum.pr/files/Download/' if findall(r'pr\d\d\d\d\d', + pytest_config_global[ + 'apk']) else '/storage/emulated/0/Android/data/im.status.ethereum/files/Download/' return app_path @property @@ -132,20 +137,21 @@ class AbstractTestCase: network_api = NetworkApi() github_report = GithubHtmlReport() - def is_alert_present(self, driver): + @staticmethod + def is_alert_present(driver): try: return driver.find_element(MobileBy.ID, 'android:id/message') except NoSuchElementException: return False - def get_alert_text(self, driver): + @staticmethod + def get_alert_text(driver): return driver.find_element(MobileBy.ID, 'android:id/message').text def add_alert_text_to_report(self, driver): if self.is_alert_present(driver): test_suite_data.current_test.testruns[-1].error += "; also Unexpected Alert is shown: '%s'" \ - % self.get_alert_text(driver) - + % self.get_alert_text(driver) def pull_geth(self, driver): result = "" @@ -168,7 +174,6 @@ class Driver(webdriver.Remote): logging.info(text) test_suite_data.current_test.testruns[-1].steps.append(text) - def fail(self, text: str): pytest.fail('Device %s: %s' % (self.number, text)) @@ -216,7 +221,8 @@ class SingleDeviceTestCase(AbstractTestCase): except (WebDriverException, AttributeError): pass finally: - self.github_report.save_test(test_suite_data.current_test, {'%s_geth.log' % test_suite_data.current_test.name: geth_content}) + self.github_report.save_test(test_suite_data.current_test, + {'%s_geth.log' % test_suite_data.current_test.name: geth_content}) class LocalMultipleDeviceTestCase(AbstractTestCase): @@ -270,7 +276,8 @@ class SauceMultipleDeviceTestCase(AbstractTestCase): try: self.print_sauce_lab_info(self.drivers[driver]) self.add_alert_text_to_report(self.drivers[driver]) - geth_names.append('%s_geth%s.log' % (test_suite_data.current_test.name, str(self.drivers[driver].number))) + geth_names.append( + '%s_geth%s.log' % (test_suite_data.current_test.name, str(self.drivers[driver].number))) geth_contents.append(self.pull_geth(self.drivers[driver])) self.drivers[driver].quit() except (WebDriverException, AttributeError): @@ -278,7 +285,6 @@ class SauceMultipleDeviceTestCase(AbstractTestCase): geth = {geth_names[i]: geth_contents[i] for i in range(len(geth_names))} self.github_report.save_test(test_suite_data.current_test, geth) - @classmethod def teardown_class(cls): cls.loop.close() diff --git a/test/appium/tests/marks.py b/test/appium/tests/marks.py index 53547673e7..1cce6d238e 100644 --- a/test/appium/tests/marks.py +++ b/test/appium/tests/marks.py @@ -10,4 +10,4 @@ low = pytest.mark.low flaky = pytest.mark.flaky transaction = pytest.mark.transaction upgrade = pytest.mark.upgrade -skip = pytest.mark.skip \ No newline at end of file +skip = pytest.mark.skip diff --git a/test/appium/tests/test_api.py b/test/appium/tests/test_api.py index a8545287d4..5fd524915c 100644 --- a/test/appium/tests/test_api.py +++ b/test/appium/tests/test_api.py @@ -2,11 +2,8 @@ import os import pytest import re import time - from os import path - from support.api.third_parties_api import get_token_info -from tests import marks def get_parameters(): diff --git a/test/appium/tests/test_performance.py b/test/appium/tests/test_performance.py index 04da4009d1..1a7a4b9af3 100644 --- a/test/appium/tests/test_performance.py +++ b/test/appium/tests/test_performance.py @@ -4,6 +4,7 @@ from views.sign_in_view import SignInView from datetime import datetime import time + class TestPerformance(SingleDeviceTestCase): def get_timestamps_by_event(self, *args): @@ -42,9 +43,10 @@ class TestPerformance(SingleDeviceTestCase): timestamps_by_event = self.get_timestamps_by_event(app_started, login_shown, password_submitted, login_success) for event in app_started, login_shown, password_submitted, login_success: self.driver.info("event: '%s' | timestamp: '%s' | time: '%s'" % (event, timestamps_by_event[event], - datetime.utcfromtimestamp(timestamps_by_event[event] / 1000))) + datetime.utcfromtimestamp( + timestamps_by_event[event] / 1000))) - time_to_login= (timestamps_by_event[login_success] - timestamps_by_event[password_submitted]) / 1000 + time_to_login = (timestamps_by_event[login_success] - timestamps_by_event[password_submitted]) / 1000 self.driver.info("Time to login is '%s'" % time_to_login) time_to_start_app = (timestamps_by_event[login_shown] - timestamps_by_event[app_started]) / 1000 diff --git a/test/appium/tests/users.py b/test/appium/tests/users.py index 250c8828b3..95c3d01933 100644 --- a/test/appium/tests/users.py +++ b/test/appium/tests/users.py @@ -16,20 +16,31 @@ ens_user['ens_upgrade'] = 'statuse2e' ens_user['ens_another'] = 'status-another-ens-e2e.eth' ens_user['address'] = '0x1eE3058Bd300246B4B20E687Efc9Eba81FF7814b' +user_mainnet = dict() +user_mainnet['passphrase'] = "gallery zoo inspire work used slush deliver surface adjust struggle lazy virtual" +user_mainnet['mainnet'] = { + 'ETH': 0.000372125264, + 'SNT': 60, + 'DGD': 0.00001 +} +user_mainnet['xdai'] = '0.0002 xDAI' +user_mainnet['bsc'] = '0.00001 BNB' + ens_user_ropsten = dict() ens_user_ropsten['ens'] = 'nastya' ens_user_ropsten['username'] = 'Thoughtful Stupendous Graywolf' ens_user_ropsten['address'] = '0x58d8c3D70ce4FA4b9fb10a665C8712238746F2ff' -ens_user_ropsten['public_key'] = '0x045efbcc044e5ae21ac3cf111ea6df6186e0cc50a2cd747f52a56d19ce516e683c66cb47f4b0a211108' \ - '59aea9592dfba1e0bf4af11ff3eab995f844b3673643bf1' +ens_user_ropsten['public_key'] = '0x045efbcc044e5ae21ac3cf111ea6df6186e0cc50a2cd747f52a56d19ce516e683c66cb47f4b0a211108' \ + '59aea9592dfba1e0bf4af11ff3eab995f844b3673643bf1' ens_user_message_sender = dict() ens_user_message_sender['ens'] = 'ensmessenger' ens_user_message_sender['username'] = 'Glaring Plush Arkshell' ens_user_message_sender['passphrase'] = 'tribe life dune clog throw situate robust gospel panic blanket timber eagle' ens_user_message_sender['address'] = '0x75fF623fe856012b0667876582038A63F4004184' -ens_user_message_sender['public_key'] = '0x0471e18b2a9867161383919d85741389a829299ae0833c23e003818c1222942f5dddcbb792daee7c88' \ - 'e8a30ee44c00d03240a971d90d76ed8200b75572241da9ef' +ens_user_message_sender[ + 'public_key'] = '0x0471e18b2a9867161383919d85741389a829299ae0833c23e003818c1222942f5dddcbb792daee7c88' \ + 'e8a30ee44c00d03240a971d90d76ed8200b75572241da9ef' dummy_user = dict() dummy_user['username'] = "Vain Wordy Hagfish" @@ -44,7 +55,7 @@ upgrade_users['chats'] = dict() upgrade_users['chats']['passphrase'] = 'identify level pink lift choose winner hour onion style festival rather salmon' upgrade_users['chats']['public_key'] = '0x045d8a344ffee0c5ce187d0248a9b8ffc4a12493c9d9e8b9a395f38' \ '825ebe55ac2350d9e7090e39e6c8d7020aaa799aefe563f1db5b6151370eae246558772ad9e' -upgrade_users['chats']['username']= 'Rapid Gleeful Cheetah' +upgrade_users['chats']['username'] = 'Rapid Gleeful Cheetah' wallet_users = dict() @@ -62,7 +73,6 @@ wallet_users['B']['address'] = "0F3EFF5CacEe63045be97281316457fb78dd659E" wallet_users['B']['public_key'] = "0x04f3c372522a087bd6895a67b669601e6b6825b2ee7add5942d10efd1c3c836a1d9a677d94d33" \ "895833b6ebe523f0fe5965f73558da58520a3f9c7a00e73f75d61" - wallet_users['C'] = dict() wallet_users['C']['passphrase'] = "purchase ensure mistake crystal person similar shaft family shield clog risk market" wallet_users['C']['username'] = "Mellow Virtual Nubiangoat" @@ -85,10 +95,10 @@ wallet_users['E']['address'] = "0x3e2e4077753d3c229a9ae332b9ca46958945e2f6" wallet_users['E']['public_key'] = "0x044cf0620ec3ea0aba9fb0e19cb42a6fbd6b4e74f234f0da82580564817b238cc6434745d31" \ "fa1649927ba48adfa7c95991fd51940bc00a71e80b095db5b107f1b" wallet_users['E']['collectibles'] = { - 'Coins & Steel Exclusive Item Skin V2' : '1', - 'Coins & Steel Founder Aura' : '2', - 'CryptoKittiesRinkeby' : '2', - 'KudosToken V7' : '1', + 'Coins & Steel Exclusive Item Skin V2': '1', + 'Coins & Steel Founder Aura': '2', + 'CryptoKittiesRinkeby': '2', + 'KudosToken V7': '1', } wallet_users['F'] = dict() wallet_users['F']['passphrase'] = "jazz human replace save wreck merry evolve oval black expose clutch sword" @@ -97,7 +107,6 @@ wallet_users['F']['address'] = "0x8A4339aE98df2B2e51E37631C8B4F853048D4556" wallet_users['F']['public_key'] = "0x049d0b39d95b20114fac79c3173a36c60a126c060dce52bba4128ab9a3885f0f058f2af9c92099" \ "315eb564412b718d8bfe697a4425e4bc603063abd4f5c45f8e57" - # Users used in chats. E.g. as members of a group chat chat_users = dict() @@ -148,7 +157,8 @@ transaction_senders['D']['public_key'] = "0x044764a9ba22bb4ae355619ca3824ee66b9f "d0dd570471986c229c077c8053ee47784416eb6604d52e41f8f9d566ef8" transaction_senders['E'] = dict() -transaction_senders['E']['passphrase'] = "sea ill guard bounce gesture tomato walnut fitness plastic affair oven transfer" +transaction_senders['E'][ + 'passphrase'] = "sea ill guard bounce gesture tomato walnut fitness plastic affair oven transfer" transaction_senders['E']['username'] = "Fatal Metallic Imperialeagle" transaction_senders['E']['address'] = "f7cb60839c0de25e37be0391c33bb34a8f0f8414" transaction_senders['E']['public_key'] = "0x04db6128352e5c2d05ee5a6556848453cf3a7af34e94b3e20a302de684e9906461e38adf" \ @@ -367,13 +377,13 @@ transaction_recipients['J']['public_key'] = "0x04e7e481932714c1a13ffb29fc79446ee "7a80804ff59a750693492a65be9682d0b850b4080d976cf9e43ff37ec841" transaction_recipients['K'] = dict() -transaction_recipients['K']['passphrase'] = "core orphan clerk involve trade admit exhibit valid short canvas disorder world" +transaction_recipients['K'][ + 'passphrase'] = "core orphan clerk involve trade admit exhibit valid short canvas disorder world" transaction_recipients['K']['username'] = "Upright Authorized Waterstrider" transaction_recipients['K']['address'] = "0x6a1aC3a7a5A064FF6E0f169E0d384703245556b4" transaction_recipients['K']['public_key'] = "0x04d1c98a6e25a7ea0241349a41709c5dc51c7c1d59224076d13d1ebe16671eedc8f" \ "3b23ab95db679a9124752ed77339424034fd9a12f0184894c0d7a25710d2f3c" - recovery_users = { "radar blur cabbage chef fix engine embark joy scheme fiction master release": "0xaC39b311DCEb2A4b2f5d8461c1cdaF756F4F7Ae9", diff --git a/test/appium/views/base_element.py b/test/appium/views/base_element.py index 5f1397e2f4..d9de10cdd1 100644 --- a/test/appium/views/base_element.py +++ b/test/appium/views/base_element.py @@ -25,7 +25,7 @@ class BaseElement(object): self.accessibility_id = None self.translation_id = None self.uppercase = None - self.prefix='' + self.prefix = '' self.suffix = None self.id = None self.class_name = None @@ -77,7 +77,8 @@ class BaseElement(object): return self.driver.find_element(self.by, self.locator) except NoSuchElementException: raise NoSuchElementException( - "Device %s: %s by %s: `%s` is not found on the screen" % (self.driver.number, self.name, self.by, self.locator)) from None + "Device %s: %s by %s: `%s` is not found on the screen" % ( + self.driver.number, self.name, self.by, self.locator)) from None except Exception as exception: if 'Internal Server Error' in str(exception): continue @@ -100,7 +101,8 @@ class BaseElement(object): .until(expected_conditions.presence_of_element_located((self.by, self.locator))) except TimeoutException: raise TimeoutException( - "Device %s: %s by %s: `%s` is not found on the screen" % (self.driver.number, self.name, self.by, self.locator)) from None + "Device %s: %s by %s: `%s` is not found on the screen" % ( + self.driver.number, self.name, self.by, self.locator)) from None def wait_for_elements(self, seconds=10): try: @@ -108,7 +110,8 @@ class BaseElement(object): .until(expected_conditions.presence_of_all_elements_located((self.by, self.locator))) except TimeoutException: raise TimeoutException( - "Device %s: %s by %s:`%s` is not found on the screen" % (self.driver.number, self.name, self.by, self.locator)) from None + "Device %s: %s by %s:`%s` is not found on the screen" % ( + self.driver.number, self.name, self.by, self.locator)) from None def wait_for_visibility_of_element(self, seconds=10, ignored_exceptions=None): try: @@ -116,7 +119,8 @@ class BaseElement(object): .until(expected_conditions.visibility_of_element_located((self.by, self.locator))) except TimeoutException: raise TimeoutException( - "Device %s: %s by %s:`%s` is not found on the screen" % (self.driver.number, self.name, self.by, self.locator)) from None + "Device %s: %s by %s:`%s` is not found on the screen" % ( + self.driver.number, self.name, self.by, self.locator)) from None def wait_for_invisibility_of_element(self, seconds=10): try: @@ -148,12 +152,13 @@ class BaseElement(object): except NoSuchElementException: size = self.driver.get_window_size() if direction == 'down': - self.driver.swipe(500, size["height"]*0.4, 500, size["height"]*0.05) + self.driver.swipe(500, size["height"] * 0.4, 500, size["height"] * 0.05) else: - self.driver.swipe(500, size["height"]*0.25, 500, size["height"]*0.8) + self.driver.swipe(500, size["height"] * 0.25, 500, size["height"] * 0.8) else: raise NoSuchElementException( - "Device %s: %s by %s: `%s` is not found on the screen" % (self.driver.number, self.name, self.by, self.locator)) from None + "Device %s: %s by %s: `%s` is not found on the screen" % ( + self.driver.number, self.name, self.by, self.locator)) from None def scroll_and_click(self, direction='down'): self.scroll_to_element(direction=direction) @@ -212,7 +217,7 @@ class BaseElement(object): screen = Image.open(BytesIO(base64.b64decode(self.find_element().screenshot_as_base64))) screen.save(full_path_to_file) - def is_element_image_equals_template(self, file_name: str = '', diff: int = 0): + def is_element_image_equals_template(self, file_name: str = ''): if file_name: self.template = file_name return not ImageChops.difference(self.image, self.template).getbbox() @@ -224,8 +229,8 @@ class BaseElement(object): difference = ImageChops.difference(self.image, self.template) stat = ImageStat.Stat(difference) diff_ratio = sum(stat.mean) / (len(stat.mean) * 255) - if diff_ratio*100 > diff: - self.driver.info('Image differs from template to %s percents' % str(diff_ratio*100)) + if diff_ratio * 100 > diff: + self.driver.info('Image differs from template to %s percents' % str(diff_ratio * 100)) result = True return result @@ -233,7 +238,7 @@ class BaseElement(object): image_template = os.sep.join(__file__.split(os.sep)[:-1]) + '/elements_templates/%s' % template_path template = imagehash.average_hash(Image.open(image_template)) element_image = imagehash.average_hash(self.image) - return not bool(template-element_image) + return not bool(template - element_image) def swipe_left_on_element(self): element = self.find_element() @@ -337,20 +342,20 @@ class Text(BaseElement): return text - class Button(BaseElement): def __init__(self, driver, **kwargs): super(Button, self).__init__(driver, **kwargs) - def wait_and_click(self, time=30): - self.driver.info("Wait for element '%s' for max %ss and click when it is available" % (self.name, time)) - self.wait_for_visibility_of_element(time) + def wait_and_click(self, sec=30): + self.driver.info("Wait for element '%s' for max %ss and click when it is available" % (self.name, sec)) + self.wait_for_visibility_of_element(sec) self.click() def click_until_presence_of_element(self, desired_element, attempts=4): counter = 0 - self.driver.info("Click until '%s' by '%s': `%s` will be presented" % (desired_element.name, desired_element.by, desired_element.locator)) + self.driver.info("Click until '%s' by '%s': `%s` will be presented" % ( + desired_element.name, desired_element.by, desired_element.locator)) while not desired_element.is_element_present(1) and counter <= attempts: try: self.find_element().click() @@ -363,7 +368,8 @@ class Button(BaseElement): def click_until_absense_of_element(self, desired_element, attempts=3): counter = 0 - self.driver.info("Click until '%s' by '%s': `%s` is NOT presented" % (desired_element.name, desired_element.by, desired_element.locator)) + self.driver.info("Click until '%s' by '%s': `%s` is NOT presented" % ( + desired_element.name, desired_element.by, desired_element.locator)) while desired_element.is_element_present(1) and counter <= attempts: try: self.find_element().click() @@ -371,6 +377,7 @@ class Button(BaseElement): except (NoSuchElementException, TimeoutException): return self.navigate() + class SilentButton(Button): def find_element(self): for _ in range(3): @@ -378,7 +385,8 @@ class SilentButton(Button): return self.driver.find_element(self.by, self.locator) except NoSuchElementException: raise NoSuchElementException( - "Device %s: '%s' by %s:'%s' not found on the screen" % (self.driver.number, self.name, self.by, self.locator)) from None + "Device %s: '%s' by %s:'%s' not found on the screen" % ( + self.driver.number, self.name, self.by, self.locator)) from None except Exception as exception: if 'Internal Server Error' in str(exception): continue @@ -390,4 +398,4 @@ class SilentButton(Button): @property def text(self): text = self.find_element().text - return text \ No newline at end of file + return text diff --git a/test/appium/views/base_view.py b/test/appium/views/base_view.py index f6a21f3ebb..4edf4d0ebe 100644 --- a/test/appium/views/base_view.py +++ b/test/appium/views/base_view.py @@ -46,6 +46,7 @@ class TabButton(Button): def __init__(self, driver, parent_locator): super().__init__(driver, xpath="%s/android.widget.TextView" % parent_locator) + return Counter(self.driver, self.locator) @property @@ -53,6 +54,7 @@ class TabButton(Button): class PublicChatUnreadMessages(BaseElement): def __init__(self, driver, parent_locator): super().__init__(driver, xpath="%s/android.widget.TextView" % parent_locator) + return PublicChatUnreadMessages(self.driver, self.locator) @@ -122,7 +124,7 @@ class ProfileButton(TabButton): from views.profile_view import ProfileView return ProfileView(self.driver) - def click(self, desired_element_text = 'privacy'): + def click(self, desired_element_text='privacy'): from views.profile_view import ProfileView if desired_element_text == 'privacy': self.click_until_presence_of_element(ProfileView(self.driver).privacy_and_security_button) @@ -158,6 +160,7 @@ class AssetButton(Button): def click(self): self.wait_for_element().click() + class OpenInStatusButton(Button): def __init__(self, driver): super().__init__(driver, translation_id="browsing-open-in-status") @@ -194,9 +197,11 @@ class AirplaneModeButton(Button): super(AirplaneModeButton, self).click() self.driver.press_keycode(4) + class SignInPhraseText(Text): def __init__(self, driver): - super().__init__(driver, translation_id="this-is-you-signing", suffix="//following-sibling::*[2]/android.widget.TextView") + super().__init__(driver, translation_id="this-is-you-signing", + suffix="//following-sibling::*[2]/android.widget.TextView") @property def list(self): @@ -247,8 +252,6 @@ class BaseView(object): self.qr_code_image = Button(self.driver, accessibility_id="qr-code-image") self.sign_in_phrase = SignInPhraseText(self.driver) - - # external browser self.open_in_status_button = OpenInStatusButton(self.driver) @@ -283,8 +286,8 @@ class BaseView(object): iterations += 1 @staticmethod - def get_translation_by_key(id): - return transl[id] + def get_translation_by_key(translation_id): + return transl[translation_id] def rooted_device_continue(self): try: @@ -321,8 +324,8 @@ class BaseView(object): except TimeoutException: counter += 1 - def just_fyi(self, string): - self.driver.info('# STEP: %s' % string, device=False) + def just_fyi(self, some_str): + self.driver.info('# STEP: %s' % some_str, device=False) def click_system_back_button(self, times=1): self.driver.info('Click system back button') @@ -360,8 +363,8 @@ class BaseView(object): self.driver.info('Paste text') self.driver.press_keycode(279) - def send_as_keyevent(self, string): - self.driver.info("Sending as keyevent `%s`" % string) + def send_as_keyevent(self, keyevent): + self.driver.info("Sending as keyevent `%s`" % keyevent) keys = {'0': 7, '1': 8, '2': 9, '3': 10, '4': 11, '5': 12, '6': 13, '7': 14, '8': 15, '9': 16, ',': 55, '-': 69, '+': 81, '.': 56, '/': 76, '\\': 73, ';': 74, ' ': 62, @@ -371,7 +374,7 @@ class BaseView(object): 'k': 39, 'l': 40, 'm': 41, 'n': 42, 'o': 43, 'p': 44, 'q': 45, 'r': 46, 's': 47, 't': 48, 'u': 49, 'v': 50, 'w': 51, 'x': 52, 'y': 53, 'z': 54} time.sleep(3) - for i in string: + for i in keyevent: if i.isalpha() and i.isupper(): keycode, metastate = keys[i.lower()], 64 # META_SHIFT_LEFT_ON Constant Value: 64. Example: i='n' -> 'N' elif type(keys[i]) is list: @@ -394,8 +397,8 @@ class BaseView(object): element = self.element_types[element_type](self.driver, xpath="//*[starts-with(@text,'%s')]" % text) return element - def element_by_translation_id(self, id, element_type='button', uppercase=False): - element = self.element_types[element_type](self.driver, translation_id=id, uppercase=uppercase) + def element_by_translation_id(self, translation_id, element_type='button', uppercase=False): + element = self.element_types[element_type](self.driver, translation_id=translation_id, uppercase=uppercase) return element def wait_for_element_starts_with_text(self, text, wait_time=60): @@ -406,27 +409,28 @@ class BaseView(object): """Uses percentage values based on device width/height""" self.driver.info("Swiping based on custom coordinates relative to device height/width") size = self.driver.get_window_size() - self.driver.swipe(size["width"] * x_start, size["height"] * y_start, size["width"] * x_end, size["height"] * y_end) + self.driver.swipe(size["width"] * x_start, size["height"] * y_start, size["width"] * x_end, + size["height"] * y_end) def swipe_up(self): self.driver.info("Swiping up") size = self.driver.get_window_size() - self.driver.swipe(size["width"]*0.5, size["height"]*0.8, size["width"]*0.5, size["height"]*0.2) + self.driver.swipe(size["width"] * 0.5, size["height"] * 0.8, size["width"] * 0.5, size["height"] * 0.2) def swipe_down(self): self.driver.info("Swiping down") size = self.driver.get_window_size() - self.driver.swipe(size["width"]*0.5, size["height"]*0.2, size["width"]*0.5, size["height"]*0.8) + self.driver.swipe(size["width"] * 0.5, size["height"] * 0.2, size["width"] * 0.5, size["height"] * 0.8) def swipe_left(self): self.driver.info("Swiping left") size = self.driver.get_window_size() - self.driver.swipe(size["width"]*0.8, size["height"]*0.8, size["width"]*0.2, size["height"]*0.8) + self.driver.swipe(size["width"] * 0.8, size["height"] * 0.8, size["width"] * 0.2, size["height"] * 0.8) def swipe_right(self): self.driver.info("Swiping right") size = self.driver.get_window_size() - self.driver.swipe(size["width"]*0.2, size["height"]*0.8, size["width"]*0.8, size["height"]*0.8) + self.driver.swipe(size["width"] * 0.2, size["height"] * 0.8, size["width"] * 0.8, size["height"] * 0.8) def switch_to_mobile(self, before_login=False, sync=False): self.driver.info("Turning on mobile data, syncing is %s" % str(sync)) @@ -520,7 +524,6 @@ class BaseView(object): continue return self.get_home_view() - def relogin(self, password=common_password): try: profile_view = self.profile_button.click() @@ -536,7 +539,6 @@ class BaseView(object): TouchAction(self.driver).tap(None, 255, 104, 1).perform() time.sleep(3) - def get_public_key_and_username(self, return_username=False): self.driver.info("Get public key and username") profile_view = self.profile_button.click() @@ -562,7 +564,6 @@ class BaseView(object): element.click() return self.get_chat_view() - def find_values_in_logcat(self, **kwargs): logcat = self.logcat items_in_logcat = list() @@ -610,7 +611,7 @@ class BaseView(object): network_and_internet = self.element_by_text('Network & internet') network_and_internet.wait_for_visibility_of_element() network_and_internet.click() - toggle=Button(self.driver, accessibility_id='Wi‑Fi') + toggle = Button(self.driver, accessibility_id='Wi‑Fi') toggle.wait_for_visibility_of_element() toggle.click() self.driver.back() @@ -650,4 +651,3 @@ class BaseView(object): string_source = self.driver.page_source source = open(full_path_to_file, "a+") source.write(string_source) - diff --git a/test/appium/views/chat_view.py b/test/appium/views/chat_view.py index 922be92788..9111f64d4d 100644 --- a/test/appium/views/chat_view.py +++ b/test/appium/views/chat_view.py @@ -90,7 +90,6 @@ class ChatOptionsButton(Button): def __init__(self, driver): super().__init__(driver, xpath="//androidx.appcompat.widget.LinearLayoutCompat") - def click(self): self.click_until_presence_of_element(HomeView(self.driver).mark_all_messages_as_read_button) @@ -137,6 +136,7 @@ class ChatElementByText(Text): class ImageInReply(BaseElement): def __init__(self, driver, parent_locator: str): super().__init__(driver, prefix=parent_locator, xpath="//android.widget.ImageView") + try: return ImageInReply(self.driver, self.locator) except NoSuchElementException: @@ -150,7 +150,6 @@ class ChatElementByText(Text): return TimeStampText(self.driver, self.locator) - @property def member_photo(self): class MemberPhoto(Button): @@ -163,7 +162,7 @@ class ChatElementByText(Text): def username(self): class Username(Text): def __init__(self, driver, parent_locator: str): - super().__init__(driver, prefix=parent_locator, xpath="/*[2]/android.widget.TextView" ) + super().__init__(driver, prefix=parent_locator, xpath="/*[2]/android.widget.TextView") return Username(self.driver, self.locator) @@ -176,7 +175,8 @@ class ChatElementByText(Text): def uncollapse(self) -> bool: class Collapse(Button): def __init__(self, driver, parent_locator: str): - super().__init__(driver, prefix=parent_locator, xpath="/../../..//android.widget.ImageView[@content-desc='icon']") + super().__init__(driver, prefix=parent_locator, + xpath="/../../..//android.widget.ImageView[@content-desc='icon']") return Collapse(self.driver, self.locator).is_element_displayed() @@ -195,7 +195,9 @@ class ChatElementByText(Text): def replied_message_text(self): class RepliedMessageText(Text): def __init__(self, driver, parent_locator: str): - super().__init__(driver, prefix=parent_locator, xpath="/preceding-sibling::*[1]/android.widget.TextView[2]") + super().__init__(driver, prefix=parent_locator, + xpath="/preceding-sibling::*[1]/android.widget.TextView[2]") + try: return RepliedMessageText(self.driver, self.message_locator).text except NoSuchElementException: @@ -207,6 +209,7 @@ class ChatElementByText(Text): def __init__(self, driver, parent_locator: str): super().__init__(driver, prefix=parent_locator, xpath="/preceding-sibling::*[1]/android.widget.TextView[1]") + try: return RepliedToUsernameText(self.driver, self.message_locator).text except NoSuchElementException: @@ -228,6 +231,7 @@ class ChatElementByText(Text): return text except NoSuchElementException: return 0 + return int(EmojisNumber(self.driver, self.locator).text) @property @@ -236,8 +240,10 @@ class ChatElementByText(Text): def __init__(self, driver, parent_locator: str): super().__init__(driver, prefix=parent_locator, xpath="/../..//android.view.ViewGroup[@content-desc='pinned-by']") + return PinnedByLabelText(self.driver, self.locator) + class UsernameOptions(Button): def __init__(self, driver, username): super().__init__(driver, xpath="//*[@text='%s']/..//*[@content-desc='menu-option']" % username) @@ -258,9 +264,9 @@ class UsernameCheckbox(Button): def click(self): try: - self.scroll_to_element(20).click() + self.scroll_to_element(20).click() except NoSuchElementException: - self.scroll_to_element(direction='up', depth=20).click() + self.scroll_to_element(direction='up', depth=20).click() class GroupChatInfoView(BaseView): @@ -273,7 +279,7 @@ class GroupChatInfoView(BaseView): def user_admin(self, username: str): admin = Button(self.driver, - xpath="//*[@text='%s']/..//*[@text='%s']" % (username, self.get_translation_by_key("group-chat-admin"))) + xpath="//*[@text='%s']/..//*[@text='%s']" % (username, self.get_translation_by_key("group-chat-admin"))) admin.scroll_to_element() return admin @@ -309,7 +315,6 @@ class CommunityView(HomeView): self.request_access_button = Button(self.driver, translation_id="request-access") self.membership_request_pending_text = Text(self.driver, translation_id="membership-request-pending") - def add_channel(self, name: str, description="Some new channel"): self.driver.info("Adding channel") self.plus_button.click() @@ -328,10 +333,10 @@ class CommunityView(HomeView): self.element_starts_with_text('join.status.im/c/').click() community_link_text = self.element_starts_with_text('join.status.im/c/').text self.home_button.double_click() - return 'https://%s'% community_link_text + return 'https://%s' % community_link_text def handle_membership_request(self, username: str, approve=True): - self.driver.info("Handling membership request of user '%s', approve='%s'" %(username, str(approve))) + self.driver.info("Handling membership request of user '%s', approve='%s'" % (username, str(approve))) self.members_button.click() self.membership_requests_button.click() approve_suffix, decline_suffix = '/following-sibling::android.view.ViewGroup[1]', '/following-sibling::android.view.ViewGroup[2]' @@ -343,7 +348,7 @@ class CommunityView(HomeView): class PreviewMessage(ChatElementByText): - def __init__(self, driver, text:str): + def __init__(self, driver, text: str): super().__init__(driver, text=text) self.locator += "/android.view.ViewGroup/android.view.ViewGroup" @@ -359,6 +364,7 @@ class PreviewMessage(ChatElementByText): class PreviewImage(SilentButton): def __init__(self, driver, parent_locator: str): super().__init__(driver, prefix=parent_locator, xpath="/android.widget.ImageView") + return PreviewMessage.return_element_or_empty(PreviewImage(self.driver, self.locator)) @property @@ -366,6 +372,7 @@ class PreviewMessage(ChatElementByText): class PreviewTitle(SilentButton): def __init__(self, driver, parent_locator: str): super().__init__(driver, prefix=parent_locator, xpath="/android.widget.TextView[1]") + return PreviewMessage.return_element_or_empty(PreviewTitle(self.driver, self.locator)) @property @@ -373,13 +380,14 @@ class PreviewMessage(ChatElementByText): class PreviewSubTitle(SilentButton): def __init__(self, driver, parent_locator: str): super().__init__(driver, prefix=parent_locator, xpath="/android.widget.TextView[2]") + return PreviewMessage.return_element_or_empty(PreviewSubTitle(self.driver, self.locator)) class CommunityLinkPreviewMessage(ChatElementByText): - def __init__(self, driver, text:str): + def __init__(self, driver, text: str): super().__init__(driver, text=text) - self.locator+="//*[@text='%s']" % self.get_translation_by_key('community') + self.locator += "//*[@text='%s']" % self.get_translation_by_key('community') @property def community_name(self) -> str: @@ -402,6 +410,7 @@ class CommunityLinkPreviewMessage(ChatElementByText): class CommunityMembers(SilentButton): def __init__(self, driver, parent_locator: str): super().__init__(driver, prefix=parent_locator, xpath="/following-sibling::android.widget.TextView[3]") + members_string = CommunityMembers(self.driver, self.locator).text return int(re.search(r'\d+', members_string).group()) @@ -409,18 +418,20 @@ class CommunityLinkPreviewMessage(ChatElementByText): def view(self) -> object: class CommunityViewButton(SilentButton): def __init__(self, driver, parent_locator: str): - super().__init__(driver, prefix=parent_locator, xpath="/..//*[@text='%s']" % self.get_translation_by_key("view")) + super().__init__(driver, prefix=parent_locator, + xpath="/..//*[@text='%s']" % self.get_translation_by_key("view")) + CommunityViewButton(self.driver, self.locator).click() CommunityView(self.driver).request_access_button.wait_for_element(20) return CommunityView(self.driver) - class TransactionMessage(ChatElementByText): - def __init__(self, driver, text:str, transaction_value): + def __init__(self, driver, text: str, transaction_value): super().__init__(driver, text=text) if transaction_value: - self.xpath = "//*[starts-with(@text,'%s')]/../*[@text='%s']/ancestor::android.view.ViewGroup[@content-desc='chat-item']" % (text, transaction_value) + self.xpath = "//*[starts-with(@text,'%s')]/../*[@text='%s']/ancestor::android.view.ViewGroup[@content-desc='chat-item']" % ( + text, transaction_value) # Common statuses for incoming and outgoing transactions self.address_requested = self.get_translation_by_key("address-requested") self.confirmed = self.get_translation_by_key("status-confirmed") @@ -510,13 +521,15 @@ class PinnedMessagesOnProfileButton(Button): class UnpinMessagePopUp(BaseElement): def __init__(self, driver): - #self.message_text = message_text + # self.message_text = message_text super().__init__(driver, translation_id="pin-limit-reached", suffix='/..') def click_unpin_message_button(self): class UnpinMessageButton(Button): def __init__(self, driver, parent_locator: str): - super().__init__(driver, prefix=parent_locator, xpath="//android.widget.TextView[starts-with(@text,'Unpin')]") + super().__init__(driver, prefix=parent_locator, + xpath="//android.widget.TextView[starts-with(@text,'Unpin')]") + return UnpinMessageButton(self.driver, self.locator).click() def message_text(self, text): @@ -547,7 +560,8 @@ class ChatView(BaseView): self.view_profile_by_avatar_button = Button(self.driver, accessibility_id="member-photo") self.user_options = Button(self.driver, accessibility_id="options") self.open_in_status_button = OpenInStatusButton(self.driver) - self.close_modal_view_from_chat_button = Button(self.driver, xpath="//androidx.appcompat.widget.LinearLayoutCompat") + self.close_modal_view_from_chat_button = Button(self.driver, + xpath="//androidx.appcompat.widget.LinearLayoutCompat") # Chat input self.chat_message_input = EditBox(self.driver, accessibility_id="chat-message-input") @@ -564,7 +578,7 @@ class ChatView(BaseView): self.history_start_icon = Button(self.driver, accessibility_id="history-chat") self.unpin_message_popup = UnpinMessagePopUp(self.driver) - #Stickers + # Stickers self.show_stickers_button = Button(self.driver, accessibility_id="show-stickers-icon") self.get_stickers = Button(self.driver, translation_id="get-stickers") self.sticker_icon = Button(self.driver, accessibility_id="sticker-icon") @@ -577,7 +591,7 @@ class ChatView(BaseView): self.first_image_from_gallery = Button(self.driver, xpath="//*[@content-desc='open-gallery']/following-sibling::android.view.ViewGroup[1]") self.images_area_in_gallery = Button(self.driver, - xpath="//*[@content-desc='open-gallery']/following-sibling::android.view.ViewGroup[1]") + xpath="//*[@content-desc='open-gallery']/following-sibling::android.view.ViewGroup[1]") self.image_message_in_chat = Button(self.driver, accessibility_id="image-message") self.save_image_button = Button(self.driver, translation_id="save") self.recent_image_in_gallery = Button(self.driver, @@ -585,11 +599,11 @@ class ChatView(BaseView): self.cancel_send_image_button = Button(self.driver, accessibility_id="cancel-send-image") self.view_image_options = Button(self.driver, xpath="//*[@content-desc='icon']/android.widget.ImageView") - self.share_image_icon_button = Button(self.driver, accessibility_id="share-button") + self.share_image_icon_button = Button(self.driver, accessibility_id="share-button") self.save_image_icon_button = Button(self.driver, accessibility_id="save-button") self.image_in_android_messenger = Button(self.driver, accessibility_id="Image") - #Audio + # Audio self.audio_message_in_chat = Button(self.driver, accessibility_id="audio-message") self.audio_message_button = Button(self.driver, accessibility_id="show-audio-message-icon") self.record_audio_button = Button(self.driver, accessibility_id="start-stop-audio-recording-button") @@ -650,13 +664,12 @@ class ChatView(BaseView): self.create_community_button = Button(self.driver, translation_id="create-community") self.community_name_edit_box = EditBox(self.driver, translation_id="name-your-community-placeholder") self.community_description_edit_box = EditBox(self.driver, xpath='//android.widget.EditText[@text="%s"]' % - self.get_translation_by_key("give-a-short-description-community")) - self.set_community_image_button = Button(self.driver, translation_id='community-thumbnail-image',suffix='/following-sibling::android.view.ViewGroup') + self.get_translation_by_key( + "give-a-short-description-community")) + self.set_community_image_button = Button(self.driver, translation_id='community-thumbnail-image', + suffix='/following-sibling::android.view.ViewGroup') self.confirm_create_in_community_button = Button(self.driver, translation_id="create") - - - def get_outgoing_transaction(self, account=None, transaction_value=None) -> object: if account is None: account = self.status_account_name @@ -693,7 +706,6 @@ class ChatView(BaseView): self.clear_history_button.click() self.clear_button.click() - def leave_chat_via_group_info(self): self.driver.info("Leave group chat via group info") self.chat_options.click() @@ -727,7 +739,7 @@ class ChatView(BaseView): def accept_membership_for_group_chat_via_chat_view(self, username, accept=True): info = "%s membership to group chat" % username - self.driver.info("Accept %s" % info) if accept else self.driver.info("Decline %s" % info) + self.driver.info("Accept %s" % info) if accept else self.driver.info("Decline %s" % info) self.group_membership_request_button.click() self.element_by_text(username).click() self.accept_group_invitation_button.click() if accept else self.decline_group_invitation_button.click() @@ -795,12 +807,12 @@ class ChatView(BaseView): self.element_by_text_part(message_text).long_press_element() self.element_by_translation_id("copy-to-clipboard").click() - def quote_message(self, message = str): + def quote_message(self, message=str): self.driver.info("Quoting '%s' message" % message) self.element_by_text_part(message).long_press_element() self.reply_message_button.click() - def set_reaction(self, message: str, emoji: str = 'thumbs-up', emoji_message=False): + def set_reaction(self, message: str, emoji: str = 'thumbs-up', emoji_message=False): self.driver.info("Setting '%s' reaction" % emoji) key = emojis[emoji] # Audio message is obvious should be tapped not on audio-scroll-line @@ -812,16 +824,16 @@ class ChatView(BaseView): self.chat_element_by_text(message).long_press_element() else: self.element_by_text_part(message).long_press_element() - element = Button(self.driver, accessibility_id ='pick-emoji-%s' % key) + element = Button(self.driver, accessibility_id='pick-emoji-%s' % key) element.click() element.wait_for_invisibility_of_element() - def view_profile_long_press(self, message = str): + def view_profile_long_press(self, message=str): self.chat_element_by_text(message).long_press_element() self.view_profile_by_avatar_button.click() self.profile_block_contact.wait_for_visibility_of_element(5) - def wait_ens_name_resolved_in_chat(self, message = str, username_value = str): + def wait_ens_name_resolved_in_chat(self, message=str, username_value=str): self.driver.info("Waiting ENS name '%s' is resolved in chat" % username_value) counter = 0 while True: @@ -835,7 +847,7 @@ class ChatView(BaseView): def move_to_messages_by_time_marker(self, marker='Today'): self.driver.info("Moving to messages by time marker: '%s'" % marker) - Button(self.driver, xpath="//*[@text='%s'']" % marker).scroll_to_element(depth=50, direction='up') + Button(self.driver, xpath="//*[@text='%s'']" % marker).scroll_to_element(depth=50, direction='up') def install_sticker_pack_by_name(self, pack_name='Status Cat'): self.driver.info("## Installing '%s' stickerpack" % pack_name, device=False) @@ -869,7 +881,7 @@ class ChatView(BaseView): def search_user_in_mention_suggestion_list(self, username): return Button(self.driver, xpath="//*[@content-desc='suggestions-list']//*[@text='%s']" % username) - def select_mention_from_suggestion_list(self, username_in_list, typed_search_pattern = ''): + def select_mention_from_suggestion_list(self, username_in_list, typed_search_pattern=''): self.driver.info("Selecting '%s' from suggestion list by '%s'" % (username_in_list, typed_search_pattern)) self.chat_message_input.set_value('@' + typed_search_pattern) self.chat_message_input.click() @@ -898,7 +910,6 @@ class ChatView(BaseView): chat_element.find_element() chat_element.member_photo.click() - def set_nickname(self, nickname, close_profile=True): self.driver.info("Setting nickname:%s" % nickname) self.profile_nickname_button.click() @@ -909,16 +920,18 @@ class ChatView(BaseView): def convert_device_time_to_chat_timestamp(self) -> list: sent_time_object = dateutil.parser.parse(self.driver.device_time) - timestamp = datetime.strptime("%s:%s" % (sent_time_object.hour, sent_time_object.minute), '%H:%M').strftime("%I:%M %p") + timestamp = datetime.strptime("%s:%s" % (sent_time_object.hour, sent_time_object.minute), '%H:%M').strftime( + "%I:%M %p") timestamp_obj = datetime.strptime(timestamp, '%I:%M %p') - possible_timestamps_obj = [timestamp_obj + timedelta(0,0,0,0,1), timestamp_obj, timestamp_obj - timedelta(0,0,0,0,1)] - timestamps = list(map(lambda x : x.strftime("%I:%M %p"), possible_timestamps_obj)) + possible_timestamps_obj = [timestamp_obj + timedelta(0, 0, 0, 0, 1), timestamp_obj, + timestamp_obj - timedelta(0, 0, 0, 0, 1)] + timestamps = list(map(lambda x: x.strftime("%I:%M %p"), possible_timestamps_obj)) final_timestamps = [t[1:] if t[0] == '0' else t for t in timestamps] return final_timestamps - def set_new_status(self, status='something is happening', image=False): - self.driver.info("## Setting new status:'%s', image set is: '%s'" % (BaseElement(self.driver).exclude_emoji(status), str(image)), device=False) + self.driver.info("## Setting new status:'%s', image set is: '%s'" % + (BaseElement(self.driver).exclude_emoji(status), str(image)), device=False) self.timeline_add_new_status_button.click_until_presence_of_element(self.timeline_my_status_editbox) self.timeline_my_status_editbox.set_value(status) @@ -938,11 +951,11 @@ class ChatView(BaseView): return transaction_message def get_community_by_name(self, community_name: str): - community_button = Button(self.driver, xpath = "//*[@content-desc='community-name-text'][starts-with(@text,'%s')]/.." % community_name) + community_button = Button(self.driver, + xpath="//*[@content-desc='community-name-text'][starts-with(@text,'%s')]/.." % community_name) community_button.click() return CommunityView(self.driver) - @staticmethod def get_resolved_chat_key(username, chat_key): return '%s • %s…%s' % (username, chat_key[:6], chat_key[-4:]) @@ -987,4 +1000,4 @@ class ChatView(BaseView): @staticmethod def pn_wants_you_to_join_to_group_chat(admin, chat_name): - return '%s wants you to join group %s' % (admin, chat_name) \ No newline at end of file + return '%s wants you to join group %s' % (admin, chat_name) diff --git a/test/appium/views/dapps_view.py b/test/appium/views/dapps_view.py index ae8817d664..692873e096 100644 --- a/test/appium/views/dapps_view.py +++ b/test/appium/views/dapps_view.py @@ -2,6 +2,7 @@ from views.base_element import Button, EditBox, BaseElement from views.base_view import BaseView from views.home_view import ChatElement + class DiscoverDappsButton(Button): def __init__(self, driver): super().__init__(driver, translation_id="open-dapp-store") @@ -15,6 +16,7 @@ class DiscoverDappsButton(Button): self.click_until_presence_of_element(BaseWebView(self.driver).browser_refresh_page_button) return self.navigate() + class EditUrlEditbox(EditBox): def __init__(self, driver): super().__init__(driver, xpath="(//android.widget.TextView)[1]") diff --git a/test/appium/views/home_view.py b/test/appium/views/home_view.py index f29df6d7b9..b2e9fb49d3 100644 --- a/test/appium/views/home_view.py +++ b/test/appium/views/home_view.py @@ -13,11 +13,13 @@ class ChatButton(Button): from views.chat_view import ChatView return ChatView(self.driver) + class ChatElement(SilentButton): def __init__(self, driver, username_part, community=False): self.username = username_part self.community = community - super().__init__(driver, xpath="//*[@content-desc='chat-name-text'][starts-with(@text,'%s')]/.." % username_part) + super().__init__(driver, + xpath="//*[@content-desc='chat-name-text'][starts-with(@text,'%s')]/.." % username_part) def navigate(self): if self.community: @@ -81,10 +83,12 @@ class ChatElement(SilentButton): return ChatImage(self.driver) + class ActivityCenterChatElement(SilentButton): def __init__(self, driver, chat_name): self.chat_name = chat_name - super().__init__(driver, xpath="//*[@content-desc='chat-name-or-sender-text'][starts-with(@text,'%s')]/../.." % chat_name) + super().__init__(driver, + xpath="//*[@content-desc='chat-name-or-sender-text'][starts-with(@text,'%s')]/../.." % chat_name) def navigate(self): from views.chat_view import ChatView @@ -117,12 +121,15 @@ class ActivityCenterChatElement(SilentButton): def chat_name_indicator_text(self): class ChatNameIndicatorText(BaseElement): def __init__(self, driver, parent_locator: str): - super().__init__(driver, xpath="(%s//*[@content-desc='chat-name-container']//android.widget.TextView)[last()]" % parent_locator) + super().__init__(driver, + xpath="(%s//*[@content-desc='chat-name-container']//android.widget.TextView)[last()]" % parent_locator) + try: return ChatNameIndicatorText(self.driver, self.locator).text except NoSuchElementException: return '' + class PushNotificationElement(SilentButton): def __init__(self, driver, pn_text): self.pn_text = pn_text @@ -150,12 +157,12 @@ class PushNotificationElement(SilentButton): def group_chat_icon(self): class GroupChatIconElement(BaseElement): def __init__(self, driver, parent_locator): - super().__init__(driver, xpath="%s/../../../*[@resource-id='android:id/right_icon_container']" % parent_locator) + super().__init__(driver, + xpath="%s/../../../*[@resource-id='android:id/right_icon_container']" % parent_locator) return GroupChatIconElement(self.driver, self.locator) - class HomeView(BaseView): def __init__(self, driver): super().__init__(driver) @@ -168,7 +175,8 @@ class HomeView(BaseView): self.universal_qr_scanner_button = Button(self.driver, accessibility_id="universal-qr-scanner") self.invite_friends_button = Button(self.driver, accessibility_id="invite-friends-button") self.stop_status_service_button = Button(self.driver, accessibility_id="STOP") - self.my_profile_on_start_new_chat_button = Button(self.driver, xpath="//*[@content-desc='current-account-photo']") + self.my_profile_on_start_new_chat_button = Button(self.driver, + xpath="//*[@content-desc='current-account-photo']") self.communities_button = ChatButton(self.driver, accessibility_id="communities-button") # Notification centre @@ -177,7 +185,8 @@ class HomeView(BaseView): self.notifications_select_button = Button(self.driver, translation_id="select") self.notifications_reject_and_delete_button = Button(self.driver, accessibility_id="reject-and-delete" "-activity-center") - self.notifications_accept_and_add_button = Button(self.driver, accessibility_id="accept-and-add-activity-center") + self.notifications_accept_and_add_button = Button(self.driver, + accessibility_id="accept-and-add-activity-center") self.notifications_select_all = Button(self.driver, xpath="(//android.widget.CheckBox[" "@content-desc='checkbox'])[1]") @@ -200,10 +209,10 @@ class HomeView(BaseView): # Connection status bottom sheet self.connected_to_n_peers_text = Text(self.driver, accessibility_id="connected-to-n-peers") - self.connected_to_node_text = Text(self.driver, accessibility_id="connected-to-mailserver") + self.connected_to_node_text = Text(self.driver, accessibility_id="connected-to-mailserver") self.waiting_for_wi_fi = Text(self.driver, accessibility_id="waiting-wi-fi") self.use_mobile_data_switch = Button(self.driver, accessibility_id="mobile-network-use-mobile") - self.connection_settings_button = Button(self.driver, accessibility_id="settings") + self.connection_settings_button = Button(self.driver, accessibility_id="settings") self.not_connected_to_node_text = Text(self.driver, accessibility_id="not-connected-nodes") self.not_connected_to_peers_text = Text(self.driver, accessibility_id="not-connected-to-peers") @@ -238,7 +247,8 @@ class HomeView(BaseView): return chat_element def get_username_below_start_new_chat_button(self, username_part): - return Text(self.driver, xpath="//*[@content-desc='enter-contact-code-input']/../..//*[starts-with(@text,'%s')]" % username_part) + return Text(self.driver, + xpath="//*[@content-desc='enter-contact-code-input']/../..//*[starts-with(@text,'%s')]" % username_part) def add_contact(self, public_key, add_in_contacts=True, nickname=''): self.driver.info("## Starting 1-1 chat, add in contacts:%s" % str(add_in_contacts), device=False) @@ -341,4 +351,4 @@ class HomeView(BaseView): def get_pn(self, pn_text: str): self.driver.info("Getting PN by '%s'" % pn_text) PushNotificationElement(self.driver, pn_text).wait_for_element(60) - return PushNotificationElement(self.driver, pn_text) \ No newline at end of file + return PushNotificationElement(self.driver, pn_text) diff --git a/test/appium/views/keycard_view.py b/test/appium/views/keycard_view.py index eec4d2ab1d..52ed2d7af2 100644 --- a/test/appium/views/keycard_view.py +++ b/test/appium/views/keycard_view.py @@ -48,9 +48,9 @@ class KeycardView(BaseView): def get_seed_phrase(self): recovery_phrase = dict() - for i in range(0,12): + for i in range(0, 12): word = self.get_recovery_word(i) - recovery_phrase[str(i+1)] = word + recovery_phrase[str(i + 1)] = word return recovery_phrase def backup_seed_phrase(self): @@ -69,4 +69,4 @@ class KeycardView(BaseView): self.begin_setup_button.click() self.connect_card_button.click() self.enter_default_pin() - self.enter_default_pin() \ No newline at end of file + self.enter_default_pin() diff --git a/test/appium/views/profile_view.py b/test/appium/views/profile_view.py index ee4a6a0002..3f68bfc2f3 100644 --- a/test/appium/views/profile_view.py +++ b/test/appium/views/profile_view.py @@ -8,6 +8,7 @@ class OptionsButton(Button): def __init__(self, driver): super().__init__(driver, xpath="(//android.view.ViewGroup[@content-desc='icon'])[2]") + class AddNewContactButton(Button): def __init__(self, driver): super().__init__(driver, accessibility_id="add-new-contact-button") @@ -39,6 +40,7 @@ class LogoutDialog(BaseView): from views.sign_in_view import SignInView return SignInView(self.driver) + class ENSusernames(Button): def __init__(self, driver): super().__init__(driver, translation_id="ens-usernames") @@ -51,6 +53,7 @@ class ENSusernames(Button): self.scroll_to_element().click() return self.navigate() + class AdvancedButton(Button): def __init__(self, driver): super().__init__(driver, accessibility_id="advanced-button") @@ -74,6 +77,7 @@ class RecoveryPhraseTable(Text): super().__init__(driver, translation_id="your-recovery-phrase", suffix="/following-sibling::android.view.ViewGroup[1]/android.widget.TextView") + class RecoveryPhraseWordNumberText(Text): def __init__(self, driver): super().__init__(driver, xpath="//*[contains(@text,'#')]") @@ -113,7 +117,7 @@ class MailServerElement(Button): def click(self): size = self.driver.get_window_size() - self.driver.swipe(500, size["height"]*0.8, 500, size["height"]*0.05) + self.driver.swipe(500, size["height"] * 0.8, 500, size["height"] * 0.05) self.find_element().click() @@ -164,6 +168,7 @@ class ProfilePictureElement(Button): def __init__(self, driver): super().__init__(driver, accessibility_id="chat-icon") + class KeycardButton(Button): def navigate(self): @@ -175,7 +180,6 @@ class KeycardButton(Button): return self.navigate() - class ProfileView(BaseView): def __init__(self, driver): @@ -249,7 +253,7 @@ class ProfileView(BaseView): suffix="/following-sibling::android.widget.Switch[1]") self.ask_me_when_on_mobile_network = Button(self.driver, translation_id="mobile-network-ask-me", suffix="/following-sibling::android.widget.Switch[1]") - ##Sync history data + ## Sync history data self.sync_history_for_button = Button(self.driver, accessibility_id="default-sync-period-button") ## History nodes self.mail_server_button = Button(self.driver, accessibility_id="offline-messages-settings-button") @@ -261,7 +265,9 @@ class ProfileView(BaseView): self.use_history_node_button = Button(self.driver, translation_id="offline-messaging-use-history-nodes", suffix="/following-sibling::*[1]") self.mail_server_delete_button = Button(self.driver, accessibility_id="mailserver-delete-button") - self.mail_server_confirm_delete_button = Button(self.driver, xpath='//*[@text="%s"]' % self.get_translation_by_key("delete-mailserver").upper()) + self.mail_server_confirm_delete_button = Button(self.driver, + xpath='//*[@text="%s"]' % self.get_translation_by_key( + "delete-mailserver").upper()) ## Device syncing self.devices_button = Button(self.driver, accessibility_id="pairing-settings-button") self.device_name_input = EditBox(self.driver, accessibility_id="device-name") @@ -270,26 +276,32 @@ class ProfileView(BaseView): self.advertise_device_button = Button(self.driver, accessibility_id="advertise-device") self.sync_all_button = Button(self.driver, translation_id="sync-all-devices") - #Keycard - self.keycard_button = Button(self.driver, accessibility_id="keycard-button") + # Keycard + self.keycard_button = Button(self.driver, accessibility_id="keycard-button") self.change_pin_button = KeycardButton(self.driver, translation_id="change-pin") self.change_puk_button = KeycardButton(self.driver, translation_id="change-puk") self.change_pairing_code_button = KeycardButton(self.driver, translation_id="change-pairing") self.create_keycard_backup_button = KeycardButton(self.driver, translation_id="keycard-backup") - # Advanced self.advanced_button = AdvancedButton(self.driver) ## Network self.network_settings_button = Button(self.driver, accessibility_id="network-button") - self.active_network_name = Text(self.driver, xpath="//android.widget.TextView[contains(@text,'with upstream RPC')]") + self.active_network_name = Text(self.driver, + xpath="//android.widget.TextView[contains(@text,'with upstream RPC')]") self.plus_button = Button(self.driver, xpath="(//android.widget.ImageView[@content-desc='icon'])[2]") self.ropsten_chain_button = Button(self.driver, translation_id="ropsten-network") self.custom_network_url_input = EditBox(self.driver, translation_id="rpc-url", suffix="/following-sibling::*[1]/android.widget.EditText") + self.custom_network_symbol_input = EditBox(self.driver, translation_id="specify-symbol") self.specify_name_input = EditBox(self.driver, translation_id="name", suffix="/following-sibling::*[1]/android.widget.EditText") self.connect_button = Button(self.driver, accessibility_id="network-connect-button") + ## Toggles + self.transaction_management_enabled_toggle = Button(self.driver, + accessibility_id="transactions-management-enabled") + self.webview_debug_toggle = Button(self.driver, accessibility_id="webview-debug-switch") + self.waku_bloom_toggle = Button(self.driver, accessibility_id="waku-bloom-filter-mode-settings-switch") ## Log level self.log_level_setting_button = Button(self.driver, accessibility_id="log-level-settings-button") ## Fleet @@ -300,13 +312,16 @@ class ProfileView(BaseView): self.enable_bootnodes = Button(self.driver, xpath="//android.widget.Switch") self.add_bootnode_button = Button(self.driver, accessibility_id="add-bootnode") - #Need help + # Need help self.help_button = HelpButton(self.driver) self.submit_bug_button = Button(self.driver, accessibility_id="submit-bug-button") + self.bug_description_edit_box = EditBox(self.driver, accessibility_id="bug-report-description") + self.bug_steps_edit_box = EditBox(self.driver, accessibility_id="bug-report-steps") + self.bug_submit_button = Button(self.driver, accessibility_id="bug-report-submit") self.request_a_feature_button = Button(self.driver, accessibility_id="request-a-feature-button") self.faq_button = FaqButton(self.driver) - #About + # About self.about_button = AboutButton(self.driver) self.privacy_policy_button = PrivacyPolicyButton(self.driver) self.terms_of_use_button = TermsOfUseButton(self.driver) @@ -314,7 +329,7 @@ class ProfileView(BaseView): self.node_version_text = Text(self.driver, xpath="//*[@content-desc='node-version']//android.widget.TextView[2]") - #Logout + # Logout self.logout_button = LogoutButton(self.driver) self.logout_dialog = LogoutDialog(self.driver) self.confirm_logout_button = Button(self.driver, translation_id="logout", uppercase=True) @@ -338,8 +353,8 @@ class ProfileView(BaseView): from views.chat_view import ChatView return ChatView(self.driver) - def add_custom_network(self, rpc_url ='https://ropsten.infura.io/v3/f315575765b14720b32382a61a89341a', - name='custom_ropsten'): + def add_custom_network(self, rpc_url='https://ropsten.infura.io/v3/f315575765b14720b32382a61a89341a', + name='custom_ropsten', symbol='ETHro'): self.driver.info("## Add predefined custom network", device=False) self.advanced_button.click() self.network_settings_button.scroll_to_element() @@ -347,6 +362,7 @@ class ProfileView(BaseView): self.plus_button.click_until_presence_of_element(self.ropsten_chain_button) self.custom_network_url_input.send_keys(rpc_url) self.specify_name_input.send_keys(name) + self.custom_network_symbol_input.set_value(symbol) self.ropsten_chain_button.scroll_to_element() self.ropsten_chain_button.click() self.ropsten_chain_button.click() @@ -378,7 +394,7 @@ class ProfileView(BaseView): self.driver.info("## Seed phrase is backed up!", device=False) return recovery_phrase - def edit_profile_picture(self, file_name: str, update_by = "Gallery"): + def edit_profile_picture(self, file_name: str, update_by="Gallery"): self.driver.info("## Setting custom profile image", device=False) if not AbstractTestCase().environment == 'sauce': raise NotImplementedError('Test case is implemented to run on SauceLabs only') @@ -397,7 +413,6 @@ class ProfileView(BaseView): self.crop_photo_button.click() self.driver.info("## Custom profile image has been set", device=False) - def take_photo(self): self.take_photo_button.click() if self.allow_button.is_element_displayed(sec=5): @@ -418,7 +433,6 @@ class ProfileView(BaseView): self.element_by_text(element_text).click() image_full_content.click() - def logout(self): self.driver.info("Logging out") self.logout_button.click() @@ -433,7 +447,8 @@ class ProfileView(BaseView): def get_toggle_device_by_name(self, device_name): self.driver.info("Selecting device '%s' for sync" % device_name) - return SilentButton(self.driver, xpath="//android.widget.TextView[contains(@text,'%s')]/..//android.widget.CheckBox" % device_name) + return SilentButton(self.driver, + xpath="//android.widget.TextView[contains(@text,'%s')]/..//android.widget.CheckBox" % device_name) def discover_and_advertise_device(self, device_name): self.driver.info("Discovering and advertising '%s'" % device_name) diff --git a/test/appium/views/send_transaction_view.py b/test/appium/views/send_transaction_view.py index b56ee8fef1..21e1676c24 100644 --- a/test/appium/views/send_transaction_view.py +++ b/test/appium/views/send_transaction_view.py @@ -3,6 +3,7 @@ from views.base_element import Text, SilentButton from views.base_element import Button, EditBox from views.base_view import BaseView + class AmountEditBox(EditBox, Button): def __init__(self, driver): super(AmountEditBox, self).__init__(driver, accessibility_id="amount-input") @@ -21,7 +22,6 @@ class ChooseRecipientButton(Button): return self.navigate() - class UpdateFeeButton(Button): def __init__(self, driver): super(UpdateFeeButton, self).__init__(driver, translation_id="update") @@ -35,7 +35,8 @@ class UpdateFeeButton(Button): class ValidationErrorOnSendTransaction(Button): def __init__(self, driver, field): - super(ValidationErrorOnSendTransaction, self).__init__(driver, xpath="//*[@text='%s']/../*[@content-desc='icon']" % field) + super(ValidationErrorOnSendTransaction, self).__init__(driver, + xpath="//*[@text='%s']/../*[@content-desc='icon']" % field) class NotEnoughEthForGas(Text): @@ -50,7 +51,9 @@ class ValidationWarnings(object): class SignWithKeycardButton(Button): def __init__(self, driver): - super(SignWithKeycardButton, self).__init__(driver, xpath="//*[contains(@text,'%s')]" % self.get_translation_by_key("sign-with")) + super(SignWithKeycardButton, self).__init__(driver, + xpath="//*[contains(@text,'%s')]" % self.get_translation_by_key( + "sign-with")) def navigate(self): from views.keycard_view import KeycardView @@ -72,22 +75,24 @@ class SendTransactionView(BaseView): self.scan_qr_code_button = Button(self.driver, accessibility_id="scan-contact-code-button") self.enter_recipient_address_input = EditBox(self.driver, accessibility_id="recipient-address-input") self.first_recipient_button = Button(self.driver, accessibility_id="chat-icon") - self.enter_recipient_address_text = Text(self.driver, xpath="//*[@content-desc='choose-recipient-button']//android.widget.TextView") + self.enter_recipient_address_text = Text(self.driver, + xpath="//*[@content-desc='choose-recipient-button']//android.widget.TextView") self.recent_recipients_button = Button(self.driver, translation_id="recent-recipients") self.amount_edit_box = AmountEditBox(self.driver) self.set_max_button = Button(self.driver, translation_id="set-max") - self.validation_error_element = Text(self.driver, xpath="//*[@content-desc='custom-gas-fee']/../android.view.ViewGroup//*[@content-desc='icon']") + self.validation_error_element = Text(self.driver, + xpath="//*[@content-desc='custom-gas-fee']/../android.view.ViewGroup//*[@content-desc='icon']") # Network fee elements self.network_fee_button = Button(self.driver, accessibility_id="custom-gas-fee") self.gas_limit_input = EditBox(self.driver, accessibility_id="gas-amount-limit") self.per_gas_tip_limit_input = EditBox(self.driver, accessibility_id="per-gas-tip-limit") self.per_gas_price_limit_input = EditBox(self.driver, accessibility_id="per-gas-price-limit") - self.max_fee_text = Text(self.driver, xpath='//*[@text="Maximum fee:"]/following-sibling::android.widget.TextView[1]') + self.max_fee_text = Text(self.driver, + xpath='//*[@text="Maximum fee:"]/following-sibling::android.widget.TextView[1]') self.save_fee_button = Button(self.driver, accessibility_id="save-fees") - self.sign_transaction_button = Button(self.driver, accessibility_id="send-transaction-bottom-sheet") self.sign_with_keycard_button = SignWithKeycardButton(self.driver) self.sign_with_password = Button(self.driver, translation_id="sign-with-password") @@ -98,7 +103,8 @@ class SendTransactionView(BaseView): self.select_asset_button = Button(self.driver, accessibility_id="choose-asset-button") self.asset_text = Text(self.driver, xpath="//*[@content-desc='choose-asset-button']//android.widget.TextView") - self.recipient_text = Text(self.driver, xpath="//*[@content-desc='choose-recipient-button']//android.widget.TextView") + self.recipient_text = Text(self.driver, + xpath="//*[@content-desc='choose-recipient-button']//android.widget.TextView") self.share_button = Button(self.driver, accessibility_id="share-address-button") @@ -116,6 +122,10 @@ class SendTransactionView(BaseView): self.new_favorite_name_input = EditBox(self.driver, accessibility_id="fav-name") self.new_favorite_add_favorite = Button(self.driver, accessibility_id="add-fav") + # Transaction management + self.advanced_button = Button(self.driver, translation_id="advanced") + self.nonce_input = EditBox(self.driver, accessibility_id="nonce") + self.nonce_save_button = Button(self.driver, accessibility_id="save-nonce") def set_recipient_address(self, address): self.driver.info("Setting recipient address to '%s'" % address) @@ -141,18 +151,19 @@ class SendTransactionView(BaseView): self.driver.info("## Transaction is signed!", device=False) self.ok_button.click() - @staticmethod def get_formatted_recipient_address(address): return address[:6] + '…' + address[-4:] def get_username_in_transaction_bottom_sheet_button(self, username_part): self.driver.info("Getting username by '%s' in transaction fee bottom sheet" % username_part) - return SilentButton(self.driver, xpath="//*[@content-desc='amount-input']/..//*[starts-with(@text,'%s')]" % username_part) + return SilentButton(self.driver, + xpath="//*[@content-desc='amount-input']/..//*[starts-with(@text,'%s')]" % username_part) def get_account_in_select_account_bottom_sheet_button(self, account_name): self.driver.info("Getting account by '%s' in transaction fee bottom sheet" % account_name) - return SilentButton(self.driver, translation_id="select-account", suffix="/..//*[starts-with(@text,'%s')]" % account_name) + return SilentButton(self.driver, translation_id="select-account", + suffix="/..//*[starts-with(@text,'%s')]" % account_name) def get_validation_icon(self, field='Network fee'): return ValidationErrorOnSendTransaction(self.driver, field) @@ -162,7 +173,7 @@ class SendTransactionView(BaseView): data = { 'amount': self.amount_edit_box.text, 'asset': self.asset_text.text, - 'address': self.enter_recipient_address_text.text + 'address': self.enter_recipient_address_text.text } return data @@ -170,9 +181,8 @@ class SendTransactionView(BaseView): self.driver.info("Getting network fee from send transaction bottom sheet") return Text(self.driver, xpath="//*[@content-desc='custom-gas-fee']/android.widget.TextView[1]").text[0:-9] - def add_to_favorites(self, name): self.driver.info("Adding '%s' to favorite recipients" % name) self.recipient_add_to_favorites.click() self.new_favorite_name_input.set_value(name) - self.new_favorite_add_favorite.click() \ No newline at end of file + self.new_favorite_add_favorite.click() diff --git a/test/appium/views/sign_in_view.py b/test/appium/views/sign_in_view.py index e881cd1e42..f38c5286c8 100644 --- a/test/appium/views/sign_in_view.py +++ b/test/appium/views/sign_in_view.py @@ -4,11 +4,13 @@ from tests import common_password, appium_root_project_path from views.base_element import Button, EditBox, Text from views.base_view import BaseView + class MultiAccountButton(Button): class Username(Text): def __init__(self, driver, locator_value): super(MultiAccountButton.Username, self).__init__(driver, xpath="%s//android.widget.TextView[@content-desc='username']" % locator_value) + def __init__(self, driver, position=1): super(MultiAccountButton, self).__init__(driver, xpath="//*[@content-desc='select-account-button-%s']" % position) @@ -106,7 +108,7 @@ class TermsOfUseLink(Button): try: self.click_inside_element_by_coordinate(times_to_click=2) counter += 1 - except (NoSuchElementException): + except NoSuchElementException: return self.navigate() self.driver.info('Click on link %s' % self.name) return self.navigate() @@ -144,7 +146,7 @@ class SignInView(BaseView): self.get_keycard_banner = Button(self.driver, translation_id="get-a-keycard") self.accept_tos_checkbox = Button(self.driver, xpath="//android.widget.CheckBox[@content-desc='checkbox']") - #keycard recovery + # keycard recovery self.recover_with_keycard_button = Button(self.driver, accessibility_id="recover-with-keycard-button") self.begin_recovery_button = BeginRecoveryButton(self.driver) self.pair_to_this_device_button = Button(self.driver, translation_id="pair-card") @@ -158,7 +160,7 @@ class SignInView(BaseView): self.options_button = Button(self.driver, xpath="//androidx.appcompat.widget.LinearLayoutCompat") self.manage_keys_and_storage_button = Button(self.driver, accessibility_id="manage-keys-and-storage-button") self.multi_account_on_login_button = MultiAccountOnLoginButton(self.driver) - self.move_keystore_file_option = Button(self.driver, accessibility_id="move-keystore-file") + self.move_keystore_file_option = Button(self.driver, accessibility_id="move-keystore-file") self.reset_database_checkbox = Button(self.driver, translation_id="reset-database") self.move_and_reset_button = MoveAndResetButton(self.driver) self.choose_storage_button = Button(self.driver, translation_id="choose-storage") @@ -171,7 +173,8 @@ class SignInView(BaseView): self.cancel_custom_seed_phrase_button = Button(self.driver, accessibility_id="cancel-custom-seed-phrase") def create_user(self, password=common_password, keycard=False, enable_notifications=False, second_user=False): - self.driver.info("## Creating new multiaccount (password:'%s', keycard:'%s')" % (password, str(keycard)), device=False) + self.driver.info("## Creating new multiaccount (password:'%s', keycard:'%s')" % (password, str(keycard)), + device=False) if not second_user: self.accept_tos_checkbox.click() self.get_started_button.click_until_presence_of_element(self.generate_key_button) @@ -200,7 +203,8 @@ class SignInView(BaseView): self.driver.info("## New multiaccount is created successfully!", device=False) return self.get_home_view() - def recover_access(self, passphrase: str, password: str = common_password, keycard=False, enable_notifications=False, second_user=False): + def recover_access(self, passphrase: str, password: str = common_password, keycard=False, + enable_notifications=False, second_user=False): self.driver.info("## Recover access(password:%s, keycard:%s)" % (password, str(keycard)), device=False) if not second_user: self.accept_tos_checkbox.click() @@ -250,7 +254,6 @@ class SignInView(BaseView): self.driver.info("## Signed in successfully!", device=False) return self.get_home_view() - def get_multiaccount_by_position(self, position: int, element_class=MultiAccountOnLoginButton): account_button = element_class(self.driver, position) if account_button.is_element_displayed(): @@ -276,7 +279,8 @@ class SignInView(BaseView): self.multi_account_on_login_button.wait_for_visibility_of_element(30) self.get_multiaccount_by_position(1).click() self.password_input.set_value(common_password) - self.driver.push_file(source_path=full_path_to_file, destination_path='%s%s'% (AbstractTestCase().app_path, import_file_name)) + self.driver.push_file(source_path=full_path_to_file, + destination_path='%s%s' % (AbstractTestCase().app_path, import_file_name)) self.options_button.click() self.element_by_text('Import unencrypted').click() self.element_by_text('Import unencrypted').wait_for_invisibility_of_element(40) diff --git a/test/appium/views/transactions_view.py b/test/appium/views/transactions_view.py index 5f30c71186..7ecb113959 100644 --- a/test/appium/views/transactions_view.py +++ b/test/appium/views/transactions_view.py @@ -6,6 +6,7 @@ from views.base_view import BaseView class OptionsButton(Button): def __init__(self, driver): super().__init__(driver, xpath="(//android.widget.ImageView[@content-desc='icon'])[2]") + def click(self): self.click_until_presence_of_element(OptionsButton.CopyTransactionHashButton(self.driver)) @@ -17,6 +18,7 @@ class OptionsButton(Button): def __init__(self, driver): super().__init__(driver, translation_id="open-on-etherscan") + class TransactionTable(BaseElement): def __init__(self, driver): super().__init__(driver, xpath="//android.widget.ScrollView") @@ -78,7 +80,6 @@ class TransactionTable(BaseElement): self.driver.info('Finding transaction by index %s' % index) return self.TransactionElement.by_index(self.driver, index=index) - def transaction_by_amount(self, amount: str, asset): self.driver.info('Finding transaction by amount %s' % amount) return self.TransactionElement.by_amount(self.driver, amount=amount.replace(',', '.'), asset=asset) @@ -92,13 +93,14 @@ class TransactionTable(BaseElement): except NoSuchElementException: from views.base_view import BaseView BaseView(self.driver).pull_to_refresh() - self.driver.fail('Transaction %s %s was not found on Wallet/Transaction screen' %(amount, asset)) + self.driver.fail('Transaction %s %s was not found on Wallet/Transaction screen' % (amount, asset)) def get_transactions_number(self): element = self.TransactionElement(self.driver) element.locator = '//android.view.ViewGroup[@content-desc="transaction-item"]' return len(element.wait_for_elements()) + class TransactionsView(BaseView): def __init__(self, driver): super().__init__(driver) diff --git a/test/appium/views/wallet_view.py b/test/appium/views/wallet_view.py index 3225832708..87790ed041 100644 --- a/test/appium/views/wallet_view.py +++ b/test/appium/views/wallet_view.py @@ -21,6 +21,7 @@ class AssetCheckBox(SilentButton): def click(self): self.scroll_to_element(12).click() + class BackupRecoveryPhrase(Button): def __init__(self, driver): super().__init__(driver, translation_id="wallet-backup-recovery-title") @@ -29,6 +30,7 @@ class BackupRecoveryPhrase(Button): from views.profile_view import ProfileView return ProfileView(self.driver) + class AccountElementButton(SilentButton): def __init__(self, driver, account_name): super().__init__(driver, xpath="//*[@content-desc='accountcard%s']" % account_name) @@ -48,6 +50,15 @@ class SendTransactionButton(Button): return SendTransactionView(self.driver) +class SendTransactionFromMainButton(Button): + def __init__(self, driver): + super().__init__(driver, accessibility_id="send-transaction-button") + + def navigate(self): + from views.send_transaction_view import SendTransactionView + return SendTransactionView(self.driver) + + class ReceiveTransactionButton(Button): def __init__(self, driver): super().__init__(driver, translation_id="receive") @@ -73,7 +84,7 @@ class AccountColorButton(Button): def select_color_by_position(self, position: int): self.click() self.driver.find_element_by_xpath( - "((//android.widget.ScrollView)[1]/*/*)[%s]" % str(position+1)).click() + "((//android.widget.ScrollView)[1]/*/*)[%s]" % str(position + 1)).click() class WalletView(BaseView): @@ -81,6 +92,7 @@ class WalletView(BaseView): super().__init__(driver) self.send_transaction_button = SendTransactionButton(self.driver) + self.send_transaction_from_main_screen = SendTransactionFromMainButton(self.driver) self.transaction_history_button = TransactionHistoryButton(self.driver) self.usd_total_value = Text(self.driver, accessibility_id="total-amount-value-text") @@ -89,9 +101,12 @@ class WalletView(BaseView): self.manage_assets_button = Button(self.driver, accessibility_id="wallet-manage-assets") self.manage_accounts_button = Button(self.driver, accessibility_id="wallet-manage-accounts") self.scan_tokens_button = Button(self.driver, accessibility_id="wallet-scan-token") - self.stt_check_box = Button(self.driver, xpath="//*[@text='STT']/../android.view.ViewGroup[@content-desc='checkbox']") - self.all_assets_full_names = Text(self.driver, xpath="//*[@content-desc='checkbox']/../android.widget.TextView[1]") - self.all_assets_symbols = Button(self.driver, xpath="//*[@content-desc='checkbox']/../android.widget.TextView[2]") + self.stt_check_box = Button(self.driver, + xpath="//*[@text='STT']/../android.view.ViewGroup[@content-desc='checkbox']") + self.all_assets_full_names = Text(self.driver, + xpath="//*[@content-desc='checkbox']/../android.widget.TextView[1]") + self.all_assets_symbols = Button(self.driver, + xpath="//*[@content-desc='checkbox']/../android.widget.TextView[2]") self.currency_item_text = Text(self.driver, xpath="//*[@content-desc='currency-item']//android.widget.TextView") self.address_text = Text(self.driver, accessibility_id="address-text") @@ -101,7 +116,8 @@ class WalletView(BaseView): self.total_amount_text = Text(self.driver, accessibility_id="total-amount-value-text") self.currency_text = Text(self.driver, accessibility_id="total-amount-currency-text") self.backup_recovery_phrase = BackupRecoveryPhrase(self.driver) - self.backup_recovery_phrase_warning_text = Text(self.driver, accessibility_id="back-up-your-seed-phrase-warning") + self.backup_recovery_phrase_warning_text = Text(self.driver, + accessibility_id="back-up-your-seed-phrase-warning") self.add_custom_token_button = AddCustomTokenButton(self.driver) @@ -121,13 +137,15 @@ class WalletView(BaseView): self.enter_your_password_input = EditBox(self.driver, accessibility_id="add-account-enter-password") self.account_name_input = EditBox(self.driver, accessibility_id="enter-account-name") self.account_color_button = AccountColorButton(self.driver) - self.add_account_generate_account_button = Button(self.driver, accessibility_id="add-account-add-account-button") + self.add_account_generate_account_button = Button(self.driver, + accessibility_id="add-account-add-account-button") self.status_account_total_usd_value = Text(self.driver, accessibility_id="account-total-value") self.scan_qr_button = Button(self.driver, accessibility_id="accounts-qr-code") - self.close_send_transaction_view_button = Button(self.driver, xpath="//androidx.appcompat.widget.LinearLayoutCompat") + self.close_send_transaction_view_button = Button(self.driver, + xpath="//androidx.appcompat.widget.LinearLayoutCompat") self.hide_account_button = Button(self.driver, accessibility_id="hide-account-button") - #collectibles + # collectibles self.collectibles_button = Button(self.driver, translation_id="wallet-collectibles") self.nft_asset_button = Button(self.driver, accessibility_id="nft-asset") self.set_collectible_as_profile_photo_button = Button(self.driver, accessibility_id="set-nft-as-pfp") @@ -136,10 +154,11 @@ class WalletView(BaseView): # individual account settings self.account_settings_button = Button(self.driver, translation_id="account-settings") self.apply_settings_button = Button(self.driver, translation_id="apply") - self.password_delete_account_input = EditBox(self.driver, xpath='//*[@text="Password"]/following-sibling::*/android.widget.EditText') + self.password_delete_account_input = EditBox(self.driver, + xpath='//*[@text="Password"]/following-sibling::*/android.widget.EditText') self.delete_account_confirm_button = Button(self.driver, accessibility_id="delete-account-confirm") - def wait_balance_is_equal_expected_amount(self, asset ='ETH', expected_balance=0.1, wait_time=300): + def wait_balance_is_equal_expected_amount(self, asset='ETH', expected_balance=0.1, wait_time=300): counter = 0 while True: if counter >= wait_time: @@ -148,35 +167,38 @@ class WalletView(BaseView): counter += 10 time.sleep(10) self.swipe_down() - self.driver.info('**Waiting %s seconds for %s balance update to be equal to %s**' % (counter,asset, expected_balance)) + self.driver.info('Waiting %s seconds for %s balance update to be equal to %s' % ( + counter, asset, expected_balance)) else: self.driver.info('**Balance for %s is equal to %s**' % (asset, expected_balance)) return - def wait_balance_is_changed(self, asset ='ETH', initial_balance=0, wait_time=400, scan_tokens=False): - self.driver.info('**Waiting %ss for %s updated balance**' % (wait_time, asset)) + def wait_balance_is_changed(self, asset='ETH', initial_balance=0, wait_time=400, scan_tokens=False): + self.driver.info('Waiting %ss for %s updated balance' % (wait_time, asset)) counter = 0 while True: if counter >= wait_time: - self.driver.fail('Balance %s %s is not changed during %s seconds!' % (asset, initial_balance,wait_time)) - elif self.asset_by_name(asset).is_element_present() and self.get_asset_amount_by_name(asset) == initial_balance: + self.driver.fail( + 'Balance %s %s is not changed during %s seconds!' % (asset, initial_balance, wait_time)) + elif self.asset_by_name(asset).is_element_present() and self.get_asset_amount_by_name( + asset) == initial_balance: if scan_tokens: self.scan_tokens() - if (counter/60).is_integer(): + if (counter / 60).is_integer(): self.pull_to_refresh() - counter+=20 + counter += 20 counter += 10 time.sleep(10) - self.driver.info('*Waiting %ss for %s updated balance*' % (counter,asset)) + self.driver.info('Waiting %ss for %s updated balance' % (counter, asset)) elif not self.asset_by_name(asset).is_element_present(10): if scan_tokens: self.scan_tokens() self.swipe_up() counter += 10 time.sleep(10) - self.driver.info('*Waiting %s seconds for %s to display asset*' % (counter, asset)) + self.driver.info('Waiting %s seconds for %s to display asset' % (counter, asset)) else: - self.driver.info('**Balance is updated!**') + self.driver.info('Balance is updated!') self.wallet_button.double_click() self.element_by_translation_id("wallet-total-value").scroll_to_element(direction='up') return self @@ -184,7 +206,6 @@ class WalletView(BaseView): def get_sign_in_phrase(self): return ' '.join([element.text for element in self.sign_in_phrase.find_elements()]) - def set_up_wallet_when_sending_tx(self): self.driver.info("Setting up wallet") phrase = self.sign_in_phrase.text @@ -201,14 +222,13 @@ class WalletView(BaseView): return address def wallet_account_by_name(self, account_name): - self.driver.info("*Getting '%s' wallet account*" % account_name) + self.driver.info("Getting '%s' wallet account" % account_name) return AccountElementButton(self.driver, account_name) - def get_asset_amount_by_name(self, asset: str): self.driver.info("Getting %s amount" % asset) asset_value = SilentButton(self.driver, xpath="//android.view.ViewGroup[@content-desc=':%s-asset-value']" - "//android.widget.TextView[1]" % asset) + "//android.widget.TextView[1]" % asset) asset_value.scroll_to_element() try: return float(asset_value.text.split()[0]) @@ -231,16 +251,16 @@ class WalletView(BaseView): def get_account_options_from_main_screen(self, account_name=''): account_name = self.status_account_name if not account_name else account_name self.driver.info("Getting '%s'account options from main wallet screen" % account_name) - return SilentButton(self.driver, xpath="//*[@content-desc='accountcard%s']//*[@content-desc='icon']" % account_name) + return SilentButton(self.driver, + xpath="//*[@content-desc='accountcard%s']//*[@content-desc='icon']" % account_name) def hidden_account_by_name_button(self, account_name=''): return SilentButton(self.driver, - xpath="//*[@text='%s']/following-sibling::*[@content-desc='hide-icon']"% account_name) + xpath="//*[@text='%s']/following-sibling::*[@content-desc='hide-icon']" % account_name) def show_account_by_name_button(self, account_name=''): return SilentButton(self.driver, - xpath="//*[@text='%s']/following-sibling::*[@content-desc='show-icon']"% account_name) - + xpath="//*[@text='%s']/following-sibling::*[@content-desc='show-icon']" % account_name) def select_asset(self, *args): self.driver.info("Selecting asset(s)") @@ -273,30 +293,32 @@ class WalletView(BaseView): def send_transaction(self, **kwargs): self.driver.info("## Sending transaction", device=False) - send_transaction_view = self.send_transaction_button.click() - send_transaction_view.select_asset_button.click() + send_tx = self.send_transaction_from_main_screen.click() if kwargs.get('from_main_wallet', + True) else self.send_transaction_button.click() + send_tx.select_asset_button.click() asset_name = kwargs.get('asset_name', 'ETH').upper() - asset_button = send_transaction_view.asset_by_name(asset_name) - send_transaction_view.select_asset_button.click_until_presence_of_element(send_transaction_view.eth_asset_in_select_asset_bottom_sheet_button) + asset_button = send_tx.asset_by_name(asset_name) + send_tx.select_asset_button.click_until_presence_of_element( + send_tx.eth_asset_in_select_asset_bottom_sheet_button) asset_button.click() - send_transaction_view.amount_edit_box.click() + send_tx.amount_edit_box.click() - transaction_amount = str(kwargs.get('amount', send_transaction_view.get_unique_amount())) + transaction_amount = str(kwargs.get('amount', send_tx.get_unique_amount())) - send_transaction_view.amount_edit_box.set_value(transaction_amount) + send_tx.amount_edit_box.set_value(transaction_amount) if kwargs.get('account_name'): - send_transaction_view.chose_recipient_button.click() - send_transaction_view.accounts_button.click() - send_transaction_view.element_by_text(kwargs.get('account_name')).click() + send_tx.chose_recipient_button.click() + send_tx.accounts_button.click() + send_tx.element_by_text(kwargs.get('account_name')).click() else: - send_transaction_view.set_recipient_address(kwargs.get('recipient')) + send_tx.set_recipient_address(kwargs.get('recipient')) if kwargs.get('sign_transaction', True): - send_transaction_view.sign_transaction_button.click() + send_tx.sign_transaction_button.click() if self.sign_in_phrase.is_element_displayed(): self.set_up_wallet_when_sending_tx() - send_transaction_view.sign_transaction(keycard=kwargs.get('keycard', False), - sender_password=kwargs.get('sender_password', common_password)) - return send_transaction_view + send_tx.sign_transaction(keycard=kwargs.get('keycard', False), + sender_password=kwargs.get('sender_password', common_password)) + return send_tx def find_transaction_in_history(self, amount, asset='ETH', account_name=None, return_hash=False): if account_name is None: @@ -314,7 +336,6 @@ class WalletView(BaseView): result = TransactionTable.TransactionElement.TransactionDetailsView(self.driver).get_transaction_hash() return result - def set_currency(self, desired_currency='EUR'): self.driver.info("Setting '%s' currency" % desired_currency) self.multiaccount_more_options.click_until_presence_of_element(self.set_currency_button) @@ -344,4 +365,4 @@ class WalletView(BaseView): def get_collectibles_amount(self, collectibles='CryptoKitties'): self.driver.info("Getting '%s' Collectibles amount" % collectibles) - return Text(self.driver,xpath="//*[@text='%s']//following-sibling::android.widget.TextView" % collectibles) + return Text(self.driver, xpath="//*[@text='%s']//following-sibling::android.widget.TextView" % collectibles) diff --git a/test/appium/views/web_views/base_web_view.py b/test/appium/views/web_views/base_web_view.py index 6952c73685..c3dfcfe040 100644 --- a/test/appium/views/web_views/base_web_view.py +++ b/test/appium/views/web_views/base_web_view.py @@ -3,6 +3,7 @@ import time from views.base_element import EditBox, Button, BaseElement from views.base_view import BaseView + class BaseWebView(BaseView): def __init__(self, driver): @@ -10,7 +11,8 @@ class BaseWebView(BaseView): self.progress_bar_icon = Button(self.driver, xpath="//android.widget.ProgressBar") self.url_edit_box_lock_icon = Button(self.driver, xpath="'(//android.view.ViewGroup[@content-desc='icon'])[2]") - self.policy_summary = Button(self.driver, xpath="//*[@content-desc='Status Privacy Policy'] | //*[@text='Status Privacy Policy']") + self.policy_summary = Button(self.driver, + xpath="//*[@content-desc='Status Privacy Policy'] | //*[@text='Status Privacy Policy']") self.terms_of_use_summary = Button(self.driver, xpath="//*[@content-desc='Status App Terms of Use']") self.browser_previous_page_button = Button(self.driver, accessibility_id="previous-page-button") @@ -61,7 +63,8 @@ class BaseWebView(BaseView): self.close_all_button.click() else: self.driver.info("**Removing '%s' from recent websites**") - close_button = Button(self.driver, xpath="//*[contains(@text, '%s')]/../../../../*[@content-desc='empty-tab']"% name) + close_button = Button(self.driver, + xpath="//*[contains(@text, '%s')]/../../../../*[@content-desc='empty-tab']" % name) close_button.scroll_to_element() close_button.click() @@ -82,4 +85,3 @@ class BaseWebView(BaseView): bookmark_name = self.bookmark_name_input.text self.save_bookmark_button.click() return bookmark_name - diff --git a/test/appium/views/web_views/status_test_dapp.py b/test/appium/views/web_views/status_test_dapp.py index 87dc0d78fa..b7aeedb351 100644 --- a/test/appium/views/web_views/status_test_dapp.py +++ b/test/appium/views/web_views/status_test_dapp.py @@ -1,6 +1,7 @@ from views.web_views.base_web_view import BaseWebView, Button import time + class RequestSTTButton(Button): def __init__(self, driver): super(RequestSTTButton, self).__init__(driver, webview="Request STT")