diff --git a/lib/chromiumBrowser.js b/lib/chromiumBrowser.js index 50d9b47..53aab60 100644 --- a/lib/chromiumBrowser.js +++ b/lib/chromiumBrowser.js @@ -46,7 +46,7 @@ class ChromiumBrowser { try { return puppeteer.launch({ args: launchArgs, - protocolTimeout: 120000, + protocolTimeout: 180000, defaultViewport: { width: 800, height: 600}, executablePath: this.localExecutivePath, headless: 'new', diff --git a/lib/func.js b/lib/func.js index 2a94a77..4071271 100644 --- a/lib/func.js +++ b/lib/func.js @@ -17,15 +17,22 @@ const checkArgs = (obj, field, checkLength = false) => { } const updatePageViewport = async (page, job, maxPageHeight = null) => { - let scrollHeight = await page.evaluate(`(async () => { + let scrollHeight = await Promise.race([ + page.evaluate(`(async () => { return document.documentElement.scrollHeight; - })()`) + })()`), + new Promise((_, rej) => setTimeout(() => rej(new Error('scrollHeight timeout')), 4000)), + ]).catch(() => 1000); if (maxPageHeight && scrollHeight > maxPageHeight) { scrollHeight = maxPageHeight } - await page.setViewport({ width: Number.parseInt(job.breakpoint), height: Number.parseInt(scrollHeight) }) + await Promise.race([ + page.setViewport({ width: Number.parseInt(job.breakpoint), height: Number.parseInt(scrollHeight) }), + new Promise((_, rej) => setTimeout(() => rej(new Error('setViewport timeout')), 4000)), + ]).catch(() => {}); + await new Promise(resolve => setTimeout(resolve, 1000)); return scrollHeight } @@ -122,32 +129,40 @@ module.exports = { addJsCode: async (page, job) => { if (!checkArgs(job, 'js_code', true)) { - return Promise.resolve() + return; } try { - await page.evaluate(job.args.js_code) + await Promise.race([ + page.evaluate(job.args.js_code), + new Promise((_, rej) => + setTimeout(() => rej(new Error('evaluate js_code timeout')), 5000) + ), + ]); } catch (e) { - logger.warn('Failed to evaluate page', { error: e, js_code: job.args.js_code }) + logger.warn('Failed to evaluate page', { error: e, js_code: job.args.js_code }); } await new Promise(resolve => setTimeout(resolve, 2000)); - return page + return page; }, addCssCode: async (page, job) => { if (!checkArgs(job, 'css_code', true)) { - return Promise.resolve() + return; } try { - await page.addStyleTag({ content: job.args.css_code }) + await Promise.race([ + page.addStyleTag({ content: job.args.css_code }), + new Promise((_, rej) => setTimeout(() => rej(logger.warn('addStyleTag timeout')), 4000)), + ]); } catch (e) { - logger.error('Failed to add style tag', { error: e, css_code: job.args.css_code }) + logger.error('Failed to add style tag', { error: e, css_code: job.args.css_code }); } await new Promise(resolve => setTimeout(resolve, 2000)); - return page + return page; }, addFixtures: async (page, job) => { diff --git a/lib/funcPerform.js b/lib/funcPerform.js index 0a7f486..c06730d 100644 --- a/lib/funcPerform.js +++ b/lib/funcPerform.js @@ -332,6 +332,7 @@ module.exports = { // Remove all browser Cookies. const client = await page.target().createCDPSession(); await client.send('Network.clearBrowserCookies'); + await client.send('Network.setBypassServiceWorker', { bypass: true }) await new Promise(resolve => setTimeout(resolve, 1000)); await func.setHeaders(page, jobItem) @@ -499,17 +500,34 @@ module.exports = { await new Promise(resolve => setTimeout(resolve, 1000)); logger.debug('page.goto done') - await page.evaluate(() => document.fonts.ready) - await page.waitForFunction(() => document.readyState === 'complete'); + await Promise.race([ + page.evaluate(() => Promise.race([ + (document && document.fonts && document.fonts.ready) || Promise.resolve(), + new Promise(res => setTimeout(res, 4000)), + ])), + new Promise((_, rej) => setTimeout(() => rej(new Error('fonts.ready cap (6s)')), 6000)), + ]).catch(e => logger.warn('fonts.ready skipped', { error: String(e) })); + + await page + .waitForFunction(() => document.readyState === 'complete', { + polling: 'mutation', + timeout: 6000, + }) + .catch(() => logger.warn('readyState=complete timed out')); await new Promise(resolve => setTimeout(resolve, 1000)); // @see https://github.com/ygerasimov/diffy-pm/issues/250 (wp-rocket fix) - await page.evaluate(() => { - try { - window.dispatchEvent(new Event('touchstart')); - window.document.dispatchEvent(new Event('touchstart')); - } catch (e) {} - }); + await Promise.race([ + page.evaluate(() => { + try { + window.dispatchEvent(new Event('touchstart')); + document.dispatchEvent(new Event('touchstart')); + } catch (e) {} + }), + new Promise((_, rej) => + setTimeout(() => rej(new Error('touchstart poke timeout')), 3000) + ), + ]).catch(err => logger.warn('touchstart skipped', { error: String(err) })); await func.addCssCode(page, jobItem) logger.debug('addCssCode done')