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