azon_seeker/scripts/test-amazon-search-page-ready.ts

66 lines
2.3 KiB
TypeScript

import { JSDOM } from 'jsdom';
import { waitForAmazonSearchPageReady } from '../src/page-worker/web-injectors/amazon-search-page-ready';
const main = async () => {
const dom = new JSDOM(
'<main><div class="a-spinner">Persistent widget spinner</div><div data-component-type="s-search-result" data-asin="B000000001"></div><a class="s-pagination-next" href="/s?page=2">Next</a></main>',
{ url: 'https://www.amazon.com/s?k=security+camera' },
);
Object.defineProperty(dom.window.document, 'readyState', {
configurable: true,
value: 'complete',
});
Object.assign(globalThis, { document: dom.window.document, window: dom.window });
Object.assign(dom.window.HTMLElement.prototype, { scrollIntoView: () => undefined });
const started = Date.now();
await waitForAmazonSearchPageReady();
const elapsed = Date.now() - started;
dom.window.close();
if (elapsed >= 2000) {
throw new Error(`Ready search results were delayed by a persistent spinner (${elapsed}ms)`);
}
const errorDom = new JSDOM(
'<main><h1>SORRY</h1><p>Something went wrong on our end.</p><p>Please go back and try again.</p></main>',
{ url: 'https://www.amazon.com/s?k=protein+powder' },
);
Object.defineProperty(errorDom.window.document, 'readyState', {
configurable: true,
value: 'complete',
});
Object.assign(globalThis, { document: errorDom.window.document, window: errorDom.window });
await waitForAmazonSearchPageReady().then(
() => {
throw new Error('Amazon transient error page must not be accepted as an empty result page');
},
(error) => {
if (!String(error).includes('临时错误页')) throw error;
},
);
errorDom.window.close();
const captchaDom = new JSDOM('<input id="captchacharacters">', {
url: 'https://www.amazon.com/s?k=protein+powder',
});
Object.defineProperty(captchaDom.window.document, 'readyState', {
configurable: true,
value: 'complete',
});
Object.assign(globalThis, { document: captchaDom.window.document, window: captchaDom.window });
await waitForAmazonSearchPageReady().then(
() => {
throw new Error('Amazon captcha page must fail immediately');
},
(error) => {
if (!String(error).includes('验证码')) throw error;
},
);
captchaDom.window.close();
console.log('Amazon search page-ready tests passed.');
};
void main();