Added e2e tests for account management verifications

Signed-off-by: yevh-berdnyk <ie.berdnyk@gmail.com>
This commit is contained in:
yevh-berdnyk 2018-05-02 19:01:17 +03:00
parent ca80926433
commit f94e1c5826
No known key found for this signature in database
GPG Key ID: E9B425FDFC4DEA9C
11 changed files with 365 additions and 52 deletions

View File

@ -16,7 +16,7 @@ class TestNetwork(SingleDeviceTestCase):
sign_in_view.create_user() sign_in_view.create_user()
profile_view = sign_in_view.profile_button.click() profile_view = sign_in_view.profile_button.click()
profile_view.switch_network(network) profile_view.switch_network(network)
sign_in_view.first_account_button.click() sign_in_view.click_account_by_position(0)
sign_in_view.password_input.send_keys('qwerty1234') sign_in_view.password_input.send_keys('qwerty1234')
sign_in_view.sign_in_button.click() sign_in_view.sign_in_button.click()
sign_in_view.find_full_text('Wallet', 20) sign_in_view.find_full_text('Wallet', 20)
@ -39,7 +39,7 @@ class TestNetworkChats(MultipleDeviceTestCase):
device_1_public_key = device_1_profile_view.public_key_text.text device_1_public_key = device_1_profile_view.public_key_text.text
if network[0] != 'Ropsten with upstream RPC': if network[0] != 'Ropsten with upstream RPC':
login_d1 = device_1_profile_view.switch_network(network[0]) login_d1 = device_1_profile_view.switch_network(network[0])
login_d1.first_account_button.click() login_d1.click_account_by_position(0)
login_d1.password_input.send_keys('qwerty1234') login_d1.password_input.send_keys('qwerty1234')
login_d1.sign_in_button.click() login_d1.sign_in_button.click()
login_d1.find_full_text('Wallet', 60) login_d1.find_full_text('Wallet', 60)
@ -49,7 +49,7 @@ class TestNetworkChats(MultipleDeviceTestCase):
if network[1] != 'Ropsten with upstream RPC': if network[1] != 'Ropsten with upstream RPC':
device_2_profile_view = device_2.profile_button.click() device_2_profile_view = device_2.profile_button.click()
device_2_sign_in = device_2_profile_view.switch_network(network[1]) device_2_sign_in = device_2_profile_view.switch_network(network[1])
device_2_sign_in.first_account_button.click() device_2_sign_in.click_account_by_position(0)
device_2_sign_in.password_input.send_keys('qwerty1234') device_2_sign_in.password_input.send_keys('qwerty1234')
device_2_home_view = device_2_sign_in.sign_in_button.click() device_2_home_view = device_2_sign_in.sign_in_button.click()
device_2_home_view.find_full_text('Wallet', 60) device_2_home_view.find_full_text('Wallet', 60)

View File

@ -1,3 +1,5 @@
import random
import emoji
import pytest import pytest
import time import time
from tests.base_test_case import SingleDeviceTestCase from tests.base_test_case import SingleDeviceTestCase
@ -8,6 +10,7 @@ from views.sign_in_view import SignInView
@pytest.mark.all @pytest.mark.all
class TestProfileView(SingleDeviceTestCase): class TestProfileView(SingleDeviceTestCase):
@pytest.mark.testrail_case_id(3395)
def test_qr_code_and_its_value(self): def test_qr_code_and_its_value(self):
sign_in_view = SignInView(self.driver) sign_in_view = SignInView(self.driver)
sign_in_view.create_user() sign_in_view.create_user()
@ -16,9 +19,21 @@ class TestProfileView(SingleDeviceTestCase):
key_value = profile_view.public_key_text.text key_value = profile_view.public_key_text.text
time.sleep(5) time.sleep(5)
key_value_from_qr = profile_view.get_text_from_qr() key_value_from_qr = profile_view.get_text_from_qr()
assert key_value == key_value_from_qr if key_value != key_value_from_qr:
self.errors.append("QR code value '%s' doesn't match public key '%s'" % (key_value_from_qr, key_value))
profile_view.cross_icon.click()
wallet_view = profile_view.wallet_button.click()
wallet_view.request_button.click()
wallet_view.qr_code_image.wait_for_element()
key_value = wallet_view.address_text.text
key_value_from_qr = wallet_view.get_text_from_qr()
if key_value_from_qr != "ethereum:%s'" % key_value:
self.errors.append(
"Wallet QR code value '%s' doesn't match wallet address '%s'" % (key_value_from_qr, key_value))
self.verify_no_errors()
@pytest.mark.pr @pytest.mark.pr
@pytest.mark.testrail_case_id(3396)
def test_contact_profile_view(self): def test_contact_profile_view(self):
sign_in_view = SignInView(self.driver) sign_in_view = SignInView(self.driver)
sign_in_view.create_user() sign_in_view.create_user()
@ -29,6 +44,12 @@ class TestProfileView(SingleDeviceTestCase):
chat_view.view_profile_button.click() chat_view.view_profile_button.click()
for text in basic_user['username'], 'In contacts', 'Send transaction', 'Send message', 'Contact code': for text in basic_user['username'], 'In contacts', 'Send transaction', 'Send message', 'Contact code':
chat_view.find_full_text(text) chat_view.find_full_text(text)
chat_view.profile_send_message.click()
chat_view.chat_message_input.wait_for_visibility_of_element()
chat_view.chat_options.click_until_presence_of_element(chat_view.view_profile_button)
chat_view.view_profile_button.click()
chat_view.profile_send_transaction.click()
assert chat_view.chat_message_input.text.strip() == '/send'
@pytest.mark.pr @pytest.mark.pr
def test_network_switch(self): def test_network_switch(self):
@ -37,7 +58,7 @@ class TestProfileView(SingleDeviceTestCase):
profile_view = sign_in_view.profile_button.click() profile_view = sign_in_view.profile_button.click()
profile_view.advanced_button.click() profile_view.advanced_button.click()
sign_in_view = profile_view.switch_network('Rinkeby with upstream RPC') sign_in_view = profile_view.switch_network('Rinkeby with upstream RPC')
sign_in_view.first_account_button.click() sign_in_view.click_account_by_position(0)
sign_in_view.password_input.set_value('qwerty1234') sign_in_view.password_input.set_value('qwerty1234')
sign_in_view.sign_in_button.click() sign_in_view.sign_in_button.click()
sign_in_view.profile_button.click_until_presence_of_element(profile_view.advanced_button) sign_in_view.profile_button.click_until_presence_of_element(profile_view.advanced_button)
@ -45,3 +66,110 @@ class TestProfileView(SingleDeviceTestCase):
desired_network = profile_view.element_by_text('RINKEBY WITH UPSTREAM RPC', 'text') desired_network = profile_view.element_by_text('RINKEBY WITH UPSTREAM RPC', 'text')
desired_network.scroll_to_element() desired_network.scroll_to_element()
assert desired_network.is_element_displayed() assert desired_network.is_element_displayed()
@pytest.mark.testrail_case_id(3398)
def test_profile_picture(self):
sign_in_view = SignInView(self.driver)
sign_in_view.create_user()
profile_view = sign_in_view.profile_button.click()
profile_view.edit_profile_picture(file_name='sauce_logo.png')
profile_view.relogin()
sign_in_view.profile_button.click()
if not profile_view.profile_picture.is_element_image_equals_template():
pytest.fail('Profile picture was not updated')
@pytest.mark.testrail_case_id(3399)
def test_backup_seed_phrase_and_recover_account(self):
sign_in_view = SignInView(self.driver)
sign_in_view.create_user(password='qwerty1234')
home_view = sign_in_view.get_home_view()
public_key = home_view.get_public_key()
profile_view = home_view.get_profile_view()
profile_view.backup_seed_phrase_button.click()
profile_view.ok_continue_button.click()
seed_phrase = profile_view.get_seed_phrase()
profile_view.next_button.click()
word_number = profile_view.seed_phrase_word_number.text
profile_view.seed_phrase_word_input.set_value(seed_phrase[word_number])
profile_view.next_button.click()
word_number_1 = profile_view.seed_phrase_word_number.text
profile_view.seed_phrase_word_input.set_value(seed_phrase[word_number_1])
profile_view.done_button.click()
profile_view.yes_button.click()
profile_view.ok_got_it_button.click()
profile_view.logout_button.click()
profile_view.confirm_logout_button.click()
recover_access_view = sign_in_view.add_existing_account_button.click()
recover_access_view.passphrase_input.set_value(' '.join(seed_phrase.values()))
recover_access_view.password_input.set_value('qwerty1234')
recover_access_view.sign_in_button.click()
sign_in_view.do_not_share.click()
public_key_1 = home_view.get_public_key()
assert public_key == public_key_1
@pytest.mark.testrail_case_id(3411)
def test_debug_on_of(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()
chat_view = home_view.get_chat_with_user('Status Console').click()
chat_view.commands_button.click()
chat_view.debug_command.click()
chat_view.debug_on_command.click()
chat_view.send_message_button.click()
chat_view.wait_for_message_in_one_to_one_chat('Debug server has been launched! You can now execute '
'status-dev-cli scan to find the server from your computer '
'on the same network.', self.errors)
chat_view.wait_for_message_in_one_to_one_chat('Debug mode: On', self.errors)
chat_view.commands_button.click()
chat_view.debug_command.click()
chat_view.debug_off_command.click()
chat_view.send_message_button.click()
chat_view.wait_for_message_in_one_to_one_chat('Debug mode: Off', self.errors)
self.verify_no_errors()
@pytest.mark.testrail_case_id(3421)
def test_switch_users(self):
sign_in_view = SignInView(self.driver)
for _ in range(3):
sign_in_view.create_user(password='qwerty1234')
home_view = sign_in_view.get_home_view()
profile_view = home_view.profile_button.click()
profile_view.logout_button.click()
profile_view.confirm_logout_button.click()
sign_in_view.click_account_by_position(0)
sign_in_view.password_input.send_keys('qwerty1234')
sign_in_view.sign_in_button.click()
sign_in_view.home_button.wait_for_visibility_of_element()
@pytest.mark.testrail_case_id(3424)
def test_incorrect_password(self):
sign_in_view = SignInView(self.driver)
sign_in_view.create_account_button.click()
sign_in_view.password_input.set_value('123456')
sign_in_view.next_button.click()
sign_in_view.confirm_password_input.set_value('123455')
sign_in_view.next_button.click()
sign_in_view.find_full_text("Password confirmation doesn't match password.")
sign_in_view.confirm_password_input.clear()
sign_in_view.confirm_password_input.set_value('123456')
sign_in_view.next_button.click()
sign_in_view.name_input.wait_for_element(45)
emoji_name = random.choice(list(emoji.EMOJI_UNICODE))
username = 'user'
sign_in_view.name_input.click()
sign_in_view.name_input.send_keys(emoji.emojize('%s %s' % (username, emoji_name)))
sign_in_view.next_button.click()
sign_in_view.do_not_share.wait_for_element(10)
sign_in_view.do_not_share.click_until_presence_of_element(sign_in_view.home_button)
profile_view = sign_in_view.profile_button.click()
assert profile_view.username_text.text == '%s %s' % (username, emoji.EMOJI_UNICODE[emoji_name])
profile_view.logout_button.click()
profile_view.confirm_logout_button.click()
sign_in_view.click_account_by_position(0)
sign_in_view.password_input.send_keys('123455')
sign_in_view.sign_in_button.click()
sign_in_view.find_full_text('Wrong password')

View File

@ -18,12 +18,8 @@ class TestSanity(SingleDeviceTestCase):
new_username = 'NewUserName!' new_username = 'NewUserName!'
profile_view.username_input.send_keys(new_username) profile_view.username_input.send_keys(new_username)
profile_view.confirm_button.click() profile_view.confirm_button.click()
sign_in_view = profile_view.logout_button.click() profile_view.relogin()
sign_in_view.first_account_button.click() sign_in_view.profile_button.click()
sign_in_view.password_input.send_keys('qwerty1234')
home_view = sign_in_view.sign_in_button.click()
home_view.find_full_text('Wallet', 60)
home_view.profile_button.click()
profile_view.edit_button.click() profile_view.edit_button.click()
profile_view.find_full_text(new_username, 5) profile_view.find_full_text(new_username, 5)
@ -86,7 +82,7 @@ class TestSanity(SingleDeviceTestCase):
sign_in_view.status_app_icon.scroll_to_element() sign_in_view.status_app_icon.scroll_to_element()
sign_in_view.status_app_icon.click() sign_in_view.status_app_icon.click()
sign_in_view.ok_button.click() sign_in_view.ok_button.click()
sign_in_view.first_account_button.click() sign_in_view.click_account_by_position(0)
sign_in_view.password_input.send_keys('qwerty1234') sign_in_view.password_input.send_keys('qwerty1234')
sign_in_view.sign_in_button.click() sign_in_view.sign_in_button.click()
contact_name.wait_for_element(30) contact_name.wait_for_element(30)
@ -106,7 +102,7 @@ class TestSanity(SingleDeviceTestCase):
profile_view = sign_in_view.profile_button.click() profile_view = sign_in_view.profile_button.click()
profile_view.logout_button.scroll_to_element() profile_view.logout_button.scroll_to_element()
sign_in_view = profile_view.logout_button.click() sign_in_view = profile_view.logout_button.click()
sign_in_view.first_account_button.click() sign_in_view.click_account_by_position(0)
sign_in_view.password_input.send_keys(input_text) sign_in_view.password_input.send_keys(input_text)
sign_in_view.sign_in_button.click() sign_in_view.sign_in_button.click()
sign_in_view.find_full_text(outcome, 60) sign_in_view.find_full_text(outcome, 60)

View File

@ -1,3 +1,7 @@
import base64
from io import BytesIO
import os
from PIL import Image, ImageChops
from appium.webdriver.common.mobileby import MobileBy from appium.webdriver.common.mobileby import MobileBy
from selenium.common.exceptions import NoSuchElementException from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import TimeoutException from selenium.common.exceptions import TimeoutException
@ -7,7 +11,6 @@ from tests import info
class BaseElement(object): class BaseElement(object):
class Locator(object): class Locator(object):
def __init__(self, by, value): def __init__(self, by, value):
@ -50,7 +53,7 @@ class BaseElement(object):
def wait_for_element(self, seconds=10): def wait_for_element(self, seconds=10):
try: try:
return WebDriverWait(self.driver, seconds)\ return WebDriverWait(self.driver, seconds) \
.until(expected_conditions.presence_of_element_located((self.locator.by, self.locator.value))) .until(expected_conditions.presence_of_element_located((self.locator.by, self.locator.value)))
except TimeoutException as exception: except TimeoutException as exception:
exception.msg = "'%s' is not found on screen, using: '%s', during '%s' seconds" % (self.name, self.locator, exception.msg = "'%s' is not found on screen, using: '%s', during '%s' seconds" % (self.name, self.locator,
@ -59,7 +62,7 @@ class BaseElement(object):
def wait_for_visibility_of_element(self, seconds=10): def wait_for_visibility_of_element(self, seconds=10):
try: try:
return WebDriverWait(self.driver, seconds)\ return WebDriverWait(self.driver, seconds) \
.until(expected_conditions.visibility_of_element_located((self.locator.by, self.locator.value))) .until(expected_conditions.visibility_of_element_located((self.locator.by, self.locator.value)))
except TimeoutException as exception: except TimeoutException as exception:
exception.msg = "'%s' is not found on screen, using: '%s', during '%s' seconds" % (self.name, self.locator, exception.msg = "'%s' is not found on screen, using: '%s', during '%s' seconds" % (self.name, self.locator,
@ -92,6 +95,24 @@ class BaseElement(object):
def text(self): def text(self):
return self.find_element().text return self.find_element().text
@property
def template(self):
try:
return self.__template
except FileNotFoundError:
raise FileNotFoundError('Please add %s image as template' % self.name)
@template.setter
def template(self, value):
self.__template = Image.open(os.sep.join(__file__.split(os.sep)[:-1]) + '/elements_templates/%s' % value)
@property
def image(self):
return Image.open(BytesIO(base64.b64decode(self.find_element().screenshot_as_base64)))
def is_element_image_equals_template(self):
return not ImageChops.difference(self.image, self.template).getbbox()
class BaseEditBox(BaseElement): class BaseEditBox(BaseElement):

View File

@ -25,7 +25,7 @@ class BackButton(BaseButton):
class AllowButton(BaseButton): class AllowButton(BaseButton):
def __init__(self, driver): def __init__(self, driver):
super(AllowButton, self).__init__(driver) super(AllowButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='Allow']") self.locator = self.Locator.xpath_selector("//*[@text='Allow' or @text='ALLOW']")
def click(self): def click(self):
try: try:
@ -290,3 +290,24 @@ class BaseView(object):
def public_key_to_address(self, public_key): def public_key_to_address(self, public_key):
raw_public_key = bytearray.fromhex(public_key.replace('0x04', '')) raw_public_key = bytearray.fromhex(public_key.replace('0x04', ''))
return datatypes.PublicKey(raw_public_key).to_address()[2:] return datatypes.PublicKey(raw_public_key).to_address()[2:]
def get_back_to_home_view(self):
counter = 0
while not self.home_button.is_element_displayed(2):
try:
if counter >= 5:
return
self.back_button.click()
except (NoSuchElementException, TimeoutException):
counter += 1
def relogin(self):
self.get_back_to_home_view()
profile_view = self.profile_button.click()
profile_view.logout_button.click()
profile_view.confirm_logout_button.click()
sign_in_view = self.get_sign_in_view()
sign_in_view.click_account_by_position(0)
sign_in_view.password_input.send_keys('qwerty1234')
sign_in_view.sign_in_button.click()
sign_in_view.home_button.wait_for_visibility_of_element()

View File

@ -42,6 +42,25 @@ class RequestCommand(BaseButton):
self.locator = self.Locator.accessibility_id('request-payment-button') self.locator = self.Locator.accessibility_id('request-payment-button')
class DebugCommand(BaseButton):
def __init__(self, driver):
super(DebugCommand, self).__init__(driver)
self.locator = self.Locator.xpath_selector(
"//*[contains(@text,'Starts/stops')]/preceding-sibling::*[@text='/debug']")
class DebugOnCommand(BaseButton):
def __init__(self, driver):
super(DebugOnCommand, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='On']")
class DebugOffCommand(BaseButton):
def __init__(self, driver):
super(DebugOffCommand, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='Off']")
class ChatMenuButton(BaseButton): class ChatMenuButton(BaseButton):
def __init__(self, driver): def __init__(self, driver):
super(ChatMenuButton, self).__init__(driver) super(ChatMenuButton, self).__init__(driver)
@ -99,12 +118,6 @@ class MoreUsersButton(BaseButton):
self.locator = self.Locator.xpath_selector("//android.widget.TextView[contains(@text, 'MORE')]") self.locator = self.Locator.xpath_selector("//android.widget.TextView[contains(@text, 'MORE')]")
class UserProfileDetails(BaseButton):
def __init__(self, driver):
super(UserProfileDetails, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='Profile']")
class OpenInBrowserButton(BaseButton): class OpenInBrowserButton(BaseButton):
def __init__(self, driver): def __init__(self, driver):
super(OpenInBrowserButton, self).__init__(driver) super(OpenInBrowserButton, self).__init__(driver)
@ -127,6 +140,18 @@ class ViewProfileButton(BaseButton):
self.locator = self.Locator.xpath_selector('//*[@text="View profile"]') self.locator = self.Locator.xpath_selector('//*[@text="View profile"]')
class ProfileSendMessageButton(BaseButton):
def __init__(self, driver):
super(ProfileSendMessageButton, self).__init__(driver)
self.locator = self.Locator.accessibility_id('start-conversation-button')
class ProfileSendTransactionButton(BaseButton):
def __init__(self, driver):
super(ProfileSendTransactionButton, self).__init__(driver)
self.locator = self.Locator.accessibility_id('send-transaction-button')
class ChatView(BaseView): class ChatView(BaseView):
def __init__(self, driver): def __init__(self, driver):
super(ChatView, self).__init__(driver) super(ChatView, self).__init__(driver)
@ -138,6 +163,9 @@ class ChatView(BaseView):
self.commands_button = CommandsButton(self.driver) self.commands_button = CommandsButton(self.driver)
self.send_command = SendCommand(self.driver) self.send_command = SendCommand(self.driver)
self.request_command = RequestCommand(self.driver) self.request_command = RequestCommand(self.driver)
self.debug_command = DebugCommand(self.driver)
self.debug_on_command = DebugOnCommand(self.driver)
self.debug_off_command = DebugOffCommand(self.driver)
self.chat_options = ChatMenuButton(self.driver) self.chat_options = ChatMenuButton(self.driver)
self.members_button = MembersButton(self.driver) self.members_button = MembersButton(self.driver)
@ -151,10 +179,12 @@ class ChatView(BaseView):
self.first_recipient_button = FirstRecipient(self.driver) self.first_recipient_button = FirstRecipient(self.driver)
self.user_profile_details = UserProfileDetails(self.driver)
self.open_in_browser_button = OpenInBrowserButton(self.driver) self.open_in_browser_button = OpenInBrowserButton(self.driver)
# Contact's profile
self.profile_send_message = ProfileSendMessageButton(self.driver)
self.profile_send_transaction = ProfileSendTransactionButton(self.driver)
def wait_for_syncing_complete(self): def wait_for_syncing_complete(self):
info('Waiting for syncing complete:') info('Waiting for syncing complete:')
while True: while True:

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

View File

@ -82,16 +82,6 @@ class HomeView(BaseView):
def get_chat_with_user(self, username): def get_chat_with_user(self, username):
return ChatElement(self.driver, username) return ChatElement(self.driver, username)
def get_back_to_home_view(self):
counter = 0
while not self.home_button.is_element_displayed(2):
try:
if counter >= 5:
return
self.back_button.click()
except (NoSuchElementException, TimeoutException):
counter += 1
def add_contact(self, public_key): def add_contact(self, public_key):
start_new_chat = self.plus_button.click() start_new_chat = self.plus_button.click()
start_new_chat.start_new_chat_button.click() start_new_chat.start_new_chat_button.click()

View File

@ -1,6 +1,8 @@
import time import time
from tests import info from tests import info
from views.base_element import BaseText, BaseButton, BaseEditBox from tests.base_test_case import AbstractTestCase
from views.base_element import BaseText, BaseButton, BaseEditBox, BaseElement
from views.base_view import BaseView from views.base_view import BaseView
@ -74,14 +76,12 @@ class LogoutButton(BaseButton):
super(LogoutButton, self).__init__(driver) super(LogoutButton, self).__init__(driver)
self.locator = self.Locator.accessibility_id('log-out-button') self.locator = self.Locator.accessibility_id('log-out-button')
def click(self):
self.scroll_to_element() class ConfirmLogoutButton(BaseButton):
for _ in range(2):
self.find_element().click() def __init__(self, driver):
time.sleep(2) super(ConfirmLogoutButton, self).__init__(driver)
info('Tap on %s' % self.name) self.locator = self.Locator.xpath_selector("//*[@text='LOG OUT']")
from views.sign_in_view import SignInView
return SignInView(self.driver)
class UserNameText(BaseText): class UserNameText(BaseText):
@ -105,6 +105,19 @@ class EditButton(BaseButton):
self.locator = self.Locator.accessibility_id('edit-button') self.locator = self.Locator.accessibility_id('edit-button')
class ProfilePictureElement(BaseElement):
def __init__(self, driver):
super(ProfilePictureElement, self).__init__(driver)
self.locator = self.Locator.accessibility_id('chat-icon')
class EditPictureButton(BaseButton):
def __init__(self, driver):
super(EditPictureButton, self).__init__(driver)
self.locator = self.Locator.accessibility_id('edit-profile-photo-button')
class ConfirmButton(BaseButton): class ConfirmButton(BaseButton):
def __init__(self, driver): def __init__(self, driver):
@ -131,6 +144,72 @@ class AdvancedButton(BaseButton):
return self.navigate() return self.navigate()
class BackupSeedPhraseButton(BaseButton):
def __init__(self, driver):
super(BackupSeedPhraseButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='Backup your Seed Phrase']")
class OkContinueButton(BaseButton):
def __init__(self, driver):
super(OkContinueButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='OK, CONTINUE']")
class SeedPhraseTable(BaseText):
def __init__(self, driver):
super(SeedPhraseTable, self).__init__(driver)
self.locator = self.Locator.xpath_selector(
'//android.widget.FrameLayout/android.view.ViewGroup[3]/android.widget.TextView')
class SeedPhraseWordNumberText(BaseText):
def __init__(self, driver):
super(SeedPhraseWordNumberText, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[contains(@text,'#')]")
@property
def text(self):
time.sleep(1)
return self.find_element().text.split('#')[1]
class SeedPhraseWordInput(BaseEditBox):
def __init__(self, driver):
super(SeedPhraseWordInput, self).__init__(driver)
self.locator = self.Locator.xpath_selector('//android.widget.EditText')
class OkGotItButton(BaseButton):
def __init__(self, driver):
super(OkGotItButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='OK, GOT IT']")
class DebugModeToggle(BaseButton):
def __init__(self, driver):
super(DebugModeToggle, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//android.widget.Switch")
def click(self):
self.scroll_to_element()
super(DebugModeToggle, self).click()
class SelectFromGalleryButton(BaseButton):
def __init__(self, driver):
super(SelectFromGalleryButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='Select from gallery']")
class ProfileView(BaseView): class ProfileView(BaseView):
def __init__(self, driver): def __init__(self, driver):
@ -148,15 +227,28 @@ class ProfileView(BaseView):
self.network_settings_button = NetworkSettingsButton(self.driver) self.network_settings_button = NetworkSettingsButton(self.driver)
self.connect_button = NetworkSettingsButton.ConnectButton(self.driver) self.connect_button = NetworkSettingsButton.ConnectButton(self.driver)
self.logout_button = LogoutButton(self.driver) self.logout_button = LogoutButton(self.driver)
self.confirm_logout_button = ConfirmLogoutButton(self.driver)
# new design # new design
self.username_text = UserNameText(self.driver) self.username_text = UserNameText(self.driver)
self.share_my_contact_key_button = ShareMyContactKeyButton(self.driver) self.share_my_contact_key_button = ShareMyContactKeyButton(self.driver)
self.edit_button = EditButton(self.driver) 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_button = ConfirmButton(self.driver)
self.cross_icon = CrossIcon(self.driver) self.cross_icon = CrossIcon(self.driver)
self.advanced_button = AdvancedButton(self.driver) self.advanced_button = AdvancedButton(self.driver)
self.debug_mode_toggle = DebugModeToggle(self.driver)
# Backup seed phrase
self.backup_seed_phrase_button = BackupSeedPhraseButton(self.driver)
self.ok_continue_button = OkContinueButton(self.driver)
self.seed_phrase_table = SeedPhraseTable(self.driver)
self.seed_phrase_word_number = SeedPhraseWordNumberText(self.driver)
self.seed_phrase_word_input = SeedPhraseWordInput(self.driver)
self.ok_got_it_button = OkGotItButton(self.driver)
self.select_from_gallery_button = SelectFromGalleryButton(self.driver)
def switch_network(self, network): def switch_network(self, network):
self.network_settings_button.scroll_to_element() self.network_settings_button.scroll_to_element()
@ -170,3 +262,20 @@ class ProfileView(BaseView):
def get_address(self): def get_address(self):
profile_view = self.profile_button.click() profile_view = self.profile_button.click()
return profile_view.profile_address_text.text return profile_view.profile_address_text.text
def get_seed_phrase(self):
text = [i.text for i in self.seed_phrase_table.find_elements()]
return dict(zip(text[::2], text[1::2]))
def edit_profile_picture(self, file_name: str):
if AbstractTestCase().environment == 'sauce':
self.profile_picture.template = file_name
self.edit_button.click()
self.edit_picture_button.click()
self.select_from_gallery_button.click()
if self.allow_button.is_element_displayed(sec=10):
self.allow_button.click()
self.element_by_text(file_name).click()
self.confirm_button.click()
else:
raise NotImplementedError('Test case is implemented to run on SauceLabs only')

View File

@ -1,14 +1,13 @@
from tests import get_current_time from tests import get_current_time
from views.base_element import BaseButton, BaseEditBox from views.base_element import BaseButton, BaseEditBox
from views.base_view import BaseView from views.base_view import BaseView
import time
class FirstAccountButton(BaseButton): class AccountButton(BaseButton):
def __init__(self, driver): def __init__(self, driver):
super(FirstAccountButton, self).__init__(driver) super(AccountButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//android.widget.ScrollView//android.widget.TextView") self.locator = self.Locator.xpath_selector("//*[contains(@text,'0x')]")
class PasswordInput(BaseEditBox): class PasswordInput(BaseEditBox):
@ -44,7 +43,8 @@ class RecoverAccessButton(BaseButton):
class CreateAccountButton(BaseButton): class CreateAccountButton(BaseButton):
def __init__(self, driver): def __init__(self, driver):
super(CreateAccountButton, self).__init__(driver) super(CreateAccountButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//android.widget.TextView[@text='CREATE ACCOUNT']") self.locator = self.Locator.xpath_selector(
"//android.widget.TextView[@text='CREATE ACCOUNT' or @text='CREATE NEW ACCOUNT']")
class IHaveAccountButton(RecoverAccessButton): class IHaveAccountButton(RecoverAccessButton):
@ -68,7 +68,7 @@ class ConfirmPasswordInput(BaseEditBox):
class NameInput(BaseEditBox): class NameInput(BaseEditBox):
def __init__(self, driver): def __init__(self, driver):
super(NameInput, self).__init__(driver) super(NameInput, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//android.widget.TextView[@text='Name']") self.locator = self.Locator.xpath_selector("//android.widget.EditText")
class DonNotShare(BaseButton): class DonNotShare(BaseButton):
@ -84,7 +84,7 @@ class SignInView(BaseView):
super(SignInView, self).__init__(driver) super(SignInView, self).__init__(driver)
self.driver = driver self.driver = driver
self.first_account_button = FirstAccountButton(self.driver) self.account_button = AccountButton(self.driver)
self.password_input = PasswordInput(self.driver) self.password_input = PasswordInput(self.driver)
self.sign_in_button = SignInButton(self.driver) self.sign_in_button = SignInButton(self.driver)
self.recover_access_button = RecoverAccessButton(self.driver) self.recover_access_button = RecoverAccessButton(self.driver)
@ -104,7 +104,7 @@ class SignInView(BaseView):
self.confirm_password_input.set_value(password) self.confirm_password_input.set_value(password)
self.next_button.click() self.next_button.click()
self.name_input.wait_for_element(45) self.name_input.wait_for_element(45)
self.name_input.set_value('user_%s' % get_current_time()) self.name_input.send_keys('user_%s' % get_current_time())
self.next_button.click() self.next_button.click()
self.do_not_share.wait_for_element(10) self.do_not_share.wait_for_element(10)
self.do_not_share.click_until_presence_of_element(self.home_button) self.do_not_share.click_until_presence_of_element(self.home_button)
@ -118,3 +118,6 @@ class SignInView(BaseView):
recover_access_view.sign_in_button.click() recover_access_view.sign_in_button.click()
self.do_not_share.wait_for_element(10) self.do_not_share.wait_for_element(10)
self.do_not_share.click_until_presence_of_element(self.home_button) self.do_not_share.click_until_presence_of_element(self.home_button)
def click_account_by_position(self, position: int):
self.account_button.find_elements()[position].click()

View File

@ -98,6 +98,18 @@ class DoneButton(BaseButton):
self.locator = self.Locator.accessibility_id('done-button') self.locator = self.Locator.accessibility_id('done-button')
class QRCodeImage(BaseButton):
def __init__(self, driver):
super(QRCodeImage, self).__init__(driver)
self.locator = self.Locator.accessibility_id('qr-code-image')
class AddressText(BaseButton):
def __init__(self, driver):
super(AddressText, self).__init__(driver)
self.locator = self.Locator.accessibility_id('address-text')
class WalletView(BaseView): class WalletView(BaseView):
def __init__(self, driver): def __init__(self, driver):
super(WalletView, self).__init__(driver) super(WalletView, self).__init__(driver)
@ -117,6 +129,9 @@ class WalletView(BaseView):
self.stt_check_box = STTCheckBox(self.driver) self.stt_check_box = STTCheckBox(self.driver)
self.done_button = DoneButton(self.driver) self.done_button = DoneButton(self.driver)
self.qr_code_image = QRCodeImage(self.driver)
self.address_text = AddressText(self.driver)
def get_usd_total_value(self): def get_usd_total_value(self):
return float(self.usd_total_value.text) return float(self.usd_total_value.text)