Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ulixee
GitHub Repository: ulixee/secret-agent
Path: blob/main/puppet/test/Page.popups.test.ts
1030 views
1
import Log from '@secret-agent/commons/Logger';
2
import { IPuppetPage } from '@secret-agent/interfaces/IPuppetPage';
3
import IPuppetContext from '@secret-agent/interfaces/IPuppetContext';
4
import CorePlugins from '@secret-agent/core/lib/CorePlugins';
5
import { IBoundLog } from '@secret-agent/interfaces/ILog';
6
import Core from '@secret-agent/core';
7
import { IBrowserEmulatorConfig } from '@secret-agent/interfaces/ICorePlugin';
8
import { TestServer } from './server';
9
import Puppet from '../index';
10
import { capturePuppetContextLogs, createTestPage, ITestPage } from './TestPage';
11
import CustomBrowserEmulator from './_CustomBrowserEmulator';
12
13
const { log } = Log(module);
14
const browserEmulatorId = CustomBrowserEmulator.id;
15
16
describe('Page.popups', () => {
17
let server: TestServer;
18
let page: ITestPage;
19
let puppet: Puppet;
20
let context: IPuppetContext;
21
const needsClosing = [];
22
23
beforeAll(async () => {
24
Core.use(CustomBrowserEmulator);
25
const { browserEngine } = CustomBrowserEmulator.selectBrowserMeta();
26
server = await TestServer.create(0);
27
puppet = new Puppet(browserEngine);
28
await puppet.start();
29
const plugins = new CorePlugins({ browserEmulatorId }, log as IBoundLog);
30
const config: IBrowserEmulatorConfig = { locale: 'en-GB' };
31
plugins.browserEmulator.configure(config);
32
plugins.browserEmulator.userAgentString = 'popupcity';
33
plugins.browserEmulator.operatingSystemPlatform = 'Windows95';
34
35
context = await puppet.newContext(plugins, log);
36
capturePuppetContextLogs(context, `${browserEngine.fullVersion}-Page.popups-test`);
37
context.on('page', event => {
38
needsClosing.push(event.page);
39
});
40
});
41
42
afterEach(async () => {
43
await page.close();
44
for (const close of needsClosing) {
45
await close.close();
46
}
47
needsClosing.length = 0;
48
});
49
50
beforeEach(async () => {
51
page = createTestPage(await context.newPage());
52
server.reset();
53
});
54
55
afterAll(async () => {
56
await server.stop();
57
await context.close();
58
await puppet.close();
59
});
60
61
describe('Popup tests', () => {
62
it('should focus popups by default', async () => {
63
await page.goto(server.emptyPage);
64
const [popup] = await Promise.all<IPuppetPage, any>([
65
page.waitForPopup(),
66
page.evaluate(`(() => {
67
window.open('${server.emptyPage}');
68
})()`),
69
]);
70
needsClosing.push(popup);
71
expect(await popup.evaluate('document.hasFocus()')).toBe(true);
72
expect(await page.evaluate('document.hasFocus()')).toBe(true);
73
});
74
75
it('should initialize popups with all context information', async () => {
76
server.setRoute('/empty.html', (req, res) => {
77
res.end(`<a href="${server.emptyPage}" target="_blank">Click me</a>`);
78
});
79
80
await page.goto(server.emptyPage);
81
expect(await page.evaluate(`navigator.userAgent`)).toBe('popupcity');
82
expect(await page.evaluate(`navigator.platform`)).toBe('Windows95');
83
expect(await page.evaluate(`navigator.languages`)).toStrictEqual(['en-GB']);
84
85
const popupPromise = page.waitForPopup();
86
await page.click('a');
87
const popup = await popupPromise;
88
needsClosing.push(popup);
89
expect(await popup.evaluate(`navigator.userAgent`)).toBe('popupcity');
90
expect(await popup.evaluate(`navigator.platform`)).toBe('Windows95');
91
});
92
93
it('calling window.open and window.close', async () => {
94
await page.goto(server.emptyPage);
95
await expect(
96
page.evaluate(`(() => {
97
const popup = window.open(window.location.href);
98
popup.close();
99
})()`),
100
).resolves.toBe(undefined);
101
});
102
103
it('should be able to capture concurrent popup navigations', async () => {
104
const concurrent = new Array(5).fill(0).map(async () => {
105
let newPage: ITestPage;
106
let popup: IPuppetPage;
107
try {
108
newPage = createTestPage(await context.newPage());
109
await newPage.goto(server.url('popup.html'));
110
111
const popupNavigate = newPage.waitForPopup();
112
113
await newPage.click('a');
114
popup = await popupNavigate;
115
116
await popup.mainFrame.waitForLifecycleEvent('load');
117
expect(popup.mainFrame.url).toBe(server.emptyPage);
118
} finally {
119
await popup?.close();
120
await newPage.close();
121
}
122
});
123
await Promise.all(concurrent);
124
});
125
});
126
});
127
128