Skip to content

Commit 321a0b4

Browse files
malmsteinclaude
andauthored
Migrate E2E flows to the native input field (#9016)
Task/Issue URL: https://app.asana.com/1/137249556945/project/1174433894299346/task/1215641620311440?focus=true Tech Design URL (if applicable): ### Description When the privacy config enables **native input** (the unified input field), the legacy omnibar (`omnibarTextInput`) is replaced by `inputField` on the new-tab page and becomes a disabled view behind an `omnibarTextInputClickCatcher` overlay on loaded pages. Several E2E Maestro flows drove `omnibarTextInput` directly and broke under that config. This PR migrates those flows to the native input and restructures release-blocker coverage to test the native input instead of the deprecated Input Screen. **Selector mapping (native input config):** - NTP / new tab (input widget auto-open) → tap `inputField` - Loaded page, edit the URL → tap `omnibarTextInputClickCatcher` to open the native input, then `eraseText` / `copyTextFrom` `inputField` (opens pre-filled with the full URL) - Read-only address check (no preceding tap) → keep `copyTextFrom omnibarTextInput` (the disabled field still holds the displayed URL) **Flow migrations** - Privacy flows 6 (Multi-tab) & 14 (no-session-after-fire) - Security `AddressBarSpoof` 1, 2, 4, 5, 6, 7, 8 - Release flows: Multiple tabs, General website browsing, Fire button (×2), bookmarks (×3), favorites (×2) — `visit_site` now asserts `inputField` presence instead of the old `"Search"` omnibar hint (absent in this config) **Release-blocker restructuring** - Dropped `releaseTest` from the deprecated `input_screen` flows (kept `inputScreenTest`) - Added a **Unified Input Field** release-blocker step to the full nightly suite, running `unifiedInputTest` on the internal binary (the unified flows force their toggles via `launchApp` arguments, which only apply on internal — so they can't ride the `releaseTest` tag, which runs on the play binary) - Removed the Unified Input Field step from the non-release-blocker suite so the native input tests don't run twice - Removed the flaky `change duck.ai model and reasoning effort` unified flow (asserted `modelPickerChip` visibility; very flaky, low value) ### Steps to test this PR _E2E against a native-input privacy config_ - [ ] Dispatch `e2e-maestro.yml` with `tags=privacyTest` → 14/14 pass - [ ] Dispatch `e2e-maestro.yml` with `tags=securityTest` → 7/7 pass - [ ] Dispatch `e2e-maestro.yml` with `tags=releaseTest` → migrated release flows pass (Input Screen flows no longer included) - [ ] `unifiedInputTest` runs as a release blocker in the full nightly suite (internal binary), and no longer in the non-blockers suite ### UI changes | Before | After | | ------ | ----- | | n/a — test-only change | n/a | <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Low Risk** > Test-only and workflow changes; no app runtime or production logic modified. > > **Overview** > Updates Maestro E2E flows so they target the **native unified input** (`inputField` on NTP, `omnibarTextInputClickCatcher` + `inputField` when editing on a loaded page) instead of driving `omnibarTextInput` directly, which breaks when privacy config enables native input. > > **Release, privacy, and security flows** — bookmarks, favorites, tabs, browsing, fire button, privacy tests 6/14, and address-bar spoof tests now use the new selectors; several security flows replace `doubleTapOn` with tap + `eraseText`, and one spoof test adds an earlier `assertNotVisible` before opening the overlay input. > > **Nightly CI** — adds a **Unified Input Field** release-blocker step to the full suite (`unifiedInputTest` on the internal APK); removes that step from the non-blockers suite to avoid duplicate runs. Deprecated **Input Screen** flows drop the `releaseTest` tag (kept as `inputScreenTest` only). > > **Removed** — the flaky unified Duck.ai model/reasoning Maestro flow and its shared subflow. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit 631c7e7. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY --> --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
1 parent 019d2dd commit 321a0b4

27 files changed

Lines changed: 83 additions & 220 deletions

.github/workflows/e2e-nightly-full-suite.yml

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,28 @@ jobs:
286286
asana_releases_project_id: ${{ vars.GH_ANDROID_APP_RELEASES_PROJECT_ID }}
287287
asana_releases_blocker_section_id: ${{ vars.GH_ANDROID_APP_RELEASES_PROJECT_BLOCKER_SECTION_ID }}
288288

289+
- name: Unified Input Field
290+
id: maestro-unified-input
291+
uses: ./.github/actions/maestro-cloud-asana-reporter
292+
timeout-minutes: 120
293+
with:
294+
maestro_api_key: ${{ secrets.ROBIN_API_KEY }}
295+
maestro_project_id: ${{ vars.ROBIN_ANDROID_PROJECT_ID }}
296+
maestro_test_name: unifiedInputTest${{ env.DI_UNDERSCORE_SUFFIX }}_${{ github.sha }}
297+
maestro_timeout: ${{ vars.ROBIN_TIMEOUT_MINUTES }}
298+
maestro_app_binary_id: ${{ steps.maestro-upload-internal-binary.outputs.maestro_app_binary_id }}
299+
maestro_api_level: 34
300+
maestro_include_tags: unifiedInputTest
301+
asana_pat: ${{ secrets.ASANA_ACCESS_TOKEN }}
302+
asana_project_id: ${{ vars.GH_ANDROID_APP_PROJECT_ID }}
303+
asana_section_id: ${{ vars.GH_ANDROID_APP_INCOMING_SECTION_ID }}
304+
test_suite_name: Unified Input Field (${{ env.DDG_DI == 'AnvilDagger' && 'Nightly' || format('{0} Nightly', env.DDG_DI) }})
305+
create_asana_error_task: ${{ inputs.create_asana_tasks }}
306+
# Only block releases for the default Anvil path. Metro is informational.
307+
is_release_blocker: ${{ env.DDG_DI == 'AnvilDagger' }}
308+
asana_releases_project_id: ${{ vars.GH_ANDROID_APP_RELEASES_PROJECT_ID }}
309+
asana_releases_blocker_section_id: ${{ vars.GH_ANDROID_APP_RELEASES_PROJECT_BLOCKER_SECTION_ID }}
310+
289311
- name: Notifications permissions Android 13+
290312
id: maestro-notification-permissions
291313
uses: ./.github/actions/maestro-cloud-asana-reporter

.github/workflows/e2e-nightly-non-blockers-suite.yml

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -127,25 +127,6 @@ jobs:
127127
asana_section_id: ${{ vars.GH_ANDROID_APP_INCOMING_SECTION_ID }}
128128
test_suite_name: Android Design System (Nightly)
129129

130-
- name: Unified Input Field
131-
id: maestro-uif
132-
# Run regardless of earlier suite failures, but only if the internal binary uploaded.
133-
if: ${{ !cancelled() && steps.maestro-upload-internal-binary.outcome == 'success' }}
134-
uses: ./.github/actions/maestro-cloud-asana-reporter
135-
timeout-minutes: 120
136-
with:
137-
maestro_api_key: ${{ secrets.ROBIN_API_KEY }}
138-
maestro_project_id: ${{ vars.ROBIN_ANDROID_PROJECT_ID }}
139-
maestro_test_name: uif_${{ github.sha }}
140-
maestro_timeout: ${{ vars.ROBIN_TIMEOUT_MINUTES }}
141-
maestro_app_binary_id: ${{ steps.maestro-upload-internal-binary.outputs.maestro_app_binary_id }}
142-
maestro_include_tags: unifiedInputTest
143-
asana_pat: ${{ secrets.ASANA_ACCESS_TOKEN }}
144-
maestro_api_level: 34
145-
asana_project_id: ${{ vars.GH_ANDROID_APP_PROJECT_ID }}
146-
asana_section_id: ${{ vars.GH_ANDROID_APP_INCOMING_SECTION_ID }}
147-
test_suite_name: Unified Input Field
148-
149130
- name: Internal Onboarding Flows
150131
id: maestro-preonboarding
151132
# Run regardless of earlier suite failures, but only if the internal binary uploaded.

.maestro/bookmarks/ensure_bookmarks_can_be_added_and_deleted.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ tags:
1414
- runFlow: ../shared/skip_all_onboarding.yaml
1515

1616
- tapOn:
17-
id: "omnibarTextInput"
17+
id: "inputField"
1818
- inputText: "https://privacy-test-pages.site"
1919
- pressKey: Enter
2020
- tapOn:

.maestro/bookmarks/open_bookmark_and_navigate_back.yaml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,14 @@ tags:
1414
- runFlow: ../shared/skip_all_onboarding.yaml
1515

1616
- tapOn:
17-
id: "omnibarTextInput"
17+
id: "inputField"
1818
- inputText: "https://www.search-company.site/"
1919
- pressKey: Enter
2020
- assertVisible:
2121
text: "Search engine"
2222
- tapOn:
23-
id: "omnibarTextInput"
23+
id: "omnibarTextInputClickCatcher"
24+
- eraseText
2425
- inputText: "https://privacy-test-pages.site"
2526
- pressKey: Enter
2627
- assertVisible:

.maestro/bookmarks/open_bookmark_in_folder_and_navigate_back.yaml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ tags:
1414
- runFlow: ../shared/skip_all_onboarding.yaml
1515

1616
- tapOn:
17-
id: "omnibarTextInput"
17+
id: "inputField"
1818
- inputText: "https://privacy-test-pages.site/"
1919
- pressKey: Enter
2020
- assertVisible:
@@ -26,7 +26,8 @@ tags:
2626
- tapOn:
2727
text: "add bookmark"
2828
- tapOn:
29-
id: "omnibarTextInput"
29+
id: "omnibarTextInputClickCatcher"
30+
- eraseText
3031
- inputText: "https://www.search-company.site/"
3132
- pressKey: Enter
3233
- assertVisible:

.maestro/browsing/visit_site.yaml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,15 @@ tags:
1414
- runFlow: ../shared/skip_all_onboarding.yaml
1515

1616
- assertVisible:
17-
text: "Search"
17+
id: "inputField"
1818
- tapOn:
19-
id: "omnibarTextInput"
19+
id: "inputField"
2020
- inputText: "https://privacy-test-pages.site"
2121
- pressKey: Enter
2222
- assertVisible:
2323
text: ".*Privacy Test Pages.*"
2424
- tapOn:
25-
id: "omnibarTextInput"
25+
id: "omnibarTextInputClickCatcher"
2626
- eraseText
2727
- assertVisible:
28-
text: "Search"
28+
id: "inputField"

.maestro/favorites/favorites_bookmarks_add.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ tags:
1414
- runFlow: ../shared/skip_all_onboarding.yaml
1515

1616
- tapOn:
17-
id: "omnibarTextInput"
17+
id: "inputField"
1818
- inputText: "https://privacy-test-pages.site"
1919
- pressKey: Enter
2020
- tapOn:

.maestro/favorites/favorites_bookmarks_delete.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ tags:
1414
- runFlow: ../shared/skip_all_onboarding.yaml
1515

1616
- tapOn:
17-
id: "omnibarTextInput"
17+
id: "inputField"
1818
- inputText: "https://privacy-test-pages.site"
1919
- pressKey: Enter
2020
- tapOn:

.maestro/fire_button/dimiss_fire_during_onboarding.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ tags:
1414
- runFlow: ../shared/pre_onboarding.yaml
1515

1616
- tapOn:
17-
id: "omnibarTextInput"
17+
id: "inputField"
1818
- inputText: "https://privacy-test-pages.site"
1919
- pressKey: Enter
2020
- assertVisible:

.maestro/fire_button/fire_during_onboarding.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ tags:
1414
- runFlow: ../shared/pre_onboarding.yaml
1515

1616
- tapOn:
17-
id: "omnibarTextInput"
17+
id: "inputField"
1818
- inputText: "https://privacy-test-pages.site"
1919
- pressKey: Enter
2020
- assertVisible:

0 commit comments

Comments
 (0)