browserless 10.10.3 → 10.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/package.json +15 -14
- package/src/driver.js +19 -1
- package/src/index.js +8 -4
package/README.md
CHANGED
|
@@ -46,6 +46,7 @@ This package integrates and re-exports functionality from other `@browserless/*`
|
|
|
46
46
|
| `@browserless/goto` | Page navigation with smart waiting strategies, ad blocking, and evasion techniques |
|
|
47
47
|
| `@browserless/screenshot` | Screenshot capture with overlays, device emulation, and code highlighting |
|
|
48
48
|
| `@browserless/pdf` | PDF generation with customizable margins and scaling |
|
|
49
|
+
| `@browserless/capture` | Tab recording via extension + `tabCapture` (uses default browser context) |
|
|
49
50
|
| `@browserless/errors` | Standardized error handling and timeout errors |
|
|
50
51
|
|
|
51
52
|
## License
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "browserless",
|
|
3
3
|
"description": "The headless Chrome/Chromium driver on top of Puppeteer. Take screenshots, generate PDFs, extract text and HTML with a production-ready API.",
|
|
4
4
|
"homepage": "https://browserless.js.org",
|
|
5
|
-
"version": "10.
|
|
5
|
+
"version": "10.11.1",
|
|
6
6
|
"main": "src/index.js",
|
|
7
7
|
"author": {
|
|
8
8
|
"email": "hello@microlink.io",
|
|
@@ -18,27 +18,28 @@
|
|
|
18
18
|
"url": "https://github.com/microlinkhq/browserless/issues"
|
|
19
19
|
},
|
|
20
20
|
"keywords": [
|
|
21
|
+
"automation",
|
|
21
22
|
"browser",
|
|
22
23
|
"browserless",
|
|
23
24
|
"chrome",
|
|
24
25
|
"chromium",
|
|
25
26
|
"headless",
|
|
27
|
+
"html",
|
|
28
|
+
"javascript",
|
|
29
|
+
"nodejs",
|
|
30
|
+
"pdf",
|
|
26
31
|
"puppeteer",
|
|
27
32
|
"screenshot",
|
|
28
|
-
"pdf",
|
|
29
|
-
"html",
|
|
30
33
|
"text",
|
|
31
|
-
"
|
|
32
|
-
"web-scraping",
|
|
33
|
-
"nodejs",
|
|
34
|
-
"javascript"
|
|
34
|
+
"web-scraping"
|
|
35
35
|
],
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@browserless/
|
|
38
|
-
"@browserless/
|
|
39
|
-
"@browserless/
|
|
40
|
-
"@browserless/
|
|
41
|
-
"
|
|
37
|
+
"@browserless/capture": "^10.11.1",
|
|
38
|
+
"@browserless/errors": "^10.11.1",
|
|
39
|
+
"@browserless/goto": "^10.11.1",
|
|
40
|
+
"@browserless/pdf": "^10.11.1",
|
|
41
|
+
"@browserless/screenshot": "^10.11.1",
|
|
42
|
+
"debug-logfmt": "~1.4.8",
|
|
42
43
|
"kill-process-group": "~1.0.13",
|
|
43
44
|
"p-reflect": "~2.1.0",
|
|
44
45
|
"p-retry": "~4.6.1",
|
|
@@ -47,7 +48,7 @@
|
|
|
47
48
|
"superlock": "~1.2.6"
|
|
48
49
|
},
|
|
49
50
|
"devDependencies": {
|
|
50
|
-
"@browserless/test": "^10.
|
|
51
|
+
"@browserless/test": "^10.11.1",
|
|
51
52
|
"ava": "5",
|
|
52
53
|
"ps-list": "7",
|
|
53
54
|
"tinyspawn": "latest"
|
|
@@ -67,5 +68,5 @@
|
|
|
67
68
|
"timeout": "2m",
|
|
68
69
|
"workerThreads": false
|
|
69
70
|
},
|
|
70
|
-
"gitHead": "
|
|
71
|
+
"gitHead": "2a4bbeeadfb7f010d57a8806f706de2bc48f936e"
|
|
71
72
|
}
|
package/src/driver.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
3
|
const killProcessGroup = require('kill-process-group')
|
|
4
|
+
const createCapture = require('@browserless/capture')
|
|
4
5
|
const debug = require('debug-logfmt')('browserless')
|
|
5
6
|
const requireOneOf = require('require-one-of')
|
|
6
7
|
const pReflect = require('p-reflect')
|
|
@@ -42,12 +43,28 @@ const defaultArgs = [
|
|
|
42
43
|
'PushMessaging',
|
|
43
44
|
'site-per-process', // Disables OOPIF. https://www.chromium.org/Home/chromium-security/site-isolation
|
|
44
45
|
'WebPayments'
|
|
45
|
-
].join(',')}
|
|
46
|
+
].join(',')}`,
|
|
47
|
+
`--allowlisted-extension-id=${createCapture.extensionId}`,
|
|
48
|
+
`--disable-extensions-except=${createCapture.extensionPath}`,
|
|
49
|
+
`--load-extension=${createCapture.extensionPath}`
|
|
46
50
|
]
|
|
47
51
|
|
|
52
|
+
const normalizeIgnoreDefaultArgs = ignoreDefaultArgs => {
|
|
53
|
+
if (ignoreDefaultArgs === true) return true
|
|
54
|
+
|
|
55
|
+
const required = ['--disable-extensions']
|
|
56
|
+
|
|
57
|
+
if (Array.isArray(ignoreDefaultArgs)) {
|
|
58
|
+
return [...new Set([...ignoreDefaultArgs, ...required])]
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return required
|
|
62
|
+
}
|
|
63
|
+
|
|
48
64
|
const spawn = ({
|
|
49
65
|
args = defaultArgs,
|
|
50
66
|
headless = true,
|
|
67
|
+
ignoreDefaultArgs,
|
|
51
68
|
ignoreHTTPSErrors = true,
|
|
52
69
|
mode = 'launch',
|
|
53
70
|
puppeteer = requireOneOf(['puppeteer', 'puppeteer-core', 'puppeteer-firefox']),
|
|
@@ -57,6 +74,7 @@ const spawn = ({
|
|
|
57
74
|
puppeteer[mode]({
|
|
58
75
|
args,
|
|
59
76
|
headless,
|
|
77
|
+
ignoreDefaultArgs: normalizeIgnoreDefaultArgs(ignoreDefaultArgs),
|
|
60
78
|
ignoreHTTPSErrors,
|
|
61
79
|
waitForInitialPage,
|
|
62
80
|
...launchOpts
|
package/src/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
3
|
const { ensureError, browserTimeout } = require('@browserless/errors')
|
|
4
|
+
const createCapture = require('@browserless/capture')
|
|
4
5
|
const createScreenshot = require('@browserless/screenshot')
|
|
5
6
|
const debug = require('debug-logfmt')('browserless')
|
|
6
7
|
const createGoto = require('@browserless/goto')
|
|
@@ -78,9 +79,11 @@ module.exports = ({ timeout: globalTimeout = 30000, ...launchOpts } = {}) => {
|
|
|
78
79
|
|
|
79
80
|
const getBrowserContext = () => _contextPromise
|
|
80
81
|
|
|
81
|
-
const createPage = async name => {
|
|
82
|
+
const createPage = async (name, { useDefaultContext = false } = {}) => {
|
|
82
83
|
const duration = debug.duration('createPage')
|
|
83
|
-
const browserContext =
|
|
84
|
+
const browserContext = useDefaultContext
|
|
85
|
+
? (await getBrowser()).defaultBrowserContext()
|
|
86
|
+
: await getBrowserContext()
|
|
84
87
|
const page = await browserContext.newPage()
|
|
85
88
|
const browser = typeof page.browser === 'function' ? page.browser() : undefined
|
|
86
89
|
const metadata = {
|
|
@@ -103,7 +106,7 @@ module.exports = ({ timeout: globalTimeout = 30000, ...launchOpts } = {}) => {
|
|
|
103
106
|
}
|
|
104
107
|
}
|
|
105
108
|
|
|
106
|
-
const withPage = (fn, { timeout: evaluateTimeout } = {}) => {
|
|
109
|
+
const withPage = (fn, { timeout: evaluateTimeout, useDefaultContext = false } = {}) => {
|
|
107
110
|
const name = fn.name || 'anonymous'
|
|
108
111
|
|
|
109
112
|
return async (...args) => {
|
|
@@ -114,7 +117,7 @@ module.exports = ({ timeout: globalTimeout = 30000, ...launchOpts } = {}) => {
|
|
|
114
117
|
let closePageTimeout
|
|
115
118
|
|
|
116
119
|
try {
|
|
117
|
-
page = await createPage(name)
|
|
120
|
+
page = await createPage(name, { useDefaultContext })
|
|
118
121
|
closePageTimeout = setTimeout(() => {
|
|
119
122
|
closePage(page, name).catch(error => {
|
|
120
123
|
const { message, code, name } = ensureError(error)
|
|
@@ -192,6 +195,7 @@ module.exports = ({ timeout: globalTimeout = 30000, ...launchOpts } = {}) => {
|
|
|
192
195
|
goto,
|
|
193
196
|
html: evaluate(page => page.content()),
|
|
194
197
|
page: createPage,
|
|
198
|
+
capture: withPage(createCapture({ goto }), { useDefaultContext: true }),
|
|
195
199
|
pdf: withPage(createPdf({ goto })),
|
|
196
200
|
screenshot: withPage(createScreenshot({ goto })),
|
|
197
201
|
text: evaluate(page => page.evaluate(() => document.body.innerText)),
|