ScreenshotNeo

BlogHow-to

How to Test Website Compatibility Across Browsers and Devices

Build a practical browser and device test matrix, automate important flows, and confirm mobile behavior on real hardware.

By the ScreenshotNeo team4 October 20269 min read

To test website compatibility across browsers and devices, choose a support matrix from your audience, inspect responsive layouts at representative widths, automate important user flows across browser engines, and confirm mobile behavior on simulators and real devices. Emulation is useful for fast layout checks; it does not prove that every real browser, operating system, or hardware-dependent interaction will behave the same way.

Responsive testing asks whether a layout adapts as the viewport changes. Cross-browser testing asks whether rendering and functionality work across browser implementations and versions. Accessibility needs additional keyboard and assistive technology checks.

1. Choose a test matrix from your audience

Start with site analytics, support commitments, and the browsers your product officially supports. Select representative desktop and mobile configurations, including the browser versions that matter to your users. There is no short universal list that covers every audience.

Dimension What to record How to choose
Browser Browser name, engine where known, and version Include the browsers your audience uses and your support policy promises.
Operating system OS and version Include supported desktop and mobile platforms.
Device Model or device class Include actual mobile devices for high-impact flows and hardware-dependent behavior.
Viewport Width, height, and device scale if relevant Cover narrow phone, typical phone, tablet, laptop, and wide desktop layouts as applicable.
Network and state Network conditions, logged-in state, data, permissions Reproduce conditions that affect the journey under test.

Keep the matrix manageable by prioritizing high-traffic configurations and critical journeys. Revisit it when analytics, supported platforms, or product requirements change.

2. Check responsive layouts at useful widths

Use browser developer tools’ responsive mode for quick local exploration. Check both known breakpoints and widths between them: many problems appear while resizing through a breakpoint rather than at the breakpoint itself.

  1. Open the page in the browser and enable its responsive device or viewport mode.
  2. Inspect narrow and wide sizes that match your support matrix, then resize continuously between them.
  3. Check horizontal overflow, clipped content, overlapping elements, unreadable text, and controls that are too difficult to reach or operate.
  4. Exercise navigation, menus, forms, and dialogs at narrow widths, including keyboard access where relevant.
  5. Repeat on pages with different structures, such as long content, tables, images, and complex forms.

Emulation is efficient for layout work, but the result is still a browser’s emulated viewport. It cannot establish that a real mobile browser or device behaves identically.

3. Test high-value behavior across browser engines

List the journeys that matter for your site: for example, navigation, search, account access, form submission, or checkout if your product has one. In each supported browser, verify that the controls work, validation is understandable, focus moves correctly, and state changes persist as expected.

Playwright documents Chromium, WebKit, and Firefox, along with branded Chrome and Edge channels and device emulation. The exact available browser builds depend on the Playwright release and installed browser binaries. Keep the framework and browser builds current, and check the [Playwright browsers documentation](https://playwright.dev/docs/browsers) and [emulation documentation](https://playwright.dev/docs/emulation) for current setup details.

Runnable Playwright example

This example runs a basic page-load and navigation check in Chromium, Firefox, and WebKit. Change the URL and expected heading to match your site. Install Playwright and its browser binaries with npm install -D @playwright/test and npx playwright install, then save this as compatibility.spec.js and run npx playwright test compatibility.spec.js.

const { test, expect } = require('@playwright/test');

test('home page loads and primary navigation works', async ({ page }) => {
  await page.goto('https://example.com', { waitUntil: 'domcontentloaded' });
  await expect(page).toHaveTitle(/Example Domain/);

  // Replace this locator and expected destination with your own navigation.
  const primaryLink = page.getByRole('link', { name: 'More information' });
  await expect(primaryLink).toBeVisible();
  await primaryLink.click();
  await expect(page).toHaveURL(/iana\.org/);
});
// playwright.config.js
const { defineConfig, devices } = require('@playwright/test');

module.exports = defineConfig({
  testDir: './tests',
  use: { baseURL: 'https://example.com' },
  projects: [
    { name: 'chromium', use: { ...devices['Desktop Chrome'] } },
    { name: 'firefox', use: { ...devices['Desktop Firefox'] } },
    { name: 'webkit', use: { ...devices['Desktop Safari'] } },
    { name: 'mobile-chromium-emulation', use: { ...devices['Pixel 7'] } },
    { name: 'mobile-webkit-emulation', use: { ...devices['iPhone 13'] } },
  ],
});

The device entries configure emulation; they do not turn a desktop run into a test on a physical phone. Project names and device descriptors can change with Playwright releases, so verify descriptors available in your installed version. The example tests one journey; add site-specific assertions for errors, form validation, keyboard focus, and important state changes.

4. Use simulators and physical devices deliberately

Device simulators and emulators can help check selected OS integrations and development scenarios, including virtual keyboard behavior. Real devices provide stronger confirmation when behavior depends on an actual mobile browser, touch input, device hardware, or OS integration.

  • Use emulated viewports for fast responsive exploration and repeatable checks.
  • Use a simulator when a device or OS interaction is part of the question.
  • Use physical devices for critical mobile journeys, touch behavior, and issues that appear only on real hardware.
  • When reporting a problem, record the actual device model, OS version, browser, and browser version.

For hosted device services, verify the provider’s current inventory and whether each configuration is a real device or emulation. Check exact OS, browser, and version coverage, plus support for your network or staging setup, automation framework, logs, video, and parallel runs. Coverage changes over time. BrowserStack documents its [Live service](https://www.browserstack.com/live) and [supported Playwright versions, browsers, and operating systems](https://www.browserstack.com/support/faq/automate/playwright/playwright-supported-browsers-and-os); treat these as vendor descriptions of its current offering and recheck the matrix before depending on it.

5. Check accessibility as a separate part of compatibility

A page that looks correct can still be difficult to use with a keyboard or screen reader. Check keyboard access, visible focus, sensible focus order, labels, error announcements, and screen-reader behavior in supported environments. BrowserStack’s documentation describes screen-reader tools including NVDA and VoiceOver; automated checks alone do not amount to a complete accessibility evaluation.

6. Capture screenshots to compare rendering

For visual review, capture the same URL and state at the same viewport in each browser configuration. Make sure data, authentication, animations, and loaded content are comparable; otherwise a visual difference may reflect different page state rather than browser compatibility. Screenshots help reveal layout and rendering changes, but they do not prove that interactions or accessibility work.

For manual checks, save captures with the browser, version, OS, viewport, URL, and test date. For automated visual comparisons, keep a stable baseline and review differences instead of treating every pixel change as a defect. Dynamic timestamps, ads, fonts, and asynchronous content may need to be stabilized or excluded from comparison.

7. Report and retest defects reproducibly

A useful compatibility report gives another developer enough detail to reproduce the issue:

  • Page URL and relevant account or content state, without exposing credentials.
  • Browser name and version, operating system and version, and device model or viewport dimensions.
  • Exact steps, expected result, and actual result.
  • Screenshot or recording when it clarifies the visual or interaction problem.
  • Whether the issue reproduces after a clean reload and in a related browser or viewport.

After fixing the issue, retest the configuration that exposed it and at least one related configuration. Add a regression check for critical flows when the issue can be represented reliably in automation.

Common problems and fixes

Symptom Likely cause What to do
Layout works at the tested widths but breaks between them Only preset sizes were checked, or a breakpoint has a gap. Resize continuously and test just below and above each breakpoint.
Emulated mobile works, real phone fails The issue depends on the real browser, OS, touch input, keyboard, or hardware. Record the device and software versions, reproduce on hardware, and add that configuration to the targeted matrix.
Automation passes in one browser but fails in another Rendering or timing differs, or the app uses browser-specific behavior. Inspect the failing trace and console, wait on a meaningful page condition, and verify the behavior manually in that engine.
Playwright reports a missing browser executable The browser binaries for the installed Playwright version are not installed. Run npx playwright install and follow the current installation documentation for operating-system dependencies.
Mobile screenshot has unexpected scale or wrapping Viewport, device scale factor, or emulation settings differ from the intended configuration. Check the configured device descriptor and viewport, then confirm the result on a real device if it matters.
Visual diffs change on every run Dynamic content, animation, font loading, or asynchronous state is unstable. Use deterministic data, wait for the relevant content, and mask or disable genuinely variable regions where appropriate.
Hosted provider does not list the desired browser/device combination Provider coverage is limited or has changed. Verify its live support matrix and choose a different hosted configuration or a physical device.
Screenshot looks right but users still cannot complete a flow A screenshot does not exercise interaction, focus, validation, or assistive technology. Run the actual journey, test keyboard and screen reader behavior, and add functional assertions.

Performance, reliability, and cost

Start with local responsive emulation and a small automated suite because they are quick to repeat. Run the core browser-engine set on important flows, then reserve simulator and physical-device checks for risks that emulation cannot answer. A broad matrix increases execution time and maintenance, so prioritize by audience, impact, and support commitments.

Automation is repeatable but can miss visual details and real-device behavior. A passing run is evidence for the tested configuration and assertions, not proof of universal compatibility. Hosted device coverage can reduce the need to maintain hardware, but availability, parallelism, logs, framework support, and pricing depend on the provider and current plan; check current documentation and pricing before selecting one. Physical devices require access and upkeep, while emulation is inexpensive in hardware but has fidelity limits.

Or skip the browser setup

If your immediate task is capturing a webpage for review or a visual artifact, ScreenshotNeo provides a website screenshot API and MCP server. A screenshot is useful evidence for rendering, but it does not replace browser interaction, device, or accessibility testing.

One GET request returns an image or PDF. See the ScreenshotNeo API documentation for the supported parameters.

curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp
import requests

r = requests.get(
    "https://api.screenshotneo.com/v1/shot",
    params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"},
    timeout=90,
)
open("shot.webp", "wb").write(r.content)
const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
if (!res.ok) throw new Error(`Screenshot request failed: ${res.status}`);
await require('node:fs/promises').writeFile('shot.webp', Buffer.from(await res.arrayBuffer()));
  • Cookie and consent banners, newsletter popups, and chat widgets are removed before capture; each cleanup step can be turned off.
  • Bot checks, blank pages, timeouts, failed loads, and cache hits are never billed. Responses identify the page verdict and billing status in headers.
  • An MCP server gives AI agents tools to take screenshots, get page information, and capture PDFs.
  • 1,000 screenshots per month are free with no card; paid plans start at $5 for 3,000 screenshots. Every feature is available on every plan.

Sign up for ScreenshotNeo and get 1,000 free screenshots a month, no card required.

FAQ

How many browser and device combinations should I test?

Choose based on your users, support policy, and the impact of failure. Expand the matrix when analytics, incidents, or product changes justify it.

Does a screenshot prove a page is compatible?

No. It can help assess appearance in a captured state, but it does not exercise interaction, keyboard use, screen readers, or all device behavior.

Can browser emulation replace real-device testing?

It is useful for exploration and repeatable layout checks, but it cannot establish every behavior of a real browser and device. Confirm important mobile behavior on representative hardware.

Should I test accessibility in every browser?

Include accessibility checks in your supported environments, prioritizing the browsers and assistive technologies your users rely on. Combine automated checks with keyboard and screen-reader evaluation.