mirror of
https://github.com/status-im/status-mobile.git
synced 2025-02-12 00:27:42 +00:00
497af38a7f
Replace all the usage of the button without component Use quo Fix tests List item in multiaccounts Use list items in contacts Fix welcome screen button Experiment long press Big list item Remove old bottom sheet Use bottom sheet Keycard Add error to list item Stickers panel button Images panel Fix z-index in profile Fix android crash Fix signing list item Try fixing test iOs gas sheet keyboard Disable root alert in e2e keycard signing sheet height Clean up bottom sheet events Replace flat list in profile Memorise the manual-close value for bottom sheet Mailserver QR scanner Fix e2e tests E2e fix 2 Fix e2e 3 Remove extra fn Reduce bridging time for animation Trick android layout Try hooks Fix profile missing ens-name Disable press on control in list-view allow disabling animations in list item Use simple list in wallet assets settings TBD - this screen should be rewritten from scratch. Now on every interaction the full list is re-rendered, also it makes the wallet main screen to re-render. Fix send sheet Handle long press in main thread UI fixes perf Update e2e fix missing user name in image long press Signed-off-by: Gheorghe Pinzaru <feross95@gmail.com>
381 lines
15 KiB
Python
381 lines
15 KiB
Python
from tests import common_password
|
|
from views.base_element import BaseText, BaseElement
|
|
from views.base_element import BaseButton, BaseEditBox
|
|
from views.base_view import BaseView, OkButton
|
|
|
|
|
|
class FirstRecipient(BaseButton):
|
|
def __init__(self, driver):
|
|
super(FirstRecipient, self).__init__(driver)
|
|
self.locator = self.Locator.accessibility_id('chat-icon')
|
|
|
|
|
|
class CancelButton(BaseButton):
|
|
def __init__(self, driver):
|
|
super(CancelButton, self).__init__(driver)
|
|
self.locator = self.Locator.xpath_selector("//*[@text='Cancel']")
|
|
|
|
|
|
class SignTransactionButton(BaseButton):
|
|
def __init__(self, driver):
|
|
super(SignTransactionButton, self).__init__(driver)
|
|
self.locator = self.Locator.accessibility_id('send-transaction-bottom-sheet')
|
|
|
|
|
|
class AmountEditBox(BaseEditBox, BaseButton):
|
|
|
|
def __init__(self, driver):
|
|
super(AmountEditBox, self).__init__(driver)
|
|
self.locator = self.Locator.accessibility_id('amount-input')
|
|
|
|
|
|
class SignInPhraseText(BaseText):
|
|
def __init__(self, driver):
|
|
super(SignInPhraseText, self).__init__(driver)
|
|
self.locator = self.Locator.accessibility_id('signing-phrase-text')
|
|
|
|
|
|
class PasswordInput(BaseEditBox):
|
|
def __init__(self, driver):
|
|
super(PasswordInput, self).__init__(driver)
|
|
self.locator = self.Locator.xpath_selector("//*[@text='Password']")
|
|
|
|
|
|
class EnterPasswordInput(BaseEditBox):
|
|
def __init__(self, driver):
|
|
super(EnterPasswordInput, self).__init__(driver)
|
|
self.locator = self.Locator.accessibility_id('enter-password-input')
|
|
|
|
|
|
class GotItButton(BaseButton):
|
|
def __init__(self, driver):
|
|
super(GotItButton, self).__init__(driver)
|
|
self.locator = self.Locator.accessibility_id('got-it-button')
|
|
|
|
|
|
class ChooseRecipientButton(BaseButton):
|
|
|
|
def __init__(self, driver):
|
|
super(ChooseRecipientButton, self).__init__(driver)
|
|
self.locator = self.Locator.accessibility_id('choose-recipient-button')
|
|
|
|
|
|
class AccountsButton(BaseButton):
|
|
def __init__(self, driver):
|
|
super(AccountsButton, self).__init__(driver)
|
|
self.locator = self.Locator.accessibility_id('chose-recipient-accounts-button')
|
|
|
|
|
|
class EnterRecipientAddressButton(BaseButton):
|
|
def __init__(self, driver):
|
|
super(EnterRecipientAddressButton, self).__init__(driver)
|
|
self.locator = self.Locator.accessibility_id('choose-recipient-recipient-code')
|
|
|
|
|
|
class ScanQRCodeButton(BaseButton):
|
|
def __init__(self, driver):
|
|
super(ScanQRCodeButton, self).__init__(driver)
|
|
self.locator = self.Locator.accessibility_id('chose-recipient-scan-qr')
|
|
|
|
|
|
class EnterRecipientAddressInput(BaseEditBox):
|
|
def __init__(self, driver):
|
|
super(EnterRecipientAddressInput, self).__init__(driver)
|
|
self.locator = self.Locator.accessibility_id("recipient-address-input")
|
|
|
|
|
|
class EnterRecipientAddressInputText(BaseText):
|
|
def __init__(self, driver):
|
|
super(EnterRecipientAddressInputText, self).__init__(driver)
|
|
self.locator = self.Locator.xpath_selector("//*[@content-desc='choose-recipient-button']//android.widget.TextView")
|
|
|
|
|
|
class RecentRecipientsButton(BaseButton):
|
|
def __init__(self, driver):
|
|
super(RecentRecipientsButton, self).__init__(driver)
|
|
self.locator = self.Locator.xpath_selector("//*[@text='Contacts']")
|
|
|
|
|
|
class SelectAssetButton(BaseButton):
|
|
def __init__(self, driver):
|
|
super(SelectAssetButton, self).__init__(driver)
|
|
self.locator = self.Locator.accessibility_id('choose-asset-button')
|
|
|
|
class AssetText(BaseText):
|
|
def __init__(self, driver):
|
|
super(AssetText, self).__init__(driver)
|
|
self.locator = self.Locator.xpath_selector('//*[@content-desc="choose-asset-button"]//android.widget.TextView')
|
|
|
|
class RecipientText(BaseText):
|
|
def __init__(self, driver):
|
|
super(RecipientText, self).__init__(driver)
|
|
self.locator = self.Locator.xpath_selector('//*[@content-desc="choose-recipient-button"]//android.widget.TextView')
|
|
|
|
|
|
class ErrorDialog(BaseView):
|
|
def __init__(self, driver):
|
|
super(ErrorDialog, self).__init__(driver)
|
|
self.ok_button = OkButton(driver)
|
|
|
|
def wait_for_error_message(self, error_message, wait_time=30):
|
|
element = self.element_by_text_part(error_message)
|
|
return element.wait_for_element(wait_time)
|
|
|
|
|
|
class NetworkFeeButton(BaseButton):
|
|
def __init__(self, driver):
|
|
super(NetworkFeeButton, self).__init__(driver)
|
|
self.locator = self.Locator.accessibility_id('custom-gas-fee')
|
|
|
|
|
|
class TransactionFeeButton(BaseButton):
|
|
def __init__(self, driver):
|
|
super(TransactionFeeButton, self).__init__(driver)
|
|
self.locator = self.Locator.accessibility_id('transaction-fee-button')
|
|
|
|
|
|
class TransactionFeeTotalValue(BaseText):
|
|
def __init__(self, driver):
|
|
super(TransactionFeeTotalValue, self).__init__(driver)
|
|
self.locator = self.Locator.xpath_selector("//*[@text='Total Fee']//following::android.widget.TextView[1]")
|
|
|
|
|
|
class GasLimitInput(BaseEditBox):
|
|
def __init__(self, driver):
|
|
super(GasLimitInput, self).__init__(driver)
|
|
self.locator = self.Locator.xpath_selector("(//*[@text='Gas limit']/..//android.widget.EditText)[1]")
|
|
|
|
|
|
class GasPriceInput(BaseEditBox):
|
|
def __init__(self, driver):
|
|
super(GasPriceInput, self).__init__(driver)
|
|
self.locator = self.Locator.xpath_selector("(//*[@text='Gas limit']/..//android.widget.EditText)[2]")
|
|
|
|
@property
|
|
def text(self):
|
|
return self.find_element().text
|
|
|
|
|
|
class TotalFeeInput(BaseText):
|
|
def __init__(self, driver):
|
|
super(TotalFeeInput, self).__init__(driver)
|
|
self.locator = self.Locator.xpath_selector("//*[@text='Total Fee']/following-sibling::android.widget.TextView")
|
|
|
|
class ETHroAssetButtonInSelectAssetBottomSheet(BaseButton):
|
|
def __init__(self, driver):
|
|
super(ETHroAssetButtonInSelectAssetBottomSheet, self).__init__(driver)
|
|
self.locator = self.Locator.xpath_selector('(//*[@content-desc=":ETH-asset-value"])[2]')
|
|
|
|
|
|
class UpdateFeeButton(BaseButton):
|
|
def __init__(self, driver):
|
|
super(UpdateFeeButton, self).__init__(driver)
|
|
self.locator = self.Locator.xpath_selector("//*[@text='Update']")
|
|
|
|
def click(self):
|
|
for _ in range(3):
|
|
self.driver.info('Tap on %s' % self.name)
|
|
self.find_element().click()
|
|
self.driver.info('Wait for no %s' % self.name)
|
|
if not self.is_element_displayed():
|
|
return self.navigate()
|
|
|
|
|
|
class ValidationErrorOnSendTransaction(BaseButton):
|
|
def __init__(self, driver, field):
|
|
super(ValidationErrorOnSendTransaction, self).__init__(driver)
|
|
self.locator = self.Locator.xpath_selector("//*[@text='%s']/../*[@content-desc='icon']" % field)
|
|
|
|
class ValidationIconOnSendTransaction(BaseButton):
|
|
def __init__(self, driver):
|
|
super(ValidationIconOnSendTransaction, self).__init__(driver)
|
|
self.locator = self.Locator.xpath_selector('//*[@content-desc="custom-gas-fee"]/../android.view.ViewGroup/*[@content-desc="icon"]')
|
|
|
|
|
|
|
|
class ShareButton(BaseButton):
|
|
|
|
def __init__(self, driver):
|
|
super(ShareButton, self).__init__(driver)
|
|
self.locator = self.Locator.accessibility_id('share-address-button')
|
|
|
|
|
|
class OnboardingMessage(BaseElement):
|
|
def __init__(self, driver):
|
|
super().__init__(driver)
|
|
self.locator = self.Locator.text_selector('This is your signing phrase')
|
|
|
|
|
|
class NotEnoughEthForGas(BaseText):
|
|
def __init__(self, driver):
|
|
super().__init__(driver)
|
|
self.locator = self.Locator.text_selector('Not enough ETH for gas')
|
|
|
|
|
|
class ValidationWarnings(object):
|
|
def __init__(self, driver):
|
|
self.not_enough_eth_for_gas = NotEnoughEthForGas(driver)
|
|
|
|
|
|
class SignWithPasswordButton(BaseButton):
|
|
def __init__(self, driver):
|
|
super(SignWithPasswordButton, self).__init__(driver)
|
|
self.locator = self.Locator.text_selector('Sign with password')
|
|
|
|
|
|
class SignButton(BaseButton):
|
|
def __init__(self, driver):
|
|
super(SignButton, self).__init__(driver)
|
|
self.locator = self.Locator.xpath_selector('//*[@text="Sign"]')
|
|
|
|
|
|
class SignWithKeycardButton(BaseButton):
|
|
def __init__(self, driver):
|
|
super(SignWithKeycardButton, self).__init__(driver)
|
|
self.locator = self.Locator.text_part_selector('Sign with')
|
|
|
|
def navigate(self):
|
|
from views.keycard_view import KeycardView
|
|
return KeycardView(self.driver)
|
|
|
|
def click(self):
|
|
from views.keycard_view import TwoPinKeyboardButton
|
|
self.click_until_presence_of_element(TwoPinKeyboardButton(self.driver))
|
|
return self.navigate()
|
|
|
|
class SigningPhraseText(BaseText):
|
|
def __init__(self, driver):
|
|
super(SigningPhraseText, self).__init__(driver)
|
|
self.locator = self.Locator.text_part_selector('Signing phrase')
|
|
|
|
|
|
# Elements for commands in 1-1 chat
|
|
class UserNameInSendTransactionBottomSheet(BaseButton):
|
|
def __init__(self, driver, username_part):
|
|
super(UserNameInSendTransactionBottomSheet, self).__init__(driver)
|
|
self.username = username_part
|
|
self.locator = self.Locator.xpath_selector(
|
|
"//*[@content-desc='amount-input']/..//*[starts-with(@text,'%s')]" % self.username)
|
|
|
|
class AccountNameInSelectAccountBottomSheet(BaseButton):
|
|
def __init__(self, driver, account_part):
|
|
super(AccountNameInSelectAccountBottomSheet, self).__init__(driver)
|
|
self.username = account_part
|
|
self.locator = self.Locator.xpath_selector(
|
|
"//*[@text='Select account']/..//*[starts-with(@text,'%s')]" % self.username)
|
|
|
|
|
|
class SelectButton(BaseButton):
|
|
def __init__(self, driver):
|
|
super(SelectButton, self).__init__(driver)
|
|
self.locator = self.Locator.accessibility_id('select-account-bottom-sheet')
|
|
|
|
class RequestTransactionButtonBottomSheet(BaseButton):
|
|
def __init__(self, driver):
|
|
super(RequestTransactionButtonBottomSheet, self).__init__(driver)
|
|
self.locator = self.Locator.accessibility_id('request-transaction-bottom-sheet')
|
|
|
|
class SendTransactionView(BaseView):
|
|
def __init__(self, driver):
|
|
super(SendTransactionView, self).__init__(driver)
|
|
|
|
self.chose_recipient_button = ChooseRecipientButton(self.driver)
|
|
self.accounts_button = AccountsButton(self.driver)
|
|
self.enter_recipient_address_button = EnterRecipientAddressButton(self.driver)
|
|
self.scan_qr_code_button = ScanQRCodeButton(self.driver)
|
|
self.enter_recipient_address_input = EnterRecipientAddressInput(self.driver)
|
|
self.first_recipient_button = FirstRecipient(self.driver)
|
|
self.enter_recipient_address_text = EnterRecipientAddressInputText(self.driver)
|
|
self.recent_recipients_button = RecentRecipientsButton(self.driver)
|
|
self.amount_edit_box = AmountEditBox(self.driver)
|
|
self.validation_error_element = ValidationIconOnSendTransaction(self.driver)
|
|
|
|
self.network_fee_button = NetworkFeeButton(self.driver)
|
|
self.transaction_fee_button = TransactionFeeButton(self.driver)
|
|
self.transaction_fee_total_value = TransactionFeeTotalValue(self.driver)
|
|
self.gas_limit_input = GasLimitInput(self.driver)
|
|
self.gas_price_input = GasPriceInput(self.driver)
|
|
self.total_fee_input = TotalFeeInput(self.driver)
|
|
self.update_fee_button = UpdateFeeButton(self.driver)
|
|
|
|
self.cancel_button = CancelButton(self.driver)
|
|
self.sign_transaction_button = SignTransactionButton(self.driver)
|
|
self.sign_with_keycard_button = SignWithKeycardButton(self.driver)
|
|
self.sign_with_password = SignWithPasswordButton(self.driver)
|
|
self.sign_button = SignButton(self.driver)
|
|
self.sign_in_phrase_text = SignInPhraseText(self.driver)
|
|
self.password_input = PasswordInput(self.driver)
|
|
self.enter_password_input = EnterPasswordInput(self.driver)
|
|
self.got_it_button = GotItButton(self.driver)
|
|
|
|
self.select_asset_button = SelectAssetButton(self.driver)
|
|
self.asset_text = AssetText(self.driver)
|
|
self.recipient_text = RecipientText(self.driver)
|
|
|
|
self.error_dialog = ErrorDialog(self.driver)
|
|
|
|
self.share_button = ShareButton(self.driver)
|
|
|
|
self.onboarding_message = OnboardingMessage(self.driver)
|
|
self.validation_warnings = ValidationWarnings(self.driver)
|
|
self.eth_asset_in_select_asset_bottom_sheet_button = ETHroAssetButtonInSelectAssetBottomSheet(self.driver)
|
|
|
|
# Elements for commands in 1-1 chat
|
|
self.select_button = SelectButton(self.driver)
|
|
self.request_transaction_button = RequestTransactionButtonBottomSheet(self.driver)
|
|
|
|
def complete_onboarding(self):
|
|
if self.onboarding_message.is_element_displayed():
|
|
from views.wallet_view import WalletView
|
|
wallet_view = WalletView(self.driver)
|
|
wallet_view.ok_got_it_button.click()
|
|
|
|
def sign_transaction(self, sender_password: str = common_password, keycard=False, default_gas_price=True):
|
|
if not default_gas_price:
|
|
self.network_fee_button.click()
|
|
default_gas_price = self.gas_price_input.text
|
|
self.gas_price_input.clear()
|
|
self.gas_price_input.set_value(str(float(default_gas_price)+30))
|
|
self.update_fee_button.click()
|
|
if keycard:
|
|
keycard_view = self.sign_with_keycard_button.click()
|
|
keycard_view.enter_default_pin()
|
|
else:
|
|
self.sign_with_password.click_until_presence_of_element(self.enter_password_input)
|
|
self.enter_password_input.send_keys(sender_password)
|
|
self.sign_button.click_until_absense_of_element(self.sign_button)
|
|
self.ok_button.wait_for_element(120)
|
|
self.ok_button.click()
|
|
|
|
def get_transaction_fee_total(self):
|
|
self.network_fee_button.click_until_presence_of_element(self.gas_limit_input)
|
|
fee_value = self.transaction_fee_total_value.text.split()[0]
|
|
self.update_fee_button.click()
|
|
return fee_value
|
|
|
|
def get_formatted_recipient_address(self, address):
|
|
return address[:6] + '…' + address[-4:]
|
|
|
|
def get_username_in_transaction_bottom_sheet_button(self, username_part):
|
|
return UserNameInSendTransactionBottomSheet(self.driver, username_part)
|
|
|
|
def get_account_in_select_account_bottom_sheet_button(self, account_name):
|
|
return AccountNameInSelectAccountBottomSheet(self.driver, account_name)
|
|
|
|
def get_validation_icon(self, field='Network fee'):
|
|
return ValidationErrorOnSendTransaction(self.driver, field)
|
|
|
|
def get_values_from_send_transaction_bottom_sheet(self, gas=False):
|
|
data = {
|
|
'amount': self.amount_edit_box.text,
|
|
'asset': self.asset_text.text,
|
|
'address': self.recipient_text.text
|
|
}
|
|
if gas:
|
|
self.sign_transaction_button.click_until_presence_of_element(self.sign_with_password)
|
|
self.network_fee_button.click_until_presence_of_element(self.gas_limit_input)
|
|
data['gas_limit'] = self.gas_limit_input.text
|
|
data['gas_price'] = self.gas_price_input.text
|
|
self.cancel_button.click()
|
|
return data
|