Signed-off-by: yevh-berdnyk <ie.berdnyk@gmail.com>
This commit is contained in:
Anton Danchenko 2018-03-28 13:21:39 +03:00 committed by yevh-berdnyk
parent f8e73f8538
commit b2f5146a8a
No known key found for this signature in database
GPG Key ID: E9B425FDFC4DEA9C
15 changed files with 110 additions and 72 deletions

View File

@ -67,17 +67,17 @@ transaction_users['B_USER']['username'] = "Brief Organic Xenops"
transaction_users['B_USER']['address'] = "3d672407a7e1250bbff85b7cfdb456f5015164db"
transaction_users['B_USER']['public_key'] = "0x0406b17e5cdfadb2a05e84508b1a2916def6395e6295f57e92b85f915d40bca3" \
"f4a7e4c6d6b25afa840dd042fac83d3f856181d553f34f1c2b12878e774adde099"
transaction_users['С_USER'] = dict()
transaction_users['С_USER']['password'] = "qwerty"
transaction_users['С_USER']['passphrase'] = "romance emerge transfer trial enemy average casino decline old bag mandate winner"
transaction_users['С_USER']['username'] = "Speedy Occasional Lightningbug"
transaction_users['С_USER']['address'] = "853bdd57e881ed09d045ceee53564a00e1da3cf9"
transaction_users['С_USER']['public_key'] = "0x04aa3f3977b0c06ce04f4cdfd2ea5baf5560e18aba52324f6d4bf69bbd603b60" \
transaction_users['C_USER'] = dict()
transaction_users['C_USER']['password'] = "qwerty"
transaction_users['C_USER']['passphrase'] = "romance emerge transfer trial enemy average casino decline old bag mandate winner"
transaction_users['C_USER']['username'] = "Speedy Occasional Lightningbug"
transaction_users['C_USER']['address'] = "853bdd57e881ed09d045ceee53564a00e1da3cf9"
transaction_users['C_USER']['public_key'] = "0x04aa3f3977b0c06ce04f4cdfd2ea5baf5560e18aba52324f6d4bf69bbd603b60" \
"0e874ed483920d9613882e7345b70b1d95c6ca4ee8b18089da1d064c498355c944"
transaction_users['D_USER'] = dict()
transaction_users['D_USER']['password'] = "qwerty"
transaction_users['D_USER']['passphrase'] = "grit half victory alarm code chicken drill worth valve rug clown guess"
transaction_users['D_USER']['username'] = "Frilly Mediumdpringgreen Kingsnake"
transaction_users['D_USER']['username'] = "Frilly Mediumspringgreen Kingsnake"
transaction_users['D_USER']['address'] = "1bd914e370a63714ee144692002046c7e6d83348"
transaction_users['D_USER']['public_key'] = "0x041aa2bbf1cc1253bf658a4a44289cdd0031f0038f8d085b1a43b69550e3467b" \
"c1f7963c35d0016d9c23d28960b984045c00bd9373b413b1d19aa4370261b8d084"

View File

@ -57,12 +57,15 @@ class AbstractTestCase:
desired_caps['name'] = test_suite_data.current_test.name
desired_caps['platformName'] = 'Android'
desired_caps['appiumVersion'] = '1.7.2'
desired_caps['platformVersion'] = '6.0'
desired_caps['platformVersion'] = '7.1'
desired_caps['deviceName'] = 'Android GoogleAPI Emulator'
desired_caps['deviceOrientation'] = "portrait"
desired_caps['commandTimeout'] = 600
desired_caps['idleTimeout'] = 1000
desired_caps['unicodeKeyboard'] = True
desired_caps['automationName'] = 'UiAutomator2'
desired_caps['setWebContentDebuggingEnabled'] = True
desired_caps['ignoreUnimportantViews'] = False
return desired_caps
@property
@ -72,10 +75,12 @@ class AbstractTestCase:
desired_caps['deviceName'] = 'nexus_5'
desired_caps['platformName'] = 'Android'
desired_caps['appiumVersion'] = '1.7.2'
desired_caps['platformVersion'] = '6.0'
desired_caps['platformVersion'] = '7.1'
desired_caps['newCommandTimeout'] = 600
desired_caps['fullReset'] = False
desired_caps['unicodeKeyboard'] = True
desired_caps['automationName'] = 'UiAutomator2'
desired_caps['setWebContentDebuggingEnabled'] = True
return desired_caps
@abstractmethod

View File

@ -4,7 +4,7 @@ from views.sign_in_view import SignInView
@pytest.mark.all
class TestDappsAnsBrowsing(SingleDeviceTestCase):
class TestDAppsAndBrowsing(SingleDeviceTestCase):
@pytest.mark.pr
def test_browse_link_entering_url_in_dapp_view(self):
@ -13,12 +13,12 @@ class TestDappsAnsBrowsing(SingleDeviceTestCase):
home_view = sign_in.get_home_view()
start_new_chat = home_view.plus_button.click()
start_new_chat.open_d_app_button.click()
start_new_chat.enter_url_editbox.send_keys('status.im')
start_new_chat.enter_url_editbox.set_value('status.im')
start_new_chat.confirm()
browsing_view = home_view.get_base_web_view()
browsing_view.wait_for_d_aap_to_load()
browsing_view.find_full_text('Status, the Ethereum discovery tool.')
browsing_view.back_to_home_button.click()
assert home_view.first_chat_element_title.text == 'Status | The Mobile Ethereum Client'
home_view.swipe_and_delete_chat('Status | The Mobile Ethereum Client')
assert home_view.chat_name_text.text in 'Status | The Mobile Ethereum Client'
assert home_view.chat_url_text.text in 'https://status.im/'

View File

@ -62,6 +62,7 @@ class TestMessages(MultipleDeviceTestCase):
device_2_chat.send_message_button.click()
device_1_chat.wait_for_message_in_one_to_one_chat('%s %s' % (message_with_emoji, emoji_unicode_1), self.errors)
device_1_chat.chat_message_input.click()
device_1_chat.send_as_keyevent(message_with_new_line)
device_1_chat.send_message_button.click()
device_2_chat.wait_for_message_in_one_to_one_chat(message_with_new_line, self.errors)
@ -73,13 +74,13 @@ class TestMessages(MultipleDeviceTestCase):
if device_1_chat.element_by_text(url_message, 'button').is_element_present():
device_1_chat.element_by_text(url_message, 'button').click()
web_view = device_1_chat.open_in_browser_button.click()
web_view.find_full_text('Browse, chat and make payments securely on the decentralized web.')
web_view.find_full_text('Status, the Ethereum discovery tool.')
device_1_chat.back_button.click()
device_1_chat.delete_chat(device_2_username[:25], self.errors)
self.verify_no_errors()
@pytest.mark.pr
@pytest.mark.skip
def test_group_chat_messages_and_delete_chat(self):
self.create_drivers(3)
@ -168,6 +169,7 @@ class TestMessages(MultipleDeviceTestCase):
for message in messages_to_send_2:
chat_2.chat_message_input.send_keys(message)
chat_2.send_message_button.click()
chat_2.chat_message_input.click()
chat_2.send_as_keyevent(message_with_new_line)
chat_2.send_message_button.click()
chat_1.wait_for_messages(users[1], messages_to_receive_2, self.errors)

View File

@ -41,7 +41,7 @@ class TestSanity(SingleDeviceTestCase):
if basic_user['password'] in str(home_view.logcat):
pytest.fail('Password in logcat!!!', pytrace=False)
@pytest.mark.gorup_chat
@pytest.mark.group_chat
def test_group_chat_members(self):
sign_in_view = SignInView(self.driver)
sign_in_view.create_user()

View File

@ -62,7 +62,7 @@ class TestTransaction(SingleDeviceTestCase):
send_transaction_view.sign_transaction_button.click()
send_transaction_view.find_full_text('Wrong password', 20)
@pytest.mark.pr
@pytest.mark.skip
def test_transaction_send_command_group_chat(self):
recipient = transaction_users['A_USER']
sign_in_view = SignInView(self.driver)
@ -101,6 +101,7 @@ class TestTransaction(SingleDeviceTestCase):
start_new_chat_view.open_d_app_button.click()
auction_house = start_new_chat_view.auction_house_button.click()
start_new_chat_view.open_button.click()
auction_house.wait_for_d_aap_to_load()
auction_house.toggle_navigation_button.click()
auction_house.new_auction_button.click()
@ -108,9 +109,12 @@ class TestTransaction(SingleDeviceTestCase):
auction_name = time.strftime('%Y-%m-%d-%H-%M')
auction_house.send_as_keyevent(auction_name)
auction_house.register_name_button.click()
send_transaction_view = home_view.get_send_transaction_view()
send_transaction_view.sign_transaction(sender['password'])
auction_house.find_full_text('You are the proud owner of the name: ' + auction_name, 120)
api_requests.verify_balance_is_updated(initial_balance, address)
@pytest.mark.pr
@ -197,7 +201,7 @@ class TestTransaction(SingleDeviceTestCase):
@pytest.mark.all
class TestTransactions(MultipleDeviceTestCase):
@pytest.mark.pr
@pytest.mark.skip
def test_send_eth_to_request_in_group_chat(self):
recipient = transaction_users['E_USER']
sender = transaction_users['F_USER']
@ -246,6 +250,11 @@ class TestTransactions(MultipleDeviceTestCase):
device_2_chat = device_2_home.get_chat_view()
amount = device_1_chat.get_unique_amount()
one_to_one_chat_device_2 = device_2_chat.element_by_text_part(recipient['username'][:25], 'button')
try:
one_to_one_chat_device_2.wait_for_visibility_of_element(120)
except TimeoutException:
device_1_chat.chat_message_input.send_keys('ping')
device_1_chat.send_message_button.click()
one_to_one_chat_device_2.click()
device_1_chat.commands_button.click_until_presence_of_element(device_1_chat.request_command)
device_1_chat.request_command.click()
@ -288,6 +297,7 @@ class TestTransactions(MultipleDeviceTestCase):
wallet_view_device_1.send_request_button.click()
device_2_chat = device_2_home.get_chat_view()
one_to_one_chat_device_2 = device_2_chat.element_by_text_part(recipient['username'][:25], 'button')
one_to_one_chat_device_2.wait_for_visibility_of_element(120)
one_to_one_chat_device_2.click()
initial_balance_recipient = api_requests.get_balance(recipient['address'])
request_button = device_2_chat.element_by_text_part('Requesting %s ETH' % amount, 'button')

View File

@ -139,7 +139,7 @@ class BaseButton(BaseElement):
def click_until_presence_of_element(self, desired_element, attempts=3):
counter = 0
while not desired_element.is_element_present() and counter <= attempts:
while not desired_element.is_element_present(1) and counter <= attempts:
try:
info('Tap on %s' % self.name)
self.find_element().click()

View File

@ -45,13 +45,13 @@ class DenyButton(BaseButton):
class DeleteButton(BaseButton):
def __init__(self, driver):
super(DeleteButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='Delete']")
self.locator = self.Locator.xpath_selector("//*[@text='DELETE']")
class YesButton(BaseButton):
def __init__(self, driver):
super(YesButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='Yes']")
self.locator = self.Locator.xpath_selector("//*[@text='YES']")
class NoButton(BaseButton):
@ -69,7 +69,7 @@ class OkButton(BaseButton):
class ContinueButton(BaseButton):
def __init__(self, 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):
@ -128,12 +128,6 @@ class DoneButton(BaseButton):
"//android.widget.TextView[@text='DONE']")
class DeleteButton(BaseButton):
def __init__(self, driver):
super(DeleteButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//android.widget.Button[@text='Delete']")
class AppsButton(BaseButton):
def __init__(self, driver):
super(AppsButton, self).__init__(driver)
@ -189,10 +183,10 @@ class BaseView(object):
}
def accept_agreements(self):
for i in self.ok_button, self.continue_button:
for button in self.ok_button, self.continue_button:
try:
i.wait_for_element(4)
i.click()
button.wait_for_element(15)
button.click()
except (NoSuchElementException, TimeoutException):
pass
@ -202,7 +196,7 @@ class BaseView(object):
def confirm(self):
info("Tap 'Confirm' on native keyboard")
self.driver.keyevent(66)
self.driver.press_keycode(66)
def send_as_keyevent(self, string):
keys = {'0': 7, '1': 8, '2': 9, '3': 10, '4': 11, '5': 12, '6': 13, '7': 14, '8': 15, '9': 16,
@ -216,7 +210,7 @@ class BaseView(object):
for i in string:
info("Tap '%s' on native keyboard" % i)
time.sleep(1)
self.driver.keyevent(keys[i])
self.driver.press_keycode(keys[i])
def find_full_text(self, text, wait_time=60):
info("Looking for full text: '%s'" % text)

View File

@ -14,15 +14,14 @@ class ChatMessageInput(BaseEditBox):
class AddToContacts(BaseButton):
def __init__(self, driver):
super(AddToContacts, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='Add to contacts']")
self.locator = self.Locator.accessibility_id('add-to-contacts-button')
class UserNameText(BaseText):
def __init__(self, driver):
super(UserNameText, self).__init__(driver)
self.locator = \
self.Locator.xpath_selector('(//android.view.ViewGroup[@content-desc="toolbar-back-button"]'
'//..//android.widget.TextView)[1]')
self.Locator.accessibility_id('chat-name-text')
class TransactionPopupText(BaseText):
@ -34,19 +33,19 @@ class TransactionPopupText(BaseText):
class SendCommand(BaseButton):
def __init__(self, driver):
super(SendCommand, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='/send']")
self.locator = self.Locator.accessibility_id('send-payment-button')
class RequestCommand(BaseButton):
def __init__(self, driver):
super(RequestCommand, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='/request']")
self.locator = self.Locator.accessibility_id('request-payment-button')
class ChatOptions(BaseButton):
class ChatMenuButton(BaseButton):
def __init__(self, driver):
super(ChatOptions, self).__init__(driver)
self.locator = self.Locator.xpath_selector('(//android.view.ViewGroup[@content-desc="icon"])[2]')
super(ChatMenuButton, self).__init__(driver)
self.locator = self.Locator.accessibility_id('chat-menu-button')
class MembersButton(BaseButton):
@ -72,8 +71,7 @@ class ChatSettings(BaseButton):
class UserOptions(BaseButton):
def __init__(self, driver):
super(UserOptions, self).__init__(driver)
self.locator = self.Locator.xpath_selector('//android.widget.ImageView[@content-desc="chat-icon"]'
'/../..//android.view.View')
self.locator = self.Locator.accessibility_id('options')
class RemoveButton(BaseButton):
@ -85,15 +83,14 @@ class RemoveButton(BaseButton):
class FirstRecipient(BaseButton):
def __init__(self, driver):
super(FirstRecipient, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='Choose recipient']/.."
"//android.widget.ImageView[@content-desc='chat-icon']")
self.locator = self.Locator.accessibility_id('contact-item')
class MessageByUsername(BaseText):
def __init__(self, driver, username):
super(MessageByUsername, self).__init__(driver)
self.locator = self.Locator.xpath_selector('//*[@text="' + username + '"]'
'/following-sibling::android.widget.TextView')
self.locator = self.Locator.xpath_selector(
'//*[@text="%s"]/following-sibling::android.widget.TextView' % username)
class MoreUsersButton(BaseButton):
@ -121,8 +118,7 @@ class OpenInBrowserButton(BaseButton):
class CommandsButton(BaseButton):
def __init__(self, driver):
super(CommandsButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector(
'//*[@content-desc="chat-message-input"]/..//android.view.ViewGroup[@content-desc="icon"]')
self.locator = self.Locator.accessibility_id('chat-commands-button')
class ViewProfileButton(BaseButton):
@ -143,7 +139,7 @@ class ChatView(BaseView):
self.send_command = SendCommand(self.driver)
self.request_command = RequestCommand(self.driver)
self.chat_options = ChatOptions(self.driver)
self.chat_options = ChatMenuButton(self.driver)
self.members_button = MembersButton(self.driver)
self.delete_chat_button = DeleteChatButton(self.driver)
@ -217,4 +213,4 @@ class ChatView(BaseView):
from views.home_view import HomeView
if not HomeView(self.driver).plus_button.is_element_present() or \
self.element_by_text(chat_name).is_element_present():
errors.append('Chat was not deleted')
errors.append('Chat was not deleted')

View File

@ -8,7 +8,7 @@ from views.base_view import BaseView
class PlusButton(BaseButton):
def __init__(self, driver):
super(PlusButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector("//*[@text='+']")
self.locator = self.Locator.accessibility_id("new-chat-button")
def navigate(self):
from views.start_new_chat_view import StartNewChatView
@ -39,6 +39,7 @@ class ChatElement(BaseButton):
@property
def swipe_delete_button(self):
class DeleteButton(BaseButton):
def __init__(self, driver, parent_locator: str):
super(DeleteButton, self).__init__(driver)
@ -48,10 +49,16 @@ class ChatElement(BaseButton):
return DeleteButton(self.driver, self.locator.value)
class FirstChatElementTitle(BaseText):
class ChatNameText(BaseText):
def __init__(self, driver):
super(FirstChatElementTitle, self).__init__(driver)
self.locator = self.Locator.xpath_selector('(//android.widget.ScrollView//android.widget.TextView)[1]')
super(ChatNameText, self).__init__(driver)
self.locator = self.Locator.accessibility_id('chat-name-text')
class ChatUrlText(BaseText):
def __init__(self, driver):
super(ChatUrlText, self).__init__(driver)
self.locator = self.Locator.accessibility_id('chat-url-text')
class HomeView(BaseView):
@ -60,7 +67,8 @@ class HomeView(BaseView):
self.plus_button = PlusButton(self.driver)
self.console_button = ConsoleButton(self.driver)
self.first_chat_element_title = FirstChatElementTitle(self.driver)
self.chat_name_text = ChatNameText(self.driver)
self.chat_url_text = ChatUrlText(self.driver)
def wait_for_syncing_complete(self):
info('Waiting for syncing complete:')
@ -123,5 +131,11 @@ class HomeView(BaseView):
x, y = location['x'], location['y']
size = chat_element.find_element().size
width, height = size['width'], size['height']
self.driver.swipe(start_x=x + width / 2, start_y=y + height / 2, end_x=x, end_y=y + height / 2)
counter = 0
while counter < 10:
self.driver.swipe(start_x=x + width / 2, start_y=y + height / 2, end_x=x, end_y=y + height / 2)
if chat_element.swipe_delete_button.is_element_present():
break
time.sleep(10)
counter += 1
chat_element.swipe_delete_button.click()

View File

@ -41,7 +41,7 @@ class OptionsButton(BaseButton):
def __init__(self, driver):
super(OptionsButton.UsernameInput, self).__init__(driver)
self.locator = self.Locator.xpath_selector('//android.widget.EditText')
self.locator = self.Locator.accessibility_id('username-input')
class UserStatusInput(BaseEditBox):
@ -72,7 +72,7 @@ class LogoutButton(BaseButton):
def __init__(self, driver):
super(LogoutButton, self).__init__(driver)
self.locator = self.Locator.xpath_selector('//*[@text="Log out"]')
self.locator = self.Locator.accessibility_id('log-out-button')
def click(self):
self.scroll_to_element()

View File

@ -1,6 +1,7 @@
from tests import get_current_time
from views.base_element import BaseButton, BaseEditBox
from views.base_view import BaseView
import time
class FirstAccountButton(BaseButton):
@ -70,6 +71,13 @@ class NameInput(BaseEditBox):
self.locator = self.Locator.xpath_selector("//android.widget.TextView[@text='Name']")
class DonNotShare(BaseButton):
def __init__(self, driver):
super(DonNotShare, self).__init__(driver)
self.locator = self.Locator.xpath_selector('//*[@text="NO, I DON%sT WANT TO SHARE"]' % "'")
class SignInView(BaseView):
def __init__(self, driver):
@ -87,8 +95,10 @@ class SignInView(BaseView):
self.add_existing_account_button = AddExistingAccountButton(self.driver)
self.confirm_password_input = ConfirmPasswordInput(self.driver)
self.name_input = NameInput(self.driver)
self.do_not_share = DonNotShare(self.driver)
def create_user(self):
time.sleep(30) # wait for "Shake to provide your feedback" popup to disappear, it's not possible to interact with the element
self.create_account_button.click()
self.password_input.set_value('qwerty1234')
self.next_button.click()
@ -97,11 +107,15 @@ class SignInView(BaseView):
self.name_input.wait_for_element(45)
self.name_input.set_value('user_%s' % get_current_time())
self.next_button.click()
self.element_by_text("NO, I DON'T WANT TO SHARE").click()
self.do_not_share.wait_for_element(10)
self.do_not_share.click_until_presence_of_element(self.home_button)
def recover_access(self, passphrase, password):
time.sleep(30) # wait for "Shake to provide your feedback" popup to disappear, it's not possible to interact with the element
recover_access_view = self.i_have_account_button.click()
recover_access_view.passphrase_input.set_value(passphrase)
recover_access_view.password_input.click()
recover_access_view.password_input.set_value(password)
recover_access_view.sign_in_button.click()
self.do_not_share.wait_for_element(10)
self.do_not_share.click_until_presence_of_element(self.home_button)

View File

@ -28,9 +28,9 @@ class ChatNameEditBox(BaseEditBox):
self.locator = self.Locator.accessibility_id('chat-name-input')
class OpenDAapButton(BaseButton):
class OpenDAppButton(BaseButton):
def __init__(self, driver):
super(OpenDAapButton, self).__init__(driver)
super(OpenDAppButton, self).__init__(driver)
self.locator = self.Locator.accessibility_id('open-dapp-button')
@ -66,7 +66,7 @@ class StartNewChatView(ContactsView):
self.new_group_chat_button = NewGroupChatButton(self.driver)
self.join_public_chat_button = JoinPublicChatButton(self.driver)
self.open_d_app_button = OpenDAapButton(self.driver)
self.open_d_app_button = OpenDAppButton(self.driver)
self.open_button = OpenButton(self.driver)
self.chat_name_editbox = ChatNameEditBox(self.driver)

View File

@ -5,12 +5,12 @@ class ToggleNavigationButton(BaseButton):
def __init__(self, driver):
super(ToggleNavigationButton, self).__init__(driver)
self.locator = self.Locator.accessibility_id('Toggle navigation ')
self.locator = self.Locator.xpath_selector("//*[@text='Toggle navigation ']")
class NewAuctionButton(BaseButton):
def __init__(self, driver):
super(ToggleNavigationButton.NewAuctionButton, self).__init__(driver)
self.locator = self.Locator.accessibility_id('New Auction')
self.locator = self.Locator.xpath_selector("//*[@text='New Auction']")
class ReserveAssetName(BaseElement):
@ -20,13 +20,20 @@ class ReserveAssetName(BaseElement):
def __init__(self, driver):
super(ReserveAssetName.NameToReserveInput, self).__init__(driver)
self.locator = self.Locator.xpath_selector(
'(//android.widget.EditText[@content-desc="eg MyFamousWallet.eth"])[1]')
'(//*[@text="Name To Reserve:"])[2]')
class RegisterNameButton(BaseButton):
def __init__(self, driver):
super(ReserveAssetName.RegisterNameButton, self).__init__(driver)
self.locator = self.Locator.accessibility_id('Register Name')
self.locator = self.Locator.xpath_selector('//*[@text="Register Name"]')
class AssetContract(BaseElement):
def __init__(self, driver):
super(AssetContract, self).__init__(driver)
self.locator = self.Locator.xpath_selector('//*[@text="Asset contract"]')
class AuctionHouseWebView(BaseWebView):
@ -40,3 +47,4 @@ class AuctionHouseWebView(BaseWebView):
self.name_to_reserve_input = ReserveAssetName.NameToReserveInput(self.driver)
self.register_name_button = ReserveAssetName.RegisterNameButton(self.driver)
self.asset_contract = AssetContract(self.driver)

View File

@ -40,8 +40,3 @@ class BaseWebView(BaseView):
counter += 1
if counter > wait_time:
pytest.fail("Page is not loaded during %s seconds" % wait_time)
def find_full_text(self, text, wait_time=60):
element = BaseElement(self.driver)
element.locator = element.Locator.xpath_selector('//*[@content-desc="' + text + '"]')
return element.wait_for_element(wait_time)