318 lines
15 KiB
Python
318 lines
15 KiB
Python
import time
|
|
|
|
from selenium.common import NoSuchElementException
|
|
|
|
from tests import common_password
|
|
from tests.base_test_case import AbstractTestCase
|
|
from views.base_element import Text, Button, EditBox, SilentButton, BaseElement
|
|
from views.base_view import BaseView
|
|
|
|
|
|
class OptionsButton(Button):
|
|
def __init__(self, driver):
|
|
super().__init__(driver, xpath="(//android.view.ViewGroup[@content-desc='icon'])[2]")
|
|
|
|
|
|
class LogoutButton(SilentButton):
|
|
def __init__(self, driver):
|
|
super().__init__(driver, translation_id="logout")
|
|
|
|
def click(self):
|
|
self.scroll_to_element().click()
|
|
return self.navigate()
|
|
|
|
|
|
class LogoutDialog(BaseView):
|
|
def __init__(self, driver):
|
|
super().__init__(driver)
|
|
self.logout_button = LogoutDialog.LogoutButton(driver)
|
|
|
|
class LogoutButton(SilentButton):
|
|
def __init__(self, driver):
|
|
super().__init__(driver, translation_id="logout", uppercase=True)
|
|
|
|
def navigate(self):
|
|
from views.sign_in_view import SignInView
|
|
return SignInView(self.driver)
|
|
|
|
|
|
class AdvancedButton(Button):
|
|
def __init__(self, driver):
|
|
super().__init__(driver, accessibility_id="icon, Advanced, label-component, icon")
|
|
|
|
def click(self):
|
|
self.scroll_to_element().click()
|
|
return self.navigate()
|
|
|
|
|
|
class RecoveryPhraseTable(Text):
|
|
def __init__(self, driver):
|
|
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,'#')]")
|
|
|
|
@property
|
|
def number(self):
|
|
time.sleep(1)
|
|
return int(self.find_element().text.split('#')[1])
|
|
|
|
|
|
class HelpButton(Button):
|
|
def __init__(self, driver):
|
|
super().__init__(driver, accessibility_id="help-button")
|
|
|
|
def click(self):
|
|
self.scroll_to_element().click()
|
|
|
|
|
|
class SyncSettingsButton(Button):
|
|
def __init__(self, driver):
|
|
super().__init__(driver, accessibility_id="sync-settings-button")
|
|
|
|
def click(self):
|
|
self.scroll_to_element().click()
|
|
|
|
|
|
class ProfilePictureElement(Button):
|
|
def __init__(self, driver):
|
|
super().__init__(driver, accessibility_id="chat-icon")
|
|
|
|
|
|
class ProfileView(BaseView):
|
|
|
|
def __init__(self, driver):
|
|
super().__init__(driver)
|
|
self.options_button = OptionsButton(self.driver)
|
|
|
|
# Header
|
|
self.default_username_text = Text(self.driver, accessibility_id="username")
|
|
self.contact_name_text = Text(self.driver, accessibility_id="contact-name")
|
|
self.profile_picture = ProfilePictureElement(self.driver)
|
|
self.online_indicator = Button(self.driver, accessibility_id="online-profile-photo-dot")
|
|
self.crop_photo_button = Button(self.driver, accessibility_id="Crop")
|
|
self.shutter_button = Button(self.driver, accessibility_id="Shutter")
|
|
self.accept_photo_button = Button(self.driver, accessibility_id="Done")
|
|
|
|
# Contacts
|
|
self.contacts_button = Button(self.driver, accessibility_id="contacts-button")
|
|
|
|
# Privacy and security
|
|
self.privacy_and_security_button = Button(self.driver, accessibility_id="privacy-and-security-settings-button")
|
|
self.reset_password_button = Button(self.driver, accessibility_id="reset-password")
|
|
self.current_password_edit_box = EditBox(self.driver, accessibility_id="current-password")
|
|
self.new_password_edit_box = EditBox(self.driver, accessibility_id="new-password")
|
|
self.confirm_new_password_edit_box = EditBox(self.driver, accessibility_id="confirm-new-password")
|
|
self.current_password_wrong_text = Text(self.driver, accessibility_id="current-password-error")
|
|
|
|
# Appearance
|
|
self.appearance_button = Button(self.driver, accessibility_id="appearance-settings-button")
|
|
|
|
## Backup recovery phrase
|
|
self.backup_recovery_phrase_button = Button(
|
|
self.driver, accessibility_id="icon, Backup recovery phrase, label-component, icon")
|
|
|
|
self.recovery_phrase_table = RecoveryPhraseTable(self.driver)
|
|
self.recovery_phrase_word_number = RecoveryPhraseWordNumberText(self.driver)
|
|
self.recovery_phrase_next_button = Button(self.driver, accessibility_id="Next, icon")
|
|
self.recovery_phrase_word_input = EditBox(self.driver, xpath="//android.widget.EditText")
|
|
|
|
|
|
# Notifications
|
|
self.profile_notifications_button = Button(self.driver,
|
|
accessibility_id="icon, Notifications, label-component, icon")
|
|
self.profile_notifications_toggle_button = Button(self.driver,
|
|
accessibility_id="local-notifications-settings-button")
|
|
self.push_notification_toggle = Button(
|
|
self.driver, xpath="//*[@content-desc='notifications-button']//*[@content-desc='switch']")
|
|
self.wallet_push_notifications = Button(self.driver, accessibility_id="notifications-button")
|
|
|
|
# Sync settings
|
|
self.sync_settings_button = SyncSettingsButton(self.driver)
|
|
self.backup_settings_button = Button(self.driver, accessibility_id="backup-settings-button")
|
|
self.perform_backup_button = Button(self.driver, translation_id="perform-backup")
|
|
|
|
## Device syncing
|
|
self.syncing_button = Button(self.driver, accessibility_id="icon, Syncing, label-component, icon")
|
|
self.paired_devices_button = Button(
|
|
self.driver, xpath="//android.view.ViewGroup[contains(@content-desc,'icon, Paired devices,')]")
|
|
self.sync_plus_button = Button(
|
|
self.driver,
|
|
xpath="//*[@text='Paired devices']/following-sibling::android.view.ViewGroup[@content-desc='icon']")
|
|
|
|
# Advanced
|
|
self.advanced_button = AdvancedButton(self.driver)
|
|
self.log_level_setting_button = Button(self.driver, accessibility_id="log-level-settings-button")
|
|
self.fleet_setting_button = Button(self.driver, accessibility_id="fleet-settings-button")
|
|
|
|
# Need help
|
|
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")
|
|
|
|
# About
|
|
self.app_version_text = Text(self.driver, xpath="//*[@content-desc='app-version']//android.widget.TextView[2]")
|
|
self.node_version_text = Text(self.driver,
|
|
xpath="//*[@content-desc='node-version']//android.widget.TextView[2]")
|
|
|
|
# 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)
|
|
|
|
# New profile
|
|
self.edit_profile_button = Button(self.driver, accessibility_id="icon, Edit Profile, label-component, icon")
|
|
self.change_profile_photo_button = Button(
|
|
self.driver,
|
|
xpath="//*[@content-desc='user-avatar']/following-sibling::android.view.ViewGroup[@content-desc='icon']")
|
|
self.take_photo_button = Button(self.driver, accessibility_id="take-photo-button")
|
|
self.select_from_gallery_button = Button(self.driver, accessibility_id="select-from-gallery-button")
|
|
self.profile_password_button = Button(self.driver, accessibility_id="icon, Password, label-component, icon")
|
|
self.profile_messages_button = Button(self.driver, accessibility_id="icon, Messages, label-component, icon")
|
|
self.profile_blocked_users_button = Button(self.driver, accessibility_id="Blocked users, label-component, icon")
|
|
self.profile_wallet_button = Button(self.driver, accessibility_id="icon, Wallet, label-component, icon")
|
|
self.network_settings_button = Button(self.driver, accessibility_id="Network settings, label-component, icon")
|
|
self.profile_legacy_button = Button(self.driver,
|
|
accessibility_id="icon, Legacy settings, label-component, icon")
|
|
self.testnet_mode_toggle = Button(self.driver, accessibility_id="icon, Testnet mode, label-component")
|
|
self.confirm_testnet_mode_change_button = Button(self.driver, accessibility_id="confirm-testnet-mode-change")
|
|
self.key_pairs_and_accounts_button = Button(self.driver,
|
|
accessibility_id="Key pairs and accounts, label-component, icon")
|
|
self.options_button = Button(self.driver, accessibility_id="options-button")
|
|
self.import_by_entering_recovery_phrase_button = Button(self.driver, accessibility_id="import-seed-phrase")
|
|
|
|
def switch_network(self):
|
|
self.driver.info("Toggling test mode")
|
|
self.profile_wallet_button.click()
|
|
self.network_settings_button.click()
|
|
self.testnet_mode_toggle.click()
|
|
self.confirm_testnet_mode_change_button.click()
|
|
|
|
def switch_push_notifications(self):
|
|
self.driver.info("Enabling push notifications via Profile")
|
|
self.profile_notifications_button.scroll_and_click()
|
|
self.profile_notifications_toggle_button.click()
|
|
self.allow_button.click_if_shown()
|
|
|
|
def get_recovery_phrase(self):
|
|
text = [i.text for i in self.recovery_phrase_table.find_elements()]
|
|
return dict(zip(map(int, text[::2]), text[1::2]))
|
|
|
|
def backup_recovery_phrase(self):
|
|
self.just_fyi("Back up recovery phrase")
|
|
self.backup_recovery_phrase_button.click()
|
|
self.ok_continue_button.click()
|
|
recovery_phrase = self.get_recovery_phrase()
|
|
self.recovery_phrase_next_button.click()
|
|
word_number = self.recovery_phrase_word_number.number
|
|
self.recovery_phrase_word_input.send_keys(recovery_phrase[word_number])
|
|
self.recovery_phrase_next_button.click()
|
|
word_number_1 = self.recovery_phrase_word_number.number
|
|
self.recovery_phrase_word_input.send_keys(recovery_phrase[word_number_1])
|
|
self.done_button.click()
|
|
self.yes_button.click()
|
|
self.ok_got_it_button.click()
|
|
return ' '.join(recovery_phrase.values())
|
|
|
|
def edit_profile_picture(self, image_index: int, update_by="Gallery"):
|
|
self.driver.info("## Setting custom profile image", device=False)
|
|
if not AbstractTestCase().environment == 'lt':
|
|
raise NotImplementedError('Test case is implemented to run on SauceLabs only')
|
|
self.edit_profile_button.click()
|
|
self.change_profile_photo_button.click()
|
|
if update_by == "Gallery":
|
|
self.select_from_gallery_button.click()
|
|
self.select_photo_from_gallery_by_index(image_index)
|
|
else:
|
|
## take by Photo
|
|
self.take_photo()
|
|
self.click_system_back_button()
|
|
self.profile_picture.click()
|
|
self.take_photo()
|
|
self.accept_photo_button.click()
|
|
self.crop_photo_button.click()
|
|
self.driver.info("## Custom profile image has been set", device=False)
|
|
self.click_system_back_button()
|
|
|
|
def take_photo(self):
|
|
self.take_photo_button.click()
|
|
if self.allow_button.is_element_displayed(sec=5):
|
|
self.allow_button.click()
|
|
if self.allow_all_the_time.is_element_displayed(sec=5):
|
|
self.allow_all_the_time.click()
|
|
if self.element_by_text("NEXT").is_element_displayed(sec=5):
|
|
self.element_by_text("NEXT").click()
|
|
self.shutter_button.click()
|
|
|
|
def select_photo_from_gallery_by_index(self, image_index: int):
|
|
self.allow_button.click_if_shown()
|
|
self.allow_all_button.click_if_shown()
|
|
image_element = Button(self.driver, class_name="androidx.cardview.widget.CardView")
|
|
try:
|
|
image_element.find_elements()[image_index].click()
|
|
except IndexError:
|
|
self.click_system_back_button(times=2)
|
|
raise NoSuchElementException("Image with index %s was not found" % image_index) from None
|
|
|
|
def logout(self):
|
|
self.driver.info("Logging out")
|
|
self.logout_button.click()
|
|
self.logout_dialog.logout_button.click()
|
|
self.logout_button.wait_for_invisibility_of_element(30)
|
|
|
|
def get_sync_code(self):
|
|
self.syncing_button.scroll_and_click()
|
|
self.paired_devices_button.click()
|
|
self.sync_plus_button.click()
|
|
for checkbox in Button(
|
|
self.driver,
|
|
xpath="//*[@content-desc='checkbox-off'][@resource-id='checkbox-component']").find_elements():
|
|
checkbox.click()
|
|
self.continue_button.click()
|
|
self.slide_button_track.swipe_right_on_element(width_percentage=1.3)
|
|
password_input = self.password_input.find_element()
|
|
password_input.send_keys(common_password)
|
|
self.login_button.click()
|
|
self.wait_for_staleness_of_element(password_input)
|
|
return self.password_input.text
|
|
|
|
def get_current_device_name(self):
|
|
element = BaseElement(
|
|
self.driver,
|
|
xpath="//android.view.ViewGroup/android.view.ViewGroup[@content-desc='status-tag-positive']/..")
|
|
return element.attribute_value('content-desc').split(',')[1].strip()
|
|
|
|
def get_paired_device_by_name(self, device_name: str):
|
|
|
|
class PairedDeviceElement(BaseElement):
|
|
def __init__(self, driver, device_name):
|
|
super().__init__(driver, xpath="//*[@content-desc='icon, %s, label-component']" % device_name)
|
|
|
|
@property
|
|
def get_pair_button(self):
|
|
return Button(self.driver, xpath=self.locator + "//*[@content-desc='Pair']")
|
|
|
|
@property
|
|
def get_unpair_button(self):
|
|
return Button(self.driver, xpath=self.locator + "//*[@content-desc='Unpair']")
|
|
|
|
return PairedDeviceElement(self.driver, device_name)
|
|
|
|
def get_key_pair_account_by_name(self, account_name: str):
|
|
class KeyPairAccountElement(BaseElement):
|
|
def __init__(self, driver, account_name):
|
|
locator = "//*[@content-desc='account-avatar']/following-sibling::*[@text='%s']" % account_name
|
|
super().__init__(driver, xpath=locator)
|
|
self.address = Text(driver, xpath=locator + "/following-sibling::android.widget.TextView")
|
|
|
|
return KeyPairAccountElement(self.driver, account_name)
|
|
|
|
def get_missing_key_pair_by_name(self, key_pair_name: str):
|
|
return BaseElement(self.driver,
|
|
xpath="//*[@content-desc='missing-keypair-item']//*[@text='%s']" % key_pair_name)
|