使用Puppeteer检测并测试Chrome扩展程序

ebi*_*del 14 automated-tests google-chrome-extension puppeteer

有没有办法使用Puppeteer测试Chrome扩展程序?例如,扩展程序可以检测Chrome是否以"测试"模式启动以提供不同的UI,检查内容脚本是否正常工作等?

ebi*_*del 17

传递--user-agentpuppeteer.launch()是一个自定义值来覆盖浏览器的UA的有效途径.然后,您的扩展程序可以navigator.userAgent在其后台页面中回读,并确定Chrome是与Puppeteer一起启动的.此时,您可以提供不同的代码路径来测试crx与正常操作.

puppeteer_script.js

const puppeteer = require('puppeteer');

const CRX_PATH = '/path/to/crx/folder/';

puppeteer.launch({
  headless: false, // extensions only supported in full chrome.
  args: [
    `--disable-extensions-except=${CRX_PATH}`,
    `--load-extension=${CRX_PATH}`,
    '--user-agent=PuppeteerAgent'
  ]
}).then(async browser => {
  // ... do some testing ...
  await browser.close();
});
Run Code Online (Sandbox Code Playgroud)

扩展background.js

chrome.runtime.onInstalled.addListener(details => {
  console.log(navigator.userAgent); // "PuppeteerAgent"
});
Run Code Online (Sandbox Code Playgroud)

或者,如果您想保留浏览器的原始UA字符串,则会变得棘手.

  1. 启动Chrome并在Puppeteer中创建一个空白页面.
  2. 将其标题设置为自定义名称.
  3. 在后台脚本中检测选项卡的标题更新.
  4. 设置一个全局标志以便以后重用.

background.js

let LAUNCHED_BY_PUPPETEER = false; // reuse in other parts of your crx as needed.

chrome.tabs.onUpdated.addListener((tabId, info, tab) => {
  if (!LAUNCHED_BY_PUPPETEER && tab.title.includes('PuppeteerAgent')) {
    chrome.tabs.remove(tabId);
    LAUNCHED_BY_PUPPETEER = true;
  }
});
Run Code Online (Sandbox Code Playgroud)

puppeteer_script.js

const puppeteer = require('puppeteer');

const CRX_PATH = '/path/to/crx/folder/';

puppeteer.launch({
  headless: false, // extensions only supported in full chrome.
  args: [
    `--disable-extensions-except=${CRX_PATH}`,
    `--load-extension=${CRX_PATH}`,
  ]
}).then(async browser => {
  const page = await browser.newPage();
  await page.evaluate("document.title = 'PuppeteerAgent'");

  // ... do some testing ...

  await browser.close();
});
Run Code Online (Sandbox Code Playgroud)

注意:缺点是此方法需要manifest.json中的"tabs"权限.


测试扩展页面

假设您想测试弹出页面UI?一种方法是chrome-extension://直接导航到其URL,然后使用puppeteer进行UI测试:

// Can we navigate to a chrome-extension page? YES!
const page = await browser.newPage();
await page.goto('chrome-extension://ipfiboohojhbonenbbppflmpfkakjhed/popup.html');
// click buttons, test UI elements, etc.
Run Code Online (Sandbox Code Playgroud)

要创建稳定的扩展ID以进行测试,请查看:https://stackoverflow.com/a/23877974/274673

  • 如果您只想单击扩展按钮,该怎么办? (4认同)
  • 我错误地认为 CRX_PATH 指向要加载的扩展名的 .crx 存档,但它是您的 `manifest.json` 所在的文件夹。 (2认同)