Path: blob/main/plugins/default-browser-emulator/test/chrome.test.ts
1029 views
import * as Fs from 'fs';1import * as Path from 'path';2import * as Helpers from '@secret-agent/testing/helpers';3import { inspect } from 'util';4import Puppet from '@secret-agent/puppet';5import Log from '@secret-agent/commons/Logger';6import CorePlugins from '@secret-agent/core/lib/CorePlugins';7import { IBoundLog } from '@secret-agent/interfaces/ILog';8import BrowserEmulator from '../index';9import { getOverrideScript } from '../lib/DomOverridesBuilder';10import DomExtractor = require('./DomExtractor');1112const { log } = Log(module);1314const windowChromePath = Path.resolve(15__dirname,16'../data/as-chrome-88-0/as-mac-os-10-14/window-chrome.json',17);18const { chrome, prevProperty } = JSON.parse(Fs.readFileSync(windowChromePath, 'utf8')) as any;19const selectBrowserMeta = BrowserEmulator.selectBrowserMeta();2021let puppet: Puppet;22beforeAll(async () => {23puppet = new Puppet(selectBrowserMeta.browserEngine);24Helpers.onClose(() => puppet.close(), true);25await puppet.start();26});27afterAll(Helpers.afterAll);28afterEach(Helpers.afterEach);2930const debug = process.env.DEBUG || false;3132test('it should mimic a chrome object', async () => {33const httpServer = await Helpers.runHttpServer();34const page = await createPage();35const script = getOverrideScript('window.chrome', {36polyfill: {37property: chrome,38prevProperty,39},40}).script;41await page.addNewDocumentScript(script, false);42await Promise.all([43page.navigate(httpServer.url),44page.mainFrame.waitOn('frame-lifecycle', ev => ev.name === 'DOMContentLoaded'),45]);4647const structure = JSON.parse(48(await page.mainFrame.evaluate(49`new (${DomExtractor.toString()})('window').run(window, 'window', ['chrome'])`,50false,51)) as any,52).window;53if (debug) console.log(inspect(structure.chrome, false, null, true));5455const structureJson = JSON.stringify(structure.chrome, (key, value) => {56if (key === '_$value' || key === '_$invocation') return undefined;57return value;58});5960const chromeJson = JSON.stringify(chrome, (key, value) => {61if (key === '_$value' || key === '_$invocation') return undefined;62return value;63});64// must delete csi's invocation since it's different on each run65expect(structureJson).toBe(chromeJson);66}, 60e3);6768test('it should update loadtimes and csi values', async () => {69const httpServer = await Helpers.runHttpServer();70const page = await createPage();71await page.addNewDocumentScript(72getOverrideScript('window.chrome', {73updateLoadTimes: true,74polyfill: {75property: chrome,76prevProperty,77},78}).script,79false,80);81await Promise.all([82page.navigate(httpServer.url),83page.mainFrame.waitOn('frame-lifecycle', ev => ev.name === 'DOMContentLoaded'),84]);8586const loadTimes = JSON.parse(87(await page.mainFrame.evaluate(`JSON.stringify(chrome.loadTimes())`, false)) as any,88);89if (debug) console.log(inspect(loadTimes, false, null, true));90expect(loadTimes.requestTime).not.toBe(chrome.loadTimes['new()'].requestTime._$value);9192const csi = JSON.parse(93(await page.mainFrame.evaluate(`JSON.stringify(chrome.csi())`, false)) as any,94);95if (debug) console.log(inspect(csi, false, null, true));96expect(csi.pageT).not.toBe(chrome.csi['new()'].pageT._$value);9798expect(csi.onloadT).not.toBe(chrome.csi['new()'].onloadT._$value);99expect(String(csi.onloadT).length).toBe(String(chrome.csi['new()'].onloadT._$value).length);100expect(Object.keys(csi)).toHaveLength(4);101}, 60e3);102103async function createPage() {104const plugins = new CorePlugins({ selectBrowserMeta }, log as IBoundLog);105const context = await puppet.newContext(plugins, log);106Helpers.onClose(() => context.close());107const page = await context.newPage();108page.on('page-error', console.log);109if (debug) {110page.on('console', console.log);111}112return page;113}114115116