Resource library

QA Interview

Appium Scenario-Based Interview Questions and Answers (2026)

Practice Appium scenario based interview questions on locators, waits, gestures, hybrid apps, parallel runs, CI, debugging, framework design, and strategy.

27 min read | 3,529 words

TL;DR

The best answers to Appium scenario based interview questions connect mobile risk to a reliable automation design. Clarify platform and app type, select semantic locators, synchronize on observable conditions, isolate device and data state, capture layered diagnostics, and explain when a lower-level API or component test is a better choice than Appium.

Key Takeaways

  • Explain Appium as a WebDriver-based server plus independently installed platform drivers, not as one monolithic mobile tool.
  • Prefer accessibility IDs and stable platform identifiers, and request testability changes when the app exposes none.
  • Replace fixed sleeps with conditions tied to UI, app, network, or backend readiness.
  • Treat permissions, lifecycle, deep links, keyboards, connectivity, orientation, and device diversity as core mobile risks.
  • Design parallel execution around unique device sessions, ports, accounts, and cleanup.
  • Use page or screen objects for stable behavior while keeping assertions and workflows readable.
  • Diagnose failures from the first divergence using Appium logs, device logs, screenshots, page source, video, and backend IDs.

Appium scenario based interview questions test whether you can automate a real mobile product, not whether you remember a capability list. Strong candidates reason about Android and iOS differences, application lifecycle, permissions, locators, synchronization, contexts, gestures, device state, parallel execution, and diagnostic evidence. They also know when a mobile UI test is the wrong layer.

Modern Appium uses a server with separately managed drivers and plugins. Android automation commonly uses the UiAutomator2 driver, while iOS commonly uses XCUITest. Exact support and options belong to the installed driver documentation, so a credible 2026 answer checks driver versions and platform requirements rather than assuming every capability belongs to Appium core.

TL;DR

Scenario First decision Strong evidence
Element not found Locator, context, or timing? Current source, screenshot, context list, logs
Flaky tap Is the element visible, enabled, stable, and unobstructed? Condition wait plus event timeline
Parallel collision Which device, port, account, or file is shared? Unique session allocation and artifacts
Hybrid screen Native or web context, and when does it appear? Context transition and DOM/native inspection
Works locally only What differs in CI device and environment? Capabilities, server log, device log, video, network

Answer each scenario with assumptions, risk, setup, interaction, assertion, cleanup, and diagnostics. Avoid solving every failure by increasing a timeout.

1. How to Answer Appium Scenario Based Interview Questions

Start by clarifying platform, app type, and execution environment. Android and iOS expose different platform behaviors. A native app, hybrid app, mobile browser, and embedded web view require different context and locator decisions. Ask whether tests run on emulators, simulators, physical devices, or a cloud provider, and whether the failure occurs locally, in CI, or only on a particular OS version.

Next identify the user risk. If the problem is a flaky login test, the actual risk might be authentication, keyboard overlap, network recovery, or merely an unstable selector. Separate product behavior from test infrastructure. Then define controlled preconditions: app build, install or retained state, permissions, account, locale, time zone, connectivity, feature flags, and backend data.

Use a mobile evidence stack:

  1. Appium server log and exact session capabilities.
  2. Device or simulator logs, such as Android logcat or iOS platform logs.
  3. Screenshot, video, and current page source at the first failure.
  4. Contexts, current activity or app state when supported, orientation, keyboard state, and window information.
  5. Network or backend correlation identifiers for end-to-end actions.

Close with test-layer judgment. Appium is valuable for platform integration and critical user journeys. Business-rule combinations usually belong in unit, API, or component tests. The mobile test automation strategy guide provides the broader pyramid.

2. Scenario: Element Not Found or Stale After Navigation

An element can be absent because the locator is wrong, the expected screen is not active, the app is in another context, the element has not appeared, or the hierarchy was rebuilt. Do not catch every exception and retry the same lookup. Capture the current screen, page source, context, and navigation evidence first.

Prefer locator strategies in this general order, subject to the app and driver: accessibility identifier, stable resource or platform ID, supported platform selector, and carefully scoped XPath as a last resort. Accessibility IDs encourage a shared semantic contract and often work across automation and accessibility efforts. Visible text can be localized and duplicated. Coordinates break across screen sizes, orientation, safe areas, and layout changes.

A stale element reference means a previously found object no longer maps to the current UI hierarchy. Re-locate after the state transition instead of storing element instances for a long time. Screen objects should expose actions or locator definitions, not cache mutable elements across navigation.

Use an explicit condition that represents readiness. For example, wait until a destination screen's unique control is visible and enabled. If animation moves the element, wait for a stable application signal when possible or disable animation in a controlled test configuration. Avoid implicit and explicit wait combinations that make timeout behavior confusing.

If no stable identifiers exist, propose a product change. Adding accessibility IDs or test-friendly semantics is often cheaper than maintaining complex XPath. A senior engineer improves testability instead of accepting fragile automation as inevitable.

3. Scenario: Permissions, Notifications, and First-Run State

Permission behavior varies by platform, OS version, permission type, prior choice, and app installation state. A test that assumes every launch begins with a permission dialog will fail after the user has already responded. Decide whether the case requires a fresh install, reset application data, retained state, or explicit permission configuration.

Build a state matrix: not requested, granted, denied, denied with restricted re-prompt behavior, revoked in settings, and limited access where the platform offers it. Test the user experience, not only the system dialog. The app should explain why access is needed, handle denial without a crash, offer a recovery path, and avoid asking before context makes sense.

System dialogs are outside the app's normal hierarchy but are still platform UI. Use driver-supported and platform-appropriate interactions or capabilities documented for the installed driver. Do not create a universal helper that taps text such as "Allow" because wording changes with locale and OS version. Cloud device providers may expose their own permission controls with vendor-prefixed options.

Notifications add more states: permission, token registration, foreground and background handling, deep-link payload, duplicate delivery, expired content, signed-out user, and account switching. Test notification behavior with approved test infrastructure and synthetic payloads. Verify that sensitive message content is not shown on a locked device if product policy forbids it.

Always restore or provision state deliberately. Hidden permission residue creates order-dependent failures and can invalidate an entire suite.

4. Scenario: Keyboard, Gestures, and Scroll Failures

A login button may be visible in the hierarchy but covered by the software keyboard. Verify which field has focus, whether the keyboard is shown, and whether the UI should resize, scroll, or provide an action key. Hiding the keyboard can be a test action, but it should match a real user path and driver support. Do not call a convenience command blindly across platforms.

For scrolling, first ask whether the control should already be reachable through accessible navigation. Use a platform-supported mobile gesture or scrollable selector appropriate to the driver. Coordinate swipes are a fallback because they depend on dimensions and safe areas. When coordinates are unavoidable, calculate them from the window rectangle and keep them away from system gesture edges.

Gesture tests should assert the business result, such as the next image, reordered item, or refreshed list, rather than merely reporting that a swipe command returned. Cover cancellation, short movement, multi-touch if relevant, interruption, orientation, and accessibility alternatives.

Compare interaction choices:

Approach Good fit Fragility
Accessibility or ID click Named, actionable control Low when semantics are stable
Platform selector or scroll command Native platform behavior Driver and OS specific
W3C pointer actions Custom gesture needing precise sequence More implementation detail
Raw coordinates Canvas or otherwise inaccessible target High across devices and layouts
Image matching plugin Visual-only target with controlled rendering Sensitive to scaling and appearance

If the product exposes important functionality only through an unlabeled gesture, raise an accessibility and testability concern. Automation pain can reveal real user pain.

5. Scenario: Hybrid App Context Does Not Appear

A hybrid app contains native UI and an embedded web view. Appium begins in a native context, and a web context may appear only after the web view initializes and remote debugging prerequisites are satisfied. Inspect available contexts with the client API and wait for the expected context rather than switching to a hard-coded name immediately.

When the context is missing, check app build settings, web view implementation, driver requirements, browser or web view compatibility, device connectivity, and whether the screen is truly hybrid. Platform driver documentation is authoritative because discovery and automation details differ between UiAutomator2 and XCUITest.

After switching, use web locators against the DOM. Native resource IDs will not work inside the web context, and CSS selectors will not work in the native hierarchy. Encapsulate context transitions around a stable screen boundary and return to native explicitly when system or native controls reappear. Record the current context in failure artifacts.

Also test cross-context behavior: authentication cookies, deep links, back navigation, file chooser, camera or permission prompts, downloads, and offline recovery. A test that validates only the HTML form can miss the bridge between JavaScript and native code.

If the web content can be tested thoroughly in a browser, keep most functional combinations there. Retain Appium cases for the hybrid integration, device bridge, permissions, and a small number of critical journeys. This gives faster feedback and clearer failure ownership.

6. Scenario: Deep Links, Backgrounding, and App Lifecycle

Mobile apps do not live in one uninterrupted foreground session. Users open deep links, switch apps, receive calls, lose memory, rotate devices, lock screens, and resume after tokens or data have changed. Model lifecycle states explicitly: not running, launched, foreground, background, suspended where applicable, terminated, and relaunched. Driver capabilities and commands vary, so reference the installed platform driver for supported lifecycle operations.

For a deep link, test a valid authenticated destination, signed-out flow, expired link, malformed parameters, unauthorized resource, already-open app, cold start, and supported browser fallback. Assert final navigation and data, not simply that the operating system accepted the URI. Protect against open redirects and cross-account leakage.

For background and resume, control what changes while the app is away. Refresh a server-side record, expire a token, revoke permission, or change network state. Then assert whether the app refreshes, warns, retries, or requires sign-in according to product design. Avoid depending on real phone calls or uncontrolled services in the core suite.

State restoration can hide defects if every test performs a fresh install. Maintain separate suites for clean install, upgrade, retained session, and migration when those risks matter. Upgrade testing should preserve user data while applying schema and preference changes safely.

The mobile app testing checklist can help convert these lifecycle cases into a risk matrix.

7. Scenario: Waits Pass Locally but Fail in CI

CI devices may have slower startup, constrained CPU, different animations, remote network latency, or a cold application cache. Increasing every wait treats the symptom and lengthens feedback. Identify the condition the test truly needs: process launched, screen visible, control enabled, network response applied, list populated, or animation completed.

Use explicit waits around observable UI conditions and give them domain-specific failure messages. Keep the poll interval and deadline reasonable for the environment. A screen-level readiness helper can wait for one unique element and the absence of a loading indicator, but it should not hide arbitrary sleeps.

The following Python example uses current Appium client classes and Selenium conditions. Install an Android SDK and emulator, install the official Appium Python client, start Appium, install the UiAutomator2 driver with appium driver install uiautomator2, then run against the Android Settings app. The visible label may differ by OS locale, so keep the emulator in English or replace it with a stable identifier for your app:

from appium import webdriver
from appium.options.android import UiAutomator2Options
from appium.webdriver.common.appiumby import AppiumBy
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait

capabilities = {
    "platformName": "Android",
    "automationName": "UiAutomator2",
    "deviceName": "Android",
    "appPackage": "com.android.settings",
    "appActivity": ".Settings",
}
options = UiAutomator2Options().load_capabilities(capabilities)
driver = webdriver.Remote("http://127.0.0.1:4723", options=options)

try:
    wait = WebDriverWait(driver, 15)
    search = wait.until(
        EC.element_to_be_clickable((AppiumBy.ACCESSIBILITY_ID, "Search settings"))
    )
    search.click()
    assert wait.until(
        EC.visibility_of_element_located((AppiumBy.ID, "android:id/search_src_text"))
    ).is_displayed()
finally:
    driver.quit()

Do not copy this Settings-app locator into a product suite. The important pattern is W3C options, an explicit Appium server URL, explicit waits, and guaranteed session cleanup.

8. Scenario: Parallel Devices Collide

Parallel mobile automation requires isolation at several layers. Each worker needs a unique device or simulator, Appium session, driver-specific system port where required, account or tenant, application data, artifact directory, and sometimes proxy port. A test runner setting alone does not create this isolation.

Create a device allocator that leases a known capability set to one worker and always releases it. Validate device readiness before the test: online, unlocked, correct OS, sufficient storage, correct time, and expected app build. Record device ID and capabilities in every report. Use vendor-prefixed cloud options only as documented by that provider.

Data isolation is equally important. If two devices use the same account, one login may invalidate the other or shared notifications may alter state. Generate unique accounts or partition fixtures, and make cleanup idempotent. Avoid deriving identity only from a thread number because reruns and distributed workers can collide.

On Android, a driver may require a unique systemPort for parallel sessions. Other services such as ChromeDriver or MJPEG streaming can need their own ports depending on configuration. On iOS, WebDriverAgent and simulator or device allocation have separate concerns. Do not memorize a universal port list, consult the driver and provider documentation used by the team.

Start with two stable sessions, observe resource consumption, then scale. More parallelism can increase infrastructure contention and application load, making total feedback worse. Measure queue time, execution time, failure classification, and cost.

9. Scenario: Test Works on Emulator but Fails on a Real Device

Real devices introduce hardware, vendor software, resource limits, network radios, biometric sensors, cameras, notifications, and OS customizations that simulators may not reproduce. Begin by comparing exact app build, OS, device model, locale, time zone, permissions, connectivity, battery state, orientation, and installed dependencies.

Capture the Appium server log and device log from session creation. Many failures begin before the test action because application installation, signing, WebDriverAgent setup, device trust, or driver compatibility failed. Separate session-creation problems from locator and application problems.

If layout differs, inspect the current hierarchy and screenshot. A control may move behind a keyboard, notch, system bar, font scaling, or vendor dialog. Do not add a device-specific coordinate unless the application truly has no semantic control. Fix responsive or accessibility behavior where appropriate.

Network differences matter. A laptop and device may use different DNS, certificates, proxies, VPN routes, or backend environments. Verify the device can reach the Appium host and application services. For TLS failures, investigate trust and certificate setup rather than disabling security checks in test code.

Maintain a deliberate device matrix based on customer usage, platform support, hardware features, risk, and incident history. Emulators provide fast broad feedback. Physical devices provide targeted confidence. Neither category universally replaces the other.

10. Framework Design for Appium Scenario Based Interview Questions

A maintainable framework separates test intent, screen behavior, platform variation, data setup, driver lifecycle, and diagnostics. Tests should read as user or domain workflows. Screen objects expose stable actions and state, while lower-level locator details remain close to the screen. Do not turn one base page into a bag of every possible mobile command.

Use composition for reusable components such as navigation bars, permission prompts, and date pickers. Platform-specific implementations can share an interface only where behavior is genuinely common. Forced inheritance often produces conditional branches throughout the code. Keep assertions in tests or focused assertion helpers so page actions do not silently decide pass or fail.

Driver creation should validate capabilities, allocate a device, start a session, and register artifacts. Teardown must attempt screenshot and source capture on failure, then quit the session and release resources even if cleanup fails. Secrets and cloud credentials come from approved stores. Dependencies and driver versions should be visible and controlled.

Organize suites by purpose: fast smoke, critical journeys, platform features, upgrade and lifecycle, accessibility-supported checks, and broader scheduled coverage. Quarantine is temporary and owned, with reason and expiry. Track flake rate by root cause, time to classify, device utilization, and critical journey signal.

For a full implementation discussion, read the Appium framework architecture guide. In an interview, draw a small flow from test to fixture to screen to Appium client to server to driver to device, then show where logs and screenshots return.

Interview Questions and Answers

Q: An element is visible but Appium cannot click it. What do you check?

I verify the current context, locator match count, displayed and enabled state, bounds, keyboard, overlays, animation, and whether another element receives the tap. I capture source and screenshot before retrying. Then I wait on the real readiness condition or fix the semantic locator instead of using coordinates by default.

Q: How do you choose locators in Appium?

I prefer stable accessibility identifiers and platform resource IDs agreed with developers. I use supported platform selectors when they express native behavior and scoped XPath only when necessary. Visible text and coordinates are risky because localization and layout vary.

Q: Why should you avoid Thread.sleep?

A fixed sleep waits the full duration when the app is ready early and still fails when readiness takes longer. An explicit condition ties progress to observable state and provides a useful timeout. A short controlled delay may occasionally model a requirement, but it is not synchronization.

Q: How do you automate a hybrid app?

I start in native context, wait for the expected web context, switch explicitly, and use DOM locators there. I return to native for platform controls and record the active context on failure. Most web logic can run in browser tests, leaving Appium to protect the bridge and critical journeys.

Q: How do you run Appium tests in parallel?

Each worker receives a unique ready device, session, driver-specific ports, account, and artifact path. Allocation and cleanup are idempotent, and capabilities are recorded. I scale gradually while measuring contention, reliability, queue time, and cost.

Q: How do you handle permission dialogs?

I model permission states by OS and prior user choice, then provision the required state deliberately. Tests verify the app's explanation, denial handling, and recovery, using driver-supported platform interactions where needed. I avoid text-only universal helpers because dialog wording varies.

Q: What logs do you collect for a failed mobile test?

I collect Appium server logs, device logs, exact capabilities, screenshot, page source, video when useful, current context, app state, and safe backend correlation IDs. I align timestamps and look for the first divergence. Secrets and personal data are redacted.

Q: When would you not use Appium?

I would not use it for exhaustive business-rule combinations, isolated API contracts, or logic that a unit or component test can cover faster and more deterministically. I keep Appium for platform behavior, device integration, and a focused set of user journeys.

Q: How do you test push notifications?

I cover permission, token registration, foreground and background delivery, tap routing, duplicate and expired payloads, signed-out state, and account switching. I use synthetic messages in approved infrastructure and verify sensitive content policy on locked devices.

Q: What is the difference between an emulator and a real device strategy?

Emulators and simulators give fast, reproducible coverage across configurations. Physical devices add hardware, vendor customization, resource, radio, signing, and real notification confidence. I select a risk-based mix from customer usage and incident history rather than running everything everywhere.

Q: How do you reduce Appium suite flakiness?

I control app, device, account, backend, locale, clock, and network state; use semantic locators and explicit conditions; and capture layered evidence. I classify failures by cause and remove order dependence. Retries may measure instability but should not hide it.

Q: How do you test app upgrade behavior?

I install the supported previous version, create representative user state, upgrade without clearing data, and validate migration, authentication, preferences, caches, and critical workflows. I cover interrupted migration and low-storage behavior where feasible. Fresh-install tests cannot replace upgrade tests.

Q: How do you automate gestures reliably?

I prefer semantic actions or driver-supported platform gestures and assert the resulting business state. For W3C pointer actions, coordinates derive from element or window bounds and avoid system edges. I test across relevant dimensions and keep raw coordinate use limited and visible.

Q: How would you design an Appium framework from scratch?

I begin with risks, platforms, device strategy, and CI constraints. I separate lifecycle fixtures, focused screen components, domain data, platform adapters, and diagnostics, then implement one critical journey end to end. I add abstraction only after stable repetition appears.

Common Mistakes

  • Treating Appium core, platform drivers, and cloud-provider options as one capability namespace.
  • Reusing copied desired capabilities without checking current driver documentation.
  • Selecting elements by coordinates or long XPath when the app can expose semantic IDs.
  • Caching element objects across navigation and then masking stale references with retries.
  • Combining implicit waits, explicit waits, and fixed sleeps until timing becomes unpredictable.
  • Assuming fresh-install permission state in a retained-session suite.
  • Forgetting the active native or web context in hybrid automation.
  • Sharing devices, ports, users, downloads, or artifacts during parallel execution.
  • Collecting only a screenshot after the useful logs and source have disappeared.
  • Running every data combination through a slow mobile UI.
  • Claiming emulator success proves physical hardware, signing, notification, and vendor behavior.
  • Leaving quarantined tests without an owner, root cause, or expiry.

Conclusion

Appium scenario based interview questions are tests of mobile engineering judgment. A strong answer names platform and state assumptions, protects a user risk, uses stable locators and observable waits, controls device and data isolation, and captures enough evidence to diagnose the first divergence. It also places coverage below the UI whenever that produces faster and clearer confidence.

Prepare by automating one critical journey on Android or iOS, then introduce a permission denial, background transition, slow backend, and second parallel device. Explain every change from risk through evidence. That exercise is more valuable than memorizing a catalog of commands.

Interview Questions and Answers

An element is visible but Appium cannot click it. What do you investigate?

I inspect current context, locator count, state, bounds, keyboard, overlays, animation, and hit target. I capture source and screenshot before changing the test. Then I synchronize on readiness or improve the locator instead of defaulting to coordinates.

How do you choose Appium locators?

I prefer accessibility identifiers and stable platform IDs designed with developers. Supported native selectors can express platform behavior, while scoped XPath is a fallback. Text and coordinates are more fragile across localization and layout.

Why are explicit waits better than fixed sleeps?

An explicit wait proceeds when a meaningful condition becomes true and reports a defined timeout. A sleep always spends its duration and may still be too short. The condition should represent application readiness, not hide an arbitrary delay.

How do you automate hybrid applications?

I wait for and switch between native and web contexts explicitly. Native selectors apply to platform UI, while DOM selectors apply inside the web view. I test the bridge with Appium and move broad web logic to faster browser coverage.

How do you execute Appium tests in parallel?

A device allocator gives each worker a unique device, session, required driver ports, account, and artifact directory. Setup validates readiness and cleanup is idempotent. I increase parallelism only while reliability, queue time, and cost improve.

How do you handle mobile permission dialogs?

I model permission state by platform, OS, and prior choice and provision it intentionally. Tests cover grant, denial, restricted re-prompt, revocation, explanation, and recovery. System dialog interactions follow the installed driver's documented support.

Which artifacts help diagnose Appium failures?

I retain server and device logs, exact capabilities, screenshot, source, current context, app state, and video when it adds value. Safe backend request identifiers connect UI actions to service behavior. Timestamps and redaction are essential.

When is Appium the wrong test layer?

It is inefficient for exhaustive rules, isolated contracts, and logic that unit, API, browser, or component tests cover deterministically. I reserve it for platform behavior, hardware or OS integration, and selected end-to-end mobile journeys.

How would you test push notifications?

I cover permission and token lifecycle, foreground and background receipt, tap navigation, duplicate or expired payloads, signed-out state, and account switching. Synthetic payloads run in approved infrastructure, and locked-screen content follows privacy policy.

Should a mobile suite use emulators or real devices?

Use both according to risk. Emulators and simulators provide fast reproducible breadth, while physical devices cover hardware, vendor differences, signing, resources, radios, and notifications. Customer usage and incident history guide the matrix.

How do you reduce mobile automation flakiness?

I control application, device, account, backend, locale, clock, and network state. Tests use semantic locators, observable waits, isolated parallel resources, and layered artifacts. Every flaky failure is classified and owned rather than silently retried.

How do you test app upgrades?

I create representative data on a supported older build, upgrade without clearing state, and verify migrations, sessions, preferences, caches, and critical workflows. I also cover interruption and resource constraints where practical. Fresh installs do not exercise migration risk.

How do you make gesture automation reliable?

I prefer semantic controls or documented platform gestures and assert the resulting business behavior. When W3C pointer actions are required, positions derive from bounds and avoid system gesture areas. Raw coordinates remain a visible, limited fallback.

How would you design an Appium framework?

I begin with product risks, supported platforms, device sourcing, and CI constraints. Lifecycle fixtures, screen components, data setup, platform adapters, and diagnostics have clear responsibilities. I implement one critical journey and add abstractions only after stable duplication appears.

Frequently Asked Questions

What Appium topics are asked in scenario-based interviews?

Common scenarios cover locators, waits, permissions, keyboards, gestures, hybrid contexts, lifecycle, parallel devices, CI failures, real devices, and framework design. Senior interviews also probe observability, testability, and test-layer choices.

Is Appium still relevant for mobile testing in 2026?

Appium remains a relevant cross-platform WebDriver-based option with independently managed platform drivers. Tool choice still depends on product platforms, team skills, reliability needs, native access, and ecosystem constraints.

Which language should I use for Appium interviews?

Use a supported client language in which you can design and debug maintainable tests. Python, Java, JavaScript or TypeScript, C#, and Ruby may be options depending on the current client ecosystem and employer stack.

What is the best locator strategy in Appium?

Stable accessibility identifiers and platform resource IDs are usually strong choices. The best locator is unique, semantic, fast enough, and maintained as part of the app contract, while text, XPath, and coordinates require more caution.

How do I explain Appium flakiness in an interview?

Classify the first divergence across product, test, device, environment, and infrastructure. Discuss state control, semantic locators, explicit readiness conditions, parallel isolation, and diagnostic artifacts instead of offering retries as the main fix.

Do Appium candidates need Android and iOS knowledge?

A cross-platform role benefits from understanding lifecycle, permissions, selectors, signing, devices, and platform differences on both. Depth expectations depend on the specific job, so use the posting and recruiter guidance to prioritize.

How many Appium tests should run end to end?

There is no universal count. Keep a focused set for critical journeys and platform integrations, then place exhaustive rules and data combinations in faster unit, API, browser, or component layers.

Related Guides