在默认 NightWatch 浏览器实例中启用和修改 Chome 扩展(特别是 ModHeader 扩展)

Enabling and modifying Chome Extensions in default NightWatch browser instance (specifically ModHeader extension)

我正在使用 NightWatch.js 并进行一些 UI 测试,我想使用一些额外的 desiredCapabilities(即扩展已启用并应用了一些特定值)。

注意:我可以执行这些操作,但不能在 默认浏览器实例

为了完全清楚,手动执行操作如下所示: Link 至分机: https://chrome.google.com/webstore/detail/modheader/idgpnmonknjnojddfkpgkljpfnnfcklj

我能够启用扩展并使用存储在 pageObject 文件中的此命令更新值:

setChromeOptions(url) {
  const chromeCapabilities = webdriver.Capabilities.chrome();

  // setting chrome options
  const chromeOptions = {
    args:

    // path to local ModHeader extension
    ['--load-extension=/Users/raja.bellebon/AppData/Local/Google/Chrome/User Data/Default/Extensions/idgpnmonknjnojddfkpgkljpfnnfcklj/2.1.2_0/'],
  };

  chromeCapabilities.set('chromeOptions', chromeOptions);
  const driver = new webdriver.Builder().withCapabilities(chromeCapabilities).build();
  driver.get('chrome-extension://idgpnmonknjnojddfkpgkljpfnnfcklj/_generated_background_page.html');

  // setup ModHeader extension with the header value
  driver.executeScript(`
    localStorage.setItem('profiles', JSON.stringify([{ /* eslint-env browser*/
      title: 'Selenium',
      hideComment: true,
      appendMode: '',
      headers: [
      { enabled: true, name: 'X-Static-Homepage', value: 'true' },
      ],
      respHeaders: [],
      filters: [],
    }]))`);
  driver.get(url);
  return this;
}

该函数在测试开始时调用(作为第一步或在 before 内)。当我执行代码时,第二个浏览器 window 打开并在其中执行操作。同时,主(或默认)浏览器实例没有扩展名。 如何在主浏览器实例中修改扩展程序?

阅读几篇博客后,我发现我可能需要修改 conf.js 并在那里应用我的代码,但我无法 get/modify 当前驱动程序。

我一直头痛不已...任何帮助将不胜感激,谢谢!

抱歉回复晚了。我只是想出了如何去做,所以如果你将来需要它,我想分享。

首先,在您的 nightwatch.json 文件中,如下所示设置所需的功能:

"desiredCapabilities": {
    "javascriptEnabled": true,
    "acceptSslCerts": true,
    "browserName": "chrome",
    "chromeOptions": {
      "args": ["--load-extension=/home/pratik/.config/google-chrome/Default/Extensions/idgpnmonknjnojddfkpgkljpfnnfcklj/2.1.2_0"]
    }
  }

那么在你的测试中,

before: (client) => {
  modHeaderPage = client.page.modHeaderPage();
  modHeaderPage.setHeader();
  homePage = client.page.homePage();
}

您的页面对象如下所示:

module.exports = { 
  elements: {},
  commands: [{
    setHeader() {

      // set the context on the extension so the localStorage can be accessed
      const url = 'chrome-extension://idgpnmonknjnojddfkpgkljpfnnfcklj/2.1.2_0/settings.tmpl.html'; // modHeader extension
      this.navigate(url).waitForElementPresent('body', 20000);

      // setup ModHeader with header
      this.api.execute(`
        localStorage.setItem('profiles', JSON.stringify([{ /* eslint-env browser*/
          title: 'Selenium',
          hideComment: true,
          appendMode: '',
          headers: [
            { enabled: true, name: 'Header_Name', value: 'Header_Value' },
          ],
          respHeaders: [],
          filters: [],
     }]))`);
    },
  }],
};

所选答案似乎不适用于最新版本的 Mod Headers。 modheaders 现在有一个 selenium 版本,我尝试使用它但它仍然不起作用所以我所做的是:

  1. 找到我的扩展所在的位置: Where to find extensions installed folder for Google Chrome on Mac?
  2. 转到我的扩展程序的安装版本: chrome://extensions/?id=idgpnmonknjnojddfkpgkljpfnnfcklj
  3. 单击左上角的 Pack Extension(可能会根据 chrome 的版本移动)
  4. 在显示“扩展程序根目录”的地方,我输入了在第 1 步中找到的位置,然后单击“打包扩展程序”
  5. 获取步骤 1 中在目录中创建的 crx 文件,将其移至我的存储库 /extensions/modheader.crx 下(此处重命名为 crx)
  6. 在nightwatch.conf.js中添加:
const fs = require('fs');
const stream = fs.readFileSync(`${__dirname}/extensions/modheader.crx`);
const modHeader = Buffer.from(stream).toString('base64');
...
  desiredCapabilities: {
    javascriptEnabled: true,
    acceptSslCerts: true,
    browserName: "chrome",
    chromeOptions: {
      extensions:[modHeader],
    }
  }
  1. 添加了一个类似于所选答案的 modHeaderPage:
module.exports = {
  elements: {
  },
  commands: [{
    setHeader() {
      const url = 'chrome-extension://idgpnmonknjnojddfkpgkljpfnnfcklj/popup.html'; // modHeader extension
      this.navigate('https://www.google.com'); // needs to hit a non extension page before the extension, don't matter what it is
      this.navigate(url).waitForElementPresent('body', 20000);
      // Uses Nightwatch Apis to add header information
      this.api.setValue('input[placeholder="Name"]', 'HEADER_NAME');
      this.api.setValue('input[placeholder="Value"]', 'HEADER_VALUE');
    },
  }],
};

  1. 我在设置文件中添加了:
module.exports ={
  beforeEach: async (browser, done) => {
    const modHeaderPage = browser.page.modHeaderPage();
    modHeaderPage.setHeader();
    // more code
    done();
  }

我现在可以使用扩展程序将 headers 添加到我的请求中。希望这会帮助其他人,花了太长时间才能让它工作:D

缺点是无头不适用于扩展...

Is it possible to run Google Chrome in headless mode with extensions?