BrowserStack Cross-Browser Testing
Learn how BrowserStack Live and Automate cover browsers, real devices, localhost testing, CI, debugging, and practical cross-browser workflows.
BrowserStack cross-browser testing means checking a website or web app in many browser, operating-system and device combinations through BrowserStack’s cloud. Use Live for interactive manual sessions and Automate for repeatable Selenium, Cypress or other framework-driven suites. BrowserStack can also reach localhost, staging and private systems through Local Testing.
The practical workflow is:
- List the browsers, versions, operating systems and real devices your users require.
- Explore the highest-risk flows manually in Live.
- Turn stable regression paths into Automate tests.
- Run them in parallel in CI, collect screenshots, video, logs and network evidence, then fix and retest.
What BrowserStack cross-browser testing covers
BrowserStack hosts browser and device combinations so your team does not have to maintain every environment locally. Coverage, device access and advanced capabilities depend on the product and plan; verify the current pricing and plan matrix before purchasing.
| Need | BrowserStack product | Best use |
|---|---|---|
| Interactive compatibility check | Live | Click through a page, inspect layout, reproduce a bug and capture evidence. |
| Repeatable automated regression | Automate | Run Selenium, Cypress or another supported framework across a browser matrix. |
| Development or internal site | Live or Automate + Local Testing | Exercise localhost, staging and private applications through the cloud. |
| Real mobile behavior | Live or Automate real devices | Check touch, viewport, mobile browser behavior and device-specific issues. |
BrowserStack Live versus Automate
Live: manual, interactive testing
Live gives a tester an interactive browser session on selected desktop or mobile environments. It is useful when a defect is new, a visual change needs exploration, or a flow requires human judgment. Live supports Local Testing, multi-device comparison, browser developer tools, Jira-style bug reporting integrations and accessibility checks with screen readers such as NVDA and VoiceOver.
- Choose a browser, operating system and device.
- Open the public URL or enable Local Testing for an internal URL.
- Exercise the flow and inspect layout, console output and responsive behavior.
- Record the exact environment and attach screenshots or a bug report.
Automate: repeatable suites
Automate runs framework-driven tests across browser and mobile combinations. Selenium and Cypress are documented integration paths. Automated runs can expose text logs, console logs, video, network information, screenshots and historical run context, which makes failures easier to reproduce in CI.
Choose Automate when the same assertions must run on every pull request, nightly build or release candidate. Keep a small smoke matrix for fast feedback and a larger regression matrix on a scheduled or release workflow.
Build a useful browser matrix
Do not select browsers randomly. Start with analytics, support tickets, contractual requirements and the features your application uses. Include at least one representative combination for each major desktop browser your users need, plus the mobile operating systems and devices that account for meaningful traffic.
| Axis | Questions to answer |
|---|---|
| Desktop browser | Which Chromium, Firefox and WebKit-based experiences matter to your audience? |
| Version | Do you support only current releases, or a defined older-version window? |
| Operating system | Are Windows and macOS both required? Does the OS affect fonts, downloads or permissions? |
| Mobile device | Which real phones and tablets represent your traffic and support cases? |
| Viewport and orientation | Do breakpoints, rotation and browser chrome change the layout? |
| Network and location | Do checkout, maps, media or geolocation flows need constrained networks or locations? |
| Accessibility | Do keyboard, screen-reader and contrast checks belong in the release gate? |
Tag each test with its required capability. A login smoke test may need only a desktop browser; a camera, geolocation or touch workflow may require a real mobile device. Plan parallel capacity around the longest-running suites and the time your CI feedback must meet.
Test a public site manually in Live
- Open Live and select the target browser, operating system or real device.
- Enter the public URL.
- Check navigation, forms, typography, responsive breakpoints, media, downloads and error states.
- Open developer tools when you need console or layout evidence.
- Use multi-device comparison for the same page at several viewport or device sizes.
- Save the browser, OS, device, URL, account state and reproduction steps with the defect.
For accessibility work, combine keyboard navigation with the available screen-reader checks, including NVDA and VoiceOver. Treat an automated accessibility result as a starting point and manually verify the user journey.
Test localhost, staging and private sites
BrowserStack Local Testing creates a path from the BrowserStack cloud to a development or internal environment. This lets Live and Automate exercise localhost, staging and private applications without making them public. Follow BrowserStack’s current Local Testing setup instructions for the operating system and test framework you use.
- Install and authenticate the Local Testing connector in the environment that can reach your site.
- Start the connector before the Live session or CI job.
- Enable the Local Testing capability in the session or framework configuration.
- Use the internal hostname that the connector can resolve.
- Stop the connector after the job and rotate credentials according to your team’s policy.
Common failures are DNS names that resolve only on a developer laptop, firewalls that block the connector, mixed-content requests to a different internal hostname, and services that require an allowlisted IP. Check those dependencies before debugging the browser test itself.
Automate with Selenium
The exact capability names and authentication fields vary by language binding and BrowserStack’s current SDK. The following Python example shows the shape of a Selenium test; copy the current capabilities from BrowserStack’s Selenium documentation before running it.
import os
from selenium import webdriver
from selenium.webdriver.common.by import By
options = webdriver.ChromeOptions()
options.set_capability("browserName", "chrome")
options.set_capability("browserVersion", "latest")
options.set_capability("platformName", "Windows 11")
options.set_capability("bstack:options", {
"sessionName": "homepage smoke",
"buildName": "local example"
})
username = os.environ["BROWSERSTACK_USERNAME"]
access_key = os.environ["BROWSERSTACK_ACCESS_KEY"]
command_executor = f"https://{username}:{access_key}@hub-cloud.browserstack.com/wd/hub"
driver = webdriver.Remote(command_executor=command_executor, options=options)
try:
driver.get("https://example.com")
assert "Example" in driver.title
print(driver.find_element(By.TAG_NAME, "h1").text)
finally:
driver.quit()
For a real project, keep credentials in CI secrets, set an explicit timeout, give every session a build and test name, and mark pass or fail in the way recommended by the current BrowserStack SDK. Add Local Testing capabilities when the URL is private.
Automate with Cypress
BrowserStack documents Cypress execution across browsers and devices. Keep the test itself focused on application behavior and let the BrowserStack configuration define the browser matrix. A minimal Cypress test can look like this:
describe('checkout smoke test', () => {
it('shows the checkout page', () => {
cy.visit('https://example.com/checkout')
cy.get('h1').should('contain', 'Checkout')
})
})
Use the current BrowserStack Cypress integration commands and configuration for authentication, parallelization, Local Testing and CI status reporting. Do not hard-code access keys in the repository.
CI strategy and evidence
- Pull requests: run a short smoke matrix against the most important desktop and mobile combinations.
- Nightly: run the broader browser and device matrix, including accessibility, network and geolocation cases where required.
- Release candidates: repeat critical purchase, authentication, upload and payment flows on the exact supported environments.
When a test fails, preserve the URL, commit, browser version, operating system, device, viewport, test data and timestamp. Review video, screenshots, console logs, network information and text logs together; a visual symptom can be caused by a failed asset request or JavaScript exception.
Capabilities to evaluate before choosing a plan
BrowserStack plan entitlements change. Confirm current limits and availability for:
- Desktop-only versus real mobile-device sessions.
- Number of parallel Automate sessions.
- Local Testing.
- Accessibility checks and screen-reader workflows.
- Network throttling and geolocation testing.
- Debugging artifacts, integrations, support and enterprise controls.
The right plan is the one that covers your required environments and parallel speed. Recheck the pricing page immediately before procurement because browser inventories, device counts, limits and displayed prices are volatile.
Screenshot evidence without running a browser matrix
Cross-browser testing and screenshot capture solve different problems. BrowserStack is appropriate when you must interact with a page on specific browsers or real devices. For a clean, repeatable image of a URL in an application, ScreenshotNeo is the first screenshot API to try: it removes consent banners, popups and chat widgets before capture, bills only clean shots, and has the lowest paid plan described here.
Or skip the browser setup
One GET request returns PNG, JPEG, WebP or PDF output. See the ScreenshotNeo API docs for all options.
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}`);
ScreenshotNeo can capture full pages with lazy images loaded, a CSS-selected element, dark mode, custom viewports and device presets, retina output, PDFs, custom CSS and JavaScript, pre-capture clicks, hidden selectors, selector or network-idle waits, blocked ads and trackers, custom headers, cookies, user agents, Authorization, timezone, geolocation, transparent backgrounds, resizing, chosen cache TTLs, signed image links, asynchronous jobs with signed webhooks, bulk capture of up to 100 URLs per call, usage reporting and an OpenAPI specification. Requests using parameter names common to other screenshot APIs can ease migration.
Cookie banners, newsletter popups and chat widgets are removed before the shot. Bot checks, blank pages, timeouts, failed loads and cache hits are never billed; response headers identify the page verdict and whether it was billed. An MCP server provides take_screenshot, get_page_info and capture_pdf tools for Claude, Cursor and other MCP clients. The Free plan includes 1,000 shots per month with no card; paid plans start at $5 for 3,000 shots. Start with the free ScreenshotNeo account.
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
| Session cannot open localhost | Local Testing is not running or the hostname is unreachable from the connector. | Start the connector, verify DNS and firewall rules, and use a hostname it can resolve. |
| Element is missing | The page has not finished rendering, the selector differs by browser, or a consent layer covers it. | Wait for a stable selector, make the selector resilient, and handle consent state explicitly. |
| Test is flaky | Fixed sleeps race network activity or animations. | Wait for application state, stable selectors and network completion; isolate test data. |
| Different layout than expected | Viewport, device pixel ratio, fonts or browser defaults differ. | Record viewport and device, load required fonts, and assert behavior at supported breakpoints. |
| Video exists but failure is unclear | The defect may be a console exception or failed request. | Inspect console and network artifacts alongside the video and screenshot. |
| Automate queue is slow | The selected plan has limited parallel capacity or too many sessions start together. | Reduce duplicate coverage, split smoke and regression suites, or choose a plan with the needed parallelism. |
| ScreenshotNeo response is not billed | The page was a bot check, blank page, timeout, failed load or cache hit. | Read X-Page-Verdict and X-Billed, then adjust waits, access requirements or cache settings. |
Performance, reliability and cost notes
- Parallel Automate sessions shorten wall-clock time but consume parallel capacity; reserve broad matrices for builds that need them.
- Use a small deterministic smoke suite on every change and schedule expensive device and accessibility coverage.
- Record artifacts for failures so reruns are diagnostic rather than blind.
- Local Testing adds a connector dependency; monitor its process and network path in CI.
- For screenshot-only workflows, caching with an explicit TTL can reduce repeated capture time. ScreenshotNeo does not bill cache hits and reports that verdict in response headers.
- Protect BrowserStack and ScreenshotNeo credentials with environment secrets and rotate them when access changes.
FAQ
Does BrowserStack use real devices?
BrowserStack offers real mobile-device testing in Live and Automate, with availability depending on the selected product and plan.
Can BrowserStack test a private staging site?
Yes. Local Testing is designed for localhost, staging and internal websites reachable through the connector.
Should a small team start with Live or Automate?
Start with Live when you are exploring a bug or validating a visual change. Add Automate when the same checks must run repeatedly in CI.
Is cross-browser testing only visual?
No. Include interaction, JavaScript behavior, network failures, accessibility, geolocation, device features and performance-sensitive flows where they affect your users.
When is ScreenshotNeo a better fit?
Use it when you need a clean URL screenshot or PDF through an API, especially when consent UI and other overlays would pollute the image or when you want usage-based billing with failed captures excluded.
