Implementation:DevExpress Testcafe BrowserProviderPool GetBrowserInfo
| 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 };
}