import { JSDOM } from 'jsdom'; import { waitForAmazonSearchPageReady } from '../src/page-worker/web-injectors/amazon-search-page-ready'; const main = async () => { const dom = new JSDOM( '
Persistent widget spinner
Next
', { 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 }); Object.assign(dom.window, { scrollTo: () => undefined }); dom.window.setTimeout(() => { const sponsoredModule = dom.window.document.createElement('section'); sponsoredModule.innerHTML = 'Sponsored

Lazy sponsored product

'; dom.window.document.querySelector('main')?.append(sponsoredModule); }, 500); const started = Date.now(); await waitForAmazonSearchPageReady(); const elapsed = Date.now() - started; if (!dom.window.document.querySelector('[data-asin="B000000002"]')) { throw new Error('Lazy sponsored DOM was not loaded before page readiness completed'); } if (elapsed >= 5000) { throw new Error(`Ready search results were delayed by a persistent spinner (${elapsed}ms)`); } dom.window.close(); const errorDom = new JSDOM( '

SORRY

Something went wrong on our end.

Please go back and try again.

', { 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('', { 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();