javascript - 使用 Puppeteer 检测和测试 Chrome 扩展程序

标签 javascript google-chrome-extension automated-tests puppeteer

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

最佳答案

路过--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();
});
分机 背景.js
chrome.runtime.onInstalled.addListener(details => {
  console.log(navigator.userAgent); // "PuppeteerAgent"
});

或者,如果您想保留浏览器的原始 UA 字符串,它会变得很棘手。
  • 启动 Chrome 并在 Puppeteer 中创建一个空白页面。
  • 将其标题设置为自定义名称。
  • 在后台脚本中检测标签的标题更新。
  • 设置一个全局标志以供以后重用。

  • 背景.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;
      }
    });
    
    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();
    });
    
    备注 :缺点是这种方法需要 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.
    
    要为测试创建稳定的扩展 ID,请查看:https://stackoverflow.com/a/23877974/274673

    关于javascript - 使用 Puppeteer 检测和测试 Chrome 扩展程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48089670/

    相关文章:

    javascript - 从 chrome 扩展程序传递大 blob 或文件

    selenium - 如何通过Selenium Webdriver在gmail注册页面中选择生日(月份)下拉菜单?

    javascript - 如何使用 Angular-cookie 清除 cookie

    javascript - Bootstrap 3 表单控件不堆叠

    javascript - Safari 问题,变量未定义(XML/Javascript)

    javascript - 为什么在 youtube 视频之间导航时 youtube ytplayer 对象不更新?

    google-chrome - 如何从 Google Chrome 扩展程序获取当前选项卡的 URL?

    javascript - MVVM:viewModel 的架构应该像 View 还是模型

    python - 如何使用 while 循环编写有效的游戏代码测试?

    java - ANT 构建失败并在 html 报告中给出 classNotFoundException