Address Autocomplete Testing Checklist (2026)
Address Autocomplete Testing Checklist (2026) provides a practical, item‑by‑item guide for verifying that an address suggestion feature works correctly across devices, locales, and user contexts. The
Address Autocomplete Testing Checklist (2026) provides a practical, item‑by‑item guide for verifying that an address suggestion feature works correctly across devices, locales, and user contexts. The checklist groups more than thirty concrete verification points into logical areas—happy path, error handling, edge/boundary cases, accessibility, security/privacy, performance, and release readiness—so that engineers can run manual spot checks, automate regression suites, or let an autonomous explorer exercise the feature in a single pass. Each item includes a clear pass criterion, a real‑world example, and notes on how to implement the check with common tools such as Playwright, Appium, or curl.
---
Address Autocomplete Testing Checklist (2026) – Overview and Scope
Why a dedicated checklist matters
Address autocomplete is a high‑touch UI component that appears in checkout flows, profile forms, and location‑based services. A defect can cause user frustration, abandoned carts, or inaccurate geocoding that propagates downstream. Because the widget pulls data from external services, handles ambiguous input, and must respect accessibility and privacy rules, a scattered ad‑hoc test approach often misses subtle bugs slip through. The checklist below consolidates the most frequent failure modes observed in production incidents from 2023‑2025 and adds emerging concerns for 2026 such as stricter GDPR‑style data minimization and new WCAG 2.2 contrast requirements.
How to use this document
- Pick a verification level – manual exploratory, scripted regression, or autonomous exploration.
- Map each checklist item to a test case ID (the tables later provide IDs).
- Execute – record pass/fail, capture screenshots or logs, and attach any required test data.
- Track trends – over successive releases, note which items consistently fail to guide refactor effort.
Assumptions
- The autocomplete widget is invoked via a standard text input with an associated dropdown list.
- Backend service returns JSON suggestions containing at least
label,value(canonical address), and optionalmetadata(e.g., place_id, latitude/longitude). - The frontend may debounce input, show a loading spinner, and support keyboard navigation (ArrowDown/Up, Enter, Escape).
- The target audience includes developers, QA engineers, and DevOps who need a repeatable, auditable process.
---
Address Autocomplete Testing Checklist (2026) – Happy Path Tests
Core functionality
| Test ID | Description | Pass Criterion | Automation Hint |
|---|---|---|---|
| HP‑01 | User types a complete, valid address (e.g., “1600 Amphitheatre Parkway, Mountain View, CA”) and selects the first suggestion. | The input field displays the full canonical address; any associated hidden fields (latitude, longitude) are populated correctly. | Playwright: await page.fill('#address', '1600 Amphitheatre Parkway, Mountain View, CA'); await page.waitForSelector('.suggestion-item:first-child'); await page.click('.suggestion-item:first-child'); expect(await page.inputValue('#address')).toBe('1600 Amphitheatre Parkway, Mountain View, CA'); |
| HP‑02 | User types a partial address that matches multiple entries (e.g., “Main St”) and the list shows at least five distinct suggestions. | Dropdown contains ≥5 items, each with a unique label and no duplicate place_ids. | Verify page.$$eval('.suggestion-item', els => els.map(e => e.textContent.trim())) length ≥5 and uniqueness. |
| HP‑03 | User selects a suggestion via mouse click. | The suggestion replaces the input value; dropdown closes; focus remains on the input (or moves to next logical field per tabindex). | After click, assert page.isVisible('.suggestion-list') === false and page.isFocused('#address') === true (or next field). |
| HP‑04 | User selects a suggestion via keyboard (ArrowDown → Enter). | Same outcome as mouse selection; no extra characters are inserted. | Simulate: await page.press('#address', 'ArrowDown'); await page.press('#address', 'Enter'); then verify value. |
| HP‑05 | User types an address with diacritics (e.g., “Calle de Serrano, Madrid”) and receives correct suggestions. | Suggestions preserve diacritics; selected value matches the backend’s normalized form. | Include UTF‑8 test data; check that page.inputValue('#address') contains the expected characters. |
| HP‑06 | User clears the field after a selection and types a new query. | Dropdown refreshes with new suggestions; previous selection does not linger. | After await page.fill('#address', ''); await page.waitForTimeout(100); assert dropdown hidden or empty. |
| HP‑07 | User interacts with the widget on a mobile viewport (width 320px). | Touch target for each suggestion ≥48 dp; list scrolls smoothly; selected value appears correctly. | Use device emulation in Playwright: await page.setViewportSize({width:320, height:568}); then repeat HP‑01‑HP‑04. |
| HP‑08 | User invokes the widget via screen reader announcement (e.g., NVDA). | The input is labeled (aria-label or ), and each suggestion is announced as a selectable option. | Run axe-core: await page.evaluate(() => axe.run()) and verify no violations related to missing labels or roles. |
Pass criteria summary
- Value integrity – the address shown after selection exactly matches the canonical string returned by the API.
- State consistency – hidden fields, focus, and dropdown visibility follow the expected UI contract.
- Input fidelity – Unicode, diacritics, and whitespace are preserved unless the service explicitly normalizes them.
- Device independence – behavior is identical on desktop, tablet, and mobile breakpoints.
---
Address Autocomplete Testing Checklist (2026) – Error Handling and Validation
Invalid input patterns
| Test ID | Description | Pass Criterion | Automation Hint |
|---|---|---|---|
| EH‑01 | User types only special characters (e.g., “@@@!!!”). | No suggestions are shown; an inline validation message may appear (optional) but must not break the UI. | Assert .suggestion-list has zero children or is hidden. |
| EH‑02 | User types an extremely long string (>500 chars). | Backend returns a 400 Bad Request or empty list; client shows no suggestions and does not crash. | Use page.fill('#address', 'A'.repeat(600)) then check network response status. |
| EH‑03 | User pastes a address containing newline characters. | Newlines are stripped or replaced with space before request; suggestions appear based on the cleaned query. | Intercept request and verify query param does not contain \n or \r. |
| EH‑04 | Backend returns malformed JSON (missing label). | Client gracefully handles the error: shows a fallback message like “Unable to load suggestions” and does not throw uncaught exception. | Mock server with msw or wiremock to return {}; assert no JavaScript error in console. |
| EH‑05 | Backend returns HTTP 500 or timeout. | UI displays an error banner, retains previous value (if any), and allows retry after a short delay. | Simulate latency with page.route('**/autocomplete', route => route.fulfill({status:500})); check for error element. |
| EH‑06 | User types a query that yields zero matches (e.g., “xxxxxxxxxx”). | Dropdown shows a placeholder like “No results found” or remains empty; no error is thrown. | Confirm that list is empty and optional placeholder text is present. |
| EH‑07 | User rapidly types and deletes characters (debounce stress). | Requests are throttled per debounce setting (e.g., 300 ms); no more than one request per debounce window fires. | Spy on fetch calls and assert timing between consecutive calls > debounce threshold. |
| EH‑08 | User enables browser’s autofill and selects an address from the native dropdown. | Widget respects the autofill value, triggers its own suggestion request if needed, and does not duplicate entries. | Fill via page.evaluate(() => { document.querySelector('#address').value = '…'; }) then observe network. |
Validation logic
- Client‑side sanitization – leading/trailing whitespace trimmed, internal multiple spaces collapsed to a single space unless the service preserves them.
- Server‑side validation – expects UTF‑8, rejects control characters, returns appropriate HTTP status codes (400 for client errors, 500 for server errors).
- Fallback UI – when suggestions cannot be retrieved, the widget must not lock the form; users should still be able to submit a manually typed address.
---
Address Autocomplete Testing Checklist (2026) – Edge/Boundary Cases
Locale and internationalization
| Test ID | Description | Pass Criterion | Automation Hint |
|---|---|---|---|
| EB‑01 | User types an address in a right‑to‑left language (e.g., Arabic “الرياض، السعودية”). | Dropdown aligns correctly, text is rendered RTL, and selection updates the field without garbling. | Set page locale via await page.setExtraHTTPHeaders({'Accept-Language':'ar'}); check direction: rtl on suggestion items. |
| EB‑02 | User types an address containing characters from multiple scripts (e.g., “北京市朝阳区建国门外大街1号”). | Suggestions preserve each script; no mojibake appears. | Verify that returned label contains the exact Unicode sequence. |
| EB‑03 | User types a postal code only (e.g., “90210”). | Service returns suggestions limited to matching postal code areas; selection populates full address if available. | Check that selected value includes city and state. |
| EB‑04 | User types an address with abbreviations (e.g., “St” vs “Street”). | Service normalizes or returns both variants; selection does not break downstream geocoding. | Ensure that selected value can be reverse‑geocoded to a valid latitude/longitude. |
| EB‑05 | User types an address containing a trailing comma or period. | Trailing punctuation is ignored for matching; suggestions appear as if punctuation absent. | Send query “1600 Amphitheatre Parkway, Mountain View, CA,” and assert same results as without trailing comma. |
| EB‑06 | User switches language mid‑session (e.g., changes site language from English to French). | Widget updates placeholder text and any static labels; suggestion language follows the new locale. | Change Accept-Language header, reload, and verify placeholder translation. |
| EB‑07 | User accesses the widget from a device with a non‑standard DPI (e.g., 200 dpi). | Touch targets remain ≥48 dp; text scales without clipping. | Use device emulation with custom DPI and inspect computed font sizes. |
| EB‑08 | User types an address that includes a unit number or suite (e.g., “Suite 200”). | Service treats unit as part of the label but does not discard it when returning canonical address. | Confirm that selected value contains “Suite 200”. |
Boundary values
| Test ID | Description | Pass Criterion | Automation Hint |
|---|---|---|---|
| EB‑09 | User types a single character (e.g., “a”). | If the endpoint supports min‑length ≥1, suggestions appear; otherwise, a helpful hint appears (e.g., “Type at least 2 characters”). | Check network request length and UI hint. |
| EB‑10 | User types exactly the maximum allowed length defined by the API (e.g., 100 chars). | Request succeeds; no truncation error on client side. | Generate a 100‑char string and verify response status 200. |
| EB‑11 | User types a query that results in >100 suggestions (if backend caps at 100). | Client displays at most the capped number and provides a scroll indicator; no UI overflow. | Count .suggestion-item elements; assert ≤100. |
| EB‑12 | User rapidly opens and closes the dropdown (focus blur/focus). | No memory leak; each open/close cycle releases event listeners. | Use Chrome DevTools timeline to monitor JS heap size over 20 cycles. |
| EB‑13 | User disables JavaScript. | Input remains functional as a plain text field; no autocomplete UI appears (graceful degradation). | Load page with page.setJavaScriptEnabled(false); verify only present. |
| EB‑14 | User enables high contrast mode (Windows) or forces dark mode via CSS. | All suggestion items meet WCAG AA contrast (≥4.5:1 for normal text). | Run axe-core with {"runOnly": {"type": "tag", "values": ["color"]}}. |
---
Address Autocomplete Testing Checklist (2026) – Accessibility (WCAG) Checks
Keyboard navigation
| Test ID | Description | Pass Criterion | Automation Hint |
|---|---|---|---|
| AC‑01 | User tabs into the address field. | Field receives visible focus indicator (minimum 2 px solid contrast). | Assert :focus-visible style via page.evaluate(() => getComputedStyle(document.activeElement).outline). |
| AC‑02 | User presses ArrowDown while field is focused. | First suggestion gets focus; visual highlight appears. | Check that .suggestion-item[aria-selected="true"] exists. |
| AC‑03 | User presses ArrowUp from the first suggestion. | Focus wraps to the last suggestion or returns to the input per design. | Verify focus index after sequence. |
| AC‑04 | User presses Escape while dropdown is open. | Dropdown closes and focus returns to the input field. | Assert .suggestion-list not visible and document.activeElement === input. |
| AC‑05 | User presses Enter on a highlighted suggestion. | Selection commits; dropdown closes; focus stays on input (or moves to next tabbable element). | Same as HP‑04 but via keyboard only. |
| AC‑06 | User invokes the widget via a screen reader command that reads the list of options. | Each option is announced with its role (option) and its label; selection is announced. | Use NVDA or VoiceOver via automated tools like axe-core with {"runOnly": {"type":"tag","values":["aria"]}}. |
ARIA and labeling
| Test ID | Description | Pass Criterion | Automation Hint |
|---|---|---|---|
| AC‑07 | Input has an associated or aria-label. | Screen readers announce the purpose of the field before user interaction. | Verify page.getAttribute('#address', 'aria-label') or presence of . |
| AC‑08 | Each suggestion item has role="option" and is contained within an element with role="listbox". | Ensures correct announcement in assistive tech. | Check page.getAttribute('.suggestion-item', 'role') === 'option' and parent role=listbox. |
| AC‑09 | Selected suggestion has aria-selected="true"; others have aria-selected="false" (or absent). | Screen reader conveys which option is active. | Assert attribute values. |
| AC‑10 | Live region (aria-live="polite") announces number of results when list updates. | Users are informed of changes without disruptive interruptions. | Verify presence of aria-live on a container and that its text changes on new query. |
Contrast and touch
| Test ID | Description | Pass Criterion | Automation Hint |
|---|---|---|---|
| AC‑11 | Text and icons inside suggestions meet WCAG AA contrast (≥4.5:1) against background. | No low‑contrast pairs. | Run axe contrast check. |
| AC‑12 | Touch target height ≥48 dp; vertical spacing between items ≥8 dp. | Prevents mis‑taps on mobile. | Compute computed height and margin via page.evaluate. |
| AC‑13AC‑13: User prefers‑User prefers reduced motion setting | Widget respects prefers-reduced-motion media query. | Animations (e.g., fade‑in of dropdown) are disabled or replaced with instantaneous change. | Check that @media (prefers-reduced-motion: reduce) rules are present and that no transition/duration >0ms is applied. |
---
Address Autocomplete Testing Checklist (2026) – Security and Privacy Considerations
Data leakage
| Test ID | Description | Pass Criterion | Automation Hint |
|---|---|---|---|
| SP‑01 | Widget sends the raw query string to the autocomplete endpoint over HTTPS only. | Network tab shows https://; no http:// requests observed. | Use page.route to enforce protocol or inspect request.url(). |
| SP‑02 | Query string does not contain sensitive personal data unrelated to address (e.g., credit card number, password). | If a user accidentally types such data, the request payload is sanitized or blocked. | Mock a request with {"query":"4111 1111 1111 1111"} and verify backend returns 400 or strips non‑address tokens. |
| SP‑03 | Response does not expose internal identifiers (e.g., internal database keys) that could be leveraged for enumeration. | Only public place_id or similar safe token is returned; no internal IDs. | Inspect JSON for fields like internal_id, db_key; assert absent. |
| SP‑04 | Widget implements rate limiting on the client side (e.g., max 5 requests per second). | Excessive typing does not cause a burst of requests that could be used for DoS. | Spy on fetch and ensure timestamps respect limit. |
| SP‑05 | Autocomplete suggestions are not stored in localStorage or cookies without explicit user consent. | No persistent storage of raw query or results unless opt‑in for history feature. | Check window.localStorage and document.cookie after interaction. |
Privacy compliance
---
Address Autocomplete Testing Checklist (2026) – Performance and Load
Responsiveness
| Test ID | Description | Pass Criterion | Automation Hint |
|---|---|---|---|
| PF‑01 | Time from keystroke to first suggestion display (debounce + network) ≤250 ms on 3G‑simulated connection. | Measures perceived latency; ensures UI feels instant. | Use page.route to throttle (page.setOffline(false); await page.context().setNetworkConditions({download: 500*1024, upload: 500*1024, latency: 150});) then record performance.now() before and after suggestion appears. |
| PF‑02 | Rendering of a suggestion list with 50 items completes within 60 ms (main thread). | Avoids jank; maintains 60 fps scrolling. | Use Chrome DevTools Protocol to capture LayoutShift and LongTask events; assert no task >50 ms. |
| PF‑03 | Memory growth after 50 successive queries with clearing field each time ≤5 MB. | Prevents leak in long‑running SPA sessions. | Measure window.performance.memory.usedJSHeapSize before/after loop. |
| PF‑04 | Service worker (if present) caches the autocomplete JSON responses for offline reuse; stale‑while‑revalidate strategy yields ≤800 ms for cached response. | Improves experience on flaky networks. | Disable network, ensure suggestions still appear from cache; measure time. |
| PF‑05 | Under simulated load of 200 concurrent users each typing a 2‑char query, average 95th‑percentile response time ≤400 ms. | Ensures backend can scale. | Use artillery or k6 script hitting the endpoint; collect metrics. |
Scalability hints
- Debounce tuning – 150‑300 ms is typical; too short causes excess load, too long feels laggy.
- Result virtualization – for lists >20 items, render only visible rows to keep DOM size small.
- Cache‑control headers –
Cache-Control: max-age=60, stale-while-revalidate=120allows CDN to serve frequent queries. - Server‑side throttling – respond with
429 Too Many Requestsif a single IP exceeds quota; client should show a gentle “Try again later” message.
---
Address Autocomplete Testing Checklist (2026) – Release Readiness and Automation Integration
Checklist sign‑off
| Item | Owner | Evidence Required | Frequency |
|---|---|---|---|
| Happy‑path manual smoke test | QA Lead | Video or screenshot of HP‑01‑HP‑08 on Chrome/Firefox/Safari | Every release |
| Automated regression suite (Playwright) | SDET | Pipeline job npm test:address passes 100 % | CI on each PR |
| Accessibility audit (axe) | Accessibility Engineer | No WCAG AA violations in axe report | Nightly |
| Security scan (OWASP ZAP) | SecOps | No high‑severity findings on /autocomplete endpoint | Weekly |
| Performance budget check | Perf Engineer | 95th‑percentile latency <300 ms on 3G simulation | Perf test stage |
| Localization lint | i18n Lead | All UI strings extracted; pseudo‑language test passes | Sprint |
| Privacy review | Privacy Officer | No PII in logs/network per SP‑01‑SP‑09 | Before GA |
| Release notes update | Tech Writer | Mention any changes to autocomplete behavior (e.g., new debounce value) | Release |
Example CI snippet (GitHub Actions)
name: Address Autocomplete Tests
on:
push:
branches: [main]
pull_request:
paths:
- 'src/components/AddressAutocomplete/**'
- 'tests/e2e/address-autocomplete/**'
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install deps
run: npm ci
- name: Run Playwright tests
run: npx playwright test tests/e2e/address-autocomplete/**/*.spec.ts
- name: Upload trace on failure
if: failure()
uses: actions/upload-artifact@v3
with:
name: playwright-trace
path: playwright-trace/
Example Playwright test covering multiple checklist items
import { test, expect } from '@playwright/test';
test.describe('Address Autocomplete – core scenarios', () => {
test.beforeEach(async ({ page }) => {
await page.goto('/checkout');
});
test('Happy path: select suggestion via keyboard', async ({ page }) => {
await page.fill('#address', '1600 Amphitheatre Parkway, Mountain View, CA');
await page.waitForSelector('.suggestion-item:first-child');
await page.press('#address', 'ArrowDown');
await page.press('#address', 'Enter');
expect(await page.inputValue('#address')).toBe(
'1600 Amphitheatre Parkway, Mountain View, CA'
);
expect(await page.isVisible('.suggestion-list')).toBe(false);
});
test('Error handling: malformed backend response', async ({ page }) => {
await page.route('**/autocomplete', route =>
route.fulfill({ status: 500, body: '{}' })
);
await page.fill('#address', 'Invalid!!');
await expect(page.locator('.error-banner')).toBeVisible({ timeout: 2000 });
expect(await page.inputValue('#address')).toBe('Invalid!!');
});
test('Accessibility: ARIA roles on suggestions', async ({ page }) => {
await page.fill('#address', 'Main St');
await page.waitForSelector('.suggestion-item');
const items = await page.$$('.suggestion-item');
for (const el of items) {
await expect(el).toHaveAttribute('role', 'option');
}
const listbox = await page.$('.suggestion-list');
await expect(listbox).toHaveAttribute('role', 'listbox');
});
});
---
How Autonomous Exploration Covers Most of This Checklist in One Pass
SUSA’s autonomous QA agent can be pointed at the URL that hosts the address autocomplete widget (or fed the APK for a native mobile build). The agent builds a behavioral model of the UI by exploring combinations of input values, interaction sequences, and device contexts without any pre‑written test scripts. Below is a mapping of the agent’s native capabilities to the checklist items:
| Checklist Area | What the Agent Does | Coverage Level |
|---|---|---|
| Happy path | Generates random realistic address strings (using geo‑databases), selects suggestions via mouse and touch, verifies field update and hidden population. | ✅ Full coverage for HP‑01‑HP‑08 (including device emulation). |
| Error handling | Injects malformed input (special chars, extremely long strings, newline‑laden pastes), simulates backend faults (500, timeout, empty JSON) via network throttling and response mocking. | ✅ Covers EH‑01‑EH‑08; detects unhandled exceptions and UI breakage. |
| Edge/boundary | Switches locale headers, sends RTL scripts, varies input length to min/max limits, tests postal‑code only queries, and validates diacritic preservation. | ✅ Hits EB‑01‑EB‑08, EB‑09‑EB‑12. |
| Accessibility | Checks for presence of label/aria-label, validates ARIA roles on suggestions, ensures keyboard navigation works, runs axe‑core scans for contrast and reduced‑motion compliance. | ✅ Satisfies AC‑01‑AC‑10, AC‑11‑AC‑13. |
| Security/privacy | Enforces HTTPS only, attempts to inject non‑address strings (e.g., credit‑card numbers) to see if they are stripped or blocked, verifies no sensitive data appears in logs or localStorage, tests DNT header handling. | ✅ Maps to SP‑01‑SP‑09. |
| Performance | Applies 3G network throttling, measures time from keystroke to suggestion display, monitors main‑thread thread‑long tasks, records memory usage over repeated queries. | ✅ Aligns with PF‑01‑PF‑05. |
| Release readiness | After each exploratory run, the agent outputs a structured JSON report that can be diffed against a baseline; it also auto‑generates regression scripts (Appium for Android, Playwright for Web) that can be dropped into CI pipelines. | ✅ Provides evidence for sign‑off items and creates maintainable test assets. |
Because the agent records every screen visited, every network request, and every UI state change, a single exploration session can produce evidence for >80 % of the checklist. The remaining items (such as manual visual review of focus indicators or privacy policy verification) are best supplemented with a brief human‑in‑the‑loop step, but the bulk of regression confidence comes from the autonomous pass.
---
Quick Reference Checklist (Copy‑Paste for Your Wiki)
[ ] HP‑01 – Full address selection shows correct value and hidden fields
[ ] HP‑02 – Partial query returns ≥5 distinct suggestions
[ ] HP‑03 – Mouse selection closes dropdown, keeps focus
[ ] HP‑04 – Keyboard ArrowDown+Enter selects suggestion
[ ] HP‑05 – Diacritics preserved in suggestions
[ ] HP‑06 – Clearing field resets list
[ ] HP‑07 – Mobile viewport touch targets ≥48 dp
[ ] HP‑08 – Screen reader announces label and options
[ ] EH‑01 – Special‑char query yields no suggestions
[ ] EH‑02 – Over‑long input does not crash, returns error or empty list
[ ] EH‑03 – Newlines stripped before request
[ ] EH‑04 – Malformed JSON handled gracefully, no JS exception
[ ] EH‑05 – 500/timeout shows error banner, allows retry
[ ] EH‑06 – Zero‑result query shows “No results” placeholder
[ ] EH‑07 – Debounce limits requests per time window
[ ] EH‑08 – Native autofill does not duplicate entries
[ ] EB‑01 – RTL language renders correctly, field updates
[ ] EB‑02 – Mixed script input returns correct suggestions
[ ] EB‑03 – Postal‑code only yields area matches
[ ] EB‑04 – Abbreviation handling (St vs Street)
[ ] EB‑05 – Trailing punctuation ignored for matching
[ ] EB‑06 – Language switch updates placeholder and suggestions
[ ] EB‑07 – High‑DPI
Test Your App Autonomously
Upload your APK or URL. SUSA explores like 10 real users — finds bugs, accessibility violations, and security issues. No scripts.
Try SUSA Free