diff --git a/test/appium/tests/__init__.py b/test/appium/tests/__init__.py index 900dfeffc6..a796509652 100644 --- a/test/appium/tests/__init__.py +++ b/test/appium/tests/__init__.py @@ -161,3 +161,8 @@ group_chat_users['C_USER']['public_key'] = "0x04dcdb5cac266328c41bdb0e33a266544a "3dba7e295445505ee55ea03ee99cb7d26bee05e6b486a9bdaaf6be73a0b" common_password = 'qwerty' + +bootnode_address = "enode://a8a97f126f5e3a340cb4db28a1187c325290ec08b2c9a6b1f19845ac86c46f9fac2ba13328822590" \ + "fd3de3acb09cc38b5a05272e583a2365ad1fa67f66c55b34@167.99.210.203:30404" +mailserver_address = "enode://531e252ec966b7e83f5538c19bf1cde7381cc7949026a6e499b6e998e695751aadf26d4c98d5a4eab" \ + "fb7cefd31c3c88d600a775f14ed5781520a88ecd25da3c6:status-offline-inbox@35.225.227.79:30504" diff --git a/test/appium/tests/atomic/account_management/test_profile.py b/test/appium/tests/atomic/account_management/test_profile.py index 000c7344bd..7f3f3da215 100644 --- a/test/appium/tests/atomic/account_management/test_profile.py +++ b/test/appium/tests/atomic/account_management/test_profile.py @@ -1,8 +1,7 @@ import pytest -from tests import marks, group_chat_users -from tests import marks, group_chat_users, basic_user -from tests.base_test_case import SingleDeviceTestCase +from tests import marks, group_chat_users, basic_user, bootnode_address, mailserver_address +from tests.base_test_case import SingleDeviceTestCase, MultipleDeviceTestCase from views.sign_in_view import SignInView @@ -192,3 +191,81 @@ class TestProfileSingleDevice(SingleDeviceTestCase): chat_view.view_profile_button.click() for text in basic_user['username'], 'In contacts', 'Send transaction', 'Send message', 'Contact code': chat_view.find_full_text(text) + + +@marks.all +@marks.account +class TestProfileMultipleDevice(MultipleDeviceTestCase): + + @marks.testrail_id(3708) + def test_custom_bootnodes(self): + self.create_drivers(2) + sign_in_1, sign_in_2 = SignInView(self.drivers[0]), SignInView(self.drivers[1]) + username_1, username_2 = 'user_1', 'user_2' + home_1, home_2 = sign_in_1.create_user(username=username_1), sign_in_2.create_user(username=username_2) + public_key = home_2.get_public_key() + home_2.home_button.click() + + profile_1 = home_1.profile_button.click() + profile_1.advanced_button.click() + profile_1.bootnodes_button.click() + profile_1.plus_button.click() + profile_1.specify_name_input.set_value('test') + profile_1.bootnode_address_input.set_value(bootnode_address) + profile_1.save_button.click() + profile_1.enable_bootnodes.click() + sign_in_1.sign_in() + + chat_1 = home_1.add_contact(public_key) + message = 'test message' + chat_1.chat_message_input.send_keys(message) + chat_1.send_message_button.click() + chat_2 = home_2.get_chat_with_user(username_1).click() + chat_2.chat_element_by_text(message).wait_for_visibility_of_element() + chat_2.add_to_contacts.click() + + chat_1.get_back_to_home_view() + home_1.profile_button.click() + profile_1.advanced_button.click() + profile_1.bootnodes_button.click() + profile_1.enable_bootnodes.click() + sign_in_1.sign_in() + + home_1.get_chat_with_user(username_2).click() + message_1 = 'new message' + chat_1.chat_message_input.send_keys(message_1) + chat_1.send_message_button.click() + chat_2.chat_element_by_text(message_1).wait_for_visibility_of_element() + + @marks.testrail_id(3737) + def test_switch_mailserver(self): + self.create_drivers(2) + sign_in_1, sign_in_2 = SignInView(self.drivers[0]), SignInView(self.drivers[1]) + username_1, username_2 = 'user_1', 'user_2' + home_1, home_2 = sign_in_1.create_user(username=username_1), sign_in_2.create_user(username=username_2) + public_key = home_2.get_public_key() + home_2.home_button.click() + + profile_1 = home_1.profile_button.click() + profile_1.advanced_button.click() + profile_1.mail_server_button.click() + 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) + 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() + sign_in_1.sign_in() + + chat_1 = home_1.add_contact(public_key) + message = 'test message' + chat_1.chat_message_input.send_keys(message) + chat_1.send_message_button.click() + chat_2 = home_2.get_chat_with_user(username_1).click() + chat_2.chat_element_by_text(message).wait_for_visibility_of_element() + message_1 = 'new message' + chat_2.chat_message_input.send_keys(message_1) + chat_2.send_message_button.click() + chat_1.chat_element_by_text(message_1).wait_for_visibility_of_element() 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 7079584dc8..f4666eab30 100644 --- a/test/appium/tests/atomic/account_management/test_wallet_management.py +++ b/test/appium/tests/atomic/account_management/test_wallet_management.py @@ -111,3 +111,22 @@ class TestWallet(SingleDeviceTestCase): pytest.fail("'Backup your Recovery phrase' option is not shown on Wallet for an account with funds") profile = wallet.get_profile_view() profile.backup_recovery_phrase() + + @marks.testrail_id(3777) + def test_no_collectibles_to_send_from_wallet(self): + sign_in = SignInView(self.driver) + sign_in.create_user() + profile = sign_in.profile_button.click() + profile.switch_network('Mainnet with upstream RPC') + sign_in.sign_in() + wallet = sign_in.wallet_button.click() + wallet.set_up_wallet() + wallet.options_button.click() + wallet.manage_assets_button.click() + asset_name = 'CryptoKitties' + wallet.asset_checkbox_by_name(asset_name).click() + wallet.done_button.click() + send_transaction = wallet.send_transaction_button.click() + send_transaction.select_asset_button.click() + if send_transaction.asset_by_name(asset_name).is_element_displayed(): + pytest.fail('Collectibles can be sent from wallet') diff --git a/test/appium/tests/atomic/chats/test_console.py b/test/appium/tests/atomic/chats/test_console.py index c1b1f46120..1ffffbc5ef 100644 --- a/test/appium/tests/atomic/chats/test_console.py +++ b/test/appium/tests/atomic/chats/test_console.py @@ -1,5 +1,3 @@ -import time - import pytest from tests import marks @@ -46,3 +44,25 @@ class TestMessagesPublicChat(SingleDeviceTestCase): break else: pytest.fail('Actual block number is not shown') + + @marks.testrail_id(3732) + def test_show_hide_console_chat(self): + sign_in_view = SignInView(self.driver) + sign_in_view.create_user() + profile_view = sign_in_view.profile_button.click() + profile_view.advanced_button.click() + profile_view.debug_mode_toggle.click() + home_view = profile_view.home_button.click() + console_chat = home_view.get_chat_with_user('Status Console') + console_chat.swipe_element() + chat_view = home_view.get_chat_view() + if console_chat.swipe_delete_button.is_element_displayed() or chat_view.chat_options.is_element_displayed(): + self.errors.append('Console chat can be deleted') + home_view.get_back_to_home_view() + sign_in_view.profile_button.click() + profile_view.advanced_button.click() + profile_view.debug_mode_toggle.click() + profile_view.home_button.click() + if console_chat.is_element_displayed(): + self.errors.append('Console chat is not hidden after turning off debug mode') + self.verify_no_errors() 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 b38a0a557f..7ae671d892 100644 --- a/test/appium/tests/atomic/chats/test_one_to_one.py +++ b/test/appium/tests/atomic/chats/test_one_to_one.py @@ -1,7 +1,7 @@ import random import string import emoji -import pytest +from datetime import datetime from selenium.common.exceptions import TimeoutException from tests import marks, get_current_time, group_chat_users from tests.base_test_case import MultipleDeviceTestCase, SingleDeviceTestCase @@ -169,7 +169,7 @@ class TestMessagesOneToOneChatMultiple(MultipleDeviceTestCase): chat_element.wait_for_visibility_of_element() device_2_chat = chat_element.click() if not device_2_chat.chat_element_by_text(message).is_element_displayed(): - self.erros.append("Message with test '%s' was not received" % message) + self.errors.append("Message with test '%s' was not received" % message) if not device_2_chat.add_to_contacts.is_element_displayed(): self.errors.append('Add to contacts button is not shown') if device_2_chat.user_name_text.text != username_1: @@ -205,7 +205,7 @@ class TestMessagesOneToOneChatMultiple(MultipleDeviceTestCase): chat_element.wait_for_visibility_of_element() device_2_chat = chat_element.click() if not device_2_chat.chat_element_by_text(message).is_element_displayed(): - self.erros.append("Message with text '%s' was not received" % message) + self.errors.append("Message with text '%s' was not received" % message) device_2_chat.reconnect() device_2_chat.add_to_contacts.click() @@ -315,6 +315,140 @@ class TestMessagesOneToOneChatMultiple(MultipleDeviceTestCase): self.errors.append("'Seen' status is not shown under the text message which was read by a receiver") self.verify_no_errors() + @marks.testrail_id(3784) + def test_unread_messages_counter_1_1_chat(self): + self.create_drivers(2) + device_1, device_2 = SignInView(self.drivers[0]), SignInView(self.drivers[1]) + username_2 = 'user_%s' % get_current_time() + device_1_home, device_2_home = device_1.create_user(), device_2.create_user(username=username_2) + device_1_public_key = device_1_home.get_public_key() + device_1_home.home_button.click() + + device_2_chat = device_2_home.add_contact(device_1_public_key) + + message = 'test message' + device_2_chat.chat_message_input.send_keys(message) + device_2_chat.send_message_button.click() + + if device_1_home.home_button.counter.text != '1': + self.errors.append('New messages counter is not shown on Home button') + + chat_element = device_1_home.get_chat_with_user(username_2) + if chat_element.new_messages_counter.text != '1': + self.errors.append('New messages counter is not shown on chat element') + + chat_element.click() + device_1_home.get_back_to_home_view() + + if device_1_home.home_button.counter.is_element_displayed(): + self.errors.append('New messages counter is shown on Home button for already seen message') + + if chat_element.new_messages_counter.is_element_displayed(): + self.errors.append('New messages counter is shown on chat element for already seen message') + self.verify_no_errors() + + @marks.testrail_id(1414) + def test_bold_and_italic_text_in_messages(self): + self.create_drivers(2) + sign_in_1, sign_in_2 = SignInView(self.drivers[0]), SignInView(self.drivers[1]) + username_2 = 'user_%s' % get_current_time() + device_1_home, device_2_home = sign_in_1.create_user(), sign_in_2.create_user(username=username_2) + device_1_public_key = device_1_home.get_public_key() + device_1_home.home_button.click() + + device_2_chat = device_2_home.add_contact(device_1_public_key) + + bold_text = 'bold text' + device_2_chat.chat_message_input.send_keys('*%s*' % bold_text) + device_2_chat.send_message_button.click() + if not device_2_chat.chat_element_by_text(bold_text).is_element_displayed(): + self.errors.append('Bold text is not displayed in 1-1 chat for the sender') + + device_1_chat = device_1_home.get_chat_with_user(username_2).click() + if not device_1_chat.chat_element_by_text(bold_text).is_element_displayed(): + self.errors.append('Bold text is not displayed in 1-1 chat for the recipient') + + italic_text = 'italic text' + device_2_chat.chat_message_input.send_keys('~%s~' % italic_text) + device_2_chat.send_message_button.click() + if not device_2_chat.chat_element_by_text(italic_text).is_element_displayed(): + self.errors.append('Italic text is not displayed in 1-1 chat for the sender') + + if not device_1_chat.chat_element_by_text(italic_text).is_element_displayed(): + self.errors.append('Italic text is not displayed in 1-1 chat for the recipient') + + device_1_chat.get_back_to_home_view() + device_2_chat.get_back_to_home_view() + chat_name = device_1_home.get_public_chat_name() + device_1_home.join_public_chat(chat_name) + device_2_home.join_public_chat(chat_name) + + device_2_chat.chat_message_input.send_keys('*%s*' % bold_text) + device_2_chat.send_message_button.click() + if not device_2_chat.chat_element_by_text(bold_text).is_element_displayed(): + self.errors.append('Bold text is not displayed in public chat for the sender') + + if not device_1_chat.chat_element_by_text(bold_text).is_element_displayed(): + self.errors.append('Bold text is not displayed in public chat for the recipient') + + device_2_chat.chat_message_input.send_keys('~%s~' % italic_text) + device_2_chat.send_message_button.click() + if not device_2_chat.chat_element_by_text(italic_text).is_element_displayed(): + self.errors.append('Italic text is not displayed in public chat for the sender') + + if not device_1_chat.chat_element_by_text(italic_text).is_element_displayed(): + self.errors.append('Italic text is not displayed in 1-1 chat for the recipient') + + self.verify_no_errors() + + @marks.testrail_id(2781) + def test_timestamp_in_chats(self): + self.create_drivers(2) + device_1, device_2 = self.drivers[0], self.drivers[1] + sign_in_1, sign_in_2 = SignInView(device_1), SignInView(device_2) + username_1 = 'user_%s' % get_current_time() + device_1_home, device_2_home = sign_in_1.create_user(username=username_1), sign_in_2.create_user() + device_2_public_key = device_2_home.get_public_key() + device_2_home.home_button.click() + + device_1_chat = device_1_home.add_contact(device_2_public_key) + + message = 'test text' + device_1_chat.chat_message_input.send_keys(message) + device_1_chat.send_message_button.click() + sent_time = datetime.strptime(device_1.device_time, '%a %b %d %H:%M:%S GMT %Y').strftime("%I:%M %p") + if not device_1_chat.chat_element_by_text(message).contains_text(sent_time): + self.errors.append('Timestamp is not displayed in 1-1 chat for the sender') + if device_1_chat.chat_element_by_text(message).member_photo.is_element_displayed(): + self.errors.append('Member photo is displayed in 1-1 chat for the sender') + + device_2_chat = device_2_home.get_chat_with_user(username_1).click() + if not device_2_chat.chat_element_by_text(message).contains_text(sent_time): + self.errors.append('Timestamp is not displayed in 1-1 chat for the recipient') + if not device_2_chat.chat_element_by_text(message).member_photo.is_element_displayed(): + self.errors.append('Member photo is not displayed in 1-1 chat for the recipient') + + device_1_chat.get_back_to_home_view() + device_2_chat.get_back_to_home_view() + chat_name = device_1_home.get_public_chat_name() + device_1_home.join_public_chat(chat_name) + device_2_home.join_public_chat(chat_name) + + device_2_chat.chat_message_input.send_keys(message) + device_2_chat.send_message_button.click() + sent_time = datetime.strptime(device_2.device_time, '%a %b %d %H:%M:%S GMT %Y').strftime("%I:%M %p") + if not device_2_chat.chat_element_by_text(message).contains_text(sent_time): + self.errors.append('Timestamp is not displayed in public chat for the sender') + if device_2_chat.chat_element_by_text(message).member_photo.is_element_displayed(): + self.errors.append('Member photo is displayed in public chat for the sender') + + if not device_1_chat.chat_element_by_text(message).contains_text(sent_time): + self.errors.append('Timestamp is not displayed in public chat for the recipient') + if not device_1_chat.chat_element_by_text(message).member_photo.is_element_displayed(): + self.errors.append('Member photo is not displayed in 1-1 chat for the recipient') + + self.verify_no_errors() + @marks.all @marks.chat diff --git a/test/appium/tests/atomic/chats/test_public.py b/test/appium/tests/atomic/chats/test_public.py index 2f593f257a..2fd9879618 100644 --- a/test/appium/tests/atomic/chats/test_public.py +++ b/test/appium/tests/atomic/chats/test_public.py @@ -1,11 +1,11 @@ import pytest from tests import marks -from tests.base_test_case import MultipleDeviceTestCase +from tests.base_test_case import MultipleDeviceTestCase, SingleDeviceTestCase from views.sign_in_view import SignInView @marks.chat -class TestPublicChat(MultipleDeviceTestCase): +class TestPublicChatMultipleDevice(MultipleDeviceTestCase): @marks.testrail_id(1383) @marks.smoke_1 @@ -68,3 +68,54 @@ class TestPublicChat(MultipleDeviceTestCase): for message in message_1, message_2: if chat_1.element_starts_with_text(message).is_element_present(): pytest.fail("Message '%s' is shown after re-login, but public chat history has been cleared" % message) + + @marks.testrail_id(3729) + def test_unread_messages_counter_public_chat(self): + self.create_drivers(2) + device_1, device_2 = SignInView(self.drivers[0]), SignInView(self.drivers[1]) + home_1, home_2 = device_1.create_user(), device_2.create_user() + + chat_name = home_1.get_public_chat_name() + chat_1, chat_2 = home_1.join_public_chat(chat_name), home_2.join_public_chat(chat_name) + home_1.get_back_to_home_view() + + message = 'test message' + chat_2.chat_message_input.send_keys(message) + chat_2.send_message_button.click() + + if home_1.home_button.counter.text != '1': + self.errors.append('New messages counter is not shown on Home button') + + chat_element = home_1.get_chat_with_user('#' + chat_name) + if chat_element.new_messages_counter.text != '1': + self.errors.append('New messages counter is not shown on chat element') + + chat_element.click() + home_1.get_back_to_home_view() + + if home_1.home_button.counter.is_element_displayed(): + self.errors.append('New messages counter is shown on Home button for already seen message') + + if chat_element.new_messages_counter.is_element_displayed(): + self.errors.append('New messages counter is shown on chat element for already seen message') + self.verify_no_errors() + + +@marks.chat +class TestPublicChatSingleDevice(SingleDeviceTestCase): + + @marks.skip + @marks.testrail_id(3752) + def test_send_korean_characters(self): + sign_in = SignInView(self.driver) + home = sign_in.create_user() + chat_name = home.get_public_chat_name() + public_chat = home.join_public_chat(chat_name) + message = '파란하늘' + public_chat.chat_message_input.send_keys(message) + if public_chat.chat_message_input.text != message: + self.errors.append('Korean characters are not displayed properly in the chat message input') + public_chat.send_message_button.click() + if not public_chat.chat_element_by_text(message).is_element_displayed(): + self.errors.append('Message with korean characters is not shown') + self.verify_no_errors() diff --git a/test/appium/tests/atomic/transactions/test_wallet.py b/test/appium/tests/atomic/transactions/test_wallet.py index 45c9645762..876a09e222 100644 --- a/test/appium/tests/atomic/transactions/test_wallet.py +++ b/test/appium/tests/atomic/transactions/test_wallet.py @@ -1,5 +1,4 @@ import random - from tests import transaction_users, transaction_users_wallet, marks, common_password from tests.base_test_case import SingleDeviceTestCase, MultipleDeviceTestCase from views.sign_in_view import SignInView @@ -260,6 +259,86 @@ class TestTransactionWalletSingleDevice(SingleDeviceTestCase): self.errors.append('Warning about too precise amount is not shown when requesting a transaction') self.verify_no_errors() + @marks.testrail_id(1405) + def test_insufficient_funds_error_wallet(self): + sender = transaction_users['H_USER'] + sign_in_view = SignInView(self.driver) + sign_in_view.recover_access(sender['passphrase'], sender['password']) + wallet_view = sign_in_view.wallet_button.click() + wallet_view.set_up_wallet() + bigger_amount = wallet_view.get_eth_value() + 1 + send_transaction = wallet_view.send_transaction_button.click() + amount_edit_box = send_transaction.amount_edit_box + amount_edit_box.click() + amount_edit_box.set_value(bigger_amount) + send_transaction.element_by_text('Insufficient funds').wait_for_visibility_of_element(5) + + valid_amount = send_transaction.get_unique_amount() + amount_edit_box.clear() + amount_edit_box.set_value(valid_amount) + send_transaction.confirm() + send_transaction.chose_recipient_button.click() + send_transaction.enter_recipient_address_button.click() + send_transaction.enter_recipient_address_input.set_value(transaction_users['G_USER']['address']) + send_transaction.done_button.click() + send_transaction.sign_transaction_button.click() + send_transaction.enter_password_input.send_keys(sender['password']) + send_transaction.sign_transaction_button.click() + send_transaction.got_it_button.click() + self.network_api.find_transaction_by_unique_amount(sender['address'], valid_amount) + + @marks.testrail_id(3728) + def test_modify_transaction_fee_values(self): + sender = transaction_users['H_USER'] + sign_in_view = SignInView(self.driver) + sign_in_view.recover_access(sender['passphrase'], sender['password']) + wallet_view = sign_in_view.wallet_button.click() + wallet_view.set_up_wallet() + send_transaction = wallet_view.send_transaction_button.click() + + amount = send_transaction.get_unique_amount() + send_transaction.amount_edit_box.set_value(amount) + send_transaction.confirm() + send_transaction.chose_recipient_button.click() + send_transaction.enter_recipient_address_button.click() + recipient_address = transaction_users['G_USER']['address'] + send_transaction.enter_recipient_address_input.set_value(recipient_address) + send_transaction.done_button.click() + send_transaction.advanced_button.click() + send_transaction.transaction_fee_button.click() + send_transaction.gas_limit_input.clear() + send_transaction.gas_limit_input.set_value('1') + send_transaction.gas_price_input.clear() + send_transaction.gas_price_input.set_value('1') + send_transaction.total_fee_input.click() + send_transaction.done_button.click() + send_transaction.sign_transaction_button.click_until_presence_of_element(send_transaction.enter_password_input) + send_transaction.enter_password_input.send_keys(sender['password']) + send_transaction.sign_transaction_button.click() + send_transaction.element_by_text('intrinsic gas too low').wait_for_visibility_of_element() + send_transaction.ok_button.click() + + wallet_view.send_transaction_button.click() + send_transaction.amount_edit_box.set_value(amount) + send_transaction.confirm() + send_transaction.chose_recipient_button.click() + send_transaction.enter_recipient_address_button.click() + send_transaction.enter_recipient_address_input.set_value(recipient_address) + send_transaction.done_button.click() + + send_transaction.advanced_button.click() + send_transaction.transaction_fee_button.click() + send_transaction.gas_limit_input.clear() + gas_limit = '1005000' + send_transaction.gas_limit_input.set_value(gas_limit) + send_transaction.gas_price_input.clear() + gas_price = '24' + send_transaction.gas_price_input.set_value(gas_price) + send_transaction.total_fee_input.click() + send_transaction.done_button.click() + send_transaction.sign_transaction(sender['password']) + self.network_api.find_transaction_by_unique_amount(sender['address'], amount) + @marks.transaction class TestTransactionWalletMultipleDevice(MultipleDeviceTestCase): diff --git a/test/appium/views/base_element.py b/test/appium/views/base_element.py index a81defa689..684ab1e714 100644 --- a/test/appium/views/base_element.py +++ b/test/appium/views/base_element.py @@ -81,9 +81,9 @@ class BaseElement(object): seconds) raise exception - def wait_for_visibility_of_element(self, seconds=10): + def wait_for_visibility_of_element(self, seconds=10, ignored_exceptions=None): try: - return WebDriverWait(self.driver, seconds) \ + return WebDriverWait(self.driver, seconds, ignored_exceptions=ignored_exceptions) \ .until(expected_conditions.visibility_of_element_located((self.locator.by, self.locator.value))) except TimeoutException as exception: exception.msg = "'%s' is not found on screen, using: '%s', during '%s' seconds" % (self.name, self.locator, @@ -115,10 +115,10 @@ class BaseElement(object): except TimeoutException: return False - def is_element_displayed(self, sec=5): + def is_element_displayed(self, sec=5, ignored_exceptions=None): try: info('Wait for %s' % self.name) - return self.wait_for_visibility_of_element(sec) + return self.wait_for_visibility_of_element(sec, ignored_exceptions=ignored_exceptions) except TimeoutException: return False diff --git a/test/appium/views/base_view.py b/test/appium/views/base_view.py index 6ce5f175c4..fb78a34e47 100644 --- a/test/appium/views/base_view.py +++ b/test/appium/views/base_view.py @@ -7,7 +7,7 @@ import re import zbarlight from tests import info, common_password from eth_keys import datatypes -from selenium.common.exceptions import NoSuchElementException, TimeoutException +from selenium.common.exceptions import NoSuchElementException, TimeoutException, StaleElementReferenceException from PIL import Image from datetime import datetime from io import BytesIO @@ -84,7 +84,7 @@ class TabButton(BaseButton): def __init__(self, driver, parent_locator): super(Counter, self).__init__(driver) self.locator = self.Locator.xpath_selector( - "//*[@content-desc='%s']/android.view.ViewGroup[2]/android.widget.TextView" % parent_locator) + "//*[@content-desc='%s']//android.view.ViewGroup[2]/android.widget.TextView" % parent_locator) return Counter(self.driver, self.locator.value) @@ -191,6 +191,12 @@ class DiscardButton(BaseButton): self.locator = self.Locator.xpath_selector("//*[@text='DISCARD']") +class ConfirmButton(BaseButton): + def __init__(self, driver): + super(ConfirmButton, self).__init__(driver) + self.locator = self.Locator.xpath_selector("//*[@text='CONFIRM']") + + class BaseView(object): def __init__(self, driver): self.driver = driver @@ -213,6 +219,7 @@ class BaseView(object): self.delete_button = DeleteButton(self.driver) self.ok_continue_button = OkContinueButton(self.driver) self.discard_button = DiscardButton(self.driver) + self.confirm_button = ConfirmButton(self.driver) self.connection_status = ConnectionStatusText(self.driver) self.apps_button = AppsButton(self.driver) @@ -416,20 +423,21 @@ class BaseView(object): def reconnect(self): connect_status = self.connection_status for i in range(3): - if connect_status.is_element_displayed(5) and 'Tap to reconnect' in connect_status.text: - try: - connect_status.click() - except AttributeError: - pass - try: - connect_status.wait_for_invisibility_of_element() - except TimeoutException as e: - if i == 2: - e.msg = "Can't reconnect to mail server after 3 attempts" - raise e + if connect_status.is_element_displayed(5, ignored_exceptions=StaleElementReferenceException): + if 'Tap to reconnect' in connect_status.text: + try: + connect_status.click() + except AttributeError: + pass + try: + connect_status.wait_for_invisibility_of_element() + except TimeoutException as e: + if i == 2: + e.msg = "Can't reconnect to mail server after 3 attempts" + raise e def check_no_values_in_logcat(self, **kwargs): logcat = self.logcat for key, value in kwargs.items(): - if re.findall('\W%s|\W%s\W' % (value, value), logcat): + if re.findall('\W%s$|\W%s\W' % (value, value), logcat): pytest.fail('%s in logcat!!!' % key.capitalize(), pytrace=False) diff --git a/test/appium/views/home_view.py b/test/appium/views/home_view.py index 383511d834..7f62b7dc32 100644 --- a/test/appium/views/home_view.py +++ b/test/appium/views/home_view.py @@ -87,6 +87,16 @@ class ChatElement(BaseButton): counter += 1 self.swipe_delete_button.click() + @property + def new_messages_counter(self): + class UnreadMessagesCountText(BaseText): + def __init__(self, driver, parent_locator: str): + super(UnreadMessagesCountText, self).__init__(driver) + locator_str = "//*[@content-desc='unread-messages-count-text']" + self.locator = self.Locator.xpath_selector(parent_locator + locator_str) + + return UnreadMessagesCountText(self.driver, self.locator.value) + class ChatNameText(BaseText): def __init__(self, driver): @@ -146,7 +156,7 @@ class HomeView(BaseView): user_contact.click() start_new_chat.next_button.click() start_new_chat.chat_name_editbox.send_keys(group_chat_name) - start_new_chat.confirm_button.click() + start_new_chat.create_button.click() def join_public_chat(self, chat_name: str): start_new_chat = self.plus_button.click() diff --git a/test/appium/views/profile_view.py b/test/appium/views/profile_view.py index 4133ab8660..04b045e9cc 100644 --- a/test/appium/views/profile_view.py +++ b/test/appium/views/profile_view.py @@ -132,10 +132,10 @@ class EditPictureButton(BaseButton): self.locator = self.Locator.accessibility_id('edit-profile-photo-button') -class ConfirmButton(BaseButton): +class ConfirmEditButton(BaseButton): def __init__(self, driver): - super(ConfirmButton, self).__init__(driver) + super(ConfirmEditButton, self).__init__(driver) self.locator = self.Locator.accessibility_id('done-button') @@ -238,10 +238,10 @@ class MainCurrencyButton(BaseButton): self.locator = self.Locator.accessibility_id("currency-button") -class NetworkPlusButton(BaseButton): +class PlusButton(BaseButton): def __init__(self, driver): - super(NetworkPlusButton, self).__init__(driver) + super(PlusButton, self).__init__(driver) self.locator = self.Locator.xpath_selector("(//android.view.ViewGroup[@content-desc='icon'])[2]") @@ -253,10 +253,10 @@ class RopstenChainButton(BaseButton): "//*[contains(@text,'Ropsten test network')]/following-sibling::android.widget.CheckBox[1]") -class CustomNetworkName(BaseEditBox): +class SpecifyNameInput(BaseEditBox): def __init__(self, driver): - super(CustomNetworkName, self).__init__(driver) + super(SpecifyNameInput, self).__init__(driver) self.locator = self.Locator.xpath_selector("//*[@text='Name']/following-sibling::*[1]/android.widget.EditText") @@ -300,6 +300,69 @@ class FaqButton(BaseButton): return BaseWebView(self.driver) +class BootnodesButton(BaseButton): + + def __init__(self, driver): + super(BootnodesButton, self).__init__(driver) + self.locator = self.Locator.accessibility_id('bootnodes-settings-button') + + +class AddBootnodeButton(BaseButton): + + def __init__(self, driver): + super(AddBootnodeButton, self).__init__(driver) + self.locator = self.Locator.xpath_selector("(//*[@content-desc='icon'])[2]") + + +class BootnodeNameInput(BaseEditBox): + + def __init__(self, driver): + super(BootnodeNameInput, self).__init__(driver) + self.locator = self.Locator.xpath_selector("//android.widget.EditText[@text='Specify a name']") + + +class BootnodeAddressInput(BaseEditBox): + + def __init__(self, driver): + super(BootnodeAddressInput, self).__init__(driver) + self.locator = self.Locator.xpath_selector("//android.widget.EditText[@text='Specify bootnode address']") + + +class EnableBootnodesToggle(BaseEditBox): + + def __init__(self, driver): + super(EnableBootnodesToggle, self).__init__(driver) + self.locator = self.Locator.xpath_selector('//android.widget.Switch') + + +class MailServerButton(BaseButton): + + def __init__(self, driver): + super(MailServerButton, self).__init__(driver) + self.locator = self.Locator.accessibility_id('offline-messages-settings-button') + + +class MailServerAddressInput(BaseEditBox): + + def __init__(self, driver): + super(MailServerAddressInput, self).__init__(driver) + self.locator = self.Locator.xpath_selector("//android.widget.EditText[@text='Specify a mailserver address']") + + +class MailServerElement(BaseButton): + + def __init__(self, driver, server_name): + super(MailServerElement, self).__init__(driver) + self.locator = self.Locator.xpath_selector("//*[@content-desc='mailserver-item']//*[@text='%s']" % server_name) + + +class MailServerConnectButton(BaseButton): + + def __init__(self, driver): + super(MailServerConnectButton, self).__init__(driver) + self.locator = self.Locator.accessibility_id('mailserver-connect-button') + + class ProfileView(BaseView): def __init__(self, driver): @@ -314,10 +377,10 @@ class ProfileView(BaseView): self.profile_address_text = ProfileAddressText(self.driver) self.network_settings_button = NetworkSettingsButton(self.driver) - self.network_plus_button = NetworkPlusButton(self.driver) + self.plus_button = PlusButton(self.driver) self.ropsten_chain_button = RopstenChainButton(self.driver) self.custom_network_url = CustomNetworkURL(self.driver) - self.custom_network_name = CustomNetworkName(self.driver) + self.specify_name_input = SpecifyNameInput(self.driver) self.connect_button = NetworkSettingsButton.ConnectButton(self.driver) self.logout_button = LogoutButton(self.driver) self.logout_dialog = LogoutDialog(self.driver) @@ -330,7 +393,7 @@ class ProfileView(BaseView): self.edit_button = EditButton(self.driver) self.profile_picture = ProfilePictureElement(self.driver) self.edit_picture_button = EditPictureButton(self.driver) - self.confirm_button = ConfirmButton(self.driver) + self.confirm_edit_button = ConfirmEditButton(self.driver) self.cross_icon = CrossIcon(self.driver) self.share_button = ShareButton(self.driver) self.advanced_button = AdvancedButton(self.driver) @@ -350,6 +413,16 @@ class ProfileView(BaseView): self.submit_bug_button = SubmitBugButton(self.driver) self.faq_button = FaqButton(self.driver) + # Bootnodes + self.bootnodes_button = BootnodesButton(self.driver) + self.bootnode_address_input = BootnodeAddressInput(self.driver) + self.enable_bootnodes = EnableBootnodesToggle(self.driver) + + # Mailservers + self.mail_server_button = MailServerButton(self.driver) + self.mail_server_address_input = MailServerAddressInput(self.driver) + self.mail_server_connect_button = MailServerConnectButton(self.driver) + def switch_network(self, network): self.advanced_button.click() self.debug_mode_toggle.click() @@ -366,10 +439,10 @@ class ProfileView(BaseView): self.debug_mode_toggle.click() self.network_settings_button.scroll_to_element() self.network_settings_button.click() - self.network_plus_button.click_until_presence_of_element(self.ropsten_chain_button) + self.plus_button.click_until_presence_of_element(self.ropsten_chain_button) self.ropsten_chain_button.click() self.custom_network_url.send_keys('https://ropsten.infura.io/iMko0kJNQUdhbCSaJcox') - self.custom_network_name.send_keys('custom_ropsten') + self.specify_name_input.send_keys('custom_ropsten') self.save_button.click() self.element_by_text_part('custom_ropsten').click_until_presence_of_element(self.connect_button) self.connect_button.click() @@ -413,7 +486,7 @@ class ProfileView(BaseView): for element_text in 'Images', 'DCIM': self.element_by_text(element_text).click() picture.click() - self.confirm_button.click() + self.confirm_edit_button.click() def logout(self): self.logout_button.click() @@ -425,3 +498,5 @@ class ProfileView(BaseView): desired_currency.scroll_to_element() desired_currency.click() + def mail_server_by_name(self, server_name): + return MailServerElement(self.driver, server_name) diff --git a/test/appium/views/send_transaction_view.py b/test/appium/views/send_transaction_view.py index 6773de7958..a3bb214f1d 100644 --- a/test/appium/views/send_transaction_view.py +++ b/test/appium/views/send_transaction_view.py @@ -46,12 +46,6 @@ class EnterPasswordInput(BaseEditBox): self.locator = self.Locator.accessibility_id('enter-password-input') -class ConfirmButton(BaseButton): - def __init__(self, driver): - super(ConfirmButton, self).__init__(driver) - self.locator = self.Locator.xpath_selector("//*[@text='CONFIRM']") - - class GotItButton(BaseButton): def __init__(self, driver): super(GotItButton, self).__init__(driver) @@ -161,7 +155,6 @@ class SendTransactionView(BaseView): self.cancel_button = CancelButton(self.driver) self.sign_transaction_button = SignTransactionButton(self.driver) - self.confirm_button = ConfirmButton(self.driver) self.sign_in_phrase_text = SignInPhraseText(self.driver) self.password_input = PasswordInput(self.driver) self.enter_password_input = EnterPasswordInput(self.driver) diff --git a/test/appium/views/start_new_chat_view.py b/test/appium/views/start_new_chat_view.py index 0f0d886824..d0e4f0ebef 100644 --- a/test/appium/views/start_new_chat_view.py +++ b/test/appium/views/start_new_chat_view.py @@ -40,9 +40,9 @@ class OpenButton(BaseButton): self.locator = self.Locator.accessibility_id('open-dapp-button') -class ConfirmButton(BaseButton): +class CreateButton(BaseButton): def __init__(self, driver): - super(ConfirmButton, self).__init__(driver) + super(CreateButton, self).__init__(driver) self.locator = self.Locator.accessibility_id('create-button') @@ -78,7 +78,7 @@ class StartNewChatView(ContactsView): self.chat_name_editbox = ChatNameEditBox(self.driver) self.enter_url_editbox = EnterUrlEditbox(self.driver) - self.confirm_button = ConfirmButton(self.driver) + self.create_button = CreateButton(self.driver) def get_username_checkbox(self, username: str): return UsernameCheckbox(self.driver, username) diff --git a/test/appium/views/wallet_view.py b/test/appium/views/wallet_view.py index b780e8628e..8661be03c1 100644 --- a/test/appium/views/wallet_view.py +++ b/test/appium/views/wallet_view.py @@ -141,7 +141,12 @@ class AssetTextElement(BaseText): class AssetCheckBox(BaseButton): def __init__(self, driver, asset_name): super(AssetCheckBox, self).__init__(driver) - self.locator = self.Locator.xpath_selector("//*[@text='%s']/../android.widget.CheckBox" % asset_name) + self.asset_name = asset_name + self.locator = self.Locator.xpath_selector("//*[@text='%s']/../android.widget.CheckBox" % self.asset_name) + + def click(self): + self.scroll_to_element().click() + info('Click %s asset checkbox' % self.asset_name) class TotalAmountText(BaseText):