Files
2026-07-13 13:23:39 +08:00

63 lines
1.7 KiB
TypeScript

import http from 'node:http';
import type { AddressInfo } from 'node:net';
import { JSDOMCrawler } from '@crawlee/jsdom';
import { MemoryStorageEmulator } from '../../shared/MemoryStorageEmulator';
const router = new Map<string, http.RequestListener>();
router.set('/', (req, res) => {
res.setHeader('content-type', 'text/html; charset=utf-8');
res.end(`<!DOCTYPE html><html><head><title>Example Domain</title></head><body><p>Hello, world!</p></body></html>`);
});
let server: http.Server;
let url: string;
beforeAll(async () => {
server = http.createServer((request, response) => {
try {
const requestUrl = new URL(request.url!, 'http://localhost');
router.get(requestUrl.pathname)!(request, response);
} catch (error) {
response.destroy();
}
});
await new Promise<void>((resolve) =>
server.listen(() => {
url = `http://127.0.0.1:${(server.address() as AddressInfo).port}`;
resolve();
}),
);
});
afterAll(async () => {
await new Promise((resolve) => server.close(resolve));
});
const localStorageEmulator = new MemoryStorageEmulator();
beforeEach(async () => {
await localStorageEmulator.init();
});
afterAll(async () => {
await localStorageEmulator.destroy();
});
test('works', async () => {
const results: string[] = [];
const crawler = new JSDOMCrawler({
maxRequestRetries: 0,
requestHandler: ({ window }) => {
results.push(window.document.title, window.document.querySelector('p')!.textContent!);
},
});
await crawler.run([url]);
expect(results).toStrictEqual(['Example Domain', 'Hello, world!']);
});