Skip to content
Draft
9 changes: 9 additions & 0 deletions flows/FLOWS_LIMITATIONS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Maestro flow coverage limitations

These are known gaps that are partially covered or not fully automatable with Maestro alone:

- Hardware signer operations that require physical actions on external devices (Coldcard/Jade/Ledger/Passport/Keystone, etc.).
- External app handoff flows (buy providers, deep links, app-store redirects) where control leaves the tested app.
- OS-level permission dialogs that vary by device vendor, OS version, and locale (flows include best-effort conditionals only).
- Network-dependent outcomes that require deterministic on-chain or Electrum state (broadcast timing, mempool confirmation, fiat provider responses).
- Secure recovery phrase verification depth (flows only check navigation/visibility and never export or persist seed content).
29 changes: 29 additions & 0 deletions flows/_common_enter_passcode_1111.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
appId: ${APPID}
---
- runFlow:
when:
visible:
id: "key_1"
commands:
- tapOn:
id: "key_1"
- tapOn:
id: "key_1"
- tapOn:
id: "key_1"
- tapOn:
id: "key_1"
- runFlow:
when:
notVisible:
id: "key_1"
commands:
- tapOn: "1"
- tapOn: "1"
- tapOn: "1"
- tapOn: "1"
- runFlow:
when:
visible: "Proceed"
commands:
- tapOn: "Proceed"
26 changes: 26 additions & 0 deletions flows/_common_handle_runtime_permissions.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
appId: ${APPID}
---
- runFlow:
when:
visible:
id: "com.android.permissioncontroller:id/permission_allow_foreground_only_button"
commands:
- tapOn:
id: "com.android.permissioncontroller:id/permission_allow_foreground_only_button"
- runFlow:
when:
visible:
id: "com.android.permissioncontroller:id/permission_allow_button"
commands:
- tapOn:
id: "com.android.permissioncontroller:id/permission_allow_button"
- runFlow:
when:
visible: "Allow While Using App"
commands:
- tapOn: "Allow While Using App"
- runFlow:
when:
visible: "Allow Once"
commands:
- tapOn: "Allow Once"
18 changes: 18 additions & 0 deletions flows/_common_open_manage_keys.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
appId: ${APPID}
---
- runFlow: _common_unlock_if_needed.yaml
- runFlow:
when:
visible:
id: "btn_Manage Keys"
commands:
- tapOn:
id: "btn_Manage Keys"
- runFlow:
when:
visible: "Manage Keys"
commands:
- tapOn: "Manage Keys"
- extendedWaitUntil:
visible: "Manage Keys"
timeout: 15000
20 changes: 20 additions & 0 deletions flows/_common_open_wallet.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
appId: ${APPID}
---
- runFlow: _common_unlock_if_needed.yaml
- tapOn:
id: "view_wallet_0"
index: 0
- waitForAnimationToEnd:
timeout: 2000
- runFlow:
when:
visible:
id: "list_transactions"
commands:
- swipe:
from:
id: "list_transactions"
direction: DOWN
duration: 1500
- waitForAnimationToEnd:
timeout: 3000
16 changes: 16 additions & 0 deletions flows/_common_unlock_if_needed.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
appId: ${APPID}
---
- runFlow:
when:
visible: "Enter your passcode"
commands:
- runFlow: _common_enter_passcode_1111.yaml
- runFlow:
when:
visible: "Proceed"
commands:
- tapOn: "Proceed"
- extendedWaitUntil:
visible:
id: "view_wallet_0"
timeout: 30000
40 changes: 21 additions & 19 deletions flows/addNewKey.yaml
Original file line number Diff line number Diff line change
@@ -1,30 +1,32 @@
appId: ${APPID}
---
- tapOn:
id: 'btn_Manage\nKeys'
- runFlow: _common_open_manage_keys.yaml
- assertVisible:
id: 'btn_Add Key'
id: "btn_Add Key"
- tapOn:
id: 'btn_Add Key'
id: "btn_Add Key"
- waitForAnimationToEnd:
timeout: 5000
- scroll
- tapOn:
id: 'btn_KEEPER'
timeout: 3000
- runFlow:
when:
visible:
id: "btn_KEEPER"
commands:
- tapOn:
id: "btn_KEEPER"
- assertVisible:
id: 'btn_Add a New Mobile Key'
- tapOn:
id: 'btn_Add a New Mobile Key'
- assertVisible: Next
id: "btn_Add a New Mobile Key"
- tapOn:
id: 'modal_primary_btn'
- waitForAnimationToEnd:
timeout: 20000
id: "btn_Add a New Mobile Key"
- runFlow:
when:
visible:
id: "modal_primary_btn"
commands:
- tapOn:
id: "modal_primary_btn"
- extendedWaitUntil:
visible: "Manage Keys"
timeout: 20000
- assertVisible:
id: 'btn_back'
- tapOn:
id: 'btn_back'
- runFlow: hidendeletekey.yaml
id: "btn_back"
61 changes: 30 additions & 31 deletions flows/addwallet.yaml
Original file line number Diff line number Diff line change
@@ -1,51 +1,50 @@
appId: ${APPID}
---
- assertTrue: ${output.text_HotWallet = "1 Wallet"}
- runFlow: _common_unlock_if_needed.yaml
- assertVisible:
id: 'wallet_list'
id: "wallet_list"
- swipe:
from:
id: 'wallet_list'
direction: LEFT
from:
id: "wallet_list"
direction: LEFT
- assertVisible:
id: 'btn_add_wallet'
id: "btn_add_wallet"
- tapOn:
id: 'btn_add_wallet'
id: "btn_add_wallet"
- waitForAnimationToEnd:
timeout: 1000
- assertTrue: ${output.text_modal_title = "Add or Import Wallet"}
- assertTrue: ${output.text_modal_subtitle = "Create purpose specific wallets having dedicated UTXOs. Manage other app wallets by importing them"}
timeout: 3000
- assertVisible: "Add or Import Wallet"
- assertVisible:
id: 'btn_Hot Wallet'
id: "btn_Hot Wallet"
- assertVisible:
id: 'btn_2-of-3 Vault'
id: "btn_2-of-3 Vault"
- assertVisible:
id: 'btn_3-of-5 Vault'
id: "btn_3-of-5 Vault"
- assertVisible:
id: 'btn_Collaborative'
id: "btn_Collaborative"
- tapOn:
id: 'btn_Hot Wallet'
id: "btn_Hot Wallet"
- waitForAnimationToEnd:
timeout: 2000
timeout: 3000
- tapOn:
id: 'input_transfer_policy'
- 'eraseText'
- inputText: '21000'
id: "input_transfer_policy"
- eraseText
- inputText: "21000"
- hideKeyboard
- assertVisible:
id: 'btn_primaryText'
- assertTrue: ${output.btn_primaryText = "Create"}
id: "btn_primaryText"
- tapOn:
id: 'btn_primaryText'
- assertVisible:
id: modal_loading
id: "btn_primaryText"
- waitForAnimationToEnd:
timeout: 20000
- assertVisible:
id: 'modal_primary_btn'
- tapOn:
id: 'modal_primary_btn'
- assertVisible:
id: 'btn_back'
- runFlow:
when:
visible:
id: "modal_primary_btn"
commands:
- tapOn:
id: "modal_primary_btn"
- assertVisible:
id: "btn_back"
- tapOn:
id: 'btn_back'
id: "btn_back"
76 changes: 41 additions & 35 deletions flows/appsettings.yaml
Original file line number Diff line number Diff line change
@@ -1,43 +1,49 @@
appId: ${APPID}
---
# - runFlow: login.yaml
- runFlow: _common_unlock_if_needed.yaml
- tapOn:
id: btn_AppSettingsIcon
- assertVisible:
id: 'btn_back'
- assertVisible: 'App Settings'
- assertVisible: 'Configure your app here'
- assertVisible:
id: 'btn_App_Backup}'
- assertVisible:
id: 'view_Biometrics'
- assertVisible:
id: 'view_Dark_Mode'
- assertVisible:
id: 'view_Node_Settings'
- assertVisible:
id: 'view_Version_History'
- assertVisible:
id: 'view_Tor_Settings'
- assertVisible:
id: 'view_Language_&_Currency'
- assertVisible:
id: 'view_ KeeperTelegram'
- assertVisible:
id: 'view_keeperTwitter'
- assertVisible:
id: 'btn_FAQ'
- assertVisible:
id: 'text_termsCondition'
- assertVisible:
id: 'text_privacyPolicy'
id: "btn_AppSettingsIcon"
- assertVisible:
id: "btn_back"
- assertVisible: "App Settings"
- runFlow:
when:
visible:
id: "btn_App_Backup"
commands:
- assertVisible:
id: "btn_App_Backup"
- runFlow:
when:
visible: "Backup Wallet"
commands:
- assertVisible: "Backup Wallet"
- assertVisible:
id: "view_Biometrics"
- assertVisible:
id: "view_Dark_Mode"
- assertVisible:
id: "view_Node_Settings"
- assertVisible:
id: "view_Version_History"
- assertVisible:
id: "view_Tor_Settings"
- assertVisible:
id: "view_Language_&_Currency"
- runFlow:
when:
visible:
id: "view_KeeperTelegram"
commands:
- assertVisible:
id: "view_KeeperTelegram"
- assertVisible:
id: "view_keeperTwitter"
- tapOn:
id: 'view_Dark_Mode'
delay: 1000
id: "view_Dark_Mode"
- tapOn:
id: 'view_Dark_Mode'
delay: 1000
id: "view_Dark_Mode"
- runFlow: exportseed.yaml
- runFlow: versionhistory.yaml
- tapOn:
id: 'btn_back'
id: "btn_back"
36 changes: 16 additions & 20 deletions flows/buyBTC.yaml
Original file line number Diff line number Diff line change
@@ -1,25 +1,21 @@
appId: ${APPID}
---
- runFlow: _common_open_wallet.yaml
- assertVisible:
id: "btn_Buy"
- tapOn:
id: 'view_wallet_0'
index: 0
- swipe:
from:
id: list_transactions
direction: DOWN
duration: 2000
- waitForAnimationToEnd:
timeout: 5000
- repeat:
while:
id: "btn_Buy"
- runFlow:
when:
visible:
id: 'icon_unconfirmed_0'
id: "btn_Buy Bitcoin"
commands:
- runFlow: refreshwallet.yaml
- assertVisible:
id: 'btn_Buy Bitcoin'
- tapOn:
id: 'btn_Buy Bitcoin'
- tapOn:
id: 'btn_primaryText'

- tapOn:
id: "btn_Buy Bitcoin"
- runFlow:
when:
visible:
id: "btn_primaryText"
commands:
- tapOn:
id: "btn_primaryText"
Loading