From 408292962346180433e75433391746ce13a5b7f2 Mon Sep 17 00:00:00 2001 From: Kiko Beats Date: Fri, 12 Aug 2022 18:01:02 +0200 Subject: [PATCH] fix(browserless): pass context options --- README.md | 4 +++ packages/browserless/src/index.js | 14 ++++++---- packages/browserless/test/index.js | 45 +++++++++++++++++++++++++++--- 3 files changed, 53 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 4c42a54877..2f4c08e678 100644 --- a/README.md +++ b/README.md @@ -166,6 +166,10 @@ Every browser context is isolated. They won't share cookies/cache with other bro #### options +Any [browser.createIncognitoBrowserContext#options](https://pptr.dev/next/api/puppeteer.browsercontextoptions) can be passed. + +Additionally, you can setup: + ##### retry type: `number`
diff --git a/packages/browserless/src/index.js b/packages/browserless/src/index.js index 7e881d091e..4a3d1eb259 100644 --- a/packages/browserless/src/index.js +++ b/packages/browserless/src/index.js @@ -58,8 +58,8 @@ module.exports = ({ timeout: globalTimeout = 30000, ...launchOpts } = {}) => { let browserProcessPromise = spawn() - const createBrowserContext = () => - getBrowser().then(browser => browser.createIncognitoBrowserContext()) + const createBrowserContext = contextOpts => + getBrowser().then(browser => browser.createIncognitoBrowserContext(contextOpts)) const getBrowser = async () => { if (isClosed) return browserProcessPromise @@ -73,8 +73,8 @@ module.exports = ({ timeout: globalTimeout = 30000, ...launchOpts } = {}) => { return browserProcess || getBrowser() } - const createContext = async ({ retry = 2, timeout: contextTimeout } = {}) => { - let _contextPromise = createBrowserContext() + const createContext = async ({ retry = 2, timeout: contextTimeout, ...contextOpts } = {}) => { + let _contextPromise = createBrowserContext(contextOpts) const getBrowserContext = () => _contextPromise @@ -82,7 +82,7 @@ module.exports = ({ timeout: globalTimeout = 30000, ...launchOpts } = {}) => { const browserProcess = context.browser() browserProcess.once('disconnected', async () => { await getBrowser() - _contextPromise = createBrowserContext() + _contextPromise = createBrowserContext(contextOpts) }) }) @@ -132,7 +132,9 @@ module.exports = ({ timeout: globalTimeout = 30000, ...launchOpts } = {}) => { debug('onFailedAttempt', { name: error.name, code: error.code, isRejected }) if (error.name === 'AbortError') throw error if (isRejected) throw new AbortError() - if (error.code === 'EBRWSRCONTEXTCONNRESET') _contextPromise = createBrowserContext() + if (error.code === 'EBRWSRCONTEXTCONNRESET') { + _contextPromise = createBrowserContext(contextOpts) + } const { message, attemptNumber, retriesLeft } = error debug('retry', { attemptNumber, retriesLeft, message }) } diff --git a/packages/browserless/test/index.js b/packages/browserless/test/index.js index 023f229220..526201e5de 100644 --- a/packages/browserless/test/index.js +++ b/packages/browserless/test/index.js @@ -1,14 +1,51 @@ 'use strict' +const { initBrowserless, getBrowserless } = require('@browserless/test/util') +const http = require('http') + const test = require('ava') -const createBrowserless = require('../src') -require('@browserless/test')(createBrowserless()) +const browserlessFactory = getBrowserless() + +require('@browserless/test')(browserlessFactory) + +test('pass specific options to a context', async t => { + const proxiedRequestUrls = [] + + const proxy = http + .createServer((req, res) => { + proxiedRequestUrls.push(req.url) + + const proxyRequest = http.request( + req.url, + { + method: req.method, + headers: req.headers + }, + proxyResponse => { + res.writeHead(proxyResponse.statusCode, proxyResponse.headers) + proxyResponse.pipe(res, { end: true }) + } + ) + + req.pipe(proxyRequest, { end: true }) + }) + .listen() + + const proxyServer = `http://[::]:${proxy.address().port}` + + const browserless = await browserlessFactory.createContext({ proxyServer: proxyServer }) + const page = await browserless.page() + + await browserless.goto(page, { url: 'http://example.com' }) + + t.deepEqual(proxiedRequestUrls, ['http://example.com/']) +}) test('ensure to destroy browser contexts', async t => { - const browserlessFactory = createBrowserless() + const browserlessFactory = initBrowserless() + const browser = await browserlessFactory.browser() - t.teardown(() => browser.close()) t.is(browser.browserContexts().length, 1)