ScreenshotNeo

BlogGuides

Common Browser Compatibility Issues and How to Test for Them

Learn why websites behave differently across browsers and build a practical test plan with Playwright, manual checks, and a clear support matrix.

By the ScreenshotNeo team4 October 202610 min read

Browser compatibility issues happen when browser versions, rendering engines, operating systems, devices, or assistive technologies handle a web feature or interaction differently. The practical way to manage them is to define which environments you support, check the features your site depends on, and test important user flows across representative target platforms. Automation broadens repeatable coverage, but it does not replace checks on actual platforms or accessibility testing.

No team can realistically test every browser and device combination. Build a support matrix around your audience, product requirements, and the risk of each feature. Then use automated tests and manual checks as complementary sources of evidence. See MDN’s introduction to cross-browser testing and testing strategies.

1. What causes browser compatibility issues?

A page can look or behave differently because browsers do not all support the same features, or because a supported feature behaves differently across engines, operating systems, or devices. The browser’s version matters too: a newer release may implement a CSS property or JavaScript API that an older supported release lacks.

  • Unsupported features: CSS, JavaScript, or web APIs may be absent in an older browser version.
  • Implementation differences: A feature can exist in multiple browsers but produce different layout or interaction behavior.
  • Viewport and device differences: Responsive layouts, touch behavior, and available screen space vary by device and configuration.
  • Platform dependencies: Media codecs and native integrations can depend on the operating system as well as the browser.
  • Assistive technology: Visual rendering alone does not show whether keyboard navigation or screen-reader use works.

When a bug appears, first determine whether it is tied to a feature, a browser engine, a particular version, a viewport, an operating system, or an interaction path. This narrows the problem more effectively than treating every report as a general “browser issue.”

2. Define a browser support matrix

Write down the environments that must work before choosing test coverage. Use site analytics or other audience evidence when available, and account for product obligations, regional needs, and the functions being built. A support range should state the browser or engine, version policy, operating system, device class, and any relevant assistive-technology expectations.

Dimension What to decide Example of a useful policy
Browser and engine Which distinct engines or branded browsers matter? Cover Chromium, Firefox, and Safari users; add branded Chrome or Edge where required.
Version How old a browser release must remain supported? Document a version floor or an agreed update policy.
Operating system Which platforms are in the audience? Include the desktop and mobile operating systems the product supports.
Device class Which screen and input types matter? Representative desktop, phone, and tablet layouts, including touch where relevant.
Assistive technology Which access paths need explicit checks? Keyboard-only operation and screen-reader navigation for core flows.

This is a policy for meaningful coverage, not a claim that every combination has been tested. Prioritize environments by audience and risk rather than attempting an exhaustive matrix. MDN’s testing strategy guidance discusses how to select a manageable testing approach.

3. Find feature support gaps before they become bugs

Inventory the newer or platform-sensitive features your implementation relies on: CSS properties, JavaScript syntax and APIs, media formats, and browser integrations. Check their support against the versions in your matrix while making the implementation decision. Compatibility information changes, so verify it during development instead of relying on memory.

  1. List the feature and the user-visible behavior that depends on it.
  2. Check the feature in MDN browser documentation and MDN Browser Compatibility Data; use Can I Use as another compatibility reference.
  3. Compare support with the project’s documented browser and version policy.
  4. Choose a fallback or alternate implementation where a required environment lacks the feature. If a reduced experience is acceptable, keep it usable and make that decision explicit.
  5. Add a test for the behavior that matters, including the fallback path where applicable.

For guidance on progressive support and older environments, see MDN’s article on supporting older browsers. Compatibility tables help answer whether a feature is available; they do not establish that your whole page or workflow works correctly.

4. Test behavior, not just page loading

A page returning successfully is only a starting point. Test the user tasks that depend on your application: navigation, forms, menus, media, and other important interactions. Check layout at representative viewport sizes, then include keyboard and screen-reader checks for the relevant flows.

  • Can a user reach and operate navigation and menus?
  • Do forms accept valid input, report errors, and complete the expected action?
  • Do responsive layouts retain content and usable controls at target sizes?
  • Do media and platform-dependent features work in the environments that need them?
  • Can a keyboard user operate the core workflow, and can a screen reader navigate its content?

MDN recommends simple keyboard and screen-reader testing as part of cross-browser work. Baseline browser support can summarize feature availability, but it is not a substitute for accessibility, usability, performance, or security testing. See MDN’s explanation of Baseline compatibility.

5. Automate cross-browser checks with Playwright

Playwright can run repeatable checks using Chromium, Firefox, and WebKit. It also supports branded Chrome and Edge channels when the relevant browser is installed and configured, plus device emulation. Keep Playwright and its browser binaries current; the browser documentation explains supported browsers and installation: Playwright browsers.

The following minimal project runs one workflow against Chromium, Firefox, and WebKit. It uses the Playwright test runner and checks a simple page title and heading. Replace the example URL and assertions with your application’s actual core flow.

npm init -y
npm install --save-dev @playwright/test
npx playwright install

Create playwright.config.ts:

import { defineConfig, devices } from '@playwright/test';

export default defineConfig({
  testDir: './tests',
  projects: [
    { name: 'chromium', use: { ...devices['Desktop Chrome'] } },
    { name: 'firefox', use: { ...devices['Desktop Firefox'] } },
    { name: 'webkit', use: { ...devices['Desktop Safari'] } },
  ],
});

Create tests/home.spec.ts:

import { test, expect } from '@playwright/test';

test('home page exposes its main content', async ({ page }) => {
  await page.goto('https://example.com');
  await expect(page).toHaveTitle(/Example Domain/);
  await expect(page.getByRole('heading', { name: 'Example Domain' })).toBeVisible();
});

Run the suite:

npx playwright test

For a project with a development server, configure Playwright’s web server option or start the server before the tests. Add assertions for the behaviors your users need, such as submitting a form, opening a menu, or completing a navigation flow. Device emulation is useful for expanding viewport and device coverage; it does not reproduce every hardware or operating-system behavior.

What Playwright coverage establishes

Playwright’s WebKit build is not the branded Safari application. Its documentation also notes platform-dependent differences, including media codec availability. If Safari-specific behavior, codec support, or native platform integration is high risk, check it in the actual target browser and operating system. Add branded Chrome or Edge channels when those specific browser binaries are part of the requirement. Automation proves only the assertions you wrote in the environments where they ran.

6. Add manual and real-platform checks

Use automation for repeatable regression checks, then make time for exploratory and platform-specific work. Test on physical devices where possible; emulators and virtual machines can broaden coverage when devices are unavailable. For codec availability or native integration, use the relevant operating system and browser. Include keyboard-only operation and screen-reader navigation instead of inferring accessibility from a visual screenshot or a passing browser test.

A compact workflow keeps the work repeatable:

  1. Agree on the support matrix and record the version policy.
  2. Identify risky features and decide on fallback behavior.
  3. Test a small change in the stable environments available to the team, fixing general defects early.
  4. Expand to representative target browsers, operating systems, and devices, emphasizing distinct engines and audience needs.
  5. Run automated core-flow checks on each release or relevant change.
  6. Perform manual accessibility and platform checks for the workflows and features at risk.
  7. Record defects with enough environment and reproduction detail for another person to repeat them.

7. Capture visual evidence for browser bugs

A screenshot can help compare layout and rendering across environments, but it does not prove that an interaction, keyboard path, or screen-reader experience works. Capture at the same viewport and device class when comparing visual results, and record the browser, version, operating system, and reproduction steps alongside the image.

For teams that need screenshot evidence from a URL, ScreenshotNeo is a website screenshot API and MCP server. It can return PNG, JPEG, WebP, or PDF, and offers full-page capture, device presets, custom viewport sizes, dark mode, and CSS or JavaScript adjustments. A screenshot is one useful artifact in a compatibility report; keep functional and accessibility checks separate.

8. Troubleshooting common compatibility issues

Symptom Likely cause What to do
A CSS layout or style is missing in one browser The property is unsupported in that version, or implementation behavior differs. Check compatibility data for the supported versions, reproduce at the same viewport, and provide a fallback if the environment is in scope.
A JavaScript feature fails only on older browsers The browser lacks syntax or an API used by the code. Identify the unsupported feature, compare it with the version policy, then add an alternate path or revise the support range.
A layout breaks only on phones or tablets The viewport, device class, or touch interaction exposes a responsive defect. Reproduce at the same viewport and device class, inspect layout and interaction, then check on a physical device when hardware behavior matters.
A test passes in Chromium but fails elsewhere The test covered one engine, or another engine has a support or behavior difference. Run the flow in Firefox and WebKit as required by the matrix; inspect the failing assertion and browser console in that environment.
WebKit automation differs from Safari Playwright WebKit is not branded Safari, and platform-dependent behavior can differ. Validate the issue in the actual target Safari and operating system when Safari-specific behavior matters.
Media plays on one platform but not another Codec availability can vary substantially by operating system. Check the media in the official browser on the relevant operating system; do not treat an emulated or different OS result as conclusive.
A page looks correct but is difficult to operate Visual inspection did not cover keyboard or screen-reader use. Test keyboard-only navigation and screen-reader reading and interaction for the core workflow.
An automated test cannot find its browser The required Playwright browser binary may not be installed or may be out of sync with the Playwright package. Install or update the browser binaries with npx playwright install alongside the project’s Playwright version.

For a reproducible bug report, include the browser and version, operating system, device or viewport, preconditions, steps, expected result, actual result, and useful evidence such as console output or screenshots. Avoid filing “works in my browser” without the environment details that distinguish the result.

9. Performance, reliability, and cost of a test plan

Cross-browser coverage has a real maintenance cost: each additional environment adds time to run and review tests, while manual device checks require access to those platforms. Keep the matrix focused on audience and risk, automate stable flows that are repeated often, and reserve manual exploration for behaviors automation does not establish. Run small checks early so a broad matrix does not become the first place a basic defect is discovered.

For reliable results, keep the test runner and browser binaries aligned, make test preconditions explicit, and capture the environment with failures. Emulation and virtual machines can provide breadth, while physical devices and official target browsers provide stronger evidence for hardware- or platform-dependent behavior. No finite matrix proves universal compatibility; report the environments actually covered.

If you use screenshots as evidence, keep capture settings consistent: target URL, viewport or device preset, color mode, and any page wait condition should match between comparisons. ScreenshotNeo offers a free tier of 1,000 shots per month without a card; paid plans start at $5 for 3,000 shots. Its API reports whether a result was billed, and cache hits, bot checks, blank pages, timeouts, and failed loads are not billed. See the ScreenshotNeo documentation for its API options and usage details.

10. Or skip the browser setup

If the task is to capture a page for visual review, you can use ScreenshotNeo’s one-request API instead of setting up browser automation. The examples below capture Stripe; replace the URL with the page you need. See the API documentation for options such as full-page capture, viewport and device selection, waiting for page content, and output format.

cURL

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

Python

import requests

r = requests.get(
    "https://api.screenshotneo.com/v1/shot",
    params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"},
    timeout=90,
)
r.raise_for_status()
open("shot.webp", "wb").write(r.content)

Node.js

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}`);
const bytes = new Uint8Array(await res.arrayBuffer());
await import('node:fs/promises').then(fs => fs.writeFile('shot.webp', bytes));
  • Cookie and consent banners, newsletter popups, and chat widgets are removed before the shot; each cleanup step can be turned off.
  • Bot checks, blank pages, timeouts, failed loads, and cache hits are never billed; response headers report the page verdict and billing status.
  • An MCP server gives AI agents tools to take screenshots, inspect page information, and capture PDFs.
  • 1,000 screenshots a month are free with no card; paid plans start at $5 for 3,000.

Sign up free for 1,000 screenshots a month, with no card required.

11. Frequently asked questions

Which browsers should I test?

Test the environments your audience and product requirements call for. Include distinct engines and device classes that matter, and document the version policy rather than claiming universal support.

Does a passing Playwright WebKit test mean Safari works?

No. Playwright WebKit is not the branded Safari browser. Check actual Safari on the relevant operating system when Safari-specific or platform-dependent behavior is important.

Can screenshots prove a site is accessible?

No. A screenshot records visual output. Keyboard operation and screen-reader navigation need their own checks.

Is Baseline enough to decide whether a feature is safe?

Baseline helps summarize browser support for web features. It does not replace testing your workflows or evaluating accessibility, usability, performance, and security needs.