isomorfeus-puppetmaster 0.5.5 → 0.5.6
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.
- checksums.yaml +4 -4
- data/lib/isomorfeus/puppetmaster/console_message.rb +18 -18
- data/lib/isomorfeus/puppetmaster/cookie.rb +46 -46
- data/lib/isomorfeus/puppetmaster/driver/puppeteer.rb +413 -415
- data/lib/isomorfeus/puppetmaster/driver/puppeteer_document.rb +953 -953
- data/lib/isomorfeus/puppetmaster/driver/puppeteer_node.rb +851 -851
- data/lib/isomorfeus/puppetmaster/errors.rb +90 -90
- data/lib/isomorfeus/puppetmaster/iframe.rb +16 -16
- data/lib/isomorfeus/puppetmaster/node/content_editable.rb +17 -17
- data/lib/isomorfeus/puppetmaster/node/input.rb +20 -20
- data/lib/isomorfeus/puppetmaster/node/select.rb +35 -35
- data/lib/isomorfeus/puppetmaster/node.rb +279 -279
- data/lib/isomorfeus/puppetmaster/request.rb +16 -16
- data/lib/isomorfeus/puppetmaster/response.rb +25 -25
- data/lib/isomorfeus/puppetmaster/self_forwardable.rb +38 -38
- data/lib/isomorfeus/puppetmaster/version.rb +3 -3
- data/lib/isomorfeus/puppetmaster.rb +85 -85
- data/lib/isomorfeus-puppetmaster.rb +1 -0
- data/node_modules/.bin/extract-zip +12 -12
- data/node_modules/.bin/extract-zip.ps1 +28 -28
- data/node_modules/.bin/rimraf +12 -12
- data/node_modules/.bin/rimraf.ps1 +28 -28
- data/node_modules/.package-lock.json +530 -585
- data/node_modules/@types/node/LICENSE +21 -21
- data/node_modules/@types/node/assert/strict.d.ts +8 -8
- data/node_modules/@types/node/assert.d.ts +912 -912
- data/node_modules/@types/node/async_hooks.d.ts +497 -497
- data/node_modules/@types/node/buffer.d.ts +2142 -2142
- data/node_modules/@types/node/child_process.d.ts +1355 -1355
- data/node_modules/@types/node/cluster.d.ts +414 -414
- data/node_modules/@types/node/console.d.ts +407 -407
- data/node_modules/@types/node/constants.d.ts +18 -18
- data/node_modules/@types/node/crypto.d.ts +3224 -3224
- data/node_modules/@types/node/dgram.d.ts +545 -545
- data/node_modules/@types/node/diagnostics_channel.d.ts +128 -128
- data/node_modules/@types/node/dns/promises.d.ts +357 -357
- data/node_modules/@types/node/dns.d.ts +643 -643
- data/node_modules/@types/node/domain.d.ts +169 -169
- data/node_modules/@types/node/events.d.ts +623 -623
- data/node_modules/@types/node/fs/promises.d.ts +997 -997
- data/node_modules/@types/node/fs.d.ts +3723 -3723
- data/node_modules/@types/node/globals.d.ts +285 -285
- data/node_modules/@types/node/globals.global.d.ts +1 -1
- data/node_modules/@types/node/http.d.ts +1358 -1358
- data/node_modules/@types/node/http2.d.ts +2100 -2100
- data/node_modules/@types/node/https.d.ts +391 -391
- data/node_modules/@types/node/index.d.ts +131 -131
- data/node_modules/@types/node/inspector.d.ts +2738 -2738
- data/node_modules/@types/node/module.d.ts +114 -114
- data/node_modules/@types/node/net.d.ts +783 -783
- data/node_modules/@types/node/os.d.ts +455 -455
- data/node_modules/@types/node/package.json +229 -229
- data/node_modules/@types/node/path.d.ts +172 -172
- data/node_modules/@types/node/perf_hooks.d.ts +555 -555
- data/node_modules/@types/node/process.d.ts +1477 -1477
- data/node_modules/@types/node/punycode.d.ts +117 -117
- data/node_modules/@types/node/querystring.d.ts +131 -131
- data/node_modules/@types/node/readline.d.ts +542 -542
- data/node_modules/@types/node/repl.d.ts +424 -424
- data/node_modules/@types/node/stream/consumers.d.ts +24 -24
- data/node_modules/@types/node/stream/promises.d.ts +42 -42
- data/node_modules/@types/node/stream/web.d.ts +6 -6
- data/node_modules/@types/node/stream.d.ts +1181 -1181
- data/node_modules/@types/node/string_decoder.d.ts +67 -67
- data/node_modules/@types/node/timers/promises.d.ts +68 -68
- data/node_modules/@types/node/timers.d.ts +94 -94
- data/node_modules/@types/node/tls.d.ts +1019 -1019
- data/node_modules/@types/node/trace_events.d.ts +161 -161
- data/node_modules/@types/node/tty.d.ts +206 -206
- data/node_modules/@types/node/url.d.ts +798 -798
- data/node_modules/@types/node/util.d.ts +1556 -1556
- data/node_modules/@types/node/v8.d.ts +378 -378
- data/node_modules/@types/node/vm.d.ts +504 -504
- data/node_modules/@types/node/wasi.d.ts +153 -153
- data/node_modules/@types/node/worker_threads.d.ts +649 -649
- data/node_modules/@types/node/zlib.d.ts +517 -517
- data/node_modules/@types/yauzl/LICENSE +21 -21
- data/node_modules/@types/yauzl/index.d.ts +98 -98
- data/node_modules/@types/yauzl/package.json +26 -26
- data/node_modules/agent-base/README.md +145 -145
- data/node_modules/agent-base/dist/src/index.d.ts +78 -78
- data/node_modules/agent-base/dist/src/index.js +202 -202
- data/node_modules/agent-base/dist/src/promisify.d.ts +4 -4
- data/node_modules/agent-base/dist/src/promisify.js +17 -17
- data/node_modules/agent-base/package.json +64 -64
- data/node_modules/agent-base/src/index.ts +345 -345
- data/node_modules/agent-base/src/promisify.ts +33 -33
- data/node_modules/balanced-match/.github/FUNDING.yml +2 -2
- data/node_modules/balanced-match/LICENSE.md +21 -21
- data/node_modules/balanced-match/README.md +97 -97
- data/node_modules/balanced-match/index.js +62 -62
- data/node_modules/balanced-match/package.json +48 -48
- data/node_modules/base64-js/LICENSE +21 -21
- data/node_modules/base64-js/README.md +34 -34
- data/node_modules/base64-js/index.d.ts +3 -3
- data/node_modules/base64-js/index.js +150 -150
- data/node_modules/base64-js/package.json +47 -47
- data/node_modules/bl/.travis.yml +17 -17
- data/node_modules/bl/BufferList.js +396 -396
- data/node_modules/bl/LICENSE.md +13 -13
- data/node_modules/bl/README.md +247 -247
- data/node_modules/bl/bl.js +84 -84
- data/node_modules/bl/package.json +37 -37
- data/node_modules/bl/test/convert.js +21 -21
- data/node_modules/bl/test/indexOf.js +492 -492
- data/node_modules/bl/test/isBufferList.js +32 -32
- data/node_modules/bl/test/test.js +869 -869
- data/node_modules/brace-expansion/LICENSE +21 -21
- data/node_modules/brace-expansion/README.md +129 -129
- data/node_modules/brace-expansion/index.js +201 -201
- data/node_modules/brace-expansion/package.json +47 -47
- data/node_modules/buffer/AUTHORS.md +70 -70
- data/node_modules/buffer/LICENSE +21 -21
- data/node_modules/buffer/README.md +410 -410
- data/node_modules/buffer/index.d.ts +186 -186
- data/node_modules/buffer/index.js +1817 -1817
- data/node_modules/buffer/package.json +96 -96
- data/node_modules/buffer-crc32/LICENSE +19 -19
- data/node_modules/buffer-crc32/README.md +47 -47
- data/node_modules/buffer-crc32/index.js +111 -111
- data/node_modules/buffer-crc32/package.json +39 -39
- data/node_modules/chownr/LICENSE +15 -15
- data/node_modules/chownr/README.md +3 -3
- data/node_modules/chownr/chownr.js +167 -167
- data/node_modules/chownr/package.json +29 -29
- data/node_modules/concat-map/.travis.yml +4 -4
- data/node_modules/concat-map/LICENSE +18 -18
- data/node_modules/concat-map/README.markdown +62 -62
- data/node_modules/concat-map/example/map.js +6 -6
- data/node_modules/concat-map/index.js +13 -13
- data/node_modules/concat-map/package.json +43 -43
- data/node_modules/concat-map/test/map.js +39 -39
- data/node_modules/debug/LICENSE +19 -19
- data/node_modules/debug/README.md +455 -455
- data/node_modules/debug/package.json +59 -59
- data/node_modules/debug/src/browser.js +269 -269
- data/node_modules/debug/src/common.js +274 -274
- data/node_modules/debug/src/index.js +10 -10
- data/node_modules/debug/src/node.js +263 -263
- data/node_modules/devtools-protocol/LICENSE +27 -27
- data/node_modules/devtools-protocol/README.md +12 -12
- data/node_modules/devtools-protocol/json/browser_protocol.json +20985 -20640
- data/node_modules/devtools-protocol/json/js_protocol.json +3531 -3580
- data/node_modules/devtools-protocol/package.json +17 -18
- data/node_modules/devtools-protocol/pdl/browser_protocol.pdl +9849 -9637
- data/node_modules/devtools-protocol/pdl/js_protocol.pdl +1653 -1678
- data/node_modules/devtools-protocol/types/protocol-mapping.d.ts +4333 -4321
- data/node_modules/devtools-protocol/types/protocol-proxy-api.d.ts +3695 -3683
- data/node_modules/devtools-protocol/types/protocol.d.ts +15714 -15538
- data/node_modules/end-of-stream/LICENSE +20 -20
- data/node_modules/end-of-stream/README.md +54 -54
- data/node_modules/end-of-stream/index.js +94 -94
- data/node_modules/end-of-stream/package.json +37 -37
- data/node_modules/extract-zip/LICENSE +23 -23
- data/node_modules/extract-zip/cli.js +19 -19
- data/node_modules/extract-zip/index.d.ts +21 -21
- data/node_modules/extract-zip/index.js +173 -173
- data/node_modules/extract-zip/package.json +80 -80
- data/node_modules/extract-zip/readme.md +57 -57
- data/node_modules/fd-slicer/.npmignore +2 -2
- data/node_modules/fd-slicer/.travis.yml +7 -7
- data/node_modules/fd-slicer/CHANGELOG.md +49 -49
- data/node_modules/fd-slicer/LICENSE +21 -21
- data/node_modules/fd-slicer/README.md +199 -199
- data/node_modules/fd-slicer/index.js +296 -296
- data/node_modules/fd-slicer/package.json +36 -36
- data/node_modules/fd-slicer/test/test.js +350 -350
- data/node_modules/find-up/index.d.ts +137 -137
- data/node_modules/find-up/index.js +89 -89
- data/node_modules/find-up/license +9 -9
- data/node_modules/find-up/package.json +53 -53
- data/node_modules/find-up/readme.md +156 -156
- data/node_modules/fs-constants/LICENSE +21 -21
- data/node_modules/fs-constants/README.md +26 -26
- data/node_modules/fs-constants/browser.js +1 -1
- data/node_modules/fs-constants/index.js +1 -1
- data/node_modules/fs-constants/package.json +19 -19
- data/node_modules/fs.realpath/LICENSE +43 -43
- data/node_modules/fs.realpath/README.md +33 -33
- data/node_modules/fs.realpath/index.js +66 -66
- data/node_modules/fs.realpath/old.js +303 -303
- data/node_modules/fs.realpath/package.json +26 -26
- data/node_modules/get-stream/buffer-stream.js +52 -52
- data/node_modules/get-stream/index.d.ts +108 -108
- data/node_modules/get-stream/index.js +60 -60
- data/node_modules/get-stream/license +9 -9
- data/node_modules/get-stream/package.json +50 -50
- data/node_modules/get-stream/readme.md +124 -124
- data/node_modules/glob/LICENSE +21 -21
- data/node_modules/glob/README.md +375 -375
- data/node_modules/glob/changelog.md +67 -67
- data/node_modules/glob/common.js +234 -234
- data/node_modules/glob/glob.js +788 -788
- data/node_modules/glob/package.json +51 -51
- data/node_modules/glob/sync.js +484 -484
- data/node_modules/https-proxy-agent/README.md +137 -137
- data/node_modules/https-proxy-agent/dist/agent.d.ts +30 -30
- data/node_modules/https-proxy-agent/dist/agent.js +179 -179
- data/node_modules/https-proxy-agent/dist/index.d.ts +23 -23
- data/node_modules/https-proxy-agent/dist/index.js +13 -13
- data/node_modules/https-proxy-agent/dist/parse-proxy-response.d.ts +7 -7
- data/node_modules/https-proxy-agent/dist/parse-proxy-response.js +65 -65
- data/node_modules/https-proxy-agent/package.json +56 -56
- data/node_modules/ieee754/LICENSE +11 -11
- data/node_modules/ieee754/README.md +51 -51
- data/node_modules/ieee754/index.d.ts +9 -9
- data/node_modules/ieee754/index.js +85 -85
- data/node_modules/ieee754/package.json +52 -52
- data/node_modules/inflight/LICENSE +15 -15
- data/node_modules/inflight/README.md +37 -37
- data/node_modules/inflight/inflight.js +54 -54
- data/node_modules/inflight/package.json +29 -29
- data/node_modules/inherits/LICENSE +16 -16
- data/node_modules/inherits/README.md +42 -42
- data/node_modules/inherits/inherits.js +9 -9
- data/node_modules/inherits/inherits_browser.js +27 -27
- data/node_modules/inherits/package.json +29 -29
- data/node_modules/locate-path/index.d.ts +83 -83
- data/node_modules/locate-path/index.js +65 -65
- data/node_modules/locate-path/license +9 -9
- data/node_modules/locate-path/package.json +45 -45
- data/node_modules/locate-path/readme.md +122 -122
- data/node_modules/minimatch/LICENSE +15 -15
- data/node_modules/minimatch/README.md +209 -209
- data/node_modules/minimatch/minimatch.js +923 -923
- data/node_modules/minimatch/package.json +30 -30
- data/node_modules/mkdirp-classic/LICENSE +21 -21
- data/node_modules/mkdirp-classic/README.md +18 -18
- data/node_modules/mkdirp-classic/index.js +98 -98
- data/node_modules/mkdirp-classic/package.json +18 -18
- data/node_modules/ms/index.js +162 -162
- data/node_modules/ms/license.md +21 -21
- data/node_modules/ms/package.json +37 -37
- data/node_modules/ms/readme.md +60 -60
- data/node_modules/node-fetch/LICENSE.md +22 -22
- data/node_modules/node-fetch/README.md +590 -590
- data/node_modules/node-fetch/browser.js +24 -24
- data/node_modules/node-fetch/lib/index.es.js +1662 -1662
- data/node_modules/node-fetch/lib/index.js +1671 -1671
- data/node_modules/node-fetch/lib/index.mjs +1660 -1660
- data/node_modules/node-fetch/package.json +68 -68
- data/node_modules/once/LICENSE +15 -15
- data/node_modules/once/README.md +79 -79
- data/node_modules/once/once.js +42 -42
- data/node_modules/once/package.json +33 -33
- data/node_modules/p-limit/index.d.ts +38 -38
- data/node_modules/p-limit/index.js +57 -57
- data/node_modules/p-limit/license +9 -9
- data/node_modules/p-limit/package.json +52 -52
- data/node_modules/p-limit/readme.md +101 -101
- data/node_modules/p-locate/index.d.ts +64 -64
- data/node_modules/p-locate/index.js +52 -52
- data/node_modules/p-locate/license +9 -9
- data/node_modules/p-locate/package.json +53 -53
- data/node_modules/p-locate/readme.md +90 -90
- data/node_modules/p-try/index.d.ts +39 -39
- data/node_modules/p-try/index.js +9 -9
- data/node_modules/p-try/license +9 -9
- data/node_modules/p-try/package.json +42 -42
- data/node_modules/p-try/readme.md +58 -58
- data/node_modules/path-exists/index.d.ts +28 -28
- data/node_modules/path-exists/index.js +23 -23
- data/node_modules/path-exists/license +9 -9
- data/node_modules/path-exists/package.json +39 -39
- data/node_modules/path-exists/readme.md +52 -52
- data/node_modules/path-is-absolute/index.js +20 -20
- data/node_modules/path-is-absolute/license +21 -21
- data/node_modules/path-is-absolute/package.json +43 -43
- data/node_modules/path-is-absolute/readme.md +59 -59
- data/node_modules/pend/LICENSE +23 -23
- data/node_modules/pend/README.md +41 -41
- data/node_modules/pend/index.js +55 -55
- data/node_modules/pend/package.json +18 -18
- data/node_modules/pend/test.js +137 -137
- data/node_modules/pkg-dir/index.d.ts +44 -44
- data/node_modules/pkg-dir/index.js +17 -17
- data/node_modules/pkg-dir/license +9 -9
- data/node_modules/pkg-dir/package.json +56 -56
- data/node_modules/pkg-dir/readme.md +66 -66
- data/node_modules/progress/CHANGELOG.md +115 -115
- data/node_modules/progress/LICENSE +22 -22
- data/node_modules/progress/Makefile +8 -8
- data/node_modules/progress/Readme.md +146 -146
- data/node_modules/progress/index.js +1 -1
- data/node_modules/progress/lib/node-progress.js +236 -236
- data/node_modules/progress/package.json +26 -26
- data/node_modules/proxy-from-env/.eslintrc +29 -29
- data/node_modules/proxy-from-env/.travis.yml +10 -10
- data/node_modules/proxy-from-env/LICENSE +20 -20
- data/node_modules/proxy-from-env/README.md +131 -131
- data/node_modules/proxy-from-env/index.js +108 -108
- data/node_modules/proxy-from-env/package.json +34 -34
- data/node_modules/proxy-from-env/test.js +483 -483
- data/node_modules/pump/.travis.yml +5 -5
- data/node_modules/pump/LICENSE +20 -20
- data/node_modules/pump/README.md +65 -65
- data/node_modules/pump/index.js +82 -82
- data/node_modules/pump/package.json +24 -24
- data/node_modules/pump/test-browser.js +66 -66
- data/node_modules/pump/test-node.js +53 -53
- data/node_modules/puppeteer-core/CHANGELOG.md +319 -290
- data/node_modules/puppeteer-core/LICENSE +202 -202
- data/node_modules/puppeteer-core/README.md +481 -481
- data/node_modules/puppeteer-core/cjs-entry-core.js +29 -29
- data/node_modules/puppeteer-core/cjs-entry.js +29 -29
- data/node_modules/puppeteer-core/install.js +89 -89
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/api-docs-entry.d.ts +110 -110
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/api-docs-entry.js +80 -80
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Accessibility.d.ts +175 -175
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Accessibility.js +360 -360
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/AriaQueryHandler.d.ts +20 -20
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/AriaQueryHandler.js +84 -84
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/AriaQueryHandler.js.map +1 -1
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Browser.d.ts +455 -455
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Browser.js +540 -540
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/BrowserConnector.d.ts +53 -53
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/BrowserConnector.js +97 -97
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/BrowserWebSocketTransport.d.ts +25 -25
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/BrowserWebSocketTransport.js +34 -34
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Connection.d.ts +135 -135
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Connection.js +298 -298
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/ConnectionTransport.d.ts +24 -24
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/ConnectionTransport.js +17 -17
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/ConsoleMessage.d.ts +72 -72
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/ConsoleMessage.js +64 -64
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Coverage.d.ts +204 -204
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Coverage.js +335 -335
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/DOMWorld.d.ts +175 -175
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/DOMWorld.js +662 -662
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Debug.d.ts +52 -52
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Debug.js +81 -81
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/DeviceDescriptors.d.ts +40 -40
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/DeviceDescriptors.js +1070 -1070
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Dialog.d.ts +74 -74
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Dialog.js +97 -97
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/EmulationManager.d.ts +24 -24
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/EmulationManager.js +37 -37
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Errors.d.ts +50 -50
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Errors.js +56 -56
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/EvalTypes.d.ts +60 -60
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/EvalTypes.js +17 -17
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/EventEmitter.d.ts +92 -92
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/EventEmitter.js +116 -116
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Events.d.ts +81 -81
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Events.js +86 -86
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/ExecutionContext.d.ts +193 -193
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/ExecutionContext.js +321 -321
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/FileChooser.d.ts +58 -58
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/FileChooser.js +71 -71
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/FrameManager.d.ts +744 -744
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/FrameManager.js +1047 -1047
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/FrameManager.js.map +1 -1
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/HTTPRequest.d.ts +350 -345
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/HTTPRequest.d.ts.map +1 -1
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/HTTPRequest.js +549 -549
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/HTTPRequest.js.map +1 -1
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/HTTPResponse.d.ts +134 -125
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/HTTPResponse.d.ts.map +1 -1
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/HTTPResponse.js +184 -164
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/HTTPResponse.js.map +1 -1
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Input.d.ts +358 -358
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Input.js +543 -543
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/JSHandle.d.ts +490 -490
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/JSHandle.js +827 -827
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/LifecycleWatcher.d.ts +65 -65
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/LifecycleWatcher.d.ts.map +1 -1
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/LifecycleWatcher.js +149 -148
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/LifecycleWatcher.js.map +1 -1
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/NetworkConditions.d.ts +26 -26
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/NetworkConditions.js +33 -33
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/NetworkManager.d.ts +126 -97
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/NetworkManager.d.ts.map +1 -1
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/NetworkManager.js +467 -342
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/NetworkManager.js.map +1 -1
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/PDFOptions.d.ts +161 -161
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/PDFOptions.js +34 -34
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Page.d.ts +2055 -2055
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Page.js +2533 -2533
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Product.d.ts +20 -20
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Product.js +17 -17
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Puppeteer.d.ts +159 -159
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Puppeteer.js +161 -161
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/PuppeteerViewport.d.ts +51 -51
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/PuppeteerViewport.js +2 -2
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/QueryHandler.d.ts +64 -64
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/QueryHandler.js +165 -165
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/SecurityDetails.d.ts +60 -60
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/SecurityDetails.js +76 -76
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Target.d.ts +100 -100
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Target.js +145 -145
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/TaskQueue.d.ts +20 -20
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/TaskQueue.js +29 -29
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/TimeoutSettings.d.ts +27 -27
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/TimeoutSettings.js +47 -47
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Tracing.d.ts +46 -46
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Tracing.js +109 -109
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/USKeyboardLayout.d.ts +39 -39
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/USKeyboardLayout.js +406 -406
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/WebWorker.d.ts +98 -98
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/WebWorker.js +112 -112
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/assert.d.ts +22 -22
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/assert.js +33 -33
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/fetch.d.ts +16 -16
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/fetch.js +43 -43
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/helper.d.ts +84 -84
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/helper.js +327 -327
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/environment.d.ts +16 -16
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/environment.js +19 -19
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/global.d.ts +16 -16
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/global.js +2 -2
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/initialize-node.d.ts +17 -17
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/initialize-node.js +44 -44
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/initialize-web.d.ts +17 -17
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/initialize-web.js +26 -26
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/BrowserFetcher.d.ts +133 -133
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/BrowserFetcher.js +500 -500
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/BrowserRunner.d.ts +40 -39
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/BrowserRunner.d.ts.map +1 -1
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/BrowserRunner.js +256 -230
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/BrowserRunner.js.map +1 -1
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/LaunchOptions.d.ts +134 -134
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/LaunchOptions.js +17 -17
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/Launcher.d.ts +16 -16
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/Launcher.d.ts.map +1 -1
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/Launcher.js +655 -588
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/Launcher.js.map +1 -1
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/NodeWebSocketTransport.d.ts +26 -26
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/NodeWebSocketTransport.js +47 -47
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/PipeTransport.d.ts +29 -29
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/PipeTransport.js +64 -64
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/Puppeteer.d.ts +153 -153
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/Puppeteer.js +188 -188
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/install.d.ts +17 -17
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/install.js +173 -173
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/node-puppeteer-core.d.ts +17 -17
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/node-puppeteer-core.js +24 -24
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/node.d.ts +17 -17
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/node.js +23 -23
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/revisions.d.ts +21 -21
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/revisions.js +22 -22
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/web.d.ts +17 -17
- data/node_modules/puppeteer-core/lib/cjs/puppeteer/web.js +23 -23
- data/node_modules/puppeteer-core/lib/cjs/vendor/mitt/src/index.d.ts +27 -27
- data/node_modules/puppeteer-core/lib/cjs/vendor/mitt/src/index.js +56 -56
- data/node_modules/puppeteer-core/lib/esm/puppeteer/api-docs-entry.d.ts +110 -110
- data/node_modules/puppeteer-core/lib/esm/puppeteer/api-docs-entry.js +80 -80
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Accessibility.d.ts +175 -175
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Accessibility.js +356 -356
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/AriaQueryHandler.d.ts +20 -20
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/AriaQueryHandler.js +81 -81
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/AriaQueryHandler.js.map +1 -1
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Browser.d.ts +455 -455
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Browser.js +535 -535
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/BrowserConnector.d.ts +53 -53
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/BrowserConnector.js +74 -74
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/BrowserWebSocketTransport.d.ts +25 -25
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/BrowserWebSocketTransport.js +30 -30
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Connection.d.ts +135 -135
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Connection.js +293 -293
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/ConnectionTransport.d.ts +24 -24
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/ConnectionTransport.js +16 -16
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/ConsoleMessage.d.ts +72 -72
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/ConsoleMessage.js +60 -60
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Coverage.d.ts +204 -204
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Coverage.js +329 -329
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/DOMWorld.d.ts +175 -175
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/DOMWorld.js +657 -657
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Debug.d.ts +52 -52
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Debug.js +77 -77
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/DeviceDescriptors.d.ts +40 -40
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/DeviceDescriptors.js +1067 -1067
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Dialog.d.ts +74 -74
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Dialog.js +93 -93
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/EmulationManager.d.ts +24 -24
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/EmulationManager.js +33 -33
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Errors.d.ts +50 -50
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Errors.js +50 -50
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/EvalTypes.d.ts +60 -60
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/EvalTypes.js +16 -16
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/EventEmitter.d.ts +92 -92
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/EventEmitter.js +109 -109
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Events.d.ts +81 -81
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Events.js +83 -83
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/ExecutionContext.d.ts +193 -193
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/ExecutionContext.js +317 -317
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/FileChooser.d.ts +58 -58
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/FileChooser.js +67 -67
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/FrameManager.d.ts +744 -744
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/FrameManager.js +1042 -1042
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/FrameManager.js.map +1 -1
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/HTTPRequest.d.ts +350 -345
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/HTTPRequest.d.ts.map +1 -1
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/HTTPRequest.js +545 -545
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/HTTPRequest.js.map +1 -1
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/HTTPResponse.d.ts +134 -125
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/HTTPResponse.d.ts.map +1 -1
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/HTTPResponse.js +180 -160
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/HTTPResponse.js.map +1 -1
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Input.d.ts +358 -358
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Input.js +537 -537
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/JSHandle.d.ts +490 -490
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/JSHandle.js +802 -802
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/LifecycleWatcher.d.ts +65 -65
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/LifecycleWatcher.d.ts.map +1 -1
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/LifecycleWatcher.js +145 -144
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/LifecycleWatcher.js.map +1 -1
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/NetworkConditions.d.ts +26 -26
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/NetworkConditions.js +30 -30
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/NetworkManager.d.ts +126 -97
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/NetworkManager.d.ts.map +1 -1
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/NetworkManager.js +463 -338
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/NetworkManager.js.map +1 -1
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/PDFOptions.d.ts +161 -161
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/PDFOptions.js +31 -31
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Page.d.ts +2055 -2055
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Page.js +2529 -2529
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Product.d.ts +20 -20
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Product.js +16 -16
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Puppeteer.d.ts +159 -159
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Puppeteer.js +157 -157
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/PuppeteerViewport.d.ts +51 -51
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/PuppeteerViewport.js +1 -1
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/QueryHandler.d.ts +64 -64
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/QueryHandler.js +157 -157
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/SecurityDetails.d.ts +60 -60
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/SecurityDetails.js +72 -72
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Target.d.ts +100 -100
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Target.js +141 -141
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/TaskQueue.d.ts +20 -20
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/TaskQueue.js +25 -25
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/TimeoutSettings.d.ts +27 -27
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/TimeoutSettings.js +43 -43
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Tracing.d.ts +46 -46
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Tracing.js +105 -105
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/USKeyboardLayout.d.ts +39 -39
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/USKeyboardLayout.js +403 -403
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/WebWorker.d.ts +98 -98
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/WebWorker.js +108 -108
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/assert.d.ts +22 -22
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/assert.js +28 -28
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/fetch.d.ts +16 -16
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/fetch.js +20 -20
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/helper.d.ts +84 -84
- data/node_modules/puppeteer-core/lib/esm/puppeteer/common/helper.js +305 -305
- data/node_modules/puppeteer-core/lib/esm/puppeteer/environment.d.ts +16 -16
- data/node_modules/puppeteer-core/lib/esm/puppeteer/environment.js +16 -16
- data/node_modules/puppeteer-core/lib/esm/puppeteer/global.d.ts +16 -16
- data/node_modules/puppeteer-core/lib/esm/puppeteer/global.js +1 -1
- data/node_modules/puppeteer-core/lib/esm/puppeteer/initialize-node.d.ts +17 -17
- data/node_modules/puppeteer-core/lib/esm/puppeteer/initialize-node.js +37 -37
- data/node_modules/puppeteer-core/lib/esm/puppeteer/initialize-web.d.ts +17 -17
- data/node_modules/puppeteer-core/lib/esm/puppeteer/initialize-web.js +22 -22
- data/node_modules/puppeteer-core/lib/esm/puppeteer/node/BrowserFetcher.d.ts +133 -133
- data/node_modules/puppeteer-core/lib/esm/puppeteer/node/BrowserFetcher.js +474 -474
- data/node_modules/puppeteer-core/lib/esm/puppeteer/node/BrowserRunner.d.ts +40 -39
- data/node_modules/puppeteer-core/lib/esm/puppeteer/node/BrowserRunner.d.ts.map +1 -1
- data/node_modules/puppeteer-core/lib/esm/puppeteer/node/BrowserRunner.js +230 -204
- data/node_modules/puppeteer-core/lib/esm/puppeteer/node/BrowserRunner.js.map +1 -1
- data/node_modules/puppeteer-core/lib/esm/puppeteer/node/LaunchOptions.d.ts +134 -134
- data/node_modules/puppeteer-core/lib/esm/puppeteer/node/LaunchOptions.js +16 -16
- data/node_modules/puppeteer-core/lib/esm/puppeteer/node/Launcher.d.ts +16 -16
- data/node_modules/puppeteer-core/lib/esm/puppeteer/node/Launcher.d.ts.map +1 -1
- data/node_modules/puppeteer-core/lib/esm/puppeteer/node/Launcher.js +633 -566
- data/node_modules/puppeteer-core/lib/esm/puppeteer/node/Launcher.js.map +1 -1
- data/node_modules/puppeteer-core/lib/esm/puppeteer/node/NodeWebSocketTransport.d.ts +26 -26
- data/node_modules/puppeteer-core/lib/esm/puppeteer/node/NodeWebSocketTransport.js +40 -40
- data/node_modules/puppeteer-core/lib/esm/puppeteer/node/PipeTransport.d.ts +29 -29
- data/node_modules/puppeteer-core/lib/esm/puppeteer/node/PipeTransport.js +60 -60
- data/node_modules/puppeteer-core/lib/esm/puppeteer/node/Puppeteer.d.ts +153 -153
- data/node_modules/puppeteer-core/lib/esm/puppeteer/node/Puppeteer.js +181 -181
- data/node_modules/puppeteer-core/lib/esm/puppeteer/node/install.d.ts +17 -17
- data/node_modules/puppeteer-core/lib/esm/puppeteer/node/install.js +165 -165
- data/node_modules/puppeteer-core/lib/esm/puppeteer/node-puppeteer-core.d.ts +17 -17
- data/node_modules/puppeteer-core/lib/esm/puppeteer/node-puppeteer-core.js +22 -22
- data/node_modules/puppeteer-core/lib/esm/puppeteer/node.d.ts +17 -17
- data/node_modules/puppeteer-core/lib/esm/puppeteer/node.js +21 -21
- data/node_modules/puppeteer-core/lib/esm/puppeteer/revisions.d.ts +21 -21
- data/node_modules/puppeteer-core/lib/esm/puppeteer/revisions.js +19 -19
- data/node_modules/puppeteer-core/lib/esm/puppeteer/web.d.ts +17 -17
- data/node_modules/puppeteer-core/lib/esm/puppeteer/web.js +21 -21
- data/node_modules/puppeteer-core/lib/esm/vendor/mitt/src/index.d.ts +27 -27
- data/node_modules/puppeteer-core/lib/esm/vendor/mitt/src/index.js +53 -53
- data/node_modules/puppeteer-core/lib/types.d.ts +67 -25
- data/node_modules/puppeteer-core/package.json +115 -115
- data/node_modules/puppeteer-core/typescript-if-required.js +61 -61
- data/node_modules/readable-stream/CONTRIBUTING.md +38 -38
- data/node_modules/readable-stream/GOVERNANCE.md +136 -136
- data/node_modules/readable-stream/LICENSE +47 -47
- data/node_modules/readable-stream/README.md +106 -106
- data/node_modules/readable-stream/errors-browser.js +127 -127
- data/node_modules/readable-stream/errors.js +116 -116
- data/node_modules/readable-stream/experimentalWarning.js +17 -17
- data/node_modules/readable-stream/lib/_stream_duplex.js +138 -138
- data/node_modules/readable-stream/lib/_stream_passthrough.js +38 -38
- data/node_modules/readable-stream/lib/_stream_readable.js +1123 -1123
- data/node_modules/readable-stream/lib/_stream_transform.js +200 -200
- data/node_modules/readable-stream/lib/_stream_writable.js +696 -696
- data/node_modules/readable-stream/lib/internal/streams/async_iterator.js +206 -206
- data/node_modules/readable-stream/lib/internal/streams/buffer_list.js +209 -209
- data/node_modules/readable-stream/lib/internal/streams/destroy.js +104 -104
- data/node_modules/readable-stream/lib/internal/streams/end-of-stream.js +103 -103
- data/node_modules/readable-stream/lib/internal/streams/from-browser.js +3 -3
- data/node_modules/readable-stream/lib/internal/streams/from.js +63 -63
- data/node_modules/readable-stream/lib/internal/streams/pipeline.js +96 -96
- data/node_modules/readable-stream/lib/internal/streams/state.js +26 -26
- data/node_modules/readable-stream/lib/internal/streams/stream-browser.js +1 -1
- data/node_modules/readable-stream/lib/internal/streams/stream.js +1 -1
- data/node_modules/readable-stream/package.json +68 -68
- data/node_modules/readable-stream/readable-browser.js +9 -9
- data/node_modules/readable-stream/readable.js +16 -16
- data/node_modules/rimraf/CHANGELOG.md +65 -65
- data/node_modules/rimraf/LICENSE +15 -15
- data/node_modules/rimraf/README.md +101 -101
- data/node_modules/rimraf/bin.js +68 -68
- data/node_modules/rimraf/package.json +32 -32
- data/node_modules/rimraf/rimraf.js +360 -360
- data/node_modules/safe-buffer/LICENSE +21 -21
- data/node_modules/safe-buffer/README.md +584 -584
- data/node_modules/safe-buffer/index.d.ts +186 -186
- data/node_modules/safe-buffer/index.js +65 -65
- data/node_modules/safe-buffer/package.json +51 -51
- data/node_modules/string_decoder/LICENSE +48 -48
- data/node_modules/string_decoder/README.md +47 -47
- data/node_modules/string_decoder/lib/string_decoder.js +295 -295
- data/node_modules/string_decoder/package.json +34 -34
- data/node_modules/tar-fs/.travis.yml +6 -6
- data/node_modules/tar-fs/LICENSE +20 -20
- data/node_modules/tar-fs/README.md +165 -165
- data/node_modules/tar-fs/index.js +351 -351
- data/node_modules/tar-fs/package.json +41 -41
- data/node_modules/tar-fs/test/fixtures/a/hello.txt +1 -1
- data/node_modules/tar-fs/test/fixtures/b/a/test.txt +1 -1
- data/node_modules/tar-fs/test/index.js +346 -346
- data/node_modules/tar-stream/LICENSE +20 -20
- data/node_modules/tar-stream/README.md +168 -168
- data/node_modules/tar-stream/extract.js +257 -257
- data/node_modules/tar-stream/headers.js +295 -295
- data/node_modules/tar-stream/index.js +2 -2
- data/node_modules/tar-stream/pack.js +255 -255
- data/node_modules/tar-stream/package.json +58 -58
- data/node_modules/tar-stream/sandbox.js +11 -11
- data/node_modules/through/.travis.yml +5 -5
- data/node_modules/through/LICENSE.APACHE2 +15 -15
- data/node_modules/through/LICENSE.MIT +24 -24
- data/node_modules/through/index.js +108 -108
- data/node_modules/through/package.json +36 -36
- data/node_modules/through/readme.markdown +64 -64
- data/node_modules/through/test/async.js +28 -28
- data/node_modules/through/test/auto-destroy.js +30 -30
- data/node_modules/through/test/buffering.js +71 -71
- data/node_modules/through/test/end.js +45 -45
- data/node_modules/through/test/index.js +133 -133
- data/node_modules/tr46/.npmignore +4 -4
- data/node_modules/tr46/index.js +193 -193
- data/node_modules/tr46/package.json +31 -31
- data/node_modules/unbzip2-stream/LICENSE +24 -24
- data/node_modules/unbzip2-stream/README.md +59 -59
- data/node_modules/unbzip2-stream/dist/unbzip2-stream.min.js +1 -1
- data/node_modules/unbzip2-stream/index.js +93 -93
- data/node_modules/unbzip2-stream/lib/bit_iterator.js +39 -39
- data/node_modules/unbzip2-stream/lib/bzip2.js +365 -365
- data/node_modules/unbzip2-stream/package.json +51 -51
- data/node_modules/util-deprecate/History.md +16 -16
- data/node_modules/util-deprecate/LICENSE +24 -24
- data/node_modules/util-deprecate/README.md +53 -53
- data/node_modules/util-deprecate/browser.js +67 -67
- data/node_modules/util-deprecate/node.js +6 -6
- data/node_modules/util-deprecate/package.json +27 -27
- data/node_modules/webidl-conversions/LICENSE.md +12 -12
- data/node_modules/webidl-conversions/README.md +53 -53
- data/node_modules/webidl-conversions/lib/index.js +189 -189
- data/node_modules/webidl-conversions/package.json +23 -23
- data/node_modules/whatwg-url/LICENSE.txt +21 -21
- data/node_modules/whatwg-url/README.md +67 -67
- data/node_modules/whatwg-url/lib/URL-impl.js +200 -200
- data/node_modules/whatwg-url/lib/URL.js +196 -196
- data/node_modules/whatwg-url/lib/public-api.js +11 -11
- data/node_modules/whatwg-url/lib/utils.js +20 -20
- data/node_modules/whatwg-url/package.json +32 -32
- data/node_modules/wrappy/LICENSE +15 -15
- data/node_modules/wrappy/README.md +36 -36
- data/node_modules/wrappy/package.json +29 -29
- data/node_modules/wrappy/wrappy.js +33 -33
- data/node_modules/ws/LICENSE +19 -19
- data/node_modules/ws/README.md +493 -493
- data/node_modules/ws/browser.js +8 -8
- data/node_modules/ws/index.js +13 -13
- data/node_modules/ws/lib/buffer-util.js +126 -126
- data/node_modules/ws/lib/constants.js +12 -12
- data/node_modules/ws/lib/event-target.js +266 -266
- data/node_modules/ws/lib/extension.js +203 -203
- data/node_modules/ws/lib/limiter.js +55 -55
- data/node_modules/ws/lib/permessage-deflate.js +511 -511
- data/node_modules/ws/lib/receiver.js +612 -612
- data/node_modules/ws/lib/sender.js +422 -422
- data/node_modules/ws/lib/stream.js +180 -180
- data/node_modules/ws/lib/subprotocol.js +62 -62
- data/node_modules/ws/lib/validation.js +124 -124
- data/node_modules/ws/lib/websocket-server.js +485 -485
- data/node_modules/ws/lib/websocket.js +1149 -1149
- data/node_modules/ws/package.json +61 -61
- data/node_modules/ws/wrapper.mjs +8 -8
- data/node_modules/yauzl/LICENSE +21 -21
- data/node_modules/yauzl/README.md +658 -658
- data/node_modules/yauzl/index.js +796 -796
- data/node_modules/yauzl/package.json +40 -40
- data/package.json +1 -1
- metadata +23 -25
- data/node_modules/devtools-protocol/changelog.md +0 -10491
- data/node_modules/devtools-protocol/externs/protocol_externs.js +0 -9734
|
@@ -1,1048 +1,1048 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Copyright 2017 Google Inc. All rights reserved.
|
|
4
|
-
*
|
|
5
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
-
* you may not use this file except in compliance with the License.
|
|
7
|
-
* You may obtain a copy of the License at
|
|
8
|
-
*
|
|
9
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
-
*
|
|
11
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
-
* See the License for the specific language governing permissions and
|
|
15
|
-
* limitations under the License.
|
|
16
|
-
*/
|
|
17
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
-
exports.Frame = exports.FrameManager = exports.FrameManagerEmittedEvents = void 0;
|
|
19
|
-
const EventEmitter_js_1 = require("./EventEmitter.js");
|
|
20
|
-
const assert_js_1 = require("./assert.js");
|
|
21
|
-
const helper_js_1 = require("./helper.js");
|
|
22
|
-
const ExecutionContext_js_1 = require("./ExecutionContext.js");
|
|
23
|
-
const LifecycleWatcher_js_1 = require("./LifecycleWatcher.js");
|
|
24
|
-
const DOMWorld_js_1 = require("./DOMWorld.js");
|
|
25
|
-
const NetworkManager_js_1 = require("./NetworkManager.js");
|
|
26
|
-
const Connection_js_1 = require("./Connection.js");
|
|
27
|
-
const UTILITY_WORLD_NAME = '__puppeteer_utility_world__';
|
|
28
|
-
const xPathPattern = /^\(\/\/[^\)]+\)|^\/\//;
|
|
29
|
-
/**
|
|
30
|
-
* We use symbols to prevent external parties listening to these events.
|
|
31
|
-
* They are internal to Puppeteer.
|
|
32
|
-
*
|
|
33
|
-
* @internal
|
|
34
|
-
*/
|
|
35
|
-
exports.FrameManagerEmittedEvents = {
|
|
36
|
-
FrameAttached: Symbol('FrameManager.FrameAttached'),
|
|
37
|
-
FrameNavigated: Symbol('FrameManager.FrameNavigated'),
|
|
38
|
-
FrameDetached: Symbol('FrameManager.FrameDetached'),
|
|
39
|
-
LifecycleEvent: Symbol('FrameManager.LifecycleEvent'),
|
|
40
|
-
FrameNavigatedWithinDocument: Symbol('FrameManager.FrameNavigatedWithinDocument'),
|
|
41
|
-
ExecutionContextCreated: Symbol('FrameManager.ExecutionContextCreated'),
|
|
42
|
-
ExecutionContextDestroyed: Symbol('FrameManager.ExecutionContextDestroyed'),
|
|
43
|
-
};
|
|
44
|
-
/**
|
|
45
|
-
* @internal
|
|
46
|
-
*/
|
|
47
|
-
class FrameManager extends EventEmitter_js_1.EventEmitter {
|
|
48
|
-
constructor(client, page, ignoreHTTPSErrors, timeoutSettings) {
|
|
49
|
-
super();
|
|
50
|
-
this._frames = new Map();
|
|
51
|
-
this._contextIdToContext = new Map();
|
|
52
|
-
this._isolatedWorlds = new Set();
|
|
53
|
-
this._client = client;
|
|
54
|
-
this._page = page;
|
|
55
|
-
this._networkManager = new NetworkManager_js_1.NetworkManager(client, ignoreHTTPSErrors, this);
|
|
56
|
-
this._timeoutSettings = timeoutSettings;
|
|
57
|
-
this.setupEventListeners(this._client);
|
|
58
|
-
}
|
|
59
|
-
setupEventListeners(session) {
|
|
60
|
-
session.on('Page.frameAttached', (event) => {
|
|
61
|
-
this._onFrameAttached(session, event.frameId, event.parentFrameId);
|
|
62
|
-
});
|
|
63
|
-
session.on('Page.frameNavigated', (event) => {
|
|
64
|
-
this._onFrameNavigated(event.frame);
|
|
65
|
-
});
|
|
66
|
-
session.on('Page.navigatedWithinDocument', (event) => {
|
|
67
|
-
this._onFrameNavigatedWithinDocument(event.frameId, event.url);
|
|
68
|
-
});
|
|
69
|
-
session.on('Page.frameDetached', (event) => {
|
|
70
|
-
this._onFrameDetached(event.frameId, event.reason);
|
|
71
|
-
});
|
|
72
|
-
session.on('Page.frameStoppedLoading', (event) => {
|
|
73
|
-
this._onFrameStoppedLoading(event.frameId);
|
|
74
|
-
});
|
|
75
|
-
session.on('Runtime.executionContextCreated', (event) => {
|
|
76
|
-
this._onExecutionContextCreated(event.context, session);
|
|
77
|
-
});
|
|
78
|
-
session.on('Runtime.executionContextDestroyed', (event) => {
|
|
79
|
-
this._onExecutionContextDestroyed(event.executionContextId, session);
|
|
80
|
-
});
|
|
81
|
-
session.on('Runtime.executionContextsCleared', () => {
|
|
82
|
-
this._onExecutionContextsCleared(session);
|
|
83
|
-
});
|
|
84
|
-
session.on('Page.lifecycleEvent', (event) => {
|
|
85
|
-
this._onLifecycleEvent(event);
|
|
86
|
-
});
|
|
87
|
-
session.on('Target.attachedToTarget', async (event) => {
|
|
88
|
-
this._onAttachedToTarget(event);
|
|
89
|
-
});
|
|
90
|
-
session.on('Target.detachedFromTarget', async (event) => {
|
|
91
|
-
this._onDetachedFromTarget(event);
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
async initialize(client = this._client) {
|
|
95
|
-
try {
|
|
96
|
-
const result = await Promise.all([
|
|
97
|
-
client.send('Page.enable'),
|
|
98
|
-
client.send('Page.getFrameTree'),
|
|
99
|
-
]);
|
|
100
|
-
const { frameTree } = result[1];
|
|
101
|
-
this._handleFrameTree(client, frameTree);
|
|
102
|
-
await Promise.all([
|
|
103
|
-
client.send('Page.setLifecycleEventsEnabled', { enabled: true }),
|
|
104
|
-
client
|
|
105
|
-
.send('Runtime.enable')
|
|
106
|
-
.then(() => this._ensureIsolatedWorld(client, UTILITY_WORLD_NAME)),
|
|
107
|
-
// TODO: Network manager is not aware of OOP iframes yet.
|
|
108
|
-
client === this._client
|
|
109
|
-
? this._networkManager.initialize()
|
|
110
|
-
: Promise.resolve(),
|
|
111
|
-
]);
|
|
112
|
-
}
|
|
113
|
-
catch (error) {
|
|
114
|
-
// The target might have been closed before the initialization finished.
|
|
115
|
-
if (error.message.includes('Target closed') ||
|
|
116
|
-
error.message.includes('Session closed')) {
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
|
-
throw error;
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
networkManager() {
|
|
123
|
-
return this._networkManager;
|
|
124
|
-
}
|
|
125
|
-
async navigateFrame(frame, url, options = {}) {
|
|
126
|
-
assertNoLegacyNavigationOptions(options);
|
|
127
|
-
const { referer = this._networkManager.extraHTTPHeaders()['referer'], waitUntil = ['load'], timeout = this._timeoutSettings.navigationTimeout(), } = options;
|
|
128
|
-
const watcher = new LifecycleWatcher_js_1.LifecycleWatcher(this, frame, waitUntil, timeout);
|
|
129
|
-
let ensureNewDocumentNavigation = false;
|
|
130
|
-
let error = await Promise.race([
|
|
131
|
-
navigate(this._client, url, referer, frame._id),
|
|
132
|
-
watcher.timeoutOrTerminationPromise(),
|
|
133
|
-
]);
|
|
134
|
-
if (!error) {
|
|
135
|
-
error = await Promise.race([
|
|
136
|
-
watcher.timeoutOrTerminationPromise(),
|
|
137
|
-
ensureNewDocumentNavigation
|
|
138
|
-
? watcher.newDocumentNavigationPromise()
|
|
139
|
-
: watcher.sameDocumentNavigationPromise(),
|
|
140
|
-
]);
|
|
141
|
-
}
|
|
142
|
-
watcher.dispose();
|
|
143
|
-
if (error)
|
|
144
|
-
throw error;
|
|
145
|
-
return watcher.navigationResponse();
|
|
146
|
-
async function navigate(client, url, referrer, frameId) {
|
|
147
|
-
try {
|
|
148
|
-
const response = await client.send('Page.navigate', {
|
|
149
|
-
url,
|
|
150
|
-
referrer,
|
|
151
|
-
frameId,
|
|
152
|
-
});
|
|
153
|
-
ensureNewDocumentNavigation = !!response.loaderId;
|
|
154
|
-
return response.errorText
|
|
155
|
-
? new Error(`${response.errorText} at ${url}`)
|
|
156
|
-
: null;
|
|
157
|
-
}
|
|
158
|
-
catch (error) {
|
|
159
|
-
return error;
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
async waitForFrameNavigation(frame, options = {}) {
|
|
164
|
-
assertNoLegacyNavigationOptions(options);
|
|
165
|
-
const { waitUntil = ['load'], timeout = this._timeoutSettings.navigationTimeout(), } = options;
|
|
166
|
-
const watcher = new LifecycleWatcher_js_1.LifecycleWatcher(this, frame, waitUntil, timeout);
|
|
167
|
-
const error = await Promise.race([
|
|
168
|
-
watcher.timeoutOrTerminationPromise(),
|
|
169
|
-
watcher.sameDocumentNavigationPromise(),
|
|
170
|
-
watcher.newDocumentNavigationPromise(),
|
|
171
|
-
]);
|
|
172
|
-
watcher.dispose();
|
|
173
|
-
if (error)
|
|
174
|
-
throw error;
|
|
175
|
-
return watcher.navigationResponse();
|
|
176
|
-
}
|
|
177
|
-
async _onAttachedToTarget(event) {
|
|
178
|
-
if (event.targetInfo.type !== 'iframe') {
|
|
179
|
-
return;
|
|
180
|
-
}
|
|
181
|
-
const frame = this._frames.get(event.targetInfo.targetId);
|
|
182
|
-
const session = Connection_js_1.Connection.fromSession(this._client).session(event.sessionId);
|
|
183
|
-
frame._updateClient(session);
|
|
184
|
-
this.setupEventListeners(session);
|
|
185
|
-
await this.initialize(session);
|
|
186
|
-
}
|
|
187
|
-
async _onDetachedFromTarget(event) {
|
|
188
|
-
const frame = this._frames.get(event.targetId);
|
|
189
|
-
if (frame && frame.isOOPFrame()) {
|
|
190
|
-
// When an OOP iframe is removed from the page, it
|
|
191
|
-
// will only get a Target.detachedFromTarget event.
|
|
192
|
-
this._removeFramesRecursively(frame);
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
_onLifecycleEvent(event) {
|
|
196
|
-
const frame = this._frames.get(event.frameId);
|
|
197
|
-
if (!frame)
|
|
198
|
-
return;
|
|
199
|
-
frame._onLifecycleEvent(event.loaderId, event.name);
|
|
200
|
-
this.emit(exports.FrameManagerEmittedEvents.LifecycleEvent, frame);
|
|
201
|
-
}
|
|
202
|
-
_onFrameStoppedLoading(frameId) {
|
|
203
|
-
const frame = this._frames.get(frameId);
|
|
204
|
-
if (!frame)
|
|
205
|
-
return;
|
|
206
|
-
frame._onLoadingStopped();
|
|
207
|
-
this.emit(exports.FrameManagerEmittedEvents.LifecycleEvent, frame);
|
|
208
|
-
}
|
|
209
|
-
_handleFrameTree(session, frameTree) {
|
|
210
|
-
if (frameTree.frame.parentId) {
|
|
211
|
-
this._onFrameAttached(session, frameTree.frame.id, frameTree.frame.parentId);
|
|
212
|
-
}
|
|
213
|
-
this._onFrameNavigated(frameTree.frame);
|
|
214
|
-
if (!frameTree.childFrames)
|
|
215
|
-
return;
|
|
216
|
-
for (const child of frameTree.childFrames) {
|
|
217
|
-
this._handleFrameTree(session, child);
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
page() {
|
|
221
|
-
return this._page;
|
|
222
|
-
}
|
|
223
|
-
mainFrame() {
|
|
224
|
-
return this._mainFrame;
|
|
225
|
-
}
|
|
226
|
-
frames() {
|
|
227
|
-
return Array.from(this._frames.values());
|
|
228
|
-
}
|
|
229
|
-
frame(frameId) {
|
|
230
|
-
return this._frames.get(frameId) || null;
|
|
231
|
-
}
|
|
232
|
-
_onFrameAttached(session, frameId, parentFrameId) {
|
|
233
|
-
if (this._frames.has(frameId)) {
|
|
234
|
-
const frame = this._frames.get(frameId);
|
|
235
|
-
if (session && frame.isOOPFrame()) {
|
|
236
|
-
// If an OOP iframes becomes a normal iframe again
|
|
237
|
-
// it is first attached to the parent page before
|
|
238
|
-
// the target is removed.
|
|
239
|
-
frame._updateClient(session);
|
|
240
|
-
}
|
|
241
|
-
return;
|
|
242
|
-
}
|
|
243
|
-
(0, assert_js_1.assert)(parentFrameId);
|
|
244
|
-
const parentFrame = this._frames.get(parentFrameId);
|
|
245
|
-
const frame = new Frame(this, parentFrame, frameId, session);
|
|
246
|
-
this._frames.set(frame._id, frame);
|
|
247
|
-
this.emit(exports.FrameManagerEmittedEvents.FrameAttached, frame);
|
|
248
|
-
}
|
|
249
|
-
_onFrameNavigated(framePayload) {
|
|
250
|
-
const isMainFrame = !framePayload.parentId;
|
|
251
|
-
let frame = isMainFrame
|
|
252
|
-
? this._mainFrame
|
|
253
|
-
: this._frames.get(framePayload.id);
|
|
254
|
-
(0, assert_js_1.assert)(isMainFrame || frame, 'We either navigate top level or have old version of the navigated frame');
|
|
255
|
-
// Detach all child frames first.
|
|
256
|
-
if (frame) {
|
|
257
|
-
for (const child of frame.childFrames())
|
|
258
|
-
this._removeFramesRecursively(child);
|
|
259
|
-
}
|
|
260
|
-
// Update or create main frame.
|
|
261
|
-
if (isMainFrame) {
|
|
262
|
-
if (frame) {
|
|
263
|
-
// Update frame id to retain frame identity on cross-process navigation.
|
|
264
|
-
this._frames.delete(frame._id);
|
|
265
|
-
frame._id = framePayload.id;
|
|
266
|
-
}
|
|
267
|
-
else {
|
|
268
|
-
// Initial main frame navigation.
|
|
269
|
-
frame = new Frame(this, null, framePayload.id, this._client);
|
|
270
|
-
}
|
|
271
|
-
this._frames.set(framePayload.id, frame);
|
|
272
|
-
this._mainFrame = frame;
|
|
273
|
-
}
|
|
274
|
-
// Update frame payload.
|
|
275
|
-
frame._navigated(framePayload);
|
|
276
|
-
this.emit(exports.FrameManagerEmittedEvents.FrameNavigated, frame);
|
|
277
|
-
}
|
|
278
|
-
async _ensureIsolatedWorld(session, name) {
|
|
279
|
-
const key = `${session.id()}:${name}`;
|
|
280
|
-
if (this._isolatedWorlds.has(key))
|
|
281
|
-
return;
|
|
282
|
-
this._isolatedWorlds.add(key);
|
|
283
|
-
await session.send('Page.addScriptToEvaluateOnNewDocument', {
|
|
284
|
-
source: `//# sourceURL=${ExecutionContext_js_1.EVALUATION_SCRIPT_URL}`,
|
|
285
|
-
worldName: name,
|
|
286
|
-
});
|
|
287
|
-
// Frames might be removed before we send this.
|
|
288
|
-
await Promise.all(this.frames()
|
|
289
|
-
.filter((frame) => frame._client === session)
|
|
290
|
-
.map((frame) => session.send('Page.createIsolatedWorld', {
|
|
291
|
-
frameId: frame._id,
|
|
292
|
-
worldName: name,
|
|
293
|
-
grantUniveralAccess: true,
|
|
294
|
-
})));
|
|
295
|
-
}
|
|
296
|
-
_onFrameNavigatedWithinDocument(frameId, url) {
|
|
297
|
-
const frame = this._frames.get(frameId);
|
|
298
|
-
if (!frame)
|
|
299
|
-
return;
|
|
300
|
-
frame._navigatedWithinDocument(url);
|
|
301
|
-
this.emit(exports.FrameManagerEmittedEvents.FrameNavigatedWithinDocument, frame);
|
|
302
|
-
this.emit(exports.FrameManagerEmittedEvents.FrameNavigated, frame);
|
|
303
|
-
}
|
|
304
|
-
_onFrameDetached(frameId, reason) {
|
|
305
|
-
const frame = this._frames.get(frameId);
|
|
306
|
-
if (reason === 'remove') {
|
|
307
|
-
// Only remove the frame if the reason for the detached event is
|
|
308
|
-
// an actual removement of the frame.
|
|
309
|
-
// For frames that become OOP iframes, the reason would be 'swap'.
|
|
310
|
-
if (frame)
|
|
311
|
-
this._removeFramesRecursively(frame);
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
_onExecutionContextCreated(contextPayload, session) {
|
|
315
|
-
const auxData = contextPayload.auxData;
|
|
316
|
-
const frameId = auxData ? auxData.frameId : null;
|
|
317
|
-
const frame = this._frames.get(frameId) || null;
|
|
318
|
-
let world = null;
|
|
319
|
-
if (frame) {
|
|
320
|
-
// Only care about execution contexts created for the current session.
|
|
321
|
-
if (frame._client !== session)
|
|
322
|
-
return;
|
|
323
|
-
if (contextPayload.auxData && !!contextPayload.auxData['isDefault']) {
|
|
324
|
-
world = frame._mainWorld;
|
|
325
|
-
}
|
|
326
|
-
else if (contextPayload.name === UTILITY_WORLD_NAME &&
|
|
327
|
-
!frame._secondaryWorld._hasContext()) {
|
|
328
|
-
// In case of multiple sessions to the same target, there's a race between
|
|
329
|
-
// connections so we might end up creating multiple isolated worlds.
|
|
330
|
-
// We can use either.
|
|
331
|
-
world = frame._secondaryWorld;
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
const context = new ExecutionContext_js_1.ExecutionContext(frame._client || this._client, contextPayload, world);
|
|
335
|
-
if (world)
|
|
336
|
-
world._setContext(context);
|
|
337
|
-
const key = `${session.id()}:${contextPayload.id}`;
|
|
338
|
-
this._contextIdToContext.set(key, context);
|
|
339
|
-
}
|
|
340
|
-
_onExecutionContextDestroyed(executionContextId, session) {
|
|
341
|
-
const key = `${session.id()}:${executionContextId}`;
|
|
342
|
-
const context = this._contextIdToContext.get(key);
|
|
343
|
-
if (!context)
|
|
344
|
-
return;
|
|
345
|
-
this._contextIdToContext.delete(key);
|
|
346
|
-
if (context._world)
|
|
347
|
-
context._world._setContext(null);
|
|
348
|
-
}
|
|
349
|
-
_onExecutionContextsCleared(session) {
|
|
350
|
-
for (const [key, context] of this._contextIdToContext.entries()) {
|
|
351
|
-
// Make sure to only clear execution contexts that belong
|
|
352
|
-
// to the current session.
|
|
353
|
-
if (context._client !== session)
|
|
354
|
-
continue;
|
|
355
|
-
if (context._world)
|
|
356
|
-
context._world._setContext(null);
|
|
357
|
-
this._contextIdToContext.delete(key);
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
executionContextById(contextId, session = this._client) {
|
|
361
|
-
const key = `${session.id()}:${contextId}`;
|
|
362
|
-
const context = this._contextIdToContext.get(key);
|
|
363
|
-
(0, assert_js_1.assert)(context, 'INTERNAL ERROR: missing context with id = ' + contextId);
|
|
364
|
-
return context;
|
|
365
|
-
}
|
|
366
|
-
_removeFramesRecursively(frame) {
|
|
367
|
-
for (const child of frame.childFrames())
|
|
368
|
-
this._removeFramesRecursively(child);
|
|
369
|
-
frame._detach();
|
|
370
|
-
this._frames.delete(frame._id);
|
|
371
|
-
this.emit(exports.FrameManagerEmittedEvents.FrameDetached, frame);
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
exports.FrameManager = FrameManager;
|
|
375
|
-
/**
|
|
376
|
-
* At every point of time, page exposes its current frame tree via the
|
|
377
|
-
* {@link Page.mainFrame | page.mainFrame} and
|
|
378
|
-
* {@link Frame.childFrames | frame.childFrames} methods.
|
|
379
|
-
*
|
|
380
|
-
* @remarks
|
|
381
|
-
*
|
|
382
|
-
* `Frame` object lifecycles are controlled by three events that are all
|
|
383
|
-
* dispatched on the page object:
|
|
384
|
-
*
|
|
385
|
-
* - {@link PageEmittedEvents.FrameAttached}
|
|
386
|
-
*
|
|
387
|
-
* - {@link PageEmittedEvents.FrameNavigated}
|
|
388
|
-
*
|
|
389
|
-
* - {@link PageEmittedEvents.FrameDetached}
|
|
390
|
-
*
|
|
391
|
-
* @Example
|
|
392
|
-
* An example of dumping frame tree:
|
|
393
|
-
*
|
|
394
|
-
* ```js
|
|
395
|
-
* const puppeteer = require('puppeteer');
|
|
396
|
-
*
|
|
397
|
-
* (async () => {
|
|
398
|
-
* const browser = await puppeteer.launch();
|
|
399
|
-
* const page = await browser.newPage();
|
|
400
|
-
* await page.goto('https://www.google.com/chrome/browser/canary.html');
|
|
401
|
-
* dumpFrameTree(page.mainFrame(), '');
|
|
402
|
-
* await browser.close();
|
|
403
|
-
*
|
|
404
|
-
* function dumpFrameTree(frame, indent) {
|
|
405
|
-
* console.log(indent + frame.url());
|
|
406
|
-
* for (const child of frame.childFrames()) {
|
|
407
|
-
* dumpFrameTree(child, indent + ' ');
|
|
408
|
-
* }
|
|
409
|
-
* }
|
|
410
|
-
* })();
|
|
411
|
-
* ```
|
|
412
|
-
*
|
|
413
|
-
* @Example
|
|
414
|
-
* An example of getting text from an iframe element:
|
|
415
|
-
*
|
|
416
|
-
* ```js
|
|
417
|
-
* const frame = page.frames().find(frame => frame.name() === 'myframe');
|
|
418
|
-
* const text = await frame.$eval('.selector', element => element.textContent);
|
|
419
|
-
* console.log(text);
|
|
420
|
-
* ```
|
|
421
|
-
*
|
|
422
|
-
* @public
|
|
423
|
-
*/
|
|
424
|
-
class Frame {
|
|
425
|
-
/**
|
|
426
|
-
* @internal
|
|
427
|
-
*/
|
|
428
|
-
constructor(frameManager, parentFrame, frameId, client) {
|
|
429
|
-
this._url = '';
|
|
430
|
-
this._detached = false;
|
|
431
|
-
/**
|
|
432
|
-
* @internal
|
|
433
|
-
*/
|
|
434
|
-
this._loaderId = '';
|
|
435
|
-
/**
|
|
436
|
-
* @internal
|
|
437
|
-
*/
|
|
438
|
-
this._lifecycleEvents = new Set();
|
|
439
|
-
this._frameManager = frameManager;
|
|
440
|
-
this._parentFrame = parentFrame;
|
|
441
|
-
this._url = '';
|
|
442
|
-
this._id = frameId;
|
|
443
|
-
this._detached = false;
|
|
444
|
-
this._loaderId = '';
|
|
445
|
-
this._childFrames = new Set();
|
|
446
|
-
if (this._parentFrame)
|
|
447
|
-
this._parentFrame._childFrames.add(this);
|
|
448
|
-
this._updateClient(client);
|
|
449
|
-
}
|
|
450
|
-
/**
|
|
451
|
-
* @internal
|
|
452
|
-
*/
|
|
453
|
-
_updateClient(client) {
|
|
454
|
-
this._client = client;
|
|
455
|
-
this._mainWorld = new DOMWorld_js_1.DOMWorld(this._client, this._frameManager, this, this._frameManager._timeoutSettings);
|
|
456
|
-
this._secondaryWorld = new DOMWorld_js_1.DOMWorld(this._client, this._frameManager, this, this._frameManager._timeoutSettings);
|
|
457
|
-
}
|
|
458
|
-
isOOPFrame() {
|
|
459
|
-
return this._client !== this._frameManager._client;
|
|
460
|
-
}
|
|
461
|
-
/**
|
|
462
|
-
* @remarks
|
|
463
|
-
*
|
|
464
|
-
* `frame.goto` will throw an error if:
|
|
465
|
-
* - there's an SSL error (e.g. in case of self-signed certificates).
|
|
466
|
-
*
|
|
467
|
-
* - target URL is invalid.
|
|
468
|
-
*
|
|
469
|
-
* - the `timeout` is exceeded during navigation.
|
|
470
|
-
*
|
|
471
|
-
* - the remote server does not respond or is unreachable.
|
|
472
|
-
*
|
|
473
|
-
* - the main resource failed to load.
|
|
474
|
-
*
|
|
475
|
-
* `frame.goto` will not throw an error when any valid HTTP status code is
|
|
476
|
-
* returned by the remote server, including 404 "Not Found" and 500 "Internal
|
|
477
|
-
* Server Error". The status code for such responses can be retrieved by
|
|
478
|
-
* calling {@link HTTPResponse.status}.
|
|
479
|
-
*
|
|
480
|
-
* NOTE: `frame.goto` either throws an error or returns a main resource
|
|
481
|
-
* response. The only exceptions are navigation to `about:blank` or
|
|
482
|
-
* navigation to the same URL with a different hash, which would succeed and
|
|
483
|
-
* return `null`.
|
|
484
|
-
*
|
|
485
|
-
* NOTE: Headless mode doesn't support navigation to a PDF document. See
|
|
486
|
-
* the {@link https://bugs.chromium.org/p/chromium/issues/detail?id=761295 | upstream
|
|
487
|
-
* issue}.
|
|
488
|
-
*
|
|
489
|
-
* @param url - the URL to navigate the frame to. This should include the
|
|
490
|
-
* scheme, e.g. `https://`.
|
|
491
|
-
* @param options - navigation options. `waitUntil` is useful to define when
|
|
492
|
-
* the navigation should be considered successful - see the docs for
|
|
493
|
-
* {@link PuppeteerLifeCycleEvent} for more details.
|
|
494
|
-
*
|
|
495
|
-
* @returns A promise which resolves to the main resource response. In case of
|
|
496
|
-
* multiple redirects, the navigation will resolve with the response of the
|
|
497
|
-
* last redirect.
|
|
498
|
-
*/
|
|
499
|
-
async goto(url, options = {}) {
|
|
500
|
-
return await this._frameManager.navigateFrame(this, url, options);
|
|
501
|
-
}
|
|
502
|
-
/**
|
|
503
|
-
* @remarks
|
|
504
|
-
*
|
|
505
|
-
* This resolves when the frame navigates to a new URL. It is useful for when
|
|
506
|
-
* you run code which will indirectly cause the frame to navigate. Consider
|
|
507
|
-
* this example:
|
|
508
|
-
*
|
|
509
|
-
* ```js
|
|
510
|
-
* const [response] = await Promise.all([
|
|
511
|
-
* // The navigation promise resolves after navigation has finished
|
|
512
|
-
* frame.waitForNavigation(),
|
|
513
|
-
* // Clicking the link will indirectly cause a navigation
|
|
514
|
-
* frame.click('a.my-link'),
|
|
515
|
-
* ]);
|
|
516
|
-
* ```
|
|
517
|
-
*
|
|
518
|
-
* Usage of the {@link https://developer.mozilla.org/en-US/docs/Web/API/History_API | History API} to change the URL is considered a navigation.
|
|
519
|
-
*
|
|
520
|
-
* @param options - options to configure when the navigation is consided finished.
|
|
521
|
-
* @returns a promise that resolves when the frame navigates to a new URL.
|
|
522
|
-
*/
|
|
523
|
-
async waitForNavigation(options = {}) {
|
|
524
|
-
return await this._frameManager.waitForFrameNavigation(this, options);
|
|
525
|
-
}
|
|
526
|
-
/**
|
|
527
|
-
* @returns a promise that resolves to the frame's default execution context.
|
|
528
|
-
*/
|
|
529
|
-
executionContext() {
|
|
530
|
-
return this._mainWorld.executionContext();
|
|
531
|
-
}
|
|
532
|
-
/**
|
|
533
|
-
* @remarks
|
|
534
|
-
*
|
|
535
|
-
* The only difference between {@link Frame.evaluate} and
|
|
536
|
-
* `frame.evaluateHandle` is that `evaluateHandle` will return the value
|
|
537
|
-
* wrapped in an in-page object.
|
|
538
|
-
*
|
|
539
|
-
* This method behaves identically to {@link Page.evaluateHandle} except it's
|
|
540
|
-
* run within the context of the `frame`, rather than the entire page.
|
|
541
|
-
*
|
|
542
|
-
* @param pageFunction - a function that is run within the frame
|
|
543
|
-
* @param args - arguments to be passed to the pageFunction
|
|
544
|
-
*/
|
|
545
|
-
async evaluateHandle(pageFunction, ...args) {
|
|
546
|
-
return this._mainWorld.evaluateHandle(pageFunction, ...args);
|
|
547
|
-
}
|
|
548
|
-
/**
|
|
549
|
-
* @remarks
|
|
550
|
-
*
|
|
551
|
-
* This method behaves identically to {@link Page.evaluate} except it's run
|
|
552
|
-
* within the context of the `frame`, rather than the entire page.
|
|
553
|
-
*
|
|
554
|
-
* @param pageFunction - a function that is run within the frame
|
|
555
|
-
* @param args - arguments to be passed to the pageFunction
|
|
556
|
-
*/
|
|
557
|
-
async evaluate(pageFunction, ...args) {
|
|
558
|
-
return this._mainWorld.evaluate(pageFunction, ...args);
|
|
559
|
-
}
|
|
560
|
-
/**
|
|
561
|
-
* This method queries the frame for the given selector.
|
|
562
|
-
*
|
|
563
|
-
* @param selector - a selector to query for.
|
|
564
|
-
* @returns A promise which resolves to an `ElementHandle` pointing at the
|
|
565
|
-
* element, or `null` if it was not found.
|
|
566
|
-
*/
|
|
567
|
-
async $(selector) {
|
|
568
|
-
return this._mainWorld.$(selector);
|
|
569
|
-
}
|
|
570
|
-
/**
|
|
571
|
-
* This method evaluates the given XPath expression and returns the results.
|
|
572
|
-
*
|
|
573
|
-
* @param expression - the XPath expression to evaluate.
|
|
574
|
-
*/
|
|
575
|
-
async $x(expression) {
|
|
576
|
-
return this._mainWorld.$x(expression);
|
|
577
|
-
}
|
|
578
|
-
/**
|
|
579
|
-
* @remarks
|
|
580
|
-
*
|
|
581
|
-
* This method runs `document.querySelector` within
|
|
582
|
-
* the frame and passes it as the first argument to `pageFunction`.
|
|
583
|
-
*
|
|
584
|
-
* If `pageFunction` returns a Promise, then `frame.$eval` would wait for
|
|
585
|
-
* the promise to resolve and return its value.
|
|
586
|
-
*
|
|
587
|
-
* @example
|
|
588
|
-
*
|
|
589
|
-
* ```js
|
|
590
|
-
* const searchValue = await frame.$eval('#search', el => el.value);
|
|
591
|
-
* ```
|
|
592
|
-
*
|
|
593
|
-
* @param selector - the selector to query for
|
|
594
|
-
* @param pageFunction - the function to be evaluated in the frame's context
|
|
595
|
-
* @param args - additional arguments to pass to `pageFuncton`
|
|
596
|
-
*/
|
|
597
|
-
async $eval(selector, pageFunction, ...args) {
|
|
598
|
-
return this._mainWorld.$eval(selector, pageFunction, ...args);
|
|
599
|
-
}
|
|
600
|
-
/**
|
|
601
|
-
* @remarks
|
|
602
|
-
*
|
|
603
|
-
* This method runs `Array.from(document.querySelectorAll(selector))` within
|
|
604
|
-
* the frame and passes it as the first argument to `pageFunction`.
|
|
605
|
-
*
|
|
606
|
-
* If `pageFunction` returns a Promise, then `frame.$$eval` would wait for
|
|
607
|
-
* the promise to resolve and return its value.
|
|
608
|
-
*
|
|
609
|
-
* @example
|
|
610
|
-
*
|
|
611
|
-
* ```js
|
|
612
|
-
* const divsCounts = await frame.$$eval('div', divs => divs.length);
|
|
613
|
-
* ```
|
|
614
|
-
*
|
|
615
|
-
* @param selector - the selector to query for
|
|
616
|
-
* @param pageFunction - the function to be evaluated in the frame's context
|
|
617
|
-
* @param args - additional arguments to pass to `pageFuncton`
|
|
618
|
-
*/
|
|
619
|
-
async $$eval(selector, pageFunction, ...args) {
|
|
620
|
-
return this._mainWorld.$$eval(selector, pageFunction, ...args);
|
|
621
|
-
}
|
|
622
|
-
/**
|
|
623
|
-
* This runs `document.querySelectorAll` in the frame and returns the result.
|
|
624
|
-
*
|
|
625
|
-
* @param selector - a selector to search for
|
|
626
|
-
* @returns An array of element handles pointing to the found frame elements.
|
|
627
|
-
*/
|
|
628
|
-
async $$(selector) {
|
|
629
|
-
return this._mainWorld.$$(selector);
|
|
630
|
-
}
|
|
631
|
-
/**
|
|
632
|
-
* @returns the full HTML contents of the frame, including the doctype.
|
|
633
|
-
*/
|
|
634
|
-
async content() {
|
|
635
|
-
return this._secondaryWorld.content();
|
|
636
|
-
}
|
|
637
|
-
/**
|
|
638
|
-
* Set the content of the frame.
|
|
639
|
-
*
|
|
640
|
-
* @param html - HTML markup to assign to the page.
|
|
641
|
-
* @param options - options to configure how long before timing out and at
|
|
642
|
-
* what point to consider the content setting successful.
|
|
643
|
-
*/
|
|
644
|
-
async setContent(html, options = {}) {
|
|
645
|
-
return this._secondaryWorld.setContent(html, options);
|
|
646
|
-
}
|
|
647
|
-
/**
|
|
648
|
-
* @remarks
|
|
649
|
-
*
|
|
650
|
-
* If the name is empty, it returns the `id` attribute instead.
|
|
651
|
-
*
|
|
652
|
-
* Note: This value is calculated once when the frame is created, and will not
|
|
653
|
-
* update if the attribute is changed later.
|
|
654
|
-
*
|
|
655
|
-
* @returns the frame's `name` attribute as specified in the tag.
|
|
656
|
-
*/
|
|
657
|
-
name() {
|
|
658
|
-
return this._name || '';
|
|
659
|
-
}
|
|
660
|
-
/**
|
|
661
|
-
* @returns the frame's URL.
|
|
662
|
-
*/
|
|
663
|
-
url() {
|
|
664
|
-
return this._url;
|
|
665
|
-
}
|
|
666
|
-
/**
|
|
667
|
-
* @returns the parent `Frame`, if any. Detached and main frames return `null`.
|
|
668
|
-
*/
|
|
669
|
-
parentFrame() {
|
|
670
|
-
return this._parentFrame;
|
|
671
|
-
}
|
|
672
|
-
/**
|
|
673
|
-
* @returns an array of child frames.
|
|
674
|
-
*/
|
|
675
|
-
childFrames() {
|
|
676
|
-
return Array.from(this._childFrames);
|
|
677
|
-
}
|
|
678
|
-
/**
|
|
679
|
-
* @returns `true` if the frame has been detached, or `false` otherwise.
|
|
680
|
-
*/
|
|
681
|
-
isDetached() {
|
|
682
|
-
return this._detached;
|
|
683
|
-
}
|
|
684
|
-
/**
|
|
685
|
-
* Adds a `<script>` tag into the page with the desired url or content.
|
|
686
|
-
*
|
|
687
|
-
* @param options - configure the script to add to the page.
|
|
688
|
-
*
|
|
689
|
-
* @returns a promise that resolves to the added tag when the script's
|
|
690
|
-
* `onload` event fires or when the script content was injected into the
|
|
691
|
-
* frame.
|
|
692
|
-
*/
|
|
693
|
-
async addScriptTag(options) {
|
|
694
|
-
return this._mainWorld.addScriptTag(options);
|
|
695
|
-
}
|
|
696
|
-
/**
|
|
697
|
-
* Adds a `<link rel="stylesheet">` tag into the page with the desired url or
|
|
698
|
-
* a `<style type="text/css">` tag with the content.
|
|
699
|
-
*
|
|
700
|
-
* @param options - configure the CSS to add to the page.
|
|
701
|
-
*
|
|
702
|
-
* @returns a promise that resolves to the added tag when the stylesheets's
|
|
703
|
-
* `onload` event fires or when the CSS content was injected into the
|
|
704
|
-
* frame.
|
|
705
|
-
*/
|
|
706
|
-
async addStyleTag(options) {
|
|
707
|
-
return this._mainWorld.addStyleTag(options);
|
|
708
|
-
}
|
|
709
|
-
/**
|
|
710
|
-
*
|
|
711
|
-
* This method clicks the first element found that matches `selector`.
|
|
712
|
-
*
|
|
713
|
-
* @remarks
|
|
714
|
-
*
|
|
715
|
-
* This method scrolls the element into view if needed, and then uses
|
|
716
|
-
* {@link Page.mouse} to click in the center of the element. If there's no
|
|
717
|
-
* element matching `selector`, the method throws an error.
|
|
718
|
-
*
|
|
719
|
-
* Bear in mind that if `click()` triggers a navigation event and there's a
|
|
720
|
-
* separate `page.waitForNavigation()` promise to be resolved, you may end up
|
|
721
|
-
* with a race condition that yields unexpected results. The correct pattern
|
|
722
|
-
* for click and wait for navigation is the following:
|
|
723
|
-
*
|
|
724
|
-
* ```javascript
|
|
725
|
-
* const [response] = await Promise.all([
|
|
726
|
-
* page.waitForNavigation(waitOptions),
|
|
727
|
-
* frame.click(selector, clickOptions),
|
|
728
|
-
* ]);
|
|
729
|
-
* ```
|
|
730
|
-
* @param selector - the selector to search for to click. If there are
|
|
731
|
-
* multiple elements, the first will be clicked.
|
|
732
|
-
*/
|
|
733
|
-
async click(selector, options = {}) {
|
|
734
|
-
return this._secondaryWorld.click(selector, options);
|
|
735
|
-
}
|
|
736
|
-
/**
|
|
737
|
-
* This method fetches an element with `selector` and focuses it.
|
|
738
|
-
*
|
|
739
|
-
* @remarks
|
|
740
|
-
* If there's no element matching `selector`, the method throws an error.
|
|
741
|
-
*
|
|
742
|
-
* @param selector - the selector for the element to focus. If there are
|
|
743
|
-
* multiple elements, the first will be focused.
|
|
744
|
-
*/
|
|
745
|
-
async focus(selector) {
|
|
746
|
-
return this._secondaryWorld.focus(selector);
|
|
747
|
-
}
|
|
748
|
-
/**
|
|
749
|
-
* This method fetches an element with `selector`, scrolls it into view if
|
|
750
|
-
* needed, and then uses {@link Page.mouse} to hover over the center of the
|
|
751
|
-
* element.
|
|
752
|
-
*
|
|
753
|
-
* @remarks
|
|
754
|
-
* If there's no element matching `selector`, the method throws an
|
|
755
|
-
*
|
|
756
|
-
* @param selector - the selector for the element to hover. If there are
|
|
757
|
-
* multiple elements, the first will be hovered.
|
|
758
|
-
*/
|
|
759
|
-
async hover(selector) {
|
|
760
|
-
return this._secondaryWorld.hover(selector);
|
|
761
|
-
}
|
|
762
|
-
/**
|
|
763
|
-
* Triggers a `change` and `input` event once all the provided options have
|
|
764
|
-
* been selected.
|
|
765
|
-
*
|
|
766
|
-
* @remarks
|
|
767
|
-
*
|
|
768
|
-
* If there's no `<select>` element matching `selector`, the
|
|
769
|
-
* method throws an error.
|
|
770
|
-
*
|
|
771
|
-
* @example
|
|
772
|
-
* ```js
|
|
773
|
-
* frame.select('select#colors', 'blue'); // single selection
|
|
774
|
-
* frame.select('select#colors', 'red', 'green', 'blue'); // multiple selections
|
|
775
|
-
* ```
|
|
776
|
-
*
|
|
777
|
-
* @param selector - a selector to query the frame for
|
|
778
|
-
* @param values - an array of values to select. If the `<select>` has the
|
|
779
|
-
* `multiple` attribute, all values are considered, otherwise only the first
|
|
780
|
-
* one is taken into account.
|
|
781
|
-
* @returns the list of values that were successfully selected.
|
|
782
|
-
*/
|
|
783
|
-
select(selector, ...values) {
|
|
784
|
-
return this._secondaryWorld.select(selector, ...values);
|
|
785
|
-
}
|
|
786
|
-
/**
|
|
787
|
-
* This method fetches an element with `selector`, scrolls it into view if
|
|
788
|
-
* needed, and then uses {@link Page.touchscreen} to tap in the center of the
|
|
789
|
-
* element.
|
|
790
|
-
*
|
|
791
|
-
* @remarks
|
|
792
|
-
*
|
|
793
|
-
* If there's no element matching `selector`, the method throws an error.
|
|
794
|
-
*
|
|
795
|
-
* @param selector - the selector to tap.
|
|
796
|
-
* @returns a promise that resolves when the element has been tapped.
|
|
797
|
-
*/
|
|
798
|
-
async tap(selector) {
|
|
799
|
-
return this._secondaryWorld.tap(selector);
|
|
800
|
-
}
|
|
801
|
-
/**
|
|
802
|
-
* Sends a `keydown`, `keypress`/`input`, and `keyup` event for each character
|
|
803
|
-
* in the text.
|
|
804
|
-
*
|
|
805
|
-
* @remarks
|
|
806
|
-
* To press a special key, like `Control` or `ArrowDown`, use
|
|
807
|
-
* {@link Keyboard.press}.
|
|
808
|
-
*
|
|
809
|
-
* @example
|
|
810
|
-
* ```js
|
|
811
|
-
* await frame.type('#mytextarea', 'Hello'); // Types instantly
|
|
812
|
-
* await frame.type('#mytextarea', 'World', {delay: 100}); // Types slower, like a user
|
|
813
|
-
* ```
|
|
814
|
-
*
|
|
815
|
-
* @param selector - the selector for the element to type into. If there are
|
|
816
|
-
* multiple the first will be used.
|
|
817
|
-
* @param text - text to type into the element
|
|
818
|
-
* @param options - takes one option, `delay`, which sets the time to wait
|
|
819
|
-
* between key presses in milliseconds. Defaults to `0`.
|
|
820
|
-
*
|
|
821
|
-
* @returns a promise that resolves when the typing is complete.
|
|
822
|
-
*/
|
|
823
|
-
async type(selector, text, options) {
|
|
824
|
-
return this._mainWorld.type(selector, text, options);
|
|
825
|
-
}
|
|
826
|
-
/**
|
|
827
|
-
* @remarks
|
|
828
|
-
*
|
|
829
|
-
* This method behaves differently depending on the first parameter. If it's a
|
|
830
|
-
* `string`, it will be treated as a `selector` or `xpath` (if the string
|
|
831
|
-
* starts with `//`). This method then is a shortcut for
|
|
832
|
-
* {@link Frame.waitForSelector} or {@link Frame.waitForXPath}.
|
|
833
|
-
*
|
|
834
|
-
* If the first argument is a function this method is a shortcut for
|
|
835
|
-
* {@link Frame.waitForFunction}.
|
|
836
|
-
*
|
|
837
|
-
* If the first argument is a `number`, it's treated as a timeout in
|
|
838
|
-
* milliseconds and the method returns a promise which resolves after the
|
|
839
|
-
* timeout.
|
|
840
|
-
*
|
|
841
|
-
* @param selectorOrFunctionOrTimeout - a selector, predicate or timeout to
|
|
842
|
-
* wait for.
|
|
843
|
-
* @param options - optional waiting parameters.
|
|
844
|
-
* @param args - arguments to pass to `pageFunction`.
|
|
845
|
-
*
|
|
846
|
-
* @deprecated Don't use this method directly. Instead use the more explicit
|
|
847
|
-
* methods available: {@link Frame.waitForSelector},
|
|
848
|
-
* {@link Frame.waitForXPath}, {@link Frame.waitForFunction} or
|
|
849
|
-
* {@link Frame.waitForTimeout}.
|
|
850
|
-
*/
|
|
851
|
-
waitFor(selectorOrFunctionOrTimeout, options = {}, ...args) {
|
|
852
|
-
console.warn('waitFor is deprecated and will be removed in a future release. See https://github.com/puppeteer/puppeteer/issues/6214 for details and how to migrate your code.');
|
|
853
|
-
if (helper_js_1.helper.isString(selectorOrFunctionOrTimeout)) {
|
|
854
|
-
const string = selectorOrFunctionOrTimeout;
|
|
855
|
-
if (xPathPattern.test(string))
|
|
856
|
-
return this.waitForXPath(string, options);
|
|
857
|
-
return this.waitForSelector(string, options);
|
|
858
|
-
}
|
|
859
|
-
if (helper_js_1.helper.isNumber(selectorOrFunctionOrTimeout))
|
|
860
|
-
return new Promise((fulfill) => setTimeout(fulfill, selectorOrFunctionOrTimeout));
|
|
861
|
-
if (typeof selectorOrFunctionOrTimeout === 'function')
|
|
862
|
-
return this.waitForFunction(selectorOrFunctionOrTimeout, options, ...args);
|
|
863
|
-
return Promise.reject(new Error('Unsupported target type: ' + typeof selectorOrFunctionOrTimeout));
|
|
864
|
-
}
|
|
865
|
-
/**
|
|
866
|
-
* Causes your script to wait for the given number of milliseconds.
|
|
867
|
-
*
|
|
868
|
-
* @remarks
|
|
869
|
-
* It's generally recommended to not wait for a number of seconds, but instead
|
|
870
|
-
* use {@link Frame.waitForSelector}, {@link Frame.waitForXPath} or
|
|
871
|
-
* {@link Frame.waitForFunction} to wait for exactly the conditions you want.
|
|
872
|
-
*
|
|
873
|
-
* @example
|
|
874
|
-
*
|
|
875
|
-
* Wait for 1 second:
|
|
876
|
-
*
|
|
877
|
-
* ```
|
|
878
|
-
* await frame.waitForTimeout(1000);
|
|
879
|
-
* ```
|
|
880
|
-
*
|
|
881
|
-
* @param milliseconds - the number of milliseconds to wait.
|
|
882
|
-
*/
|
|
883
|
-
waitForTimeout(milliseconds) {
|
|
884
|
-
return new Promise((resolve) => {
|
|
885
|
-
setTimeout(resolve, milliseconds);
|
|
886
|
-
});
|
|
887
|
-
}
|
|
888
|
-
/**
|
|
889
|
-
* @remarks
|
|
890
|
-
*
|
|
891
|
-
*
|
|
892
|
-
* Wait for the `selector` to appear in page. If at the moment of calling the
|
|
893
|
-
* method the `selector` already exists, the method will return immediately.
|
|
894
|
-
* If the selector doesn't appear after the `timeout` milliseconds of waiting,
|
|
895
|
-
* the function will throw.
|
|
896
|
-
*
|
|
897
|
-
* This method works across navigations.
|
|
898
|
-
*
|
|
899
|
-
* @example
|
|
900
|
-
* ```js
|
|
901
|
-
* const puppeteer = require('puppeteer');
|
|
902
|
-
*
|
|
903
|
-
* (async () => {
|
|
904
|
-
* const browser = await puppeteer.launch();
|
|
905
|
-
* const page = await browser.newPage();
|
|
906
|
-
* let currentURL;
|
|
907
|
-
* page.mainFrame()
|
|
908
|
-
* .waitForSelector('img')
|
|
909
|
-
* .then(() => console.log('First URL with image: ' + currentURL));
|
|
910
|
-
*
|
|
911
|
-
* for (currentURL of ['https://example.com', 'https://google.com', 'https://bbc.com']) {
|
|
912
|
-
* await page.goto(currentURL);
|
|
913
|
-
* }
|
|
914
|
-
* await browser.close();
|
|
915
|
-
* })();
|
|
916
|
-
* ```
|
|
917
|
-
* @param selector - the selector to wait for.
|
|
918
|
-
* @param options - options to define if the element should be visible and how
|
|
919
|
-
* long to wait before timing out.
|
|
920
|
-
* @returns a promise which resolves when an element matching the selector
|
|
921
|
-
* string is added to the DOM.
|
|
922
|
-
*/
|
|
923
|
-
async waitForSelector(selector, options = {}) {
|
|
924
|
-
const handle = await this._secondaryWorld.waitForSelector(selector, options);
|
|
925
|
-
if (!handle)
|
|
926
|
-
return null;
|
|
927
|
-
const mainExecutionContext = await this._mainWorld.executionContext();
|
|
928
|
-
const result = await mainExecutionContext._adoptElementHandle(handle);
|
|
929
|
-
await handle.dispose();
|
|
930
|
-
return result;
|
|
931
|
-
}
|
|
932
|
-
/**
|
|
933
|
-
* @remarks
|
|
934
|
-
* Wait for the `xpath` to appear in page. If at the moment of calling the
|
|
935
|
-
* method the `xpath` already exists, the method will return immediately. If
|
|
936
|
-
* the xpath doesn't appear after the `timeout` milliseconds of waiting, the
|
|
937
|
-
* function will throw.
|
|
938
|
-
*
|
|
939
|
-
* For a code example, see the example for {@link Frame.waitForSelector}. That
|
|
940
|
-
* function behaves identically other than taking a CSS selector rather than
|
|
941
|
-
* an XPath.
|
|
942
|
-
*
|
|
943
|
-
* @param xpath - the XPath expression to wait for.
|
|
944
|
-
* @param options - options to configure the visiblity of the element and how
|
|
945
|
-
* long to wait before timing out.
|
|
946
|
-
*/
|
|
947
|
-
async waitForXPath(xpath, options = {}) {
|
|
948
|
-
const handle = await this._secondaryWorld.waitForXPath(xpath, options);
|
|
949
|
-
if (!handle)
|
|
950
|
-
return null;
|
|
951
|
-
const mainExecutionContext = await this._mainWorld.executionContext();
|
|
952
|
-
const result = await mainExecutionContext._adoptElementHandle(handle);
|
|
953
|
-
await handle.dispose();
|
|
954
|
-
return result;
|
|
955
|
-
}
|
|
956
|
-
/**
|
|
957
|
-
* @remarks
|
|
958
|
-
*
|
|
959
|
-
* @example
|
|
960
|
-
*
|
|
961
|
-
* The `waitForFunction` can be used to observe viewport size change:
|
|
962
|
-
* ```js
|
|
963
|
-
* const puppeteer = require('puppeteer');
|
|
964
|
-
*
|
|
965
|
-
* (async () => {
|
|
966
|
-
* . const browser = await puppeteer.launch();
|
|
967
|
-
* . const page = await browser.newPage();
|
|
968
|
-
* . const watchDog = page.mainFrame().waitForFunction('window.innerWidth < 100');
|
|
969
|
-
* . page.setViewport({width: 50, height: 50});
|
|
970
|
-
* . await watchDog;
|
|
971
|
-
* . await browser.close();
|
|
972
|
-
* })();
|
|
973
|
-
* ```
|
|
974
|
-
*
|
|
975
|
-
* To pass arguments from Node.js to the predicate of `page.waitForFunction` function:
|
|
976
|
-
*
|
|
977
|
-
* ```js
|
|
978
|
-
* const selector = '.foo';
|
|
979
|
-
* await frame.waitForFunction(
|
|
980
|
-
* selector => !!document.querySelector(selector),
|
|
981
|
-
* {}, // empty options object
|
|
982
|
-
* selector
|
|
983
|
-
*);
|
|
984
|
-
* ```
|
|
985
|
-
*
|
|
986
|
-
* @param pageFunction - the function to evaluate in the frame context.
|
|
987
|
-
* @param options - options to configure the polling method and timeout.
|
|
988
|
-
* @param args - arguments to pass to the `pageFunction`.
|
|
989
|
-
* @returns the promise which resolve when the `pageFunction` returns a truthy value.
|
|
990
|
-
*/
|
|
991
|
-
waitForFunction(pageFunction, options = {}, ...args) {
|
|
992
|
-
return this._mainWorld.waitForFunction(pageFunction, options, ...args);
|
|
993
|
-
}
|
|
994
|
-
/**
|
|
995
|
-
* @returns the frame's title.
|
|
996
|
-
*/
|
|
997
|
-
async title() {
|
|
998
|
-
return this._secondaryWorld.title();
|
|
999
|
-
}
|
|
1000
|
-
/**
|
|
1001
|
-
* @internal
|
|
1002
|
-
*/
|
|
1003
|
-
_navigated(framePayload) {
|
|
1004
|
-
this._name = framePayload.name;
|
|
1005
|
-
this._url = `${framePayload.url}${framePayload.urlFragment || ''}`;
|
|
1006
|
-
}
|
|
1007
|
-
/**
|
|
1008
|
-
* @internal
|
|
1009
|
-
*/
|
|
1010
|
-
_navigatedWithinDocument(url) {
|
|
1011
|
-
this._url = url;
|
|
1012
|
-
}
|
|
1013
|
-
/**
|
|
1014
|
-
* @internal
|
|
1015
|
-
*/
|
|
1016
|
-
_onLifecycleEvent(loaderId, name) {
|
|
1017
|
-
if (name === 'init') {
|
|
1018
|
-
this._loaderId = loaderId;
|
|
1019
|
-
this._lifecycleEvents.clear();
|
|
1020
|
-
}
|
|
1021
|
-
this._lifecycleEvents.add(name);
|
|
1022
|
-
}
|
|
1023
|
-
/**
|
|
1024
|
-
* @internal
|
|
1025
|
-
*/
|
|
1026
|
-
_onLoadingStopped() {
|
|
1027
|
-
this._lifecycleEvents.add('DOMContentLoaded');
|
|
1028
|
-
this._lifecycleEvents.add('load');
|
|
1029
|
-
}
|
|
1030
|
-
/**
|
|
1031
|
-
* @internal
|
|
1032
|
-
*/
|
|
1033
|
-
_detach() {
|
|
1034
|
-
this._detached = true;
|
|
1035
|
-
this._mainWorld._detach();
|
|
1036
|
-
this._secondaryWorld._detach();
|
|
1037
|
-
if (this._parentFrame)
|
|
1038
|
-
this._parentFrame._childFrames.delete(this);
|
|
1039
|
-
this._parentFrame = null;
|
|
1040
|
-
}
|
|
1041
|
-
}
|
|
1042
|
-
exports.Frame = Frame;
|
|
1043
|
-
function assertNoLegacyNavigationOptions(options) {
|
|
1044
|
-
(0, assert_js_1.assert)(options['networkIdleTimeout'] === undefined, 'ERROR: networkIdleTimeout option is no longer supported.');
|
|
1045
|
-
(0, assert_js_1.assert)(options['networkIdleInflight'] === undefined, 'ERROR: networkIdleInflight option is no longer supported.');
|
|
1046
|
-
(0, assert_js_1.assert)(options.waitUntil !== 'networkidle', 'ERROR: "networkidle" option is no longer supported. Use "networkidle2" instead');
|
|
1047
|
-
}
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Copyright 2017 Google Inc. All rights reserved.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.Frame = exports.FrameManager = exports.FrameManagerEmittedEvents = void 0;
|
|
19
|
+
const EventEmitter_js_1 = require("./EventEmitter.js");
|
|
20
|
+
const assert_js_1 = require("./assert.js");
|
|
21
|
+
const helper_js_1 = require("./helper.js");
|
|
22
|
+
const ExecutionContext_js_1 = require("./ExecutionContext.js");
|
|
23
|
+
const LifecycleWatcher_js_1 = require("./LifecycleWatcher.js");
|
|
24
|
+
const DOMWorld_js_1 = require("./DOMWorld.js");
|
|
25
|
+
const NetworkManager_js_1 = require("./NetworkManager.js");
|
|
26
|
+
const Connection_js_1 = require("./Connection.js");
|
|
27
|
+
const UTILITY_WORLD_NAME = '__puppeteer_utility_world__';
|
|
28
|
+
const xPathPattern = /^\(\/\/[^\)]+\)|^\/\//;
|
|
29
|
+
/**
|
|
30
|
+
* We use symbols to prevent external parties listening to these events.
|
|
31
|
+
* They are internal to Puppeteer.
|
|
32
|
+
*
|
|
33
|
+
* @internal
|
|
34
|
+
*/
|
|
35
|
+
exports.FrameManagerEmittedEvents = {
|
|
36
|
+
FrameAttached: Symbol('FrameManager.FrameAttached'),
|
|
37
|
+
FrameNavigated: Symbol('FrameManager.FrameNavigated'),
|
|
38
|
+
FrameDetached: Symbol('FrameManager.FrameDetached'),
|
|
39
|
+
LifecycleEvent: Symbol('FrameManager.LifecycleEvent'),
|
|
40
|
+
FrameNavigatedWithinDocument: Symbol('FrameManager.FrameNavigatedWithinDocument'),
|
|
41
|
+
ExecutionContextCreated: Symbol('FrameManager.ExecutionContextCreated'),
|
|
42
|
+
ExecutionContextDestroyed: Symbol('FrameManager.ExecutionContextDestroyed'),
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* @internal
|
|
46
|
+
*/
|
|
47
|
+
class FrameManager extends EventEmitter_js_1.EventEmitter {
|
|
48
|
+
constructor(client, page, ignoreHTTPSErrors, timeoutSettings) {
|
|
49
|
+
super();
|
|
50
|
+
this._frames = new Map();
|
|
51
|
+
this._contextIdToContext = new Map();
|
|
52
|
+
this._isolatedWorlds = new Set();
|
|
53
|
+
this._client = client;
|
|
54
|
+
this._page = page;
|
|
55
|
+
this._networkManager = new NetworkManager_js_1.NetworkManager(client, ignoreHTTPSErrors, this);
|
|
56
|
+
this._timeoutSettings = timeoutSettings;
|
|
57
|
+
this.setupEventListeners(this._client);
|
|
58
|
+
}
|
|
59
|
+
setupEventListeners(session) {
|
|
60
|
+
session.on('Page.frameAttached', (event) => {
|
|
61
|
+
this._onFrameAttached(session, event.frameId, event.parentFrameId);
|
|
62
|
+
});
|
|
63
|
+
session.on('Page.frameNavigated', (event) => {
|
|
64
|
+
this._onFrameNavigated(event.frame);
|
|
65
|
+
});
|
|
66
|
+
session.on('Page.navigatedWithinDocument', (event) => {
|
|
67
|
+
this._onFrameNavigatedWithinDocument(event.frameId, event.url);
|
|
68
|
+
});
|
|
69
|
+
session.on('Page.frameDetached', (event) => {
|
|
70
|
+
this._onFrameDetached(event.frameId, event.reason);
|
|
71
|
+
});
|
|
72
|
+
session.on('Page.frameStoppedLoading', (event) => {
|
|
73
|
+
this._onFrameStoppedLoading(event.frameId);
|
|
74
|
+
});
|
|
75
|
+
session.on('Runtime.executionContextCreated', (event) => {
|
|
76
|
+
this._onExecutionContextCreated(event.context, session);
|
|
77
|
+
});
|
|
78
|
+
session.on('Runtime.executionContextDestroyed', (event) => {
|
|
79
|
+
this._onExecutionContextDestroyed(event.executionContextId, session);
|
|
80
|
+
});
|
|
81
|
+
session.on('Runtime.executionContextsCleared', () => {
|
|
82
|
+
this._onExecutionContextsCleared(session);
|
|
83
|
+
});
|
|
84
|
+
session.on('Page.lifecycleEvent', (event) => {
|
|
85
|
+
this._onLifecycleEvent(event);
|
|
86
|
+
});
|
|
87
|
+
session.on('Target.attachedToTarget', async (event) => {
|
|
88
|
+
this._onAttachedToTarget(event);
|
|
89
|
+
});
|
|
90
|
+
session.on('Target.detachedFromTarget', async (event) => {
|
|
91
|
+
this._onDetachedFromTarget(event);
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
async initialize(client = this._client) {
|
|
95
|
+
try {
|
|
96
|
+
const result = await Promise.all([
|
|
97
|
+
client.send('Page.enable'),
|
|
98
|
+
client.send('Page.getFrameTree'),
|
|
99
|
+
]);
|
|
100
|
+
const { frameTree } = result[1];
|
|
101
|
+
this._handleFrameTree(client, frameTree);
|
|
102
|
+
await Promise.all([
|
|
103
|
+
client.send('Page.setLifecycleEventsEnabled', { enabled: true }),
|
|
104
|
+
client
|
|
105
|
+
.send('Runtime.enable')
|
|
106
|
+
.then(() => this._ensureIsolatedWorld(client, UTILITY_WORLD_NAME)),
|
|
107
|
+
// TODO: Network manager is not aware of OOP iframes yet.
|
|
108
|
+
client === this._client
|
|
109
|
+
? this._networkManager.initialize()
|
|
110
|
+
: Promise.resolve(),
|
|
111
|
+
]);
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
// The target might have been closed before the initialization finished.
|
|
115
|
+
if (error.message.includes('Target closed') ||
|
|
116
|
+
error.message.includes('Session closed')) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
throw error;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
networkManager() {
|
|
123
|
+
return this._networkManager;
|
|
124
|
+
}
|
|
125
|
+
async navigateFrame(frame, url, options = {}) {
|
|
126
|
+
assertNoLegacyNavigationOptions(options);
|
|
127
|
+
const { referer = this._networkManager.extraHTTPHeaders()['referer'], waitUntil = ['load'], timeout = this._timeoutSettings.navigationTimeout(), } = options;
|
|
128
|
+
const watcher = new LifecycleWatcher_js_1.LifecycleWatcher(this, frame, waitUntil, timeout);
|
|
129
|
+
let ensureNewDocumentNavigation = false;
|
|
130
|
+
let error = await Promise.race([
|
|
131
|
+
navigate(this._client, url, referer, frame._id),
|
|
132
|
+
watcher.timeoutOrTerminationPromise(),
|
|
133
|
+
]);
|
|
134
|
+
if (!error) {
|
|
135
|
+
error = await Promise.race([
|
|
136
|
+
watcher.timeoutOrTerminationPromise(),
|
|
137
|
+
ensureNewDocumentNavigation
|
|
138
|
+
? watcher.newDocumentNavigationPromise()
|
|
139
|
+
: watcher.sameDocumentNavigationPromise(),
|
|
140
|
+
]);
|
|
141
|
+
}
|
|
142
|
+
watcher.dispose();
|
|
143
|
+
if (error)
|
|
144
|
+
throw error;
|
|
145
|
+
return await watcher.navigationResponse();
|
|
146
|
+
async function navigate(client, url, referrer, frameId) {
|
|
147
|
+
try {
|
|
148
|
+
const response = await client.send('Page.navigate', {
|
|
149
|
+
url,
|
|
150
|
+
referrer,
|
|
151
|
+
frameId,
|
|
152
|
+
});
|
|
153
|
+
ensureNewDocumentNavigation = !!response.loaderId;
|
|
154
|
+
return response.errorText
|
|
155
|
+
? new Error(`${response.errorText} at ${url}`)
|
|
156
|
+
: null;
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
return error;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
async waitForFrameNavigation(frame, options = {}) {
|
|
164
|
+
assertNoLegacyNavigationOptions(options);
|
|
165
|
+
const { waitUntil = ['load'], timeout = this._timeoutSettings.navigationTimeout(), } = options;
|
|
166
|
+
const watcher = new LifecycleWatcher_js_1.LifecycleWatcher(this, frame, waitUntil, timeout);
|
|
167
|
+
const error = await Promise.race([
|
|
168
|
+
watcher.timeoutOrTerminationPromise(),
|
|
169
|
+
watcher.sameDocumentNavigationPromise(),
|
|
170
|
+
watcher.newDocumentNavigationPromise(),
|
|
171
|
+
]);
|
|
172
|
+
watcher.dispose();
|
|
173
|
+
if (error)
|
|
174
|
+
throw error;
|
|
175
|
+
return await watcher.navigationResponse();
|
|
176
|
+
}
|
|
177
|
+
async _onAttachedToTarget(event) {
|
|
178
|
+
if (event.targetInfo.type !== 'iframe') {
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
const frame = this._frames.get(event.targetInfo.targetId);
|
|
182
|
+
const session = Connection_js_1.Connection.fromSession(this._client).session(event.sessionId);
|
|
183
|
+
frame._updateClient(session);
|
|
184
|
+
this.setupEventListeners(session);
|
|
185
|
+
await this.initialize(session);
|
|
186
|
+
}
|
|
187
|
+
async _onDetachedFromTarget(event) {
|
|
188
|
+
const frame = this._frames.get(event.targetId);
|
|
189
|
+
if (frame && frame.isOOPFrame()) {
|
|
190
|
+
// When an OOP iframe is removed from the page, it
|
|
191
|
+
// will only get a Target.detachedFromTarget event.
|
|
192
|
+
this._removeFramesRecursively(frame);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
_onLifecycleEvent(event) {
|
|
196
|
+
const frame = this._frames.get(event.frameId);
|
|
197
|
+
if (!frame)
|
|
198
|
+
return;
|
|
199
|
+
frame._onLifecycleEvent(event.loaderId, event.name);
|
|
200
|
+
this.emit(exports.FrameManagerEmittedEvents.LifecycleEvent, frame);
|
|
201
|
+
}
|
|
202
|
+
_onFrameStoppedLoading(frameId) {
|
|
203
|
+
const frame = this._frames.get(frameId);
|
|
204
|
+
if (!frame)
|
|
205
|
+
return;
|
|
206
|
+
frame._onLoadingStopped();
|
|
207
|
+
this.emit(exports.FrameManagerEmittedEvents.LifecycleEvent, frame);
|
|
208
|
+
}
|
|
209
|
+
_handleFrameTree(session, frameTree) {
|
|
210
|
+
if (frameTree.frame.parentId) {
|
|
211
|
+
this._onFrameAttached(session, frameTree.frame.id, frameTree.frame.parentId);
|
|
212
|
+
}
|
|
213
|
+
this._onFrameNavigated(frameTree.frame);
|
|
214
|
+
if (!frameTree.childFrames)
|
|
215
|
+
return;
|
|
216
|
+
for (const child of frameTree.childFrames) {
|
|
217
|
+
this._handleFrameTree(session, child);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
page() {
|
|
221
|
+
return this._page;
|
|
222
|
+
}
|
|
223
|
+
mainFrame() {
|
|
224
|
+
return this._mainFrame;
|
|
225
|
+
}
|
|
226
|
+
frames() {
|
|
227
|
+
return Array.from(this._frames.values());
|
|
228
|
+
}
|
|
229
|
+
frame(frameId) {
|
|
230
|
+
return this._frames.get(frameId) || null;
|
|
231
|
+
}
|
|
232
|
+
_onFrameAttached(session, frameId, parentFrameId) {
|
|
233
|
+
if (this._frames.has(frameId)) {
|
|
234
|
+
const frame = this._frames.get(frameId);
|
|
235
|
+
if (session && frame.isOOPFrame()) {
|
|
236
|
+
// If an OOP iframes becomes a normal iframe again
|
|
237
|
+
// it is first attached to the parent page before
|
|
238
|
+
// the target is removed.
|
|
239
|
+
frame._updateClient(session);
|
|
240
|
+
}
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
(0, assert_js_1.assert)(parentFrameId);
|
|
244
|
+
const parentFrame = this._frames.get(parentFrameId);
|
|
245
|
+
const frame = new Frame(this, parentFrame, frameId, session);
|
|
246
|
+
this._frames.set(frame._id, frame);
|
|
247
|
+
this.emit(exports.FrameManagerEmittedEvents.FrameAttached, frame);
|
|
248
|
+
}
|
|
249
|
+
_onFrameNavigated(framePayload) {
|
|
250
|
+
const isMainFrame = !framePayload.parentId;
|
|
251
|
+
let frame = isMainFrame
|
|
252
|
+
? this._mainFrame
|
|
253
|
+
: this._frames.get(framePayload.id);
|
|
254
|
+
(0, assert_js_1.assert)(isMainFrame || frame, 'We either navigate top level or have old version of the navigated frame');
|
|
255
|
+
// Detach all child frames first.
|
|
256
|
+
if (frame) {
|
|
257
|
+
for (const child of frame.childFrames())
|
|
258
|
+
this._removeFramesRecursively(child);
|
|
259
|
+
}
|
|
260
|
+
// Update or create main frame.
|
|
261
|
+
if (isMainFrame) {
|
|
262
|
+
if (frame) {
|
|
263
|
+
// Update frame id to retain frame identity on cross-process navigation.
|
|
264
|
+
this._frames.delete(frame._id);
|
|
265
|
+
frame._id = framePayload.id;
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
// Initial main frame navigation.
|
|
269
|
+
frame = new Frame(this, null, framePayload.id, this._client);
|
|
270
|
+
}
|
|
271
|
+
this._frames.set(framePayload.id, frame);
|
|
272
|
+
this._mainFrame = frame;
|
|
273
|
+
}
|
|
274
|
+
// Update frame payload.
|
|
275
|
+
frame._navigated(framePayload);
|
|
276
|
+
this.emit(exports.FrameManagerEmittedEvents.FrameNavigated, frame);
|
|
277
|
+
}
|
|
278
|
+
async _ensureIsolatedWorld(session, name) {
|
|
279
|
+
const key = `${session.id()}:${name}`;
|
|
280
|
+
if (this._isolatedWorlds.has(key))
|
|
281
|
+
return;
|
|
282
|
+
this._isolatedWorlds.add(key);
|
|
283
|
+
await session.send('Page.addScriptToEvaluateOnNewDocument', {
|
|
284
|
+
source: `//# sourceURL=${ExecutionContext_js_1.EVALUATION_SCRIPT_URL}`,
|
|
285
|
+
worldName: name,
|
|
286
|
+
});
|
|
287
|
+
// Frames might be removed before we send this.
|
|
288
|
+
await Promise.all(this.frames()
|
|
289
|
+
.filter((frame) => frame._client === session)
|
|
290
|
+
.map((frame) => session.send('Page.createIsolatedWorld', {
|
|
291
|
+
frameId: frame._id,
|
|
292
|
+
worldName: name,
|
|
293
|
+
grantUniveralAccess: true,
|
|
294
|
+
})));
|
|
295
|
+
}
|
|
296
|
+
_onFrameNavigatedWithinDocument(frameId, url) {
|
|
297
|
+
const frame = this._frames.get(frameId);
|
|
298
|
+
if (!frame)
|
|
299
|
+
return;
|
|
300
|
+
frame._navigatedWithinDocument(url);
|
|
301
|
+
this.emit(exports.FrameManagerEmittedEvents.FrameNavigatedWithinDocument, frame);
|
|
302
|
+
this.emit(exports.FrameManagerEmittedEvents.FrameNavigated, frame);
|
|
303
|
+
}
|
|
304
|
+
_onFrameDetached(frameId, reason) {
|
|
305
|
+
const frame = this._frames.get(frameId);
|
|
306
|
+
if (reason === 'remove') {
|
|
307
|
+
// Only remove the frame if the reason for the detached event is
|
|
308
|
+
// an actual removement of the frame.
|
|
309
|
+
// For frames that become OOP iframes, the reason would be 'swap'.
|
|
310
|
+
if (frame)
|
|
311
|
+
this._removeFramesRecursively(frame);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
_onExecutionContextCreated(contextPayload, session) {
|
|
315
|
+
const auxData = contextPayload.auxData;
|
|
316
|
+
const frameId = auxData ? auxData.frameId : null;
|
|
317
|
+
const frame = this._frames.get(frameId) || null;
|
|
318
|
+
let world = null;
|
|
319
|
+
if (frame) {
|
|
320
|
+
// Only care about execution contexts created for the current session.
|
|
321
|
+
if (frame._client !== session)
|
|
322
|
+
return;
|
|
323
|
+
if (contextPayload.auxData && !!contextPayload.auxData['isDefault']) {
|
|
324
|
+
world = frame._mainWorld;
|
|
325
|
+
}
|
|
326
|
+
else if (contextPayload.name === UTILITY_WORLD_NAME &&
|
|
327
|
+
!frame._secondaryWorld._hasContext()) {
|
|
328
|
+
// In case of multiple sessions to the same target, there's a race between
|
|
329
|
+
// connections so we might end up creating multiple isolated worlds.
|
|
330
|
+
// We can use either.
|
|
331
|
+
world = frame._secondaryWorld;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
const context = new ExecutionContext_js_1.ExecutionContext((frame === null || frame === void 0 ? void 0 : frame._client) || this._client, contextPayload, world);
|
|
335
|
+
if (world)
|
|
336
|
+
world._setContext(context);
|
|
337
|
+
const key = `${session.id()}:${contextPayload.id}`;
|
|
338
|
+
this._contextIdToContext.set(key, context);
|
|
339
|
+
}
|
|
340
|
+
_onExecutionContextDestroyed(executionContextId, session) {
|
|
341
|
+
const key = `${session.id()}:${executionContextId}`;
|
|
342
|
+
const context = this._contextIdToContext.get(key);
|
|
343
|
+
if (!context)
|
|
344
|
+
return;
|
|
345
|
+
this._contextIdToContext.delete(key);
|
|
346
|
+
if (context._world)
|
|
347
|
+
context._world._setContext(null);
|
|
348
|
+
}
|
|
349
|
+
_onExecutionContextsCleared(session) {
|
|
350
|
+
for (const [key, context] of this._contextIdToContext.entries()) {
|
|
351
|
+
// Make sure to only clear execution contexts that belong
|
|
352
|
+
// to the current session.
|
|
353
|
+
if (context._client !== session)
|
|
354
|
+
continue;
|
|
355
|
+
if (context._world)
|
|
356
|
+
context._world._setContext(null);
|
|
357
|
+
this._contextIdToContext.delete(key);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
executionContextById(contextId, session = this._client) {
|
|
361
|
+
const key = `${session.id()}:${contextId}`;
|
|
362
|
+
const context = this._contextIdToContext.get(key);
|
|
363
|
+
(0, assert_js_1.assert)(context, 'INTERNAL ERROR: missing context with id = ' + contextId);
|
|
364
|
+
return context;
|
|
365
|
+
}
|
|
366
|
+
_removeFramesRecursively(frame) {
|
|
367
|
+
for (const child of frame.childFrames())
|
|
368
|
+
this._removeFramesRecursively(child);
|
|
369
|
+
frame._detach();
|
|
370
|
+
this._frames.delete(frame._id);
|
|
371
|
+
this.emit(exports.FrameManagerEmittedEvents.FrameDetached, frame);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
exports.FrameManager = FrameManager;
|
|
375
|
+
/**
|
|
376
|
+
* At every point of time, page exposes its current frame tree via the
|
|
377
|
+
* {@link Page.mainFrame | page.mainFrame} and
|
|
378
|
+
* {@link Frame.childFrames | frame.childFrames} methods.
|
|
379
|
+
*
|
|
380
|
+
* @remarks
|
|
381
|
+
*
|
|
382
|
+
* `Frame` object lifecycles are controlled by three events that are all
|
|
383
|
+
* dispatched on the page object:
|
|
384
|
+
*
|
|
385
|
+
* - {@link PageEmittedEvents.FrameAttached}
|
|
386
|
+
*
|
|
387
|
+
* - {@link PageEmittedEvents.FrameNavigated}
|
|
388
|
+
*
|
|
389
|
+
* - {@link PageEmittedEvents.FrameDetached}
|
|
390
|
+
*
|
|
391
|
+
* @Example
|
|
392
|
+
* An example of dumping frame tree:
|
|
393
|
+
*
|
|
394
|
+
* ```js
|
|
395
|
+
* const puppeteer = require('puppeteer');
|
|
396
|
+
*
|
|
397
|
+
* (async () => {
|
|
398
|
+
* const browser = await puppeteer.launch();
|
|
399
|
+
* const page = await browser.newPage();
|
|
400
|
+
* await page.goto('https://www.google.com/chrome/browser/canary.html');
|
|
401
|
+
* dumpFrameTree(page.mainFrame(), '');
|
|
402
|
+
* await browser.close();
|
|
403
|
+
*
|
|
404
|
+
* function dumpFrameTree(frame, indent) {
|
|
405
|
+
* console.log(indent + frame.url());
|
|
406
|
+
* for (const child of frame.childFrames()) {
|
|
407
|
+
* dumpFrameTree(child, indent + ' ');
|
|
408
|
+
* }
|
|
409
|
+
* }
|
|
410
|
+
* })();
|
|
411
|
+
* ```
|
|
412
|
+
*
|
|
413
|
+
* @Example
|
|
414
|
+
* An example of getting text from an iframe element:
|
|
415
|
+
*
|
|
416
|
+
* ```js
|
|
417
|
+
* const frame = page.frames().find(frame => frame.name() === 'myframe');
|
|
418
|
+
* const text = await frame.$eval('.selector', element => element.textContent);
|
|
419
|
+
* console.log(text);
|
|
420
|
+
* ```
|
|
421
|
+
*
|
|
422
|
+
* @public
|
|
423
|
+
*/
|
|
424
|
+
class Frame {
|
|
425
|
+
/**
|
|
426
|
+
* @internal
|
|
427
|
+
*/
|
|
428
|
+
constructor(frameManager, parentFrame, frameId, client) {
|
|
429
|
+
this._url = '';
|
|
430
|
+
this._detached = false;
|
|
431
|
+
/**
|
|
432
|
+
* @internal
|
|
433
|
+
*/
|
|
434
|
+
this._loaderId = '';
|
|
435
|
+
/**
|
|
436
|
+
* @internal
|
|
437
|
+
*/
|
|
438
|
+
this._lifecycleEvents = new Set();
|
|
439
|
+
this._frameManager = frameManager;
|
|
440
|
+
this._parentFrame = parentFrame;
|
|
441
|
+
this._url = '';
|
|
442
|
+
this._id = frameId;
|
|
443
|
+
this._detached = false;
|
|
444
|
+
this._loaderId = '';
|
|
445
|
+
this._childFrames = new Set();
|
|
446
|
+
if (this._parentFrame)
|
|
447
|
+
this._parentFrame._childFrames.add(this);
|
|
448
|
+
this._updateClient(client);
|
|
449
|
+
}
|
|
450
|
+
/**
|
|
451
|
+
* @internal
|
|
452
|
+
*/
|
|
453
|
+
_updateClient(client) {
|
|
454
|
+
this._client = client;
|
|
455
|
+
this._mainWorld = new DOMWorld_js_1.DOMWorld(this._client, this._frameManager, this, this._frameManager._timeoutSettings);
|
|
456
|
+
this._secondaryWorld = new DOMWorld_js_1.DOMWorld(this._client, this._frameManager, this, this._frameManager._timeoutSettings);
|
|
457
|
+
}
|
|
458
|
+
isOOPFrame() {
|
|
459
|
+
return this._client !== this._frameManager._client;
|
|
460
|
+
}
|
|
461
|
+
/**
|
|
462
|
+
* @remarks
|
|
463
|
+
*
|
|
464
|
+
* `frame.goto` will throw an error if:
|
|
465
|
+
* - there's an SSL error (e.g. in case of self-signed certificates).
|
|
466
|
+
*
|
|
467
|
+
* - target URL is invalid.
|
|
468
|
+
*
|
|
469
|
+
* - the `timeout` is exceeded during navigation.
|
|
470
|
+
*
|
|
471
|
+
* - the remote server does not respond or is unreachable.
|
|
472
|
+
*
|
|
473
|
+
* - the main resource failed to load.
|
|
474
|
+
*
|
|
475
|
+
* `frame.goto` will not throw an error when any valid HTTP status code is
|
|
476
|
+
* returned by the remote server, including 404 "Not Found" and 500 "Internal
|
|
477
|
+
* Server Error". The status code for such responses can be retrieved by
|
|
478
|
+
* calling {@link HTTPResponse.status}.
|
|
479
|
+
*
|
|
480
|
+
* NOTE: `frame.goto` either throws an error or returns a main resource
|
|
481
|
+
* response. The only exceptions are navigation to `about:blank` or
|
|
482
|
+
* navigation to the same URL with a different hash, which would succeed and
|
|
483
|
+
* return `null`.
|
|
484
|
+
*
|
|
485
|
+
* NOTE: Headless mode doesn't support navigation to a PDF document. See
|
|
486
|
+
* the {@link https://bugs.chromium.org/p/chromium/issues/detail?id=761295 | upstream
|
|
487
|
+
* issue}.
|
|
488
|
+
*
|
|
489
|
+
* @param url - the URL to navigate the frame to. This should include the
|
|
490
|
+
* scheme, e.g. `https://`.
|
|
491
|
+
* @param options - navigation options. `waitUntil` is useful to define when
|
|
492
|
+
* the navigation should be considered successful - see the docs for
|
|
493
|
+
* {@link PuppeteerLifeCycleEvent} for more details.
|
|
494
|
+
*
|
|
495
|
+
* @returns A promise which resolves to the main resource response. In case of
|
|
496
|
+
* multiple redirects, the navigation will resolve with the response of the
|
|
497
|
+
* last redirect.
|
|
498
|
+
*/
|
|
499
|
+
async goto(url, options = {}) {
|
|
500
|
+
return await this._frameManager.navigateFrame(this, url, options);
|
|
501
|
+
}
|
|
502
|
+
/**
|
|
503
|
+
* @remarks
|
|
504
|
+
*
|
|
505
|
+
* This resolves when the frame navigates to a new URL. It is useful for when
|
|
506
|
+
* you run code which will indirectly cause the frame to navigate. Consider
|
|
507
|
+
* this example:
|
|
508
|
+
*
|
|
509
|
+
* ```js
|
|
510
|
+
* const [response] = await Promise.all([
|
|
511
|
+
* // The navigation promise resolves after navigation has finished
|
|
512
|
+
* frame.waitForNavigation(),
|
|
513
|
+
* // Clicking the link will indirectly cause a navigation
|
|
514
|
+
* frame.click('a.my-link'),
|
|
515
|
+
* ]);
|
|
516
|
+
* ```
|
|
517
|
+
*
|
|
518
|
+
* Usage of the {@link https://developer.mozilla.org/en-US/docs/Web/API/History_API | History API} to change the URL is considered a navigation.
|
|
519
|
+
*
|
|
520
|
+
* @param options - options to configure when the navigation is consided finished.
|
|
521
|
+
* @returns a promise that resolves when the frame navigates to a new URL.
|
|
522
|
+
*/
|
|
523
|
+
async waitForNavigation(options = {}) {
|
|
524
|
+
return await this._frameManager.waitForFrameNavigation(this, options);
|
|
525
|
+
}
|
|
526
|
+
/**
|
|
527
|
+
* @returns a promise that resolves to the frame's default execution context.
|
|
528
|
+
*/
|
|
529
|
+
executionContext() {
|
|
530
|
+
return this._mainWorld.executionContext();
|
|
531
|
+
}
|
|
532
|
+
/**
|
|
533
|
+
* @remarks
|
|
534
|
+
*
|
|
535
|
+
* The only difference between {@link Frame.evaluate} and
|
|
536
|
+
* `frame.evaluateHandle` is that `evaluateHandle` will return the value
|
|
537
|
+
* wrapped in an in-page object.
|
|
538
|
+
*
|
|
539
|
+
* This method behaves identically to {@link Page.evaluateHandle} except it's
|
|
540
|
+
* run within the context of the `frame`, rather than the entire page.
|
|
541
|
+
*
|
|
542
|
+
* @param pageFunction - a function that is run within the frame
|
|
543
|
+
* @param args - arguments to be passed to the pageFunction
|
|
544
|
+
*/
|
|
545
|
+
async evaluateHandle(pageFunction, ...args) {
|
|
546
|
+
return this._mainWorld.evaluateHandle(pageFunction, ...args);
|
|
547
|
+
}
|
|
548
|
+
/**
|
|
549
|
+
* @remarks
|
|
550
|
+
*
|
|
551
|
+
* This method behaves identically to {@link Page.evaluate} except it's run
|
|
552
|
+
* within the context of the `frame`, rather than the entire page.
|
|
553
|
+
*
|
|
554
|
+
* @param pageFunction - a function that is run within the frame
|
|
555
|
+
* @param args - arguments to be passed to the pageFunction
|
|
556
|
+
*/
|
|
557
|
+
async evaluate(pageFunction, ...args) {
|
|
558
|
+
return this._mainWorld.evaluate(pageFunction, ...args);
|
|
559
|
+
}
|
|
560
|
+
/**
|
|
561
|
+
* This method queries the frame for the given selector.
|
|
562
|
+
*
|
|
563
|
+
* @param selector - a selector to query for.
|
|
564
|
+
* @returns A promise which resolves to an `ElementHandle` pointing at the
|
|
565
|
+
* element, or `null` if it was not found.
|
|
566
|
+
*/
|
|
567
|
+
async $(selector) {
|
|
568
|
+
return this._mainWorld.$(selector);
|
|
569
|
+
}
|
|
570
|
+
/**
|
|
571
|
+
* This method evaluates the given XPath expression and returns the results.
|
|
572
|
+
*
|
|
573
|
+
* @param expression - the XPath expression to evaluate.
|
|
574
|
+
*/
|
|
575
|
+
async $x(expression) {
|
|
576
|
+
return this._mainWorld.$x(expression);
|
|
577
|
+
}
|
|
578
|
+
/**
|
|
579
|
+
* @remarks
|
|
580
|
+
*
|
|
581
|
+
* This method runs `document.querySelector` within
|
|
582
|
+
* the frame and passes it as the first argument to `pageFunction`.
|
|
583
|
+
*
|
|
584
|
+
* If `pageFunction` returns a Promise, then `frame.$eval` would wait for
|
|
585
|
+
* the promise to resolve and return its value.
|
|
586
|
+
*
|
|
587
|
+
* @example
|
|
588
|
+
*
|
|
589
|
+
* ```js
|
|
590
|
+
* const searchValue = await frame.$eval('#search', el => el.value);
|
|
591
|
+
* ```
|
|
592
|
+
*
|
|
593
|
+
* @param selector - the selector to query for
|
|
594
|
+
* @param pageFunction - the function to be evaluated in the frame's context
|
|
595
|
+
* @param args - additional arguments to pass to `pageFuncton`
|
|
596
|
+
*/
|
|
597
|
+
async $eval(selector, pageFunction, ...args) {
|
|
598
|
+
return this._mainWorld.$eval(selector, pageFunction, ...args);
|
|
599
|
+
}
|
|
600
|
+
/**
|
|
601
|
+
* @remarks
|
|
602
|
+
*
|
|
603
|
+
* This method runs `Array.from(document.querySelectorAll(selector))` within
|
|
604
|
+
* the frame and passes it as the first argument to `pageFunction`.
|
|
605
|
+
*
|
|
606
|
+
* If `pageFunction` returns a Promise, then `frame.$$eval` would wait for
|
|
607
|
+
* the promise to resolve and return its value.
|
|
608
|
+
*
|
|
609
|
+
* @example
|
|
610
|
+
*
|
|
611
|
+
* ```js
|
|
612
|
+
* const divsCounts = await frame.$$eval('div', divs => divs.length);
|
|
613
|
+
* ```
|
|
614
|
+
*
|
|
615
|
+
* @param selector - the selector to query for
|
|
616
|
+
* @param pageFunction - the function to be evaluated in the frame's context
|
|
617
|
+
* @param args - additional arguments to pass to `pageFuncton`
|
|
618
|
+
*/
|
|
619
|
+
async $$eval(selector, pageFunction, ...args) {
|
|
620
|
+
return this._mainWorld.$$eval(selector, pageFunction, ...args);
|
|
621
|
+
}
|
|
622
|
+
/**
|
|
623
|
+
* This runs `document.querySelectorAll` in the frame and returns the result.
|
|
624
|
+
*
|
|
625
|
+
* @param selector - a selector to search for
|
|
626
|
+
* @returns An array of element handles pointing to the found frame elements.
|
|
627
|
+
*/
|
|
628
|
+
async $$(selector) {
|
|
629
|
+
return this._mainWorld.$$(selector);
|
|
630
|
+
}
|
|
631
|
+
/**
|
|
632
|
+
* @returns the full HTML contents of the frame, including the doctype.
|
|
633
|
+
*/
|
|
634
|
+
async content() {
|
|
635
|
+
return this._secondaryWorld.content();
|
|
636
|
+
}
|
|
637
|
+
/**
|
|
638
|
+
* Set the content of the frame.
|
|
639
|
+
*
|
|
640
|
+
* @param html - HTML markup to assign to the page.
|
|
641
|
+
* @param options - options to configure how long before timing out and at
|
|
642
|
+
* what point to consider the content setting successful.
|
|
643
|
+
*/
|
|
644
|
+
async setContent(html, options = {}) {
|
|
645
|
+
return this._secondaryWorld.setContent(html, options);
|
|
646
|
+
}
|
|
647
|
+
/**
|
|
648
|
+
* @remarks
|
|
649
|
+
*
|
|
650
|
+
* If the name is empty, it returns the `id` attribute instead.
|
|
651
|
+
*
|
|
652
|
+
* Note: This value is calculated once when the frame is created, and will not
|
|
653
|
+
* update if the attribute is changed later.
|
|
654
|
+
*
|
|
655
|
+
* @returns the frame's `name` attribute as specified in the tag.
|
|
656
|
+
*/
|
|
657
|
+
name() {
|
|
658
|
+
return this._name || '';
|
|
659
|
+
}
|
|
660
|
+
/**
|
|
661
|
+
* @returns the frame's URL.
|
|
662
|
+
*/
|
|
663
|
+
url() {
|
|
664
|
+
return this._url;
|
|
665
|
+
}
|
|
666
|
+
/**
|
|
667
|
+
* @returns the parent `Frame`, if any. Detached and main frames return `null`.
|
|
668
|
+
*/
|
|
669
|
+
parentFrame() {
|
|
670
|
+
return this._parentFrame;
|
|
671
|
+
}
|
|
672
|
+
/**
|
|
673
|
+
* @returns an array of child frames.
|
|
674
|
+
*/
|
|
675
|
+
childFrames() {
|
|
676
|
+
return Array.from(this._childFrames);
|
|
677
|
+
}
|
|
678
|
+
/**
|
|
679
|
+
* @returns `true` if the frame has been detached, or `false` otherwise.
|
|
680
|
+
*/
|
|
681
|
+
isDetached() {
|
|
682
|
+
return this._detached;
|
|
683
|
+
}
|
|
684
|
+
/**
|
|
685
|
+
* Adds a `<script>` tag into the page with the desired url or content.
|
|
686
|
+
*
|
|
687
|
+
* @param options - configure the script to add to the page.
|
|
688
|
+
*
|
|
689
|
+
* @returns a promise that resolves to the added tag when the script's
|
|
690
|
+
* `onload` event fires or when the script content was injected into the
|
|
691
|
+
* frame.
|
|
692
|
+
*/
|
|
693
|
+
async addScriptTag(options) {
|
|
694
|
+
return this._mainWorld.addScriptTag(options);
|
|
695
|
+
}
|
|
696
|
+
/**
|
|
697
|
+
* Adds a `<link rel="stylesheet">` tag into the page with the desired url or
|
|
698
|
+
* a `<style type="text/css">` tag with the content.
|
|
699
|
+
*
|
|
700
|
+
* @param options - configure the CSS to add to the page.
|
|
701
|
+
*
|
|
702
|
+
* @returns a promise that resolves to the added tag when the stylesheets's
|
|
703
|
+
* `onload` event fires or when the CSS content was injected into the
|
|
704
|
+
* frame.
|
|
705
|
+
*/
|
|
706
|
+
async addStyleTag(options) {
|
|
707
|
+
return this._mainWorld.addStyleTag(options);
|
|
708
|
+
}
|
|
709
|
+
/**
|
|
710
|
+
*
|
|
711
|
+
* This method clicks the first element found that matches `selector`.
|
|
712
|
+
*
|
|
713
|
+
* @remarks
|
|
714
|
+
*
|
|
715
|
+
* This method scrolls the element into view if needed, and then uses
|
|
716
|
+
* {@link Page.mouse} to click in the center of the element. If there's no
|
|
717
|
+
* element matching `selector`, the method throws an error.
|
|
718
|
+
*
|
|
719
|
+
* Bear in mind that if `click()` triggers a navigation event and there's a
|
|
720
|
+
* separate `page.waitForNavigation()` promise to be resolved, you may end up
|
|
721
|
+
* with a race condition that yields unexpected results. The correct pattern
|
|
722
|
+
* for click and wait for navigation is the following:
|
|
723
|
+
*
|
|
724
|
+
* ```javascript
|
|
725
|
+
* const [response] = await Promise.all([
|
|
726
|
+
* page.waitForNavigation(waitOptions),
|
|
727
|
+
* frame.click(selector, clickOptions),
|
|
728
|
+
* ]);
|
|
729
|
+
* ```
|
|
730
|
+
* @param selector - the selector to search for to click. If there are
|
|
731
|
+
* multiple elements, the first will be clicked.
|
|
732
|
+
*/
|
|
733
|
+
async click(selector, options = {}) {
|
|
734
|
+
return this._secondaryWorld.click(selector, options);
|
|
735
|
+
}
|
|
736
|
+
/**
|
|
737
|
+
* This method fetches an element with `selector` and focuses it.
|
|
738
|
+
*
|
|
739
|
+
* @remarks
|
|
740
|
+
* If there's no element matching `selector`, the method throws an error.
|
|
741
|
+
*
|
|
742
|
+
* @param selector - the selector for the element to focus. If there are
|
|
743
|
+
* multiple elements, the first will be focused.
|
|
744
|
+
*/
|
|
745
|
+
async focus(selector) {
|
|
746
|
+
return this._secondaryWorld.focus(selector);
|
|
747
|
+
}
|
|
748
|
+
/**
|
|
749
|
+
* This method fetches an element with `selector`, scrolls it into view if
|
|
750
|
+
* needed, and then uses {@link Page.mouse} to hover over the center of the
|
|
751
|
+
* element.
|
|
752
|
+
*
|
|
753
|
+
* @remarks
|
|
754
|
+
* If there's no element matching `selector`, the method throws an
|
|
755
|
+
*
|
|
756
|
+
* @param selector - the selector for the element to hover. If there are
|
|
757
|
+
* multiple elements, the first will be hovered.
|
|
758
|
+
*/
|
|
759
|
+
async hover(selector) {
|
|
760
|
+
return this._secondaryWorld.hover(selector);
|
|
761
|
+
}
|
|
762
|
+
/**
|
|
763
|
+
* Triggers a `change` and `input` event once all the provided options have
|
|
764
|
+
* been selected.
|
|
765
|
+
*
|
|
766
|
+
* @remarks
|
|
767
|
+
*
|
|
768
|
+
* If there's no `<select>` element matching `selector`, the
|
|
769
|
+
* method throws an error.
|
|
770
|
+
*
|
|
771
|
+
* @example
|
|
772
|
+
* ```js
|
|
773
|
+
* frame.select('select#colors', 'blue'); // single selection
|
|
774
|
+
* frame.select('select#colors', 'red', 'green', 'blue'); // multiple selections
|
|
775
|
+
* ```
|
|
776
|
+
*
|
|
777
|
+
* @param selector - a selector to query the frame for
|
|
778
|
+
* @param values - an array of values to select. If the `<select>` has the
|
|
779
|
+
* `multiple` attribute, all values are considered, otherwise only the first
|
|
780
|
+
* one is taken into account.
|
|
781
|
+
* @returns the list of values that were successfully selected.
|
|
782
|
+
*/
|
|
783
|
+
select(selector, ...values) {
|
|
784
|
+
return this._secondaryWorld.select(selector, ...values);
|
|
785
|
+
}
|
|
786
|
+
/**
|
|
787
|
+
* This method fetches an element with `selector`, scrolls it into view if
|
|
788
|
+
* needed, and then uses {@link Page.touchscreen} to tap in the center of the
|
|
789
|
+
* element.
|
|
790
|
+
*
|
|
791
|
+
* @remarks
|
|
792
|
+
*
|
|
793
|
+
* If there's no element matching `selector`, the method throws an error.
|
|
794
|
+
*
|
|
795
|
+
* @param selector - the selector to tap.
|
|
796
|
+
* @returns a promise that resolves when the element has been tapped.
|
|
797
|
+
*/
|
|
798
|
+
async tap(selector) {
|
|
799
|
+
return this._secondaryWorld.tap(selector);
|
|
800
|
+
}
|
|
801
|
+
/**
|
|
802
|
+
* Sends a `keydown`, `keypress`/`input`, and `keyup` event for each character
|
|
803
|
+
* in the text.
|
|
804
|
+
*
|
|
805
|
+
* @remarks
|
|
806
|
+
* To press a special key, like `Control` or `ArrowDown`, use
|
|
807
|
+
* {@link Keyboard.press}.
|
|
808
|
+
*
|
|
809
|
+
* @example
|
|
810
|
+
* ```js
|
|
811
|
+
* await frame.type('#mytextarea', 'Hello'); // Types instantly
|
|
812
|
+
* await frame.type('#mytextarea', 'World', {delay: 100}); // Types slower, like a user
|
|
813
|
+
* ```
|
|
814
|
+
*
|
|
815
|
+
* @param selector - the selector for the element to type into. If there are
|
|
816
|
+
* multiple the first will be used.
|
|
817
|
+
* @param text - text to type into the element
|
|
818
|
+
* @param options - takes one option, `delay`, which sets the time to wait
|
|
819
|
+
* between key presses in milliseconds. Defaults to `0`.
|
|
820
|
+
*
|
|
821
|
+
* @returns a promise that resolves when the typing is complete.
|
|
822
|
+
*/
|
|
823
|
+
async type(selector, text, options) {
|
|
824
|
+
return this._mainWorld.type(selector, text, options);
|
|
825
|
+
}
|
|
826
|
+
/**
|
|
827
|
+
* @remarks
|
|
828
|
+
*
|
|
829
|
+
* This method behaves differently depending on the first parameter. If it's a
|
|
830
|
+
* `string`, it will be treated as a `selector` or `xpath` (if the string
|
|
831
|
+
* starts with `//`). This method then is a shortcut for
|
|
832
|
+
* {@link Frame.waitForSelector} or {@link Frame.waitForXPath}.
|
|
833
|
+
*
|
|
834
|
+
* If the first argument is a function this method is a shortcut for
|
|
835
|
+
* {@link Frame.waitForFunction}.
|
|
836
|
+
*
|
|
837
|
+
* If the first argument is a `number`, it's treated as a timeout in
|
|
838
|
+
* milliseconds and the method returns a promise which resolves after the
|
|
839
|
+
* timeout.
|
|
840
|
+
*
|
|
841
|
+
* @param selectorOrFunctionOrTimeout - a selector, predicate or timeout to
|
|
842
|
+
* wait for.
|
|
843
|
+
* @param options - optional waiting parameters.
|
|
844
|
+
* @param args - arguments to pass to `pageFunction`.
|
|
845
|
+
*
|
|
846
|
+
* @deprecated Don't use this method directly. Instead use the more explicit
|
|
847
|
+
* methods available: {@link Frame.waitForSelector},
|
|
848
|
+
* {@link Frame.waitForXPath}, {@link Frame.waitForFunction} or
|
|
849
|
+
* {@link Frame.waitForTimeout}.
|
|
850
|
+
*/
|
|
851
|
+
waitFor(selectorOrFunctionOrTimeout, options = {}, ...args) {
|
|
852
|
+
console.warn('waitFor is deprecated and will be removed in a future release. See https://github.com/puppeteer/puppeteer/issues/6214 for details and how to migrate your code.');
|
|
853
|
+
if (helper_js_1.helper.isString(selectorOrFunctionOrTimeout)) {
|
|
854
|
+
const string = selectorOrFunctionOrTimeout;
|
|
855
|
+
if (xPathPattern.test(string))
|
|
856
|
+
return this.waitForXPath(string, options);
|
|
857
|
+
return this.waitForSelector(string, options);
|
|
858
|
+
}
|
|
859
|
+
if (helper_js_1.helper.isNumber(selectorOrFunctionOrTimeout))
|
|
860
|
+
return new Promise((fulfill) => setTimeout(fulfill, selectorOrFunctionOrTimeout));
|
|
861
|
+
if (typeof selectorOrFunctionOrTimeout === 'function')
|
|
862
|
+
return this.waitForFunction(selectorOrFunctionOrTimeout, options, ...args);
|
|
863
|
+
return Promise.reject(new Error('Unsupported target type: ' + typeof selectorOrFunctionOrTimeout));
|
|
864
|
+
}
|
|
865
|
+
/**
|
|
866
|
+
* Causes your script to wait for the given number of milliseconds.
|
|
867
|
+
*
|
|
868
|
+
* @remarks
|
|
869
|
+
* It's generally recommended to not wait for a number of seconds, but instead
|
|
870
|
+
* use {@link Frame.waitForSelector}, {@link Frame.waitForXPath} or
|
|
871
|
+
* {@link Frame.waitForFunction} to wait for exactly the conditions you want.
|
|
872
|
+
*
|
|
873
|
+
* @example
|
|
874
|
+
*
|
|
875
|
+
* Wait for 1 second:
|
|
876
|
+
*
|
|
877
|
+
* ```
|
|
878
|
+
* await frame.waitForTimeout(1000);
|
|
879
|
+
* ```
|
|
880
|
+
*
|
|
881
|
+
* @param milliseconds - the number of milliseconds to wait.
|
|
882
|
+
*/
|
|
883
|
+
waitForTimeout(milliseconds) {
|
|
884
|
+
return new Promise((resolve) => {
|
|
885
|
+
setTimeout(resolve, milliseconds);
|
|
886
|
+
});
|
|
887
|
+
}
|
|
888
|
+
/**
|
|
889
|
+
* @remarks
|
|
890
|
+
*
|
|
891
|
+
*
|
|
892
|
+
* Wait for the `selector` to appear in page. If at the moment of calling the
|
|
893
|
+
* method the `selector` already exists, the method will return immediately.
|
|
894
|
+
* If the selector doesn't appear after the `timeout` milliseconds of waiting,
|
|
895
|
+
* the function will throw.
|
|
896
|
+
*
|
|
897
|
+
* This method works across navigations.
|
|
898
|
+
*
|
|
899
|
+
* @example
|
|
900
|
+
* ```js
|
|
901
|
+
* const puppeteer = require('puppeteer');
|
|
902
|
+
*
|
|
903
|
+
* (async () => {
|
|
904
|
+
* const browser = await puppeteer.launch();
|
|
905
|
+
* const page = await browser.newPage();
|
|
906
|
+
* let currentURL;
|
|
907
|
+
* page.mainFrame()
|
|
908
|
+
* .waitForSelector('img')
|
|
909
|
+
* .then(() => console.log('First URL with image: ' + currentURL));
|
|
910
|
+
*
|
|
911
|
+
* for (currentURL of ['https://example.com', 'https://google.com', 'https://bbc.com']) {
|
|
912
|
+
* await page.goto(currentURL);
|
|
913
|
+
* }
|
|
914
|
+
* await browser.close();
|
|
915
|
+
* })();
|
|
916
|
+
* ```
|
|
917
|
+
* @param selector - the selector to wait for.
|
|
918
|
+
* @param options - options to define if the element should be visible and how
|
|
919
|
+
* long to wait before timing out.
|
|
920
|
+
* @returns a promise which resolves when an element matching the selector
|
|
921
|
+
* string is added to the DOM.
|
|
922
|
+
*/
|
|
923
|
+
async waitForSelector(selector, options = {}) {
|
|
924
|
+
const handle = await this._secondaryWorld.waitForSelector(selector, options);
|
|
925
|
+
if (!handle)
|
|
926
|
+
return null;
|
|
927
|
+
const mainExecutionContext = await this._mainWorld.executionContext();
|
|
928
|
+
const result = await mainExecutionContext._adoptElementHandle(handle);
|
|
929
|
+
await handle.dispose();
|
|
930
|
+
return result;
|
|
931
|
+
}
|
|
932
|
+
/**
|
|
933
|
+
* @remarks
|
|
934
|
+
* Wait for the `xpath` to appear in page. If at the moment of calling the
|
|
935
|
+
* method the `xpath` already exists, the method will return immediately. If
|
|
936
|
+
* the xpath doesn't appear after the `timeout` milliseconds of waiting, the
|
|
937
|
+
* function will throw.
|
|
938
|
+
*
|
|
939
|
+
* For a code example, see the example for {@link Frame.waitForSelector}. That
|
|
940
|
+
* function behaves identically other than taking a CSS selector rather than
|
|
941
|
+
* an XPath.
|
|
942
|
+
*
|
|
943
|
+
* @param xpath - the XPath expression to wait for.
|
|
944
|
+
* @param options - options to configure the visiblity of the element and how
|
|
945
|
+
* long to wait before timing out.
|
|
946
|
+
*/
|
|
947
|
+
async waitForXPath(xpath, options = {}) {
|
|
948
|
+
const handle = await this._secondaryWorld.waitForXPath(xpath, options);
|
|
949
|
+
if (!handle)
|
|
950
|
+
return null;
|
|
951
|
+
const mainExecutionContext = await this._mainWorld.executionContext();
|
|
952
|
+
const result = await mainExecutionContext._adoptElementHandle(handle);
|
|
953
|
+
await handle.dispose();
|
|
954
|
+
return result;
|
|
955
|
+
}
|
|
956
|
+
/**
|
|
957
|
+
* @remarks
|
|
958
|
+
*
|
|
959
|
+
* @example
|
|
960
|
+
*
|
|
961
|
+
* The `waitForFunction` can be used to observe viewport size change:
|
|
962
|
+
* ```js
|
|
963
|
+
* const puppeteer = require('puppeteer');
|
|
964
|
+
*
|
|
965
|
+
* (async () => {
|
|
966
|
+
* . const browser = await puppeteer.launch();
|
|
967
|
+
* . const page = await browser.newPage();
|
|
968
|
+
* . const watchDog = page.mainFrame().waitForFunction('window.innerWidth < 100');
|
|
969
|
+
* . page.setViewport({width: 50, height: 50});
|
|
970
|
+
* . await watchDog;
|
|
971
|
+
* . await browser.close();
|
|
972
|
+
* })();
|
|
973
|
+
* ```
|
|
974
|
+
*
|
|
975
|
+
* To pass arguments from Node.js to the predicate of `page.waitForFunction` function:
|
|
976
|
+
*
|
|
977
|
+
* ```js
|
|
978
|
+
* const selector = '.foo';
|
|
979
|
+
* await frame.waitForFunction(
|
|
980
|
+
* selector => !!document.querySelector(selector),
|
|
981
|
+
* {}, // empty options object
|
|
982
|
+
* selector
|
|
983
|
+
*);
|
|
984
|
+
* ```
|
|
985
|
+
*
|
|
986
|
+
* @param pageFunction - the function to evaluate in the frame context.
|
|
987
|
+
* @param options - options to configure the polling method and timeout.
|
|
988
|
+
* @param args - arguments to pass to the `pageFunction`.
|
|
989
|
+
* @returns the promise which resolve when the `pageFunction` returns a truthy value.
|
|
990
|
+
*/
|
|
991
|
+
waitForFunction(pageFunction, options = {}, ...args) {
|
|
992
|
+
return this._mainWorld.waitForFunction(pageFunction, options, ...args);
|
|
993
|
+
}
|
|
994
|
+
/**
|
|
995
|
+
* @returns the frame's title.
|
|
996
|
+
*/
|
|
997
|
+
async title() {
|
|
998
|
+
return this._secondaryWorld.title();
|
|
999
|
+
}
|
|
1000
|
+
/**
|
|
1001
|
+
* @internal
|
|
1002
|
+
*/
|
|
1003
|
+
_navigated(framePayload) {
|
|
1004
|
+
this._name = framePayload.name;
|
|
1005
|
+
this._url = `${framePayload.url}${framePayload.urlFragment || ''}`;
|
|
1006
|
+
}
|
|
1007
|
+
/**
|
|
1008
|
+
* @internal
|
|
1009
|
+
*/
|
|
1010
|
+
_navigatedWithinDocument(url) {
|
|
1011
|
+
this._url = url;
|
|
1012
|
+
}
|
|
1013
|
+
/**
|
|
1014
|
+
* @internal
|
|
1015
|
+
*/
|
|
1016
|
+
_onLifecycleEvent(loaderId, name) {
|
|
1017
|
+
if (name === 'init') {
|
|
1018
|
+
this._loaderId = loaderId;
|
|
1019
|
+
this._lifecycleEvents.clear();
|
|
1020
|
+
}
|
|
1021
|
+
this._lifecycleEvents.add(name);
|
|
1022
|
+
}
|
|
1023
|
+
/**
|
|
1024
|
+
* @internal
|
|
1025
|
+
*/
|
|
1026
|
+
_onLoadingStopped() {
|
|
1027
|
+
this._lifecycleEvents.add('DOMContentLoaded');
|
|
1028
|
+
this._lifecycleEvents.add('load');
|
|
1029
|
+
}
|
|
1030
|
+
/**
|
|
1031
|
+
* @internal
|
|
1032
|
+
*/
|
|
1033
|
+
_detach() {
|
|
1034
|
+
this._detached = true;
|
|
1035
|
+
this._mainWorld._detach();
|
|
1036
|
+
this._secondaryWorld._detach();
|
|
1037
|
+
if (this._parentFrame)
|
|
1038
|
+
this._parentFrame._childFrames.delete(this);
|
|
1039
|
+
this._parentFrame = null;
|
|
1040
|
+
}
|
|
1041
|
+
}
|
|
1042
|
+
exports.Frame = Frame;
|
|
1043
|
+
function assertNoLegacyNavigationOptions(options) {
|
|
1044
|
+
(0, assert_js_1.assert)(options['networkIdleTimeout'] === undefined, 'ERROR: networkIdleTimeout option is no longer supported.');
|
|
1045
|
+
(0, assert_js_1.assert)(options['networkIdleInflight'] === undefined, 'ERROR: networkIdleInflight option is no longer supported.');
|
|
1046
|
+
(0, assert_js_1.assert)(options.waitUntil !== 'networkidle', 'ERROR: "networkidle" option is no longer supported. Use "networkidle2" instead');
|
|
1047
|
+
}
|
|
1048
1048
|
//# sourceMappingURL=FrameManager.js.map
|