From f4c156c3f7943857deb21758cebf947511d4e995 Mon Sep 17 00:00:00 2001 From: Anton Danchenko Date: Sat, 30 Jun 2018 15:17:38 +0300 Subject: [PATCH] added atomic transaction tests Signed-off-by: yevh-berdnyk --- test/appium/support/api/network_api.py | 12 +- test/appium/support/testrail_report.py | 21 ++- .../account_management/test_create_account.py | 22 +++ .../atomic/account_management/test_profile.py | 3 - .../tests/atomic/chats/test_commands.py | 29 +++- .../appium/tests/atomic/chats/test_console.py | 13 ++ .../tests/atomic/chats/test_one_to_one.py | 27 ++- .../tests/atomic/transactions/__init__.py | 0 .../tests/atomic/transactions/test_daaps.py | 35 ++++ .../tests/atomic/transactions/test_wallet.py | 163 ++++++++++++++++++ test/appium/tests/conftest.py | 4 +- test/appium/tests/marks.py | 1 + test/appium/tests/test_transaction.py | 4 +- test/appium/views/chat_view.py | 5 + test/appium/views/home_view.py | 2 +- test/appium/views/send_transaction_view.py | 4 - 16 files changed, 322 insertions(+), 23 deletions(-) create mode 100644 test/appium/tests/atomic/transactions/__init__.py create mode 100644 test/appium/tests/atomic/transactions/test_daaps.py create mode 100644 test/appium/tests/atomic/transactions/test_wallet.py diff --git a/test/appium/support/api/network_api.py b/test/appium/support/api/network_api.py index 0da2f5154d..7abaeb3a57 100644 --- a/test/appium/support/api/network_api.py +++ b/test/appium/support/api/network_api.py @@ -7,26 +7,30 @@ from tests import info class NetworkApi: def __init__(self): - self.etherscan_url = 'http://api-ropsten.etherscan.io/api?' + self.ropsten_url = 'http://api-ropsten.etherscan.io/api?' self.faucet_url = 'http://51.15.45.169:3001/donate' self.chat_bot_url = 'http://offsite.chat:8099' def get_transactions(self, address: str) -> dict: - method = self.etherscan_url + 'module=account&action=txlist&address=0x%s&sort=desc' % address + method = self.ropsten_url + 'module=account&action=txlist&address=0x%s&sort=desc' % address return requests.request('GET', url=method).json()['result'] def is_transaction_successful(self, transaction_hash: str) -> int: - method = self.etherscan_url + 'module=transaction&action=getstatus&txhash=%s' % transaction_hash + method = self.ropsten_url + 'module=transaction&action=getstatus&txhash=%s' % transaction_hash return not int(requests.request('GET', url=method).json()['result']['isError']) def get_balance(self, address): - method = self.etherscan_url + 'module=account&action=balance&address=0x%s&tag=latest' % address + method = self.ropsten_url + 'module=account&action=balance&address=0x%s&tag=latest' % address for i in range(5): try: return int(requests.request('GET', method).json()["result"]) except ValueError: pass + def get_latest_block_number(self) -> int: + method = self.ropsten_url + 'module=proxy&action=eth_blockNumber' + return int(requests.request('GET', url=method).json()['result'], 0) + def find_transaction_by_hash(self, address: str, transaction_hash: str): transactions = self.get_transactions(address=address) for transaction in transactions: diff --git a/test/appium/support/testrail_report.py b/test/appium/support/testrail_report.py index 0f910071e8..96e796d415 100644 --- a/test/appium/support/testrail_report.py +++ b/test/appium/support/testrail_report.py @@ -15,7 +15,7 @@ class TestrailReport(BaseTestReport): self.user = environ.get('TESTRAIL_USER') self.run_id = None - self.suite_id = 42 + self.suite_id = 15 self.project_id = 9 self.outcomes = { @@ -54,10 +54,27 @@ class TestrailReport(BaseTestReport): def add_run(self, run_name): request_body = {'suite_id': self.suite_id, 'name': run_name, - 'milestone_id': self.actual_milestone_id} + 'milestone_id': self.actual_milestone_id, + 'case_ids': self.get_regression_cases(), + 'include_all': False} run = self.post('add_run/%s' % self.project_id, request_body) self.run_id = run['id'] + def get_cases(self, section_id): + return self.get('get_cases/%s&suite_id=%s§ion_id=%s' % (self.project_id, self.suite_id, section_id)) + + def get_regression_cases(self): + test_cases = dict() + test_cases['smoke_phase_1'] = 157 + test_cases['smoke_phase_2'] = 308 + test_cases['upgrade'] = 309 + test_cases['negative_tests'] = 458 + case_ids = list() + for phase in test_cases: + for case in self.get_cases(test_cases[phase]): + case_ids.append(case['id']) + return case_ids + def add_results(self): for test in self.get_all_tests(): test_steps = "# Steps: \n" diff --git a/test/appium/tests/atomic/account_management/test_create_account.py b/test/appium/tests/atomic/account_management/test_create_account.py index a1f0db2c7d..6ebf4c2efb 100644 --- a/test/appium/tests/atomic/account_management/test_create_account.py +++ b/test/appium/tests/atomic/account_management/test_create_account.py @@ -62,3 +62,25 @@ class TestCreateAccount(SingleDeviceTestCase): if not home.element_by_text(text).is_element_displayed(): self.errors.append("'%s' text is not shown" % text) self.verify_no_errors() + + @marks.testrail_id(844) + def test_create_account_short_and_mismatch_password(self): + + sign_in = SignInView(self.driver) + sign_in.create_account_button.click() + sign_in.password_input.set_value('12345') + + mismatch_error = "Password confirmation doesn't match password" + + sign_in.next_button.click() + if sign_in.confirm_password_input.is_element_displayed(): + self.errors.append('Next button is clickable when password is less then 6 symbols') + + sign_in.password_input.set_value('123456') + sign_in.next_button.click() + sign_in.confirm_password_input.set_value('1234567') + sign_in.next_button.click() + + if not sign_in.find_text_part(mismatch_error): + self.errors.append("'%s' is not shown") + self.verify_no_errors() diff --git a/test/appium/tests/atomic/account_management/test_profile.py b/test/appium/tests/atomic/account_management/test_profile.py index 674990df68..3259534163 100644 --- a/test/appium/tests/atomic/account_management/test_profile.py +++ b/test/appium/tests/atomic/account_management/test_profile.py @@ -49,14 +49,12 @@ class TestProfileSingleDevice(SingleDeviceTestCase): self.errors.append('Can\'t share wallet address via email') self.verify_no_errors() - @marks.skip @marks.testrail_id(3704) def test_copy_contact_code_and_wallet_address(self): sign_in_view = SignInView(self.driver) sign_in_view.create_user() profile_view = sign_in_view.profile_button.click() profile_view.share_my_contact_key_button.click() - profile_view.share_my_contact_key_button.click() public_key = profile_view.public_key_text.text profile_view.public_key_text.long_press_element() self.driver.press_keycode(278) @@ -96,7 +94,6 @@ class TestProfileSingleDevice(SingleDeviceTestCase): if not profile_view.profile_picture.is_element_image_equals_template(): pytest.fail('Profile picture was not updated') - @marks.skip @marks.testrail_id(2374) def test_backup_seed_phrase(self): sign_in_view = SignInView(self.driver) diff --git a/test/appium/tests/atomic/chats/test_commands.py b/test/appium/tests/atomic/chats/test_commands.py index 1a45f7271f..b36da96cc6 100644 --- a/test/appium/tests/atomic/chats/test_commands.py +++ b/test/appium/tests/atomic/chats/test_commands.py @@ -211,5 +211,32 @@ class TestCommands(MultipleDeviceTestCase): self.errors.append("Request funds message doesn't contain 'Send' button") except TimeoutException: self.errors.append('Request funds message was not received') - self.verify_no_errors() + + @marks.testrail_id(1417) + def test_contact_profile_send_transaction(self): + self.create_drivers(1) + recipient = transaction_users['B_USER'] + sign_in_view = SignInView(self.drivers[0]) + sign_in_view.create_user() + home_view = sign_in_view.get_home_view() + sender_public_key = home_view.get_public_key() + sender_address = home_view.public_key_to_address(sender_public_key) + home_view.home_button.click() + self.network_api.get_donate(sender_address) + wallet_view = home_view.wallet_button.click() + wallet_view.set_up_wallet() + home_view.home_button.click() + home_view.add_contact(recipient['public_key']) + chat_view = home_view.get_chat_view() + 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() + chat_view.chat_message_input.click() + chat_view.eth_asset.click() + amount = chat_view.get_unique_amount() + chat_view.send_as_keyevent(amount) + chat_view.send_message_button.click() + send_transaction_view = chat_view.get_send_transaction_view() + send_transaction_view.sign_transaction(common_password) + self.network_api.find_transaction_by_unique_amount(recipient['address'], amount) diff --git a/test/appium/tests/atomic/chats/test_console.py b/test/appium/tests/atomic/chats/test_console.py index 6e9f52321b..9d9be58548 100644 --- a/test/appium/tests/atomic/chats/test_console.py +++ b/test/appium/tests/atomic/chats/test_console.py @@ -33,3 +33,16 @@ class TestMessagesPublicChat(SingleDeviceTestCase): time.sleep(wait_time if wait_time > 0 else 0) console_view.send_faucet_request() console_view.chat_element_by_text('Faucet request has been received').wait_for_visibility_of_element() + + @marks.testrail_id(1400) + def test_web3_block_number(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.chat_message_input.send_keys('web3.eth.blockNumber') + chat_view.send_message_button.click() + chat_view.wait_for_element_starts_with_text(str(self.network_api.get_latest_block_number()), 10) diff --git a/test/appium/tests/atomic/chats/test_one_to_one.py b/test/appium/tests/atomic/chats/test_one_to_one.py index e970496e4b..2097176cbd 100644 --- a/test/appium/tests/atomic/chats/test_one_to_one.py +++ b/test/appium/tests/atomic/chats/test_one_to_one.py @@ -1,16 +1,13 @@ import random import string - import emoji import pytest from selenium.common.exceptions import TimeoutException - -from tests import marks, get_current_time, group_chat_users +from tests import marks, get_current_time, group_chat_users, transaction_users from tests.base_test_case import MultipleDeviceTestCase, SingleDeviceTestCase from views.sign_in_view import SignInView -@marks.all @marks.chat class TestMessagesOneToOneChatMultiple(MultipleDeviceTestCase): @@ -363,3 +360,25 @@ class TestMessagesOneToOneChatSingle(SingleDeviceTestCase): if not chat.chat_element_by_text(emoji_unicode).is_element_displayed(): self.errors.append('Message with emoji was not sent in 1-1 chat') self.verify_no_errors() + + +class TestChatManagement(SingleDeviceTestCase): + + @marks.testrail_id(1428) + def test_clear_history(self): + recipient = transaction_users['E_USER'] + sign_in_view = SignInView(self.driver) + sign_in_view.create_user() + home_view = sign_in_view.get_home_view() + home_view.add_contact(recipient['public_key']) + chat_view = home_view.get_chat_view() + for _ in range(4): + chat_view.chat_message_input.send_keys('test message') + chat_view.send_message_button.click() + chat_view.clear_history() + if not chat_view.no_messages_in_chat.is_element_present(): + pytest.fail('Message history is shown') + home_view.relogin() + home_view.get_chat_with_user(recipient['username']).click() + if not chat_view.no_messages_in_chat.is_element_present(): + pytest.fail('Message history is shown after re-login') diff --git a/test/appium/tests/atomic/transactions/__init__.py b/test/appium/tests/atomic/transactions/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/appium/tests/atomic/transactions/test_daaps.py b/test/appium/tests/atomic/transactions/test_daaps.py new file mode 100644 index 0000000000..1e19d2e57b --- /dev/null +++ b/test/appium/tests/atomic/transactions/test_daaps.py @@ -0,0 +1,35 @@ +from tests import transaction_users, marks +from tests.base_test_case import SingleDeviceTestCase +from views.sign_in_view import SignInView + + +class TestTransactionDApp(SingleDeviceTestCase): + + @marks.testrail_id(769) + def test_send_transaction_from_daap(self): + sender = transaction_users['B_USER'] + sign_in_view = SignInView(self.driver) + sign_in_view.recover_access(sender['passphrase'], sender['password']) + address = transaction_users['B_USER']['address'] + initial_balance = self.network_api.get_balance(address) + status_test_dapp = sign_in_view.open_status_test_dapp() + status_test_dapp.wait_for_d_aap_to_load() + status_test_dapp.assets_button.click() + send_transaction_view = status_test_dapp.request_stt_button.click() + send_transaction_view.sign_transaction(sender['password']) + self.network_api.verify_balance_is_updated(initial_balance, address) + + @marks.testrail_id(3716) + def test_sign_message_from_daap(self): + password = 'password_for_daap' + sign_in_view = SignInView(self.driver) + sign_in_view.create_user(password) + status_test_dapp = sign_in_view.open_status_test_dapp() + status_test_dapp.wait_for_d_aap_to_load() + status_test_dapp.transactions_button.click() + send_transaction_view = status_test_dapp.sign_message_button.click() + send_transaction_view.find_full_text('Test message') + send_transaction_view.sign_transaction_button.click_until_presence_of_element( + send_transaction_view.enter_password_input) + send_transaction_view.enter_password_input.send_keys(password) + send_transaction_view.sign_transaction_button.click() diff --git a/test/appium/tests/atomic/transactions/test_wallet.py b/test/appium/tests/atomic/transactions/test_wallet.py new file mode 100644 index 0000000000..6a511d65e7 --- /dev/null +++ b/test/appium/tests/atomic/transactions/test_wallet.py @@ -0,0 +1,163 @@ +import pytest +from selenium.common.exceptions import TimeoutException +from tests import transaction_users, get_current_time, transaction_users_wallet, marks, common_password +from tests.base_test_case import SingleDeviceTestCase, MultipleDeviceTestCase +from views.sign_in_view import SignInView +from views.web_views.base_web_view import BaseWebView + + +@marks.transaction +class TestTransactionWallet(SingleDeviceTestCase): + + @marks.testrail_id(766) + def test_send_eth_from_wallet_to_contact(self): + recipient = transaction_users['F_USER'] + sender = transaction_users['E_USER'] + sign_in_view = SignInView(self.driver) + sign_in_view.recover_access(sender['passphrase'], sender['password']) + home_view = sign_in_view.get_home_view() + home_view.add_contact(recipient['public_key']) + home_view.get_back_to_home_view() + wallet_view = home_view.wallet_button.click() + wallet_view.set_up_wallet() + send_transaction = wallet_view.send_transaction_button.click() + send_transaction.amount_edit_box.click() + transaction_amount = send_transaction.get_unique_amount() + send_transaction.amount_edit_box.set_value(transaction_amount) + send_transaction.confirm() + send_transaction.chose_recipient_button.click() + send_transaction.recent_recipients_button.click() + recent_recipient = send_transaction.element_by_text(recipient['username']) + send_transaction.recent_recipients_button.click_until_presence_of_element(recent_recipient) + recent_recipient.click() + send_transaction.sign_transaction_button.click() + send_transaction.enter_password_input.click() + send_transaction.send_as_keyevent(sender['password']) + send_transaction.sign_transaction_button.click() + send_transaction.got_it_button.click() + self.network_api.find_transaction_by_unique_amount(sender['address'], transaction_amount) + + @marks.testrail_id(767) + def test_send_eth_from_wallet_to_address(self): + recipient = transaction_users['E_USER'] + sender = transaction_users['F_USER'] + sign_in_view = SignInView(self.driver) + sign_in_view.recover_access(sender['passphrase'], sender['password']) + home_view = sign_in_view.get_home_view() + wallet_view = home_view.wallet_button.click() + wallet_view.set_up_wallet() + send_transaction = wallet_view.send_transaction_button.click() + send_transaction.amount_edit_box.click() + transaction_amount = send_transaction.get_unique_amount() + send_transaction.amount_edit_box.set_value(transaction_amount) + send_transaction.confirm() + send_transaction.chose_recipient_button.click() + send_transaction.enter_recipient_address_button.click() + send_transaction.enter_recipient_address_input.set_value(recipient['address']) + send_transaction.done_button.click() + send_transaction.sign_transaction_button.click() + send_transaction.enter_password_input.click() + send_transaction.send_as_keyevent(sender['password']) + send_transaction.sign_transaction_button.click() + send_transaction.got_it_button.click() + self.network_api.find_transaction_by_unique_amount(sender['address'], transaction_amount) + + @marks.testrail_id(1430) + def test_send_stt_from_wallet(self): + sender = transaction_users_wallet['A_USER'] + recipient = transaction_users_wallet['B_USER'] + sign_in_view = SignInView(self.driver) + sign_in_view.recover_access(sender['passphrase'], sender['password']) + home_view = sign_in_view.get_home_view() + home_view.add_contact(recipient['public_key']) + home_view.get_back_to_home_view() + wallet_view = home_view.wallet_button.click() + wallet_view.set_up_wallet() + send_transaction = wallet_view.send_transaction_button.click() + send_transaction.select_asset_button.click_until_presence_of_element(send_transaction.stt_button) + send_transaction.stt_button.click() + send_transaction.amount_edit_box.click() + send_transaction.amount_edit_box.set_value(send_transaction.get_unique_amount()) + send_transaction.confirm() + send_transaction.chose_recipient_button.click() + send_transaction.enter_recipient_address_button.click() + send_transaction.enter_recipient_address_input.set_value(recipient['address']) + send_transaction.done_button.click() + send_transaction.sign_transaction_button.click() + send_transaction.enter_password_input.send_keys(sender['password']) + send_transaction.sign_transaction_button.click() + send_transaction.got_it_button.click() + + @marks.testrail_id(2164) + def test_transaction_wrong_password_wallet(self): + recipient = transaction_users['E_USER'] + sender = transaction_users['F_USER'] + sign_in_view = SignInView(self.driver) + sign_in_view.recover_access(sender['passphrase'], sender['password']) + home_view = sign_in_view.get_home_view() + wallet_view = home_view.wallet_button.click() + wallet_view.set_up_wallet() + send_transaction = wallet_view.send_transaction_button.click() + send_transaction.amount_edit_box.click() + transaction_amount = send_transaction.get_unique_amount() + send_transaction.amount_edit_box.set_value(transaction_amount) + send_transaction.confirm() + send_transaction.chose_recipient_button.click() + send_transaction.enter_recipient_address_button.click() + send_transaction.enter_recipient_address_input.set_value(recipient['address']) + send_transaction.done_button.click() + send_transaction.sign_transaction_button.click() + send_transaction.enter_password_input.click() + send_transaction.enter_password_input.send_keys('wrong_password') + send_transaction.sign_transaction_button.click() + send_transaction.find_full_text('Wrong password', 20) + + @marks.testrail_id(1452) + def test_transaction_appears_in_history(self): + recipient = transaction_users['B_USER'] + sign_in_view = SignInView(self.driver) + sign_in_view.create_user() + home_view = sign_in_view.get_home_view() + transaction_amount = home_view.get_unique_amount() + sender_public_key = home_view.get_public_key() + sender_address = home_view.public_key_to_address(sender_public_key) + home_view.home_button.click() + self.network_api.get_donate(sender_address) + wallet_view = home_view.wallet_button.click() + wallet_view.set_up_wallet() + wallet_view.wait_balance_changed_on_wallet_screen() + send_transaction = wallet_view.send_transaction_button.click() + send_transaction.amount_edit_box.click() + send_transaction.amount_edit_box.set_value(transaction_amount) + send_transaction.confirm() + send_transaction.chose_recipient_button.click() + send_transaction.enter_recipient_address_button.click() + send_transaction.enter_recipient_address_input.set_value(recipient['address']) + send_transaction.done_button.click() + send_transaction.sign_transaction_button.click() + send_transaction.enter_password_input.send_keys(common_password) + send_transaction.sign_transaction_button.click() + send_transaction.got_it_button.click() + self.network_api.find_transaction_by_unique_amount(recipient['address'], transaction_amount) + transactions_view = wallet_view.transaction_history_button.click() + transactions_view.transactions_table.find_transaction(amount=transaction_amount) + + @marks.testrail_id(2163) + def test_send_eth_from_wallet_incorrect_address(self): + recipient = transaction_users['E_USER'] + sender = transaction_users['F_USER'] + sign_in_view = SignInView(self.driver) + sign_in_view.recover_access(sender['passphrase'], sender['password']) + home_view = sign_in_view.get_home_view() + wallet_view = home_view.wallet_button.click() + wallet_view.set_up_wallet() + send_transaction = wallet_view.send_transaction_button.click() + send_transaction.amount_edit_box.click() + transaction_amount = send_transaction.get_unique_amount() + send_transaction.amount_edit_box.set_value(transaction_amount) + send_transaction.confirm() + send_transaction.chose_recipient_button.click() + send_transaction.enter_recipient_address_button.click() + send_transaction.enter_recipient_address_input.set_value(recipient['public_key']) + send_transaction.done_button.click() + send_transaction.find_text_part('Invalid address:', 20) diff --git a/test/appium/tests/conftest.py b/test/appium/tests/conftest.py index d2363a01c1..e67a42347a 100644 --- a/test/appium/tests/conftest.py +++ b/test/appium/tests/conftest.py @@ -143,8 +143,8 @@ def update_sauce_jobs(test_name, job_ids, passed): def get_testrail_case_id(obj): - if 'testrail_case_id' in obj.keywords._markers: - return obj.keywords._markers['testrail_case_id'].args[0] + if 'testrail_id' in obj.keywords._markers: + return obj.keywords._markers['testrail_id'].args[0] def pytest_runtest_setup(item): diff --git a/test/appium/tests/marks.py b/test/appium/tests/marks.py index 261be1eaef..1b980a2a45 100644 --- a/test/appium/tests/marks.py +++ b/test/appium/tests/marks.py @@ -14,3 +14,4 @@ transaction = pytest.mark.transaction wallet = pytest.mark.wallet sign_in = pytest.mark.sign_in skip = pytest.mark.skip +console = pytest.mark.console diff --git a/test/appium/tests/test_transaction.py b/test/appium/tests/test_transaction.py index e1552d5fe7..8c3b5e5e8f 100644 --- a/test/appium/tests/test_transaction.py +++ b/test/appium/tests/test_transaction.py @@ -162,8 +162,8 @@ class TestTransaction(SingleDeviceTestCase): @marks.testrail_case_id(3452) def test_sign_transaction_twice(self): - recipient = transaction_users['F_USER'] - sender = transaction_users['E_USER'] + recipient = transaction_users['E_USER'] + sender = transaction_users['F_USER'] sign_in_view = SignInView(self.driver) sign_in_view.recover_access(sender['passphrase'], sender['password']) home_view = sign_in_view.get_home_view() diff --git a/test/appium/views/chat_view.py b/test/appium/views/chat_view.py index e6aea802a2..22ee73d250 100644 --- a/test/appium/views/chat_view.py +++ b/test/appium/views/chat_view.py @@ -311,6 +311,11 @@ class ChatView(BaseView): self.element_by_text(chat_name).is_element_present(): errors.append('Chat was not deleted') + def clear_history(self): + self.chat_options.click() + self.clear_history_button.click() + self.clear_button.click() + def send_transaction_in_1_1_chat(self, amount, password, wallet_set_up=False): self.commands_button.click() self.send_command.click() diff --git a/test/appium/views/home_view.py b/test/appium/views/home_view.py index b24dc92fba..115f0b0cc3 100644 --- a/test/appium/views/home_view.py +++ b/test/appium/views/home_view.py @@ -90,7 +90,7 @@ class HomeView(BaseView): break def get_chat_with_user(self, username): - return ChatElement(self.driver, username) + return ChatElement(self.driver, username[:25]) def add_contact(self, public_key): start_new_chat = self.plus_button.click() diff --git a/test/appium/views/send_transaction_view.py b/test/appium/views/send_transaction_view.py index 3f650f6e6e..b231b2b96e 100644 --- a/test/appium/views/send_transaction_view.py +++ b/test/appium/views/send_transaction_view.py @@ -65,10 +65,6 @@ class ChooseRecipientButton(BaseButton): super(ChooseRecipientButton, self).__init__(driver) self.locator = self.Locator.accessibility_id('choose-recipient-button') - def click(self): - desired_element = EnterRecipientAddressButton(self.driver) - self.click_until_presence_of_element(desired_element=desired_element) - class EnterRecipientAddressButton(BaseButton): def __init__(self, driver):