Jump to content

Connect Leeroopedia MCP: Equip your AI agents to search best practices, build plans, verify code, diagnose failures, and look up hyperparameter defaults.

Implementation:DevExpress Testcafe BrowserProviderPool GetBrowserInfo

From Leeroopedia
Knowledge Sources
Domains Testing, Web_Automation
Last Updated 2026-02-12 04:00 GMT

Overview

Concrete browser provider resolution system for TestCafe that maps browser aliases to provider implementations through a registry-based lookup mechanism.

Description

The BrowserProviderPool is a singleton object that manages browser provider lifecycle and resolution. The getBrowserInfo() method serves as the primary entry point, accepting string aliases (chrome, firefox:headless), objects with browser configuration, or existing BrowserConnection instances. It parses aliases using a regular expression pattern, resolves providers through a three-tier lookup (cache → plugin → built-in), validates browser names, and returns a BrowserInfo object containing the provider instance, provider name, browser name, and browser-specific options.

Built-in providers include chrome, firefox, edge, chromium, chrome-canary, locally-installed, path, and remote, mapped in src/browser/provider/built-in/index.js. The pool supports plugin-based extensibility through npm packages (e.g., testcafe-browser-provider-sauce). Special handling exists for the all alias, which expands to all available browsers from a multi-browser provider.

The implementation uses lazy initialization, loading providers only when first accessed, and caches them for subsequent use.

Usage

Use getBrowserInfo() when initializing test runs to resolve user-specified browser targets into concrete provider instances.

Code Reference

Source Location

  • Repository: testcafe
  • File: src/browser/provider/pool.js
  • Lines: L12-165

Signature

// Main API
async getBrowserInfo(alias: string | object | BrowserConnection): Promise<BrowserInfo>

// Supporting methods
async getProvider(providerName: string): Promise<BrowserProvider | null>
async _parseAliasString(alias: string): Promise<{ provider, providerName, browserName, browserOption }>
async _parseAlias(alias: string | object): Promise<BrowserInfo>

Import

import browserProviderPool from './browser/provider/pool';

// Used internally by TestCafe runner
const browserInfo = await browserProviderPool.getBrowserInfo('chrome:headless');

I/O Contract

Inputs

Name Type Required Description
alias string Yes* Browser alias like 'chrome', 'firefox:headless', 'path:/usr/bin/chromium'
alias object Yes* Browser config object with { path, browserName, providerName, provider }
alias BrowserConnection Yes* Existing browser connection instance (returned as-is)
  • One of the three input types is required

Outputs

Name Type Description
BrowserInfo object Contains { alias, provider, providerName, browserName, browserOption }
provider BrowserProvider Provider instance with methods for browser automation
providerName string Name of the provider ('chrome', 'firefox', 'path', etc.)
browserName string Specific browser name or configuration string
browserOption object Browser-specific options parsed by provider

Usage Examples

Basic Browser Selection

import browserProviderPool from './browser/provider/pool';

// Chrome browser
const chromeInfo = await browserProviderPool.getBrowserInfo('chrome');
// { provider: ChromeProvider, providerName: 'chrome', browserName: '', ... }

// Firefox in headless mode
const firefoxInfo = await browserProviderPool.getBrowserInfo('firefox:headless');
// { provider: FirefoxProvider, providerName: 'firefox', browserName: 'headless', ... }

// Custom browser binary
const customInfo = await browserProviderPool.getBrowserInfo('path:/opt/chromium/chrome');
// { provider: PathProvider, providerName: 'path', browserName: '"/opt/chromium/chrome"', ... }

Advanced Provider Usage

// Get all available browsers from a provider
const allBrowsers = await browserProviderPool.getBrowserInfo('chrome:all');
// Returns array of BrowserInfo objects for all Chrome variants

// Use object configuration
const browserInfo = await browserProviderPool.getBrowserInfo({
    path: '/usr/bin/firefox',
    alias: 'custom-firefox'
});

// Get provider directly
const provider = await browserProviderPool.getProvider('chrome');
const isValid = await provider.isValidBrowserName('headless');

Provider Registration

// Add custom provider
browserProviderPool.addProvider('my-browser', {
    isMultiBrowser: false,

    async isValidBrowserName(browserName) {
        return browserName === 'my-custom-browser';
    },

    async openBrowser(id, pageUrl, browserName) {
        // Launch browser logic
    },

    async closeBrowser(id) {
        // Close browser logic
    }
});

// Use custom provider
const info = await browserProviderPool.getBrowserInfo('my-browser');

Alias Parsing Implementation

// Internal parsing logic from pool.js
const BROWSER_PROVIDER_RE = /^([^:\s]+):?(.*)?$/;

async function _parseAliasString(alias) {
    const match = BROWSER_PROVIDER_RE.exec(alias);
    // "chrome:headless" -> ["chrome:headless", "chrome", "headless"]

    let providerName = match[1]; // "chrome"
    let browserName = match[2] || ''; // "headless"

    let provider = await this.getProvider(providerName);

    if (!provider) {
        // Fallback to locally-installed provider
        providerName = 'locally-installed';
        provider = await this.getProvider(providerName);
        browserName = match[1];
    }

    const browserOption = provider.plugin.getConfig(browserName);
    return { provider, providerName, browserName, browserOption };
}

Related Pages

Implements Principle

Requires Environment

Uses Heuristic

Page Connections

Double-click a node to navigate. Hold to expand connections.
Principle
Implementation
Heuristic
Environment