Skip to main content

Overview

Test Chrome extensions by loading them into Chrome for Testing. Use testdriver.provision.chromeExtension() to launch Chrome with either:
  • A local unpacked extension via extensionPath
  • A Chrome Web Store extension via extensionId
The dashcam-chrome extension is automatically included on Linux for web log capture.

Quick Start

Using a Local Extension Path

import { describe, it, expect } from 'vitest';
import { TestDriver } from 'testdriverai/vitest/hooks';

describe('Chrome Extension Test', () => {
  it('should load and test a Chrome extension', async (context) => {
    const testdriver = TestDriver(context, { headless: true });
    
    // Wait for connection
    await testdriver.ready();
    
    // Clone an extension repo
    await testdriver.exec(
      'sh',
      'git clone --depth 1 https://github.com/GoogleChrome/chrome-extensions-samples.git /tmp/chrome-extensions-samples',
      60000,
      true
    );

    // Launch Chrome with the extension loaded
    await testdriver.provision.chromeExtension({
      extensionPath: '/tmp/chrome-extensions-samples/functional-samples/tutorial.hello-world',
      url: 'https://example.com'
    });

    // Your test code here
    const result = await testdriver.assert("the page is visible");
    expect(result).toBeTruthy();
  });
});

Using a Chrome Web Store Extension ID

import { describe, it, expect } from 'vitest';
import { TestDriver } from 'testdriverai/vitest/hooks';

describe('Chrome Extension Test', () => {
  it('should load uBlock Origin and verify it works', async (context) => {
    const testdriver = TestDriver(context, { headless: true });

    // Launch Chrome with uBlock Origin loaded by its Chrome Web Store ID
    await testdriver.provision.chromeExtension({
      extensionId: 'cjpalhdlnbpafiamejdnhcphjbkeiagm', // uBlock Origin
      url: 'https://example.com'
    });

    // Your test code here
    const result = await testdriver.assert("the page is visible");
    expect(result).toBeTruthy();
  });
});

API Reference

testdriver.provision.chromeExtension(options)

Launches Chrome for Testing with a custom extension loaded.
OptionTypeDefaultDescription
extensionPathstring-Local filesystem path to the unpacked extension directory
extensionIdstring-Chrome Web Store extension ID (e.g., cjpalhdlnbpafiamejdnhcphjbkeiagm)
urlstring'http://testdriver-sandbox.vercel.app/'URL to navigate to after launch
maximizedbooleantrueStart Chrome maximized
Note: Either extensionPath or extensionId is required. On Linux, the dashcam-chrome extension is automatically loaded alongside your extension for web log capture.

Finding Extension IDs

Extension IDs can be found in the Chrome Web Store URL:
https://chrome.google.com/webstore/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm
                                                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                                                       This is the extension ID
ExtensionID
uBlock Origincjpalhdlnbpafiamejdnhcphjbkeiagm
React Developer Toolsfmkadmapgofadopljbjfkapdkoienihi
Redux DevToolslmhkpmbekcpmknklioeibfkpmmfibljd
Bitwardennngceckbapebfimnlniiiahkandclblb

Using Your Own Extension

To test your own extension, you can either:
  1. Clone from a repository:
await testdriver.ready();
await testdriver.exec('sh', 'git clone https://github.com/your/extension.git /tmp/my-extension', 60000, true);
await testdriver.provision.chromeExtension({
  extensionPath: '/tmp/my-extension',
  url: 'https://example.com'
});
  1. Upload your extension files (if supported by your test setup)
  2. Use a pre-built extension in a known location

Complete Example

import { describe, it, expect } from 'vitest';
import { TestDriver } from 'testdriverai/vitest/hooks';

describe('Chrome Extension - Hello World', () => {
  it('should load extension and verify popup', async (context) => {
    const testdriver = TestDriver(context, { 
      headless: true, 
      newSandbox: true, 
      cacheKey: 'chrome-extension-test' 
    });
    
    // Clone the Chrome extensions samples repo
    await testdriver.exec(
      'sh',
      'git clone --depth 1 https://github.com/GoogleChrome/chrome-extensions-samples.git /tmp/chrome-extensions-samples',
      60000,
      true
    );

    // Launch Chrome with the hello-world extension loaded
    await testdriver.provision.chromeExtension({
      extensionPath: '/tmp/chrome-extensions-samples/functional-samples/tutorial.hello-world',
      url: 'https://testdriver.ai'
    });

    // Verify the page loaded
    const pageResult = await testdriver.assert("the testdriver.ai website is visible");
    expect(pageResult).toBeTruthy();

    // Click on the extensions button in Chrome toolbar
    const extensionsButton = await testdriver.find("Extensions button, puzzle piece icon in Chrome toolbar");
    await extensionsButton.click();

    // Find and click the hello world extension
    const helloExtension = await testdriver.find("Hello World extension in the extensions dropdown");
    await helloExtension.click();

    // Verify the extension popup shows
    const popupResult = await testdriver.assert("a popup shows with the text 'Hello Extensions'");
    expect(popupResult).toBeTruthy();
  });
});

Environment Setup

Chrome for Testing is pre-installed in the E2B sandbox environment at:
/opt/chrome-for-testing/chrome
/usr/local/bin/chrome-for-testing (symlink)
The dashcam-chrome extension is pre-installed at:
/usr/lib/node_modules/dashcam-chrome/build

Testing Extension Features

Test Extension Popup

it('opens extension popup', async (context) => {
  const testdriver = TestDriver(context, { headless: true });
  
  // Setup extension...
  await testdriver.provision.chromeExtension({
    extensionPath: '/path/to/extension',
    url: 'https://example.com'
  });
  
  // Click extension icon in toolbar
  const extensionIcon = await testdriver.find('extension icon in toolbar');
  await extensionIcon.click();
  
  // Interact with popup
  const result = await testdriver.assert('extension popup is visible');
  expect(result).toBeTruthy();
});

Test Content Scripts

it('verifies content script injection', async (context) => {
  const testdriver = TestDriver(context, { headless: true });
  
  await testdriver.provision.chromeExtension({
    extensionPath: '/path/to/extension',
    url: 'https://example.com'
  });
  
  // Check for extension-injected elements
  const result = await testdriver.assert('element added by extension is visible');
  expect(result).toBeTruthy();
});

Troubleshooting

Extension Not Loading

  1. Verify the extension path exists and contains a valid manifest.json
  2. Check Chrome for Testing is installed in the sandbox
  3. Ensure extension is compatible with Chrome for Testing version (Manifest V3 recommended)

Extension Permissions

Some extensions may require additional permissions or setup. You may need to:
  1. Navigate to chrome://extensions/
  2. Enable developer mode
  3. Grant required permissions

See Also