Changed xpath locators to accessibility labels in end to end tests

Signed-off-by: Anton Danchenko <ant.danchenko@gmail.com>
This commit is contained in:
yevh-berdnyk 2018-03-15 22:01:08 +02:00 committed by Anton Danchenko
parent 1248a469a6
commit b0a2bbe27b
No known key found for this signature in database
GPG Key ID: C2D4819B698627E4
19 changed files with 143 additions and 171 deletions

View File

@ -3,11 +3,13 @@ import sys
import re import re
import subprocess import subprocess
import asyncio import asyncio
from selenium.common.exceptions import WebDriverException
from tests import test_suite_data, start_threads
from os import environ from os import environ
from appium import webdriver from appium import webdriver
from abc import ABCMeta, abstractmethod from abc import ABCMeta, abstractmethod
from selenium.common.exceptions import WebDriverException
from tests import test_suite_data, start_threads
from views.base_view import BaseView
class AbstractTestCase: class AbstractTestCase:
@ -54,7 +56,7 @@ class AbstractTestCase:
desired_caps['build'] = pytest.config.getoption('build') desired_caps['build'] = pytest.config.getoption('build')
desired_caps['name'] = test_suite_data.current_test.name desired_caps['name'] = test_suite_data.current_test.name
desired_caps['platformName'] = 'Android' desired_caps['platformName'] = 'Android'
desired_caps['appiumVersion'] = '1.7.1' desired_caps['appiumVersion'] = '1.7.2'
desired_caps['platformVersion'] = '6.0' desired_caps['platformVersion'] = '6.0'
desired_caps['deviceName'] = 'Android GoogleAPI Emulator' desired_caps['deviceName'] = 'Android GoogleAPI Emulator'
desired_caps['deviceOrientation'] = "portrait" desired_caps['deviceOrientation'] = "portrait"
@ -69,7 +71,7 @@ class AbstractTestCase:
desired_caps['app'] = pytest.config.getoption('apk') desired_caps['app'] = pytest.config.getoption('apk')
desired_caps['deviceName'] = 'nexus_5' desired_caps['deviceName'] = 'nexus_5'
desired_caps['platformName'] = 'Android' desired_caps['platformName'] = 'Android'
desired_caps['appiumVersion'] = '1.7.1' desired_caps['appiumVersion'] = '1.7.2'
desired_caps['platformVersion'] = '6.0' desired_caps['platformVersion'] = '6.0'
desired_caps['newCommandTimeout'] = 600 desired_caps['newCommandTimeout'] = 600
desired_caps['fullReset'] = False desired_caps['fullReset'] = False
@ -113,6 +115,7 @@ class SingleDeviceTestCase(AbstractTestCase):
self.driver = webdriver.Remote(capabilities[self.environment]['executor'], self.driver = webdriver.Remote(capabilities[self.environment]['executor'],
capabilities[self.environment]['capabilities']) capabilities[self.environment]['capabilities'])
self.driver.implicitly_wait(self.implicitly_wait) self.driver.implicitly_wait(self.implicitly_wait)
BaseView(self.driver).accept_agreements()
test_suite_data.current_test.jobs.append(self.driver.session_id) test_suite_data.current_test.jobs.append(self.driver.session_id)
break break
except WebDriverException: except WebDriverException:
@ -137,6 +140,7 @@ class LocalMultipleDeviceTestCase(AbstractTestCase):
for driver in range(quantity): for driver in range(quantity):
self.drivers[driver] = webdriver.Remote(self.executor_local, capabilities[driver]) self.drivers[driver] = webdriver.Remote(self.executor_local, capabilities[driver])
self.drivers[driver].implicitly_wait(self.implicitly_wait) self.drivers[driver].implicitly_wait(self.implicitly_wait)
BaseView(self.drivers[driver]).accept_agreements()
test_suite_data.current_test.jobs.append(self.drivers[driver].session_id) test_suite_data.current_test.jobs.append(self.drivers[driver].session_id)
def teardown_method(self, method): def teardown_method(self, method):
@ -164,6 +168,7 @@ class SauceMultipleDeviceTestCase(AbstractTestCase):
self.capabilities_sauce_lab)) self.capabilities_sauce_lab))
for driver in range(quantity): for driver in range(quantity):
self.drivers[driver].implicitly_wait(self.implicitly_wait) self.drivers[driver].implicitly_wait(self.implicitly_wait)
BaseView(self.drivers[driver]).accept_agreements()
test_suite_data.current_test.jobs.append(self.drivers[driver].session_id) test_suite_data.current_test.jobs.append(self.drivers[driver].session_id)
def teardown_method(self, method): def teardown_method(self, method):

View File

@ -4,7 +4,7 @@ import pytest
import emoji import emoji
from tests.base_test_case import MultipleDeviceTestCase from tests.base_test_case import MultipleDeviceTestCase
from tests import group_chat_users from tests import group_chat_users, get_current_time
from views.sign_in_view import SignInView from views.sign_in_view import SignInView
unicode_text_message = '%s%s%s%s %s%s%s%s%s%s%s' % (chr(355), chr(275), chr(353), chr(539), chr(1084), chr(949), unicode_text_message = '%s%s%s%s %s%s%s%s%s%s%s' % (chr(355), chr(275), chr(353), chr(539), chr(1084), chr(949),
@ -106,7 +106,7 @@ class TestMessages(MultipleDeviceTestCase):
home_1.add_contact(public_key) home_1.add_contact(public_key)
home_1.get_back_to_home_view() home_1.get_back_to_home_view()
chat_name = 'super_group_chat' chat_name = 'a_chat_%s' % get_current_time()
home_1.create_group_chat(sorted([username_2, username_3]), chat_name) home_1.create_group_chat(sorted([username_2, username_3]), chat_name)
chat_1 = home_1.get_chat_view() chat_1 = home_1.get_chat_view()
text_message = 'This is text message!' text_message = 'This is text message!'
@ -117,27 +117,27 @@ class TestMessages(MultipleDeviceTestCase):
chat_2, chat_3 = home_2.get_chat_view(), home_3.get_chat_view() chat_2, chat_3 = home_2.get_chat_view(), home_3.get_chat_view()
for chat in chat_2, chat_3: for chat in chat_2, chat_3:
chat.wait_for_messages_by_user(username_1, text_message, self.errors) chat.wait_for_messages(username_1, text_message, self.errors)
chat_2.chat_message_input.send_keys(emoji.emojize(emoji_name)) chat_2.chat_message_input.send_keys(emoji.emojize(emoji_name))
chat_2.send_message_button.click() chat_2.send_message_button.click()
for chat in chat_1, chat_3: for chat in chat_1, chat_3:
chat.wait_for_messages_by_user(username_2, emoji_unicode, self.errors) chat.wait_for_messages(username_2, emoji_unicode, self.errors)
message_with_emoji = 'message with emoji' message_with_emoji = 'message with emoji'
chat_3.chat_message_input.send_keys(emoji.emojize('%s %s' % (message_with_emoji, emoji_name_1))) chat_3.chat_message_input.send_keys(emoji.emojize('%s %s' % (message_with_emoji, emoji_name_1)))
chat_3.send_message_button.click() chat_3.send_message_button.click()
for chat in chat_1, chat_2: for chat in chat_1, chat_2:
chat.wait_for_messages_by_user(username_3, '%s %s' % (message_with_emoji, emoji_unicode_1), self.errors) chat.wait_for_messages(username_3, '%s %s' % (message_with_emoji, emoji_unicode_1), self.errors)
chat_1.chat_message_input.send_keys(unicode_text_message) chat_1.chat_message_input.send_keys(unicode_text_message)
chat_1.send_message_button.click() chat_1.send_message_button.click()
for chat in chat_2, chat_3: for chat in chat_2, chat_3:
chat.wait_for_messages_by_user(username_1, unicode_text_message, self.errors) chat.wait_for_messages(username_1, unicode_text_message, self.errors)
for chat in chat_1, chat_2, chat_3: # for chat in chat_1, chat_2, chat_3:
chat.delete_chat(chat_name, self.errors) # chat.delete_chat(chat_name, self.errors)
self.verify_no_errors() self.verify_no_errors()
@ -160,7 +160,7 @@ class TestMessages(MultipleDeviceTestCase):
for message in messages_to_send_1: for message in messages_to_send_1:
chat_1.chat_message_input.send_keys(message) chat_1.chat_message_input.send_keys(message)
chat_1.send_message_button.click() chat_1.send_message_button.click()
chat_2.wait_for_messages_by_user(users[0], messages_to_send_1, self.errors) chat_2.wait_for_messages(users[0], messages_to_send_1, self.errors)
message_with_emoji = 'message with emoji' message_with_emoji = 'message with emoji'
messages_to_send_2 = [emoji.emojize(emoji_name), emoji.emojize('%s %s' % (message_with_emoji, emoji_name_1))] messages_to_send_2 = [emoji.emojize(emoji_name), emoji.emojize('%s %s' % (message_with_emoji, emoji_name_1))]
@ -170,7 +170,7 @@ class TestMessages(MultipleDeviceTestCase):
chat_2.send_message_button.click() chat_2.send_message_button.click()
chat_2.send_as_keyevent(message_with_new_line) chat_2.send_as_keyevent(message_with_new_line)
chat_2.send_message_button.click() chat_2.send_message_button.click()
chat_1.wait_for_messages_by_user(users[1], messages_to_receive_2, self.errors) chat_1.wait_for_messages(users[1], messages_to_receive_2, self.errors)
for chat in chat_1, chat_2: for chat in chat_1, chat_2:
chat.delete_chat(chat_name, self.errors) chat.delete_chat(chat_name, self.errors)
self.verify_no_errors() self.verify_no_errors()

View File

@ -35,9 +35,13 @@ class TestProfileView(SingleDeviceTestCase):
sign_in_view = SignInView(self.driver) sign_in_view = SignInView(self.driver)
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.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.first_account_button.click()
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()
desired_network = sign_in_view.element_by_text('RINKEBY WITH UPSTREAM RPC') sign_in_view.profile_button.click_until_presence_of_element(profile_view.advanced_button)
sign_in_view.profile_button.click_until_presence_of_element(desired_network) profile_view.advanced_button.click()
desired_network = profile_view.element_by_text('RINKEBY WITH UPSTREAM RPC', 'text')
desired_network.scroll_to_element()
assert desired_network.is_element_displayed()

View File

@ -68,7 +68,7 @@ class TestSanity(SingleDeviceTestCase):
sign_in_view.create_user() sign_in_view.create_user()
home_view = sign_in_view.get_home_view() home_view = sign_in_view.get_home_view()
start_new_chat_view = home_view.plus_button.click() start_new_chat_view = home_view.plus_button.click()
start_new_chat_view.add_new_contact.click() start_new_chat_view.start_new_chat_button.click()
contact_jarrad = home_view.element_by_text('Jarrad', 'button') contact_jarrad = home_view.element_by_text('Jarrad', 'button')
contact_jarrad.scroll_to_element() contact_jarrad.scroll_to_element()
contact_jarrad.click() contact_jarrad.click()
@ -82,7 +82,7 @@ class TestSanity(SingleDeviceTestCase):
sign_in_view.apps_button.click() sign_in_view.apps_button.click()
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_apk.click() sign_in_view.ok_button.click()
sign_in_view.first_account_button.click() sign_in_view.first_account_button.click()
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()

View File

@ -135,7 +135,7 @@ class TestTransaction(SingleDeviceTestCase):
send_transaction.done_button.click_until_presence_of_element(send_transaction.sign_later_button) send_transaction.done_button.click_until_presence_of_element(send_transaction.sign_later_button)
send_transaction.sign_later_button.click() send_transaction.sign_later_button.click()
send_transaction.yes_button.click() send_transaction.yes_button.click()
send_transaction.ok_button_apk.click() send_transaction.ok_button.click()
transactions_view = wallet_view.transactions_button.click() transactions_view = wallet_view.transactions_button.click()
transactions_view.unsigned_tab.click() transactions_view.unsigned_tab.click()
transactions_view.sign_button.click() transactions_view.sign_button.click()
@ -157,10 +157,6 @@ class TestTransaction(SingleDeviceTestCase):
home_view.add_contact(recipient['public_key']) home_view.add_contact(recipient['public_key'])
home_view.get_back_to_home_view() home_view.get_back_to_home_view()
wallet_view = home_view.wallet_button.click() wallet_view = home_view.wallet_button.click()
wallet_view.options_button.click_until_presence_of_element(wallet_view.manage_assets_button)
wallet_view.manage_assets_button.click()
wallet_view.stt_check_box.click()
wallet_view.done_button.click()
send_transaction = wallet_view.send_button.click() send_transaction = wallet_view.send_button.click()
send_transaction.select_asset_button.click_until_presence_of_element(send_transaction.stt_button) send_transaction.select_asset_button.click_until_presence_of_element(send_transaction.stt_button)
send_transaction.stt_button.click() send_transaction.stt_button.click()

View File

@ -57,6 +57,15 @@ class BaseElement(object):
seconds) seconds)
raise exception raise exception
def wait_for_visibility_of_element(self, seconds=10):
try:
return WebDriverWait(self.driver, seconds)\
.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,
seconds)
raise exception
def scroll_to_element(self): def scroll_to_element(self):
for _ in range(9): for _ in range(9):
try: try:
@ -68,8 +77,14 @@ class BaseElement(object):
def is_element_present(self, sec=5): def is_element_present(self, sec=5):
try: try:
info('Wait for %s' % self.name) info('Wait for %s' % self.name)
self.wait_for_element(sec) return self.wait_for_element(sec)
return True except TimeoutException:
return False
def is_element_displayed(self, sec=5):
try:
info('Wait for %s' % self.name)
return self.wait_for_visibility_of_element(sec)
except TimeoutException: except TimeoutException:
return False return False

View File

@ -3,7 +3,7 @@ import base64
import zbarlight import zbarlight
from tests import info from tests import info
from eth_keys import datatypes from eth_keys import datatypes
from selenium.common.exceptions import NoSuchElementException from selenium.common.exceptions import NoSuchElementException, TimeoutException
from PIL import Image from PIL import Image
from datetime import datetime from datetime import datetime
from io import BytesIO from io import BytesIO
@ -13,7 +13,7 @@ from views.base_element import BaseButton, BaseElement, BaseEditBox, BaseText
class BackButton(BaseButton): class BackButton(BaseButton):
def __init__(self, driver): def __init__(self, driver):
super(BackButton, self).__init__(driver) super(BackButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@content-desc='toolbar-back-button']") self.locator = self.Locator.accessibility_id('back-button')
def click(self, times_to_click: int = 1): def click(self, times_to_click: int = 1):
for _ in range(times_to_click): for _ in range(times_to_click):
@ -66,16 +66,16 @@ class OkButton(BaseButton):
self.locator = self.Locator.xpath_selector("//*[@text='OK']") self.locator = self.Locator.xpath_selector("//*[@text='OK']")
class ContinueButtonAPK(BaseButton): class ContinueButton(BaseButton):
def __init__(self, driver): def __init__(self, driver):
super(ContinueButtonAPK, self).__init__(driver) super(ContinueButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='Continue']") self.locator = self.Locator.xpath_selector("//*[@text='Continue']")
class HomeButton(BaseButton): class HomeButton(BaseButton):
def __init__(self, driver): def __init__(self, driver):
super(HomeButton, self).__init__(driver) super(HomeButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='Home']/..") self.locator = self.Locator.accessibility_id('home-tab-button')
def navigate(self): def navigate(self):
from views.home_view import HomeView from views.home_view import HomeView
@ -85,7 +85,7 @@ class HomeButton(BaseButton):
class WalletButton(BaseButton): class WalletButton(BaseButton):
def __init__(self, driver): def __init__(self, driver):
super(WalletButton, self).__init__(driver) super(WalletButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='Wallet']/..") self.locator = self.Locator.accessibility_id('wallet-tab-button')
def click(self): def click(self):
from views.wallet_view import TransactionsButton from views.wallet_view import TransactionsButton
@ -100,7 +100,7 @@ class WalletButton(BaseButton):
class ProfileButton(BaseButton): class ProfileButton(BaseButton):
def __init__(self, driver): def __init__(self, driver):
super(ProfileButton, self).__init__(driver) super(ProfileButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='Profile']/..") self.locator = self.Locator.accessibility_id('profile-tab-button')
def navigate(self): def navigate(self):
from views.profile_view import ProfileView from views.profile_view import ProfileView
@ -171,8 +171,8 @@ class BaseView(object):
self.back_button = BackButton(self.driver) self.back_button = BackButton(self.driver)
self.allow_button = AllowButton(self.driver) self.allow_button = AllowButton(self.driver)
self.deny_button = DenyButton(self.driver) self.deny_button = DenyButton(self.driver)
self.continue_button_apk = ContinueButtonAPK(self.driver) self.continue_button = ContinueButton(self.driver)
self.ok_button_apk = OkButton(self.driver) self.ok_button = OkButton(self.driver)
self.next_button = NextButton(self.driver) self.next_button = NextButton(self.driver)
self.save_button = SaveButton(self.driver) self.save_button = SaveButton(self.driver)
self.done_button = DoneButton(self.driver) self.done_button = DoneButton(self.driver)
@ -188,6 +188,14 @@ class BaseView(object):
'text': BaseText 'text': BaseText
} }
def accept_agreements(self):
for i in self.ok_button, self.continue_button:
try:
i.wait_for_element(4)
i.click()
except (NoSuchElementException, TimeoutException):
pass
@property @property
def logcat(self): def logcat(self):
return self.driver.get_log("logcat") return self.driver.get_log("logcat")

View File

@ -121,7 +121,8 @@ class OpenInBrowserButton(BaseButton):
class CommandsButton(BaseButton): class CommandsButton(BaseButton):
def __init__(self, driver): def __init__(self, driver):
super(CommandsButton, self).__init__(driver) super(CommandsButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector('(// android.view.ViewGroup[@ content-desc="icon"])[3]') self.locator = self.Locator.xpath_selector(
'//*[@content-desc="chat-message-input"]/..//android.view.ViewGroup[@content-desc="icon"]')
class ViewProfileButton(BaseButton): class ViewProfileButton(BaseButton):
@ -186,6 +187,22 @@ class ChatView(BaseView):
errors.append('Not received messages from user %s: "%s"' % (username, ', '.join( errors.append('Not received messages from user %s: "%s"' % (username, ', '.join(
[i for i in list(set(expected_messages) - set(received_messages))]))) [i for i in list(set(expected_messages) - set(received_messages))])))
def wait_for_messages(self, username: str, expected_messages: list, errors: list, wait_time: int = 30):
expected_messages = expected_messages if type(expected_messages) == list else [expected_messages]
repeat = 0
received_messages = list()
while repeat <= wait_time:
for message in expected_messages:
if self.element_by_text(message, 'text').is_element_present(1):
received_messages.append(message)
if not set(expected_messages) - set(received_messages):
break
time.sleep(3)
repeat += 3
if set(expected_messages) - set(received_messages):
errors.append('Not received messages from user %s: "%s"' % (username, ', '.join(
[i for i in list(set(expected_messages) - set(received_messages))])))
def send_eth_to_request(self, request, sender_password): def send_eth_to_request(self, request, sender_password):
gas_popup = self.element_by_text_part('Specify amount') gas_popup = self.element_by_text_part('Specify amount')
request.click_until_presence_of_element(gas_popup) request.click_until_presence_of_element(gas_popup)

View File

@ -45,15 +45,6 @@ class ConsoleView(BaseView):
self.recover_button = RecoverButton(self.driver) self.recover_button = RecoverButton(self.driver)
self.chat_request_input = ChatRequestInput(self.driver) self.chat_request_input = ChatRequestInput(self.driver)
self.accept_agreements()
def accept_agreements(self):
for i in self.ok_button_apk, self.continue_button_apk:
try:
i.click()
except (NoSuchElementException, TimeoutException):
pass
def create_user(self): def create_user(self):
self.request_password_icon.click() self.request_password_icon.click()
self.chat_request_input.send_keys("qwerty1234") self.chat_request_input.send_keys("qwerty1234")

View File

@ -24,8 +24,7 @@ class PlusButton(BaseButton):
class PublicKeyEditBox(BaseEditBox): class PublicKeyEditBox(BaseEditBox):
def __init__(self, driver): def __init__(self, driver):
super(PublicKeyEditBox, self).__init__(driver) super(PublicKeyEditBox, self).__init__(driver)
self.locator = \ self.locator = self.Locator.accessibility_id('enter-contact-code-input')
self.Locator.xpath_selector("//*[@text='Enter contact code']")
class ConfirmPublicKeyButton(BaseButton): class ConfirmPublicKeyButton(BaseButton):

View File

@ -1,28 +0,0 @@
from views.base_view import BaseView
import time
from views.base_element import *
class AllRecent(BaseButton):
def __init__(self, driver):
super(AllRecent, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='Recent statuses']/..//*[@text='ALL']")
class AllPopular(BaseButton):
def __init__(self, driver):
super(AllPopular, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='Popular #hashtags']/..//*[@text='ALL']")
class DiscoverView(BaseView):
def __init__(self, driver):
super(DiscoverView, self).__init__(driver)
self.driver = driver
self.all_popular = AllPopular(self.driver)
self.all_recent = AllRecent(self.driver)

View File

@ -14,6 +14,12 @@ class PlusButton(BaseButton):
from views.start_new_chat_view import StartNewChatView from views.start_new_chat_view import StartNewChatView
return StartNewChatView(self.driver) return StartNewChatView(self.driver)
def click(self):
from views.start_new_chat_view import StartNewChatButton
desired_element = StartNewChatButton(self.driver)
self.click_until_presence_of_element(desired_element=desired_element)
return self.navigate()
class ConsoleButton(BaseButton): class ConsoleButton(BaseButton):
def __init__(self, driver): def __init__(self, driver):
@ -70,7 +76,7 @@ class HomeView(BaseView):
def get_back_to_home_view(self): def get_back_to_home_view(self):
counter = 0 counter = 0
while not self.home_button.is_element_present(): while not self.home_button.is_element_displayed(2):
try: try:
if counter >= 5: if counter >= 5:
return return
@ -80,9 +86,11 @@ class HomeView(BaseView):
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.add_new_contact.click() start_new_chat.start_new_chat_button.click()
start_new_chat.public_key_edit_box.send_keys(public_key) start_new_chat.public_key_edit_box.set_value(public_key)
start_new_chat.confirm() start_new_chat.confirm()
one_to_one_chat = self.get_chat_view()
one_to_one_chat.chat_message_input.wait_for_element(60)
def create_group_chat(self, user_names_to_add: list, group_chat_name: str = 'new_group_chat'): def create_group_chat(self, user_names_to_add: list, group_chat_name: str = 'new_group_chat'):
start_new_chat = self.plus_button.click() start_new_chat = self.plus_button.click()

View File

@ -1,36 +0,0 @@
from views.base_view import BaseView
from views.base_element import *
class ProfileIcon(BaseButton):
def __init__(self, driver):
super(ProfileIcon, self).__init__(driver)
self.locator = self.Locator.accessibility_id('drawer-profile-icon')
def navigate(self):
from views.profile_view import ProfileView
return ProfileView(self.driver)
class SwitchUsersButton(BaseButton):
def __init__(self, driver):
super(SwitchUsersButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//android.widget.TextView[@text='SWITCH USERS']")
def click(self):
self.find_element().click()
info('Tap on %s' % self.name)
return self.navigate()
def navigate(self):
from views.sign_in_view import SignInView
return SignInView(self.driver)
class ProfileDrawer(BaseView):
def __init__(self, driver):
super(ProfileDrawer, self).__init__(driver)
self.driver = driver
self.profile_icon = ProfileIcon(self.driver)
self.switch_users_button = SwitchUsersButton(self.driver)

View File

@ -1,5 +1,4 @@
import time import time
import pytest
from tests import info from tests import info
from views.base_element import BaseText, BaseButton, BaseEditBox from views.base_element import BaseText, BaseButton, BaseEditBox
from views.base_view import BaseView from views.base_view import BaseView
@ -9,7 +8,7 @@ class PublicKeyText(BaseText):
def __init__(self, driver): def __init__(self, driver):
super(PublicKeyText, self).__init__(driver) super(PublicKeyText, self).__init__(driver)
self.locator = self.Locator.xpath_selector('//*[contains(@text, "0x04")]') self.locator = self.Locator.accessibility_id('address-text')
@property @property
def text(self): def text(self):
@ -55,7 +54,7 @@ class NetworkSettingsButton(BaseButton):
def __init__(self, driver): def __init__(self, driver):
super(NetworkSettingsButton, self).__init__(driver) super(NetworkSettingsButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector('//*[@text="Network"]') self.locator = self.Locator.accessibility_id('network-button')
class NetworkButton(BaseButton): class NetworkButton(BaseButton):
def __init__(self, driver, network): def __init__(self, driver, network):
@ -66,7 +65,7 @@ class NetworkSettingsButton(BaseButton):
def __init__(self, driver): def __init__(self, driver):
super(NetworkSettingsButton.ConnectButton, self).__init__(driver) super(NetworkSettingsButton.ConnectButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector('//*[@text="CONNECT"]') self.locator = self.Locator.accessibility_id('network-connect-button')
class LogoutButton(BaseButton): class LogoutButton(BaseButton):
@ -96,29 +95,40 @@ class ShareMyContactKeyButton(BaseButton):
def __init__(self, driver): def __init__(self, driver):
super(ShareMyContactKeyButton, self).__init__(driver) super(ShareMyContactKeyButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector('//*[@text="SHARE MY CONTACT CODE"]') self.locator = self.Locator.accessibility_id('share-my-contact-code-button')
class EditButton(BaseButton): class EditButton(BaseButton):
def __init__(self, driver): def __init__(self, driver):
super(EditButton, self).__init__(driver) super(EditButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector('//*[@text="EDIT"]') self.locator = self.Locator.accessibility_id('edit-button')
class ConfirmButton(BaseButton): class ConfirmButton(BaseButton):
def __init__(self, driver): def __init__(self, driver):
super(ConfirmButton, self).__init__(driver) super(ConfirmButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector('(//android.view.ViewGroup[@content-desc="icon"])[1]') self.locator = self.Locator.accessibility_id('done-button')
class CrossIcon(BaseButton): class CrossIcon(BaseButton):
def __init__(self, driver): def __init__(self, driver):
super(CrossIcon, self).__init__(driver) super(CrossIcon, self).__init__(driver)
self.locator = self.Locator.xpath_selector( self.locator = self.Locator.accessibility_id('done-button')
'(// android.view.ViewGroup[@ content-desc="icon"])[1]/android.view.View')
class AdvancedButton(BaseButton):
def __init__(self, driver):
super(AdvancedButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector('//*[@text="Advanced"]')
def click(self):
self.scroll_to_element().click()
info('Tap on %s' % self.name)
return self.navigate()
class ProfileView(BaseView): class ProfileView(BaseView):
@ -146,6 +156,7 @@ class ProfileView(BaseView):
self.edit_button = EditButton(self.driver) self.edit_button = EditButton(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)
def switch_network(self, network): def switch_network(self, network):
self.network_settings_button.scroll_to_element() self.network_settings_button.scroll_to_element()

View File

@ -1,32 +1,30 @@
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
from selenium.common.exceptions import NoSuchElementException, TimeoutException
class FirstRecipient(BaseButton): class FirstRecipient(BaseButton):
def __init__(self, driver): def __init__(self, driver):
super(FirstRecipient, self).__init__(driver) super(FirstRecipient, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='Choose recipient']/.." self.locator = self.Locator.accessibility_id('chat-icon')
"//android.widget.ImageView[@content-desc='chat-icon']")
class SignTransactionButton(BaseButton): class SignTransactionButton(BaseButton):
def __init__(self, driver): def __init__(self, driver):
super(SignTransactionButton, self).__init__(driver) super(SignTransactionButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='SIGN TRANSACTION']") self.locator = self.Locator.accessibility_id('sign-transaction-button')
class SignLaterButton(BaseButton): class SignLaterButton(BaseButton):
def __init__(self, driver): def __init__(self, driver):
super(SignLaterButton, self).__init__(driver) super(SignLaterButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='SIGN LATER']") self.locator = self.Locator.accessibility_id('sign-later-button')
class AmountEditBox(BaseEditBox, BaseButton): class AmountEditBox(BaseEditBox, BaseButton):
def __init__(self, driver): def __init__(self, driver):
super(AmountEditBox, self).__init__(driver) super(AmountEditBox, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='Amount']/..//android.widget.EditText") self.locator = self.Locator.accessibility_id('amount-input')
class PasswordInput(BaseEditBox): class PasswordInput(BaseEditBox):
@ -38,7 +36,7 @@ class PasswordInput(BaseEditBox):
class EnterPasswordInput(BaseEditBox): class EnterPasswordInput(BaseEditBox):
def __init__(self, driver): def __init__(self, driver):
super(EnterPasswordInput, self).__init__(driver) super(EnterPasswordInput, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//android.widget.EditText[@NAF='true']") self.locator = self.Locator.accessibility_id('enter-password-input')
class ConfirmButton(BaseButton): class ConfirmButton(BaseButton):
@ -50,14 +48,14 @@ class ConfirmButton(BaseButton):
class GotItButton(BaseButton): class GotItButton(BaseButton):
def __init__(self, driver): def __init__(self, driver):
super(GotItButton, self).__init__(driver) super(GotItButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='GOT IT']") self.locator = self.Locator.accessibility_id('got-it-button')
class ChooseRecipientButton(BaseButton): class ChooseRecipientButton(BaseButton):
def __init__(self, driver): def __init__(self, driver):
super(ChooseRecipientButton, self).__init__(driver) super(ChooseRecipientButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='Specify recipient...']") self.locator = self.Locator.accessibility_id('choose-recipient-button')
def click(self): def click(self):
desired_element = EnterRecipientAddressButton(self.driver) desired_element = EnterRecipientAddressButton(self.driver)
@ -85,7 +83,7 @@ class RecentRecipientsButton(BaseButton):
class SelectAssetButton(BaseButton): class SelectAssetButton(BaseButton):
def __init__(self, driver): def __init__(self, driver):
super(SelectAssetButton, self).__init__(driver) super(SelectAssetButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector('(//android.view.ViewGroup[@content-desc="icon"])[4]/..') self.locator = self.Locator.accessibility_id('choose-asset-button')
class STTButton(BaseButton): class STTButton(BaseButton):

View File

@ -1,4 +1,3 @@
from selenium.common.exceptions import NoSuchElementException, TimeoutException
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
@ -89,15 +88,6 @@ class SignInView(BaseView):
self.confirm_password_input = ConfirmPasswordInput(self.driver) self.confirm_password_input = ConfirmPasswordInput(self.driver)
self.name_input = NameInput(self.driver) self.name_input = NameInput(self.driver)
self.accept_agreements()
def accept_agreements(self):
for i in self.ok_button_apk, self.continue_button_apk:
try:
i.click()
except (NoSuchElementException, TimeoutException):
pass
def create_user(self): def create_user(self):
self.create_account_button.click() self.create_account_button.click()
self.password_input.set_value('qwerty1234') self.password_input.set_value('qwerty1234')

View File

@ -2,60 +2,54 @@ from views.base_element import BaseButton, BaseEditBox
from views.contacts_view import ContactsView from views.contacts_view import ContactsView
class AddNewContactButton(BaseButton): class StartNewChatButton(BaseButton):
def __init__(self, driver): def __init__(self, driver):
super(AddNewContactButton, self).__init__(driver) super(StartNewChatButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector( self.locator = self.Locator.accessibility_id('start-1-1-chat-button')
"//android.widget.TextView[@text='Start new chat']")
class NewGroupChatButton(BaseButton): class NewGroupChatButton(BaseButton):
def __init__(self, driver): def __init__(self, driver):
super(NewGroupChatButton, self).__init__(driver) super(NewGroupChatButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector( self.locator = self.Locator.accessibility_id('start-group-chat-button')
"//android.widget.TextView[@text='Start group chat']")
class JoinPublicChatButton(BaseButton): class JoinPublicChatButton(BaseButton):
def __init__(self, driver): def __init__(self, driver):
super(JoinPublicChatButton, self).__init__(driver) super(JoinPublicChatButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector( self.locator = self.Locator.accessibility_id('join-public-chat-button')
"//android.widget.TextView[@text='Join public chat']")
class ChatNameEditBox(BaseEditBox): class ChatNameEditBox(BaseEditBox):
def __init__(self, driver): def __init__(self, driver):
super(ChatNameEditBox, self).__init__(driver) super(ChatNameEditBox, self).__init__(driver)
self.locator = \ self.locator = self.Locator.accessibility_id('chat-name-input')
self.Locator.xpath_selector("//android.widget.EditText")
class OpenDAapButton(BaseButton): class OpenDAapButton(BaseButton):
def __init__(self, driver): def __init__(self, driver):
super(OpenDAapButton, self).__init__(driver) super(OpenDAapButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector( self.locator = self.Locator.accessibility_id('open-dapp-button')
"//android.widget.TextView[@text='Open ÐApp']")
class OpenButton(BaseButton): class OpenButton(BaseButton):
def __init__(self, driver): def __init__(self, driver):
super(OpenButton, self).__init__(driver) super(OpenButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector( self.locator = self.Locator.accessibility_id('open-dapp-button')
"//android.widget.TextView[@text='Open']")
class ConfirmButton(BaseButton): class ConfirmButton(BaseButton):
def __init__(self, driver): def __init__(self, driver):
super(ConfirmButton, self).__init__(driver) super(ConfirmButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector('(//android.view.ViewGroup[@content-desc="icon"])[2]') self.locator = self.Locator.accessibility_id('create-button')
class EnterUrlEditbox(BaseEditBox): class EnterUrlEditbox(BaseEditBox):
def __init__(self, driver): def __init__(self, driver):
super(EnterUrlEditbox, self).__init__(driver) super(EnterUrlEditbox, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//android.widget.EditText") self.locator = self.Locator.accessibility_id('dapp-url-input')
class UsernameCheckbox(BaseButton): class UsernameCheckbox(BaseButton):
@ -68,7 +62,7 @@ class StartNewChatView(ContactsView):
def __init__(self, driver): def __init__(self, driver):
super(StartNewChatView, self).__init__(driver) super(StartNewChatView, self).__init__(driver)
self.add_new_contact = AddNewContactButton(self.driver) self.start_new_chat_button = StartNewChatButton(self.driver)
self.new_group_chat_button = NewGroupChatButton(self.driver) self.new_group_chat_button = NewGroupChatButton(self.driver)
self.join_public_chat_button = JoinPublicChatButton(self.driver) self.join_public_chat_button = JoinPublicChatButton(self.driver)

View File

@ -56,18 +56,18 @@ class TransactionTable(BaseElement):
class HistoryTab(BaseButton): class HistoryTab(BaseButton):
def __init__(self, driver): def __init__(self, driver):
super(HistoryTab, self).__init__(driver) super(HistoryTab, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='HISTORY']") self.locator = self.Locator.accessibility_id('history-button')
class UnsignedTab(BaseButton): class UnsignedTab(BaseButton):
def __init__(self, driver): def __init__(self, driver):
super(UnsignedTab, self).__init__(driver) super(UnsignedTab, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='UNSIGNED']") self.locator = self.Locator.accessibility_id('unsigned-transactions-button')
class SignButton(BaseButton): class SignButton(BaseButton):
def __init__(self, driver): def __init__(self, driver):
super(UnsignedTab.SignButton, self).__init__(driver) super(UnsignedTab.SignButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='SIGN']") self.locator = self.Locator.accessibility_id('sign-button')
class TransactionsView(BaseView): class TransactionsView(BaseView):

View File

@ -7,7 +7,7 @@ class SendButton(BaseButton):
def __init__(self, driver): def __init__(self, driver):
super(SendButton, self).__init__(driver) super(SendButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='Send transaction']") self.locator = self.Locator.accessibility_id('send-transaction-button')
def navigate(self): def navigate(self):
from views.send_transaction_view import SendTransactionView from views.send_transaction_view import SendTransactionView
@ -18,7 +18,7 @@ class RequestButton(BaseButton):
def __init__(self, driver): def __init__(self, driver):
super(RequestButton, self).__init__(driver) super(RequestButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='Receive transaction']") self.locator = self.Locator.accessibility_id('receive-transaction-button')
def navigate(self): def navigate(self):
from views.send_transaction_view import SendTransactionView from views.send_transaction_view import SendTransactionView
@ -29,21 +29,21 @@ class SendRequestButton(BaseButton):
def __init__(self, driver): def __init__(self, driver):
super(SendRequestButton, self).__init__(driver) super(SendRequestButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='SEND REQUEST']") self.locator = self.Locator.accessibility_id('sent-request-button')
class ChooseRecipientButton(BaseButton): class ChooseRecipientButton(BaseButton):
def __init__(self, driver): def __init__(self, driver):
super(ChooseRecipientButton, self).__init__(driver) super(ChooseRecipientButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='Choose recipient...']") self.locator = self.Locator.accessibility_id('choose-recipient-button')
class TransactionsButton(BaseButton): class TransactionsButton(BaseButton):
def __init__(self, driver): def __init__(self, driver):
super(TransactionsButton, self).__init__(driver) super(TransactionsButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='Transaction History']") self.locator = self.Locator.accessibility_id('transaction-history-button')
def navigate(self): def navigate(self):
from views.transactions_view import TransactionsView from views.transactions_view import TransactionsView
@ -71,13 +71,13 @@ class UsdTotalValueText(BaseText):
class SendTransactionRequestButton(BaseButton): class SendTransactionRequestButton(BaseButton):
def __init__(self, driver): def __init__(self, driver):
super(SendTransactionRequestButton, self).__init__(driver) super(SendTransactionRequestButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='SEND A TRANSACTION REQUEST']") self.locator = self.Locator.accessibility_id('sent-transaction-request-button')
class OptionsButton(BaseButton): class OptionsButton(BaseButton):
def __init__(self, driver): def __init__(self, driver):
super(OptionsButton, self).__init__(driver) super(OptionsButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector('(//android.view.ViewGroup[@content-desc="icon"])[1]') self.locator = self.Locator.accessibility_id('options-menu-button')
class ManageAssetsButton(BaseButton): class ManageAssetsButton(BaseButton):
@ -89,13 +89,13 @@ class ManageAssetsButton(BaseButton):
class STTCheckBox(BaseButton): class STTCheckBox(BaseButton):
def __init__(self, driver): def __init__(self, driver):
super(STTCheckBox, self).__init__(driver) super(STTCheckBox, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='STT']//..//android.widget.CheckBox") self.locator = self.Locator.xpath_selector("//*[@text='STT']/../android.widget.CheckBox")
class DoneButton(BaseButton): class DoneButton(BaseButton):
def __init__(self, driver): def __init__(self, driver):
super(DoneButton, self).__init__(driver) super(DoneButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='Done']") self.locator = self.Locator.accessibility_id('done-button')
class WalletView(BaseView): class WalletView(BaseView):