2019-07-23 23:10:55 +00:00
|
|
|
from appium.webdriver.common.touch_action import TouchAction
|
2018-07-11 14:14:39 +00:00
|
|
|
from selenium.common.exceptions import NoSuchElementException
|
2021-04-30 09:31:39 +00:00
|
|
|
import os
|
|
|
|
from tests import common_password, appium_root_project_path, app_path
|
2021-01-25 16:35:40 +00:00
|
|
|
from views.base_element import Button, EditBox, Text
|
2018-01-03 09:34:40 +00:00
|
|
|
from views.base_view import BaseView
|
2018-03-31 20:05:11 +00:00
|
|
|
|
2021-01-25 16:35:40 +00:00
|
|
|
class MultiAccountButton(Button):
|
|
|
|
class Username(Text):
|
2019-07-22 23:19:30 +00:00
|
|
|
def __init__(self, driver, locator_value):
|
2021-01-25 16:35:40 +00:00
|
|
|
super(MultiAccountButton.Username, self).__init__(driver,
|
|
|
|
xpath="%s//android.widget.TextView[@content-desc='username']" % locator_value)
|
2020-01-29 07:29:56 +00:00
|
|
|
def __init__(self, driver, position=1):
|
2021-01-25 16:35:40 +00:00
|
|
|
super(MultiAccountButton, self).__init__(driver,
|
|
|
|
xpath="//*[@content-desc='select-account-button-%s']" % position)
|
|
|
|
self.username = self.Username(driver, self.locator)
|
2017-09-21 17:01:04 +00:00
|
|
|
|
|
|
|
|
2021-01-25 16:35:40 +00:00
|
|
|
class MultiAccountOnLoginButton(Button):
|
2020-01-29 07:29:56 +00:00
|
|
|
def __init__(self, driver, position=1):
|
2021-01-25 16:35:40 +00:00
|
|
|
super(MultiAccountOnLoginButton, self).__init__(driver,
|
|
|
|
xpath="(//*[@content-desc='chat-icon'])[%s]/.." % position)
|
2020-01-29 07:29:56 +00:00
|
|
|
|
2021-03-04 09:35:48 +00:00
|
|
|
@property
|
|
|
|
def account_logo(self):
|
|
|
|
class AccountLogo(Text):
|
|
|
|
def __init__(self, driver, parent_locator: str):
|
|
|
|
super().__init__(driver, xpath="%s//*[@content-desc='chat-icon']" % parent_locator)
|
|
|
|
|
|
|
|
return AccountLogo(self.driver, self.locator)
|
|
|
|
|
|
|
|
|
2021-02-26 15:27:20 +00:00
|
|
|
class MoveAndResetButton(Button):
|
|
|
|
def __init__(self, driver):
|
|
|
|
super().__init__(driver, accessibility_id="move-and-reset-button")
|
|
|
|
|
|
|
|
def navigate(self):
|
|
|
|
from views.keycard_view import KeycardView
|
|
|
|
return KeycardView(self.driver)
|
2020-01-29 07:29:56 +00:00
|
|
|
|
2021-03-04 09:35:48 +00:00
|
|
|
|
2021-01-25 16:35:40 +00:00
|
|
|
class BeginRecoveryButton(Button):
|
2020-07-09 11:37:10 +00:00
|
|
|
def __init__(self, driver):
|
2021-02-26 15:27:20 +00:00
|
|
|
super().__init__(driver, translation_id="keycard-recovery-intro-button-text")
|
2020-07-09 11:37:10 +00:00
|
|
|
|
|
|
|
def navigate(self):
|
|
|
|
from views.keycard_view import KeycardView
|
|
|
|
return KeycardView(self.driver)
|
|
|
|
|
|
|
|
def click(self):
|
|
|
|
self.scroll_to_element().click()
|
|
|
|
return self.navigate()
|
|
|
|
|
|
|
|
|
2021-01-25 16:35:40 +00:00
|
|
|
class SignInButton(Button):
|
2017-09-21 17:01:04 +00:00
|
|
|
def __init__(self, driver):
|
2021-02-26 15:27:20 +00:00
|
|
|
super().__init__(driver, translation_id="sign-in")
|
2017-09-21 17:01:04 +00:00
|
|
|
|
2018-01-14 17:43:36 +00:00
|
|
|
def navigate(self):
|
|
|
|
from views.home_view import HomeView
|
|
|
|
return HomeView(self.driver)
|
|
|
|
|
2020-02-12 10:10:19 +00:00
|
|
|
|
2021-01-25 16:35:40 +00:00
|
|
|
class AccessKeyButton(Button):
|
2017-09-26 10:50:34 +00:00
|
|
|
def __init__(self, driver):
|
2021-02-26 15:27:20 +00:00
|
|
|
super().__init__(driver, translation_id="access-existing-keys")
|
2017-09-26 10:50:34 +00:00
|
|
|
|
2021-01-25 16:35:40 +00:00
|
|
|
def click(self):
|
|
|
|
self.scroll_to_element().click()
|
|
|
|
return self.navigate()
|
2017-09-26 10:50:34 +00:00
|
|
|
|
2020-04-03 14:45:45 +00:00
|
|
|
|
2021-01-25 16:35:40 +00:00
|
|
|
class KeycardKeyStorageButton(Button):
|
2020-04-03 14:45:45 +00:00
|
|
|
def __init__(self, driver):
|
2021-02-26 15:27:20 +00:00
|
|
|
super().__init__(driver, accessibility_id="select-storage-:advanced")
|
2020-04-03 14:45:45 +00:00
|
|
|
|
|
|
|
def navigate(self):
|
|
|
|
from views.keycard_view import KeycardView
|
|
|
|
return KeycardView(self.driver)
|
|
|
|
|
|
|
|
def click(self):
|
|
|
|
self.scroll_to_element().click()
|
|
|
|
return self.navigate()
|
|
|
|
|
|
|
|
|
2021-01-25 16:35:40 +00:00
|
|
|
class PrivacyPolicyLink(Button):
|
2020-01-28 12:00:05 +00:00
|
|
|
def __init__(self, driver):
|
2021-01-25 16:35:40 +00:00
|
|
|
super(PrivacyPolicyLink, self).__init__(driver, xpath="//*[contains(@text, 'privacy policy')]")
|
2018-09-05 19:50:48 +00:00
|
|
|
|
2019-07-23 23:10:55 +00:00
|
|
|
def click(self):
|
|
|
|
element = self.find_element()
|
|
|
|
location = element.location
|
|
|
|
size = element.size
|
2020-01-16 15:47:04 +00:00
|
|
|
x = int(location['x'] + size['width'] * 0.9)
|
|
|
|
y = int(location['y'] + size['height'] * 0.8)
|
2019-07-23 23:10:55 +00:00
|
|
|
TouchAction(self.driver).tap(None, x, y).perform()
|
2021-01-25 16:35:40 +00:00
|
|
|
self.driver.info('Click on link %s' % self.name)
|
2019-07-23 23:10:55 +00:00
|
|
|
return self.navigate()
|
|
|
|
|
2018-09-05 19:50:48 +00:00
|
|
|
def navigate(self):
|
|
|
|
from views.web_views.base_web_view import BaseWebView
|
|
|
|
return BaseWebView(self.driver)
|
|
|
|
|
|
|
|
|
2018-01-03 09:34:40 +00:00
|
|
|
class SignInView(BaseView):
|
2017-09-21 17:01:04 +00:00
|
|
|
|
2021-02-26 15:27:20 +00:00
|
|
|
def __init__(self, driver):
|
|
|
|
super().__init__(driver)
|
2017-09-21 17:01:04 +00:00
|
|
|
self.driver = driver
|
2019-07-09 11:37:18 +00:00
|
|
|
|
2021-01-25 16:35:40 +00:00
|
|
|
self.password_input = EditBox(self.driver, accessibility_id="password-input")
|
2017-09-21 17:01:04 +00:00
|
|
|
self.sign_in_button = SignInButton(self.driver)
|
2021-01-25 16:35:40 +00:00
|
|
|
self.access_key_button = AccessKeyButton(self.driver)
|
|
|
|
self.generate_key_button = Button(self.driver, translation_id="generate-new-key")
|
|
|
|
self.your_keys_more_icon = Button(self.driver, accessibility_id="your-keys-more-icon")
|
|
|
|
self.generate_new_key_button = Button(self.driver, accessibility_id="generate-a-new-key")
|
|
|
|
self.create_password_input = EditBox(self.driver,
|
|
|
|
xpath="(//android.widget.EditText[@content-desc='password-input'])[1]")
|
|
|
|
self.confirm_your_password_input = EditBox(self.driver,
|
|
|
|
xpath="(//android.widget.EditText[@content-desc='password-input'])[2]")
|
|
|
|
self.enable_notifications_button = Button(self.driver, accessibility_id="enable-notifications")
|
|
|
|
self.maybe_later_button = Button(self.driver, accessibility_id="maybe-later")
|
2018-09-05 19:50:48 +00:00
|
|
|
self.privacy_policy_link = PrivacyPolicyLink(self.driver)
|
2021-01-25 16:35:40 +00:00
|
|
|
self.lets_go_button = Button(self.driver, accessibility_id="lets-go-button")
|
2020-04-03 14:45:45 +00:00
|
|
|
self.keycard_storage_button = KeycardKeyStorageButton(self.driver)
|
2021-01-25 16:35:40 +00:00
|
|
|
self.first_username_on_choose_chat_name = Text(self.driver,
|
|
|
|
xpath="//*[@content-desc='select-account-button-0']//android.widget.TextView[1]")
|
2021-02-26 15:27:20 +00:00
|
|
|
self.get_keycard_banner = Button(self.driver, translation_id="get-a-keycard")
|
2018-03-01 13:22:01 +00:00
|
|
|
|
2020-07-09 11:37:10 +00:00
|
|
|
#keycard recovery
|
2021-01-25 16:35:40 +00:00
|
|
|
self.recover_with_keycard_button = Button(self.driver, accessibility_id="recover-with-keycard-button")
|
2020-07-09 11:37:10 +00:00
|
|
|
self.begin_recovery_button = BeginRecoveryButton(self.driver)
|
2021-01-25 16:35:40 +00:00
|
|
|
self.pair_to_this_device_button = Button(self.driver, translation_id="pair-card")
|
2020-07-09 11:37:10 +00:00
|
|
|
|
2021-01-25 16:35:40 +00:00
|
|
|
# restore from seed phrase
|
|
|
|
self.seedphrase_input = EditBox(self.driver, xpath="//android.widget.EditText")
|
|
|
|
self.enter_seed_phrase_button = Button(self.driver, accessibility_id="enter-seed-phrase-button")
|
|
|
|
self.reencrypt_your_key_button = Button(self.driver, translation_id="re-encrypt-key")
|
2021-02-26 15:27:20 +00:00
|
|
|
|
|
|
|
# migrate multiaccount
|
|
|
|
self.options_button = Button(self.driver, accessibility_id="sign-in-options")
|
|
|
|
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_and_reset_button = MoveAndResetButton(self.driver)
|
|
|
|
self.choose_storage_button = Button(self.driver, translation_id="choose-storage")
|
|
|
|
self.enter_seed_phrase_next_button = Button(self.driver, translation_id="enter-seed-phrase")
|
|
|
|
self.keycard_required_option = Button(self.driver, translation_id="empty-keycard-required")
|
|
|
|
|
|
|
|
# errors
|
|
|
|
self.custom_seed_phrase_label = Text(self.driver, translation_id="custom-seed-phrase")
|
2021-01-25 16:35:40 +00:00
|
|
|
self.continue_custom_seed_phrase_button = Button(self.driver, accessibility_id="continue-custom-seed-phrase")
|
|
|
|
self.cancel_custom_seed_phrase_button = Button(self.driver, accessibility_id="cancel-custom-seed-phrase")
|
2020-07-09 11:37:10 +00:00
|
|
|
|
2020-12-02 13:18:36 +00:00
|
|
|
def create_user(self, password=common_password, keycard=False, enable_notifications=False, second_user=False):
|
2021-01-25 16:35:40 +00:00
|
|
|
self.driver.info("**Creating new multiaccount (password:%s, keycard:%s)**" % (password, str(keycard)))
|
2020-12-02 13:18:36 +00:00
|
|
|
if not second_user:
|
|
|
|
self.get_started_button.click()
|
2020-07-22 13:30:07 +00:00
|
|
|
self.generate_key_button.click_until_presence_of_element(self.next_button)
|
2021-01-25 16:35:40 +00:00
|
|
|
self.next_button.click_until_absense_of_element(self.element_by_translation_id("intro-wizard-title2"))
|
2020-04-03 14:45:45 +00:00
|
|
|
if keycard:
|
|
|
|
keycard_flow = self.keycard_storage_button.click()
|
2020-04-28 14:40:41 +00:00
|
|
|
keycard_flow.confirm_pin_and_proceed()
|
2020-04-03 14:45:45 +00:00
|
|
|
keycard_flow.backup_seed_phrase()
|
|
|
|
else:
|
|
|
|
self.next_button.click()
|
|
|
|
self.create_password_input.set_value(password)
|
|
|
|
self.confirm_your_password_input.set_value(password)
|
|
|
|
self.next_button.click()
|
2020-07-07 10:20:46 +00:00
|
|
|
self.maybe_later_button.wait_for_visibility_of_element(30)
|
2020-07-20 15:13:09 +00:00
|
|
|
if enable_notifications:
|
|
|
|
self.enable_notifications_button.click()
|
|
|
|
else:
|
|
|
|
self.maybe_later_button.click_until_presence_of_element(self.lets_go_button)
|
2019-11-25 10:32:30 +00:00
|
|
|
self.lets_go_button.click_until_absense_of_element(self.lets_go_button)
|
2019-10-30 18:21:21 +00:00
|
|
|
self.profile_button.wait_for_visibility_of_element(30)
|
2021-01-25 16:35:40 +00:00
|
|
|
self.driver.info("**New multiaccount is created successfully!**")
|
2018-06-28 18:46:51 +00:00
|
|
|
return self.get_home_view()
|
2018-03-01 13:22:01 +00:00
|
|
|
|
2020-09-02 15:57:19 +00:00
|
|
|
def recover_access(self, passphrase: str, password: str = common_password, keycard=False, enable_notifications=False):
|
2021-01-25 16:35:40 +00:00
|
|
|
self.driver.info("**Recover access(password:%s, keycard:%s)**" % (password, str(keycard)))
|
2020-07-01 12:46:08 +00:00
|
|
|
self.get_started_button.click_until_presence_of_element(self.access_key_button)
|
2021-01-25 16:35:40 +00:00
|
|
|
self.access_key_button.click()
|
|
|
|
self.enter_seed_phrase_button.click()
|
|
|
|
self.seedphrase_input.click()
|
|
|
|
self.seedphrase_input.set_value(passphrase)
|
|
|
|
self.next_button.click()
|
|
|
|
self.reencrypt_your_key_button.click()
|
2020-04-28 14:40:41 +00:00
|
|
|
if keycard:
|
|
|
|
keycard_flow = self.keycard_storage_button.click()
|
|
|
|
keycard_flow.confirm_pin_and_proceed()
|
|
|
|
else:
|
2021-01-25 16:35:40 +00:00
|
|
|
self.next_button.click()
|
|
|
|
self.create_password_input.set_value(password)
|
|
|
|
self.confirm_your_password_input.set_value(password)
|
|
|
|
self.next_button.click_until_presence_of_element(self.maybe_later_button)
|
2020-07-07 10:20:46 +00:00
|
|
|
self.maybe_later_button.wait_for_element(30)
|
2020-09-02 15:57:19 +00:00
|
|
|
if enable_notifications:
|
|
|
|
self.enable_notifications_button.click_until_presence_of_element(self.lets_go_button)
|
|
|
|
else:
|
|
|
|
self.maybe_later_button.click_until_presence_of_element(self.lets_go_button)
|
2019-11-18 09:38:34 +00:00
|
|
|
self.lets_go_button.click()
|
|
|
|
self.profile_button.wait_for_visibility_of_element(30)
|
2021-01-25 16:35:40 +00:00
|
|
|
self.driver.info("**Multiaccount is recovered successfully!**")
|
2018-06-28 18:46:51 +00:00
|
|
|
return self.get_home_view()
|
2018-05-02 16:01:17 +00:00
|
|
|
|
2020-07-13 16:06:19 +00:00
|
|
|
def sign_in(self, password=common_password, keycard=False, position=1):
|
2021-01-25 16:35:40 +00:00
|
|
|
self.driver.info("**Sign in (password:%s, keycard:%s)**" % (password, str(keycard)))
|
2020-09-23 11:48:20 +00:00
|
|
|
self.multi_account_on_login_button.wait_for_visibility_of_element(30)
|
2020-07-13 16:06:19 +00:00
|
|
|
self.get_multiaccount_by_position(position).click()
|
|
|
|
|
2020-04-03 14:45:45 +00:00
|
|
|
if keycard:
|
|
|
|
from views.keycard_view import KeycardView
|
|
|
|
keycard_view = KeycardView(self.driver)
|
2020-07-23 09:20:21 +00:00
|
|
|
keycard_view.one_button.wait_for_visibility_of_element(10)
|
2020-07-09 11:37:10 +00:00
|
|
|
keycard_view.connect_selected_card_button.click()
|
2020-07-23 09:20:21 +00:00
|
|
|
keycard_view.enter_default_pin()
|
2020-04-03 14:45:45 +00:00
|
|
|
else:
|
|
|
|
self.password_input.set_value(password)
|
|
|
|
self.sign_in_button.click()
|
2021-01-25 16:35:40 +00:00
|
|
|
self.driver.info("**Signed in successfully!**")
|
2019-10-30 18:21:21 +00:00
|
|
|
return self.get_home_view()
|
2018-04-26 06:22:11 +00:00
|
|
|
|
2020-07-13 16:06:19 +00:00
|
|
|
|
|
|
|
def get_multiaccount_by_position(self, position: int, element_class=MultiAccountOnLoginButton):
|
|
|
|
account_button = element_class(self.driver, position)
|
2019-07-22 23:19:30 +00:00
|
|
|
if account_button.is_element_displayed():
|
|
|
|
return account_button
|
|
|
|
else:
|
2018-08-15 12:51:52 +00:00
|
|
|
raise NoSuchElementException(
|
2019-07-03 14:29:01 +00:00
|
|
|
'Device %s: Unable to find multiaccount by position %s' % (self.driver.number, position)) from None
|
2019-04-02 15:16:08 +00:00
|
|
|
|
|
|
|
def open_weblink_and_login(self, url_weblink):
|
2021-01-25 16:35:40 +00:00
|
|
|
self.driver.info("**Open weblink %s**" % url_weblink)
|
2019-04-02 15:16:08 +00:00
|
|
|
self.open_universal_web_link(url_weblink)
|
|
|
|
self.sign_in()
|
2021-04-30 09:31:39 +00:00
|
|
|
|
|
|
|
def import_db(self, user, import_db_folder_name):
|
|
|
|
self.just_fyi('**Importing database**')
|
|
|
|
import_file_name = 'export.db'
|
|
|
|
home = self.recover_access(user['passphrase'])
|
|
|
|
profile = home.profile_button.click()
|
|
|
|
full_path_to_file = os.path.join(appium_root_project_path, 'views/upgrade_dbs/%s/%s' %
|
|
|
|
(import_db_folder_name, import_file_name))
|
|
|
|
profile.logout()
|
|
|
|
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=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)
|
|
|
|
self.sign_in_button.click()
|
|
|
|
self.home_button.wait_for_element(40)
|
|
|
|
self.just_fyi('**Importing database is finished!**')
|
|
|
|
return self.get_home_view()
|