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.
Files changed (710) hide show
  1. checksums.yaml +4 -4
  2. data/lib/isomorfeus/puppetmaster/console_message.rb +18 -18
  3. data/lib/isomorfeus/puppetmaster/cookie.rb +46 -46
  4. data/lib/isomorfeus/puppetmaster/driver/puppeteer.rb +413 -415
  5. data/lib/isomorfeus/puppetmaster/driver/puppeteer_document.rb +953 -953
  6. data/lib/isomorfeus/puppetmaster/driver/puppeteer_node.rb +851 -851
  7. data/lib/isomorfeus/puppetmaster/errors.rb +90 -90
  8. data/lib/isomorfeus/puppetmaster/iframe.rb +16 -16
  9. data/lib/isomorfeus/puppetmaster/node/content_editable.rb +17 -17
  10. data/lib/isomorfeus/puppetmaster/node/input.rb +20 -20
  11. data/lib/isomorfeus/puppetmaster/node/select.rb +35 -35
  12. data/lib/isomorfeus/puppetmaster/node.rb +279 -279
  13. data/lib/isomorfeus/puppetmaster/request.rb +16 -16
  14. data/lib/isomorfeus/puppetmaster/response.rb +25 -25
  15. data/lib/isomorfeus/puppetmaster/self_forwardable.rb +38 -38
  16. data/lib/isomorfeus/puppetmaster/version.rb +3 -3
  17. data/lib/isomorfeus/puppetmaster.rb +85 -85
  18. data/lib/isomorfeus-puppetmaster.rb +1 -0
  19. data/node_modules/.bin/extract-zip +12 -12
  20. data/node_modules/.bin/extract-zip.ps1 +28 -28
  21. data/node_modules/.bin/rimraf +12 -12
  22. data/node_modules/.bin/rimraf.ps1 +28 -28
  23. data/node_modules/.package-lock.json +530 -585
  24. data/node_modules/@types/node/LICENSE +21 -21
  25. data/node_modules/@types/node/assert/strict.d.ts +8 -8
  26. data/node_modules/@types/node/assert.d.ts +912 -912
  27. data/node_modules/@types/node/async_hooks.d.ts +497 -497
  28. data/node_modules/@types/node/buffer.d.ts +2142 -2142
  29. data/node_modules/@types/node/child_process.d.ts +1355 -1355
  30. data/node_modules/@types/node/cluster.d.ts +414 -414
  31. data/node_modules/@types/node/console.d.ts +407 -407
  32. data/node_modules/@types/node/constants.d.ts +18 -18
  33. data/node_modules/@types/node/crypto.d.ts +3224 -3224
  34. data/node_modules/@types/node/dgram.d.ts +545 -545
  35. data/node_modules/@types/node/diagnostics_channel.d.ts +128 -128
  36. data/node_modules/@types/node/dns/promises.d.ts +357 -357
  37. data/node_modules/@types/node/dns.d.ts +643 -643
  38. data/node_modules/@types/node/domain.d.ts +169 -169
  39. data/node_modules/@types/node/events.d.ts +623 -623
  40. data/node_modules/@types/node/fs/promises.d.ts +997 -997
  41. data/node_modules/@types/node/fs.d.ts +3723 -3723
  42. data/node_modules/@types/node/globals.d.ts +285 -285
  43. data/node_modules/@types/node/globals.global.d.ts +1 -1
  44. data/node_modules/@types/node/http.d.ts +1358 -1358
  45. data/node_modules/@types/node/http2.d.ts +2100 -2100
  46. data/node_modules/@types/node/https.d.ts +391 -391
  47. data/node_modules/@types/node/index.d.ts +131 -131
  48. data/node_modules/@types/node/inspector.d.ts +2738 -2738
  49. data/node_modules/@types/node/module.d.ts +114 -114
  50. data/node_modules/@types/node/net.d.ts +783 -783
  51. data/node_modules/@types/node/os.d.ts +455 -455
  52. data/node_modules/@types/node/package.json +229 -229
  53. data/node_modules/@types/node/path.d.ts +172 -172
  54. data/node_modules/@types/node/perf_hooks.d.ts +555 -555
  55. data/node_modules/@types/node/process.d.ts +1477 -1477
  56. data/node_modules/@types/node/punycode.d.ts +117 -117
  57. data/node_modules/@types/node/querystring.d.ts +131 -131
  58. data/node_modules/@types/node/readline.d.ts +542 -542
  59. data/node_modules/@types/node/repl.d.ts +424 -424
  60. data/node_modules/@types/node/stream/consumers.d.ts +24 -24
  61. data/node_modules/@types/node/stream/promises.d.ts +42 -42
  62. data/node_modules/@types/node/stream/web.d.ts +6 -6
  63. data/node_modules/@types/node/stream.d.ts +1181 -1181
  64. data/node_modules/@types/node/string_decoder.d.ts +67 -67
  65. data/node_modules/@types/node/timers/promises.d.ts +68 -68
  66. data/node_modules/@types/node/timers.d.ts +94 -94
  67. data/node_modules/@types/node/tls.d.ts +1019 -1019
  68. data/node_modules/@types/node/trace_events.d.ts +161 -161
  69. data/node_modules/@types/node/tty.d.ts +206 -206
  70. data/node_modules/@types/node/url.d.ts +798 -798
  71. data/node_modules/@types/node/util.d.ts +1556 -1556
  72. data/node_modules/@types/node/v8.d.ts +378 -378
  73. data/node_modules/@types/node/vm.d.ts +504 -504
  74. data/node_modules/@types/node/wasi.d.ts +153 -153
  75. data/node_modules/@types/node/worker_threads.d.ts +649 -649
  76. data/node_modules/@types/node/zlib.d.ts +517 -517
  77. data/node_modules/@types/yauzl/LICENSE +21 -21
  78. data/node_modules/@types/yauzl/index.d.ts +98 -98
  79. data/node_modules/@types/yauzl/package.json +26 -26
  80. data/node_modules/agent-base/README.md +145 -145
  81. data/node_modules/agent-base/dist/src/index.d.ts +78 -78
  82. data/node_modules/agent-base/dist/src/index.js +202 -202
  83. data/node_modules/agent-base/dist/src/promisify.d.ts +4 -4
  84. data/node_modules/agent-base/dist/src/promisify.js +17 -17
  85. data/node_modules/agent-base/package.json +64 -64
  86. data/node_modules/agent-base/src/index.ts +345 -345
  87. data/node_modules/agent-base/src/promisify.ts +33 -33
  88. data/node_modules/balanced-match/.github/FUNDING.yml +2 -2
  89. data/node_modules/balanced-match/LICENSE.md +21 -21
  90. data/node_modules/balanced-match/README.md +97 -97
  91. data/node_modules/balanced-match/index.js +62 -62
  92. data/node_modules/balanced-match/package.json +48 -48
  93. data/node_modules/base64-js/LICENSE +21 -21
  94. data/node_modules/base64-js/README.md +34 -34
  95. data/node_modules/base64-js/index.d.ts +3 -3
  96. data/node_modules/base64-js/index.js +150 -150
  97. data/node_modules/base64-js/package.json +47 -47
  98. data/node_modules/bl/.travis.yml +17 -17
  99. data/node_modules/bl/BufferList.js +396 -396
  100. data/node_modules/bl/LICENSE.md +13 -13
  101. data/node_modules/bl/README.md +247 -247
  102. data/node_modules/bl/bl.js +84 -84
  103. data/node_modules/bl/package.json +37 -37
  104. data/node_modules/bl/test/convert.js +21 -21
  105. data/node_modules/bl/test/indexOf.js +492 -492
  106. data/node_modules/bl/test/isBufferList.js +32 -32
  107. data/node_modules/bl/test/test.js +869 -869
  108. data/node_modules/brace-expansion/LICENSE +21 -21
  109. data/node_modules/brace-expansion/README.md +129 -129
  110. data/node_modules/brace-expansion/index.js +201 -201
  111. data/node_modules/brace-expansion/package.json +47 -47
  112. data/node_modules/buffer/AUTHORS.md +70 -70
  113. data/node_modules/buffer/LICENSE +21 -21
  114. data/node_modules/buffer/README.md +410 -410
  115. data/node_modules/buffer/index.d.ts +186 -186
  116. data/node_modules/buffer/index.js +1817 -1817
  117. data/node_modules/buffer/package.json +96 -96
  118. data/node_modules/buffer-crc32/LICENSE +19 -19
  119. data/node_modules/buffer-crc32/README.md +47 -47
  120. data/node_modules/buffer-crc32/index.js +111 -111
  121. data/node_modules/buffer-crc32/package.json +39 -39
  122. data/node_modules/chownr/LICENSE +15 -15
  123. data/node_modules/chownr/README.md +3 -3
  124. data/node_modules/chownr/chownr.js +167 -167
  125. data/node_modules/chownr/package.json +29 -29
  126. data/node_modules/concat-map/.travis.yml +4 -4
  127. data/node_modules/concat-map/LICENSE +18 -18
  128. data/node_modules/concat-map/README.markdown +62 -62
  129. data/node_modules/concat-map/example/map.js +6 -6
  130. data/node_modules/concat-map/index.js +13 -13
  131. data/node_modules/concat-map/package.json +43 -43
  132. data/node_modules/concat-map/test/map.js +39 -39
  133. data/node_modules/debug/LICENSE +19 -19
  134. data/node_modules/debug/README.md +455 -455
  135. data/node_modules/debug/package.json +59 -59
  136. data/node_modules/debug/src/browser.js +269 -269
  137. data/node_modules/debug/src/common.js +274 -274
  138. data/node_modules/debug/src/index.js +10 -10
  139. data/node_modules/debug/src/node.js +263 -263
  140. data/node_modules/devtools-protocol/LICENSE +27 -27
  141. data/node_modules/devtools-protocol/README.md +12 -12
  142. data/node_modules/devtools-protocol/json/browser_protocol.json +20985 -20640
  143. data/node_modules/devtools-protocol/json/js_protocol.json +3531 -3580
  144. data/node_modules/devtools-protocol/package.json +17 -18
  145. data/node_modules/devtools-protocol/pdl/browser_protocol.pdl +9849 -9637
  146. data/node_modules/devtools-protocol/pdl/js_protocol.pdl +1653 -1678
  147. data/node_modules/devtools-protocol/types/protocol-mapping.d.ts +4333 -4321
  148. data/node_modules/devtools-protocol/types/protocol-proxy-api.d.ts +3695 -3683
  149. data/node_modules/devtools-protocol/types/protocol.d.ts +15714 -15538
  150. data/node_modules/end-of-stream/LICENSE +20 -20
  151. data/node_modules/end-of-stream/README.md +54 -54
  152. data/node_modules/end-of-stream/index.js +94 -94
  153. data/node_modules/end-of-stream/package.json +37 -37
  154. data/node_modules/extract-zip/LICENSE +23 -23
  155. data/node_modules/extract-zip/cli.js +19 -19
  156. data/node_modules/extract-zip/index.d.ts +21 -21
  157. data/node_modules/extract-zip/index.js +173 -173
  158. data/node_modules/extract-zip/package.json +80 -80
  159. data/node_modules/extract-zip/readme.md +57 -57
  160. data/node_modules/fd-slicer/.npmignore +2 -2
  161. data/node_modules/fd-slicer/.travis.yml +7 -7
  162. data/node_modules/fd-slicer/CHANGELOG.md +49 -49
  163. data/node_modules/fd-slicer/LICENSE +21 -21
  164. data/node_modules/fd-slicer/README.md +199 -199
  165. data/node_modules/fd-slicer/index.js +296 -296
  166. data/node_modules/fd-slicer/package.json +36 -36
  167. data/node_modules/fd-slicer/test/test.js +350 -350
  168. data/node_modules/find-up/index.d.ts +137 -137
  169. data/node_modules/find-up/index.js +89 -89
  170. data/node_modules/find-up/license +9 -9
  171. data/node_modules/find-up/package.json +53 -53
  172. data/node_modules/find-up/readme.md +156 -156
  173. data/node_modules/fs-constants/LICENSE +21 -21
  174. data/node_modules/fs-constants/README.md +26 -26
  175. data/node_modules/fs-constants/browser.js +1 -1
  176. data/node_modules/fs-constants/index.js +1 -1
  177. data/node_modules/fs-constants/package.json +19 -19
  178. data/node_modules/fs.realpath/LICENSE +43 -43
  179. data/node_modules/fs.realpath/README.md +33 -33
  180. data/node_modules/fs.realpath/index.js +66 -66
  181. data/node_modules/fs.realpath/old.js +303 -303
  182. data/node_modules/fs.realpath/package.json +26 -26
  183. data/node_modules/get-stream/buffer-stream.js +52 -52
  184. data/node_modules/get-stream/index.d.ts +108 -108
  185. data/node_modules/get-stream/index.js +60 -60
  186. data/node_modules/get-stream/license +9 -9
  187. data/node_modules/get-stream/package.json +50 -50
  188. data/node_modules/get-stream/readme.md +124 -124
  189. data/node_modules/glob/LICENSE +21 -21
  190. data/node_modules/glob/README.md +375 -375
  191. data/node_modules/glob/changelog.md +67 -67
  192. data/node_modules/glob/common.js +234 -234
  193. data/node_modules/glob/glob.js +788 -788
  194. data/node_modules/glob/package.json +51 -51
  195. data/node_modules/glob/sync.js +484 -484
  196. data/node_modules/https-proxy-agent/README.md +137 -137
  197. data/node_modules/https-proxy-agent/dist/agent.d.ts +30 -30
  198. data/node_modules/https-proxy-agent/dist/agent.js +179 -179
  199. data/node_modules/https-proxy-agent/dist/index.d.ts +23 -23
  200. data/node_modules/https-proxy-agent/dist/index.js +13 -13
  201. data/node_modules/https-proxy-agent/dist/parse-proxy-response.d.ts +7 -7
  202. data/node_modules/https-proxy-agent/dist/parse-proxy-response.js +65 -65
  203. data/node_modules/https-proxy-agent/package.json +56 -56
  204. data/node_modules/ieee754/LICENSE +11 -11
  205. data/node_modules/ieee754/README.md +51 -51
  206. data/node_modules/ieee754/index.d.ts +9 -9
  207. data/node_modules/ieee754/index.js +85 -85
  208. data/node_modules/ieee754/package.json +52 -52
  209. data/node_modules/inflight/LICENSE +15 -15
  210. data/node_modules/inflight/README.md +37 -37
  211. data/node_modules/inflight/inflight.js +54 -54
  212. data/node_modules/inflight/package.json +29 -29
  213. data/node_modules/inherits/LICENSE +16 -16
  214. data/node_modules/inherits/README.md +42 -42
  215. data/node_modules/inherits/inherits.js +9 -9
  216. data/node_modules/inherits/inherits_browser.js +27 -27
  217. data/node_modules/inherits/package.json +29 -29
  218. data/node_modules/locate-path/index.d.ts +83 -83
  219. data/node_modules/locate-path/index.js +65 -65
  220. data/node_modules/locate-path/license +9 -9
  221. data/node_modules/locate-path/package.json +45 -45
  222. data/node_modules/locate-path/readme.md +122 -122
  223. data/node_modules/minimatch/LICENSE +15 -15
  224. data/node_modules/minimatch/README.md +209 -209
  225. data/node_modules/minimatch/minimatch.js +923 -923
  226. data/node_modules/minimatch/package.json +30 -30
  227. data/node_modules/mkdirp-classic/LICENSE +21 -21
  228. data/node_modules/mkdirp-classic/README.md +18 -18
  229. data/node_modules/mkdirp-classic/index.js +98 -98
  230. data/node_modules/mkdirp-classic/package.json +18 -18
  231. data/node_modules/ms/index.js +162 -162
  232. data/node_modules/ms/license.md +21 -21
  233. data/node_modules/ms/package.json +37 -37
  234. data/node_modules/ms/readme.md +60 -60
  235. data/node_modules/node-fetch/LICENSE.md +22 -22
  236. data/node_modules/node-fetch/README.md +590 -590
  237. data/node_modules/node-fetch/browser.js +24 -24
  238. data/node_modules/node-fetch/lib/index.es.js +1662 -1662
  239. data/node_modules/node-fetch/lib/index.js +1671 -1671
  240. data/node_modules/node-fetch/lib/index.mjs +1660 -1660
  241. data/node_modules/node-fetch/package.json +68 -68
  242. data/node_modules/once/LICENSE +15 -15
  243. data/node_modules/once/README.md +79 -79
  244. data/node_modules/once/once.js +42 -42
  245. data/node_modules/once/package.json +33 -33
  246. data/node_modules/p-limit/index.d.ts +38 -38
  247. data/node_modules/p-limit/index.js +57 -57
  248. data/node_modules/p-limit/license +9 -9
  249. data/node_modules/p-limit/package.json +52 -52
  250. data/node_modules/p-limit/readme.md +101 -101
  251. data/node_modules/p-locate/index.d.ts +64 -64
  252. data/node_modules/p-locate/index.js +52 -52
  253. data/node_modules/p-locate/license +9 -9
  254. data/node_modules/p-locate/package.json +53 -53
  255. data/node_modules/p-locate/readme.md +90 -90
  256. data/node_modules/p-try/index.d.ts +39 -39
  257. data/node_modules/p-try/index.js +9 -9
  258. data/node_modules/p-try/license +9 -9
  259. data/node_modules/p-try/package.json +42 -42
  260. data/node_modules/p-try/readme.md +58 -58
  261. data/node_modules/path-exists/index.d.ts +28 -28
  262. data/node_modules/path-exists/index.js +23 -23
  263. data/node_modules/path-exists/license +9 -9
  264. data/node_modules/path-exists/package.json +39 -39
  265. data/node_modules/path-exists/readme.md +52 -52
  266. data/node_modules/path-is-absolute/index.js +20 -20
  267. data/node_modules/path-is-absolute/license +21 -21
  268. data/node_modules/path-is-absolute/package.json +43 -43
  269. data/node_modules/path-is-absolute/readme.md +59 -59
  270. data/node_modules/pend/LICENSE +23 -23
  271. data/node_modules/pend/README.md +41 -41
  272. data/node_modules/pend/index.js +55 -55
  273. data/node_modules/pend/package.json +18 -18
  274. data/node_modules/pend/test.js +137 -137
  275. data/node_modules/pkg-dir/index.d.ts +44 -44
  276. data/node_modules/pkg-dir/index.js +17 -17
  277. data/node_modules/pkg-dir/license +9 -9
  278. data/node_modules/pkg-dir/package.json +56 -56
  279. data/node_modules/pkg-dir/readme.md +66 -66
  280. data/node_modules/progress/CHANGELOG.md +115 -115
  281. data/node_modules/progress/LICENSE +22 -22
  282. data/node_modules/progress/Makefile +8 -8
  283. data/node_modules/progress/Readme.md +146 -146
  284. data/node_modules/progress/index.js +1 -1
  285. data/node_modules/progress/lib/node-progress.js +236 -236
  286. data/node_modules/progress/package.json +26 -26
  287. data/node_modules/proxy-from-env/.eslintrc +29 -29
  288. data/node_modules/proxy-from-env/.travis.yml +10 -10
  289. data/node_modules/proxy-from-env/LICENSE +20 -20
  290. data/node_modules/proxy-from-env/README.md +131 -131
  291. data/node_modules/proxy-from-env/index.js +108 -108
  292. data/node_modules/proxy-from-env/package.json +34 -34
  293. data/node_modules/proxy-from-env/test.js +483 -483
  294. data/node_modules/pump/.travis.yml +5 -5
  295. data/node_modules/pump/LICENSE +20 -20
  296. data/node_modules/pump/README.md +65 -65
  297. data/node_modules/pump/index.js +82 -82
  298. data/node_modules/pump/package.json +24 -24
  299. data/node_modules/pump/test-browser.js +66 -66
  300. data/node_modules/pump/test-node.js +53 -53
  301. data/node_modules/puppeteer-core/CHANGELOG.md +319 -290
  302. data/node_modules/puppeteer-core/LICENSE +202 -202
  303. data/node_modules/puppeteer-core/README.md +481 -481
  304. data/node_modules/puppeteer-core/cjs-entry-core.js +29 -29
  305. data/node_modules/puppeteer-core/cjs-entry.js +29 -29
  306. data/node_modules/puppeteer-core/install.js +89 -89
  307. data/node_modules/puppeteer-core/lib/cjs/puppeteer/api-docs-entry.d.ts +110 -110
  308. data/node_modules/puppeteer-core/lib/cjs/puppeteer/api-docs-entry.js +80 -80
  309. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Accessibility.d.ts +175 -175
  310. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Accessibility.js +360 -360
  311. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/AriaQueryHandler.d.ts +20 -20
  312. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/AriaQueryHandler.js +84 -84
  313. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/AriaQueryHandler.js.map +1 -1
  314. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Browser.d.ts +455 -455
  315. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Browser.js +540 -540
  316. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/BrowserConnector.d.ts +53 -53
  317. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/BrowserConnector.js +97 -97
  318. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/BrowserWebSocketTransport.d.ts +25 -25
  319. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/BrowserWebSocketTransport.js +34 -34
  320. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Connection.d.ts +135 -135
  321. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Connection.js +298 -298
  322. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/ConnectionTransport.d.ts +24 -24
  323. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/ConnectionTransport.js +17 -17
  324. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/ConsoleMessage.d.ts +72 -72
  325. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/ConsoleMessage.js +64 -64
  326. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Coverage.d.ts +204 -204
  327. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Coverage.js +335 -335
  328. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/DOMWorld.d.ts +175 -175
  329. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/DOMWorld.js +662 -662
  330. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Debug.d.ts +52 -52
  331. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Debug.js +81 -81
  332. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/DeviceDescriptors.d.ts +40 -40
  333. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/DeviceDescriptors.js +1070 -1070
  334. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Dialog.d.ts +74 -74
  335. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Dialog.js +97 -97
  336. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/EmulationManager.d.ts +24 -24
  337. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/EmulationManager.js +37 -37
  338. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Errors.d.ts +50 -50
  339. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Errors.js +56 -56
  340. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/EvalTypes.d.ts +60 -60
  341. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/EvalTypes.js +17 -17
  342. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/EventEmitter.d.ts +92 -92
  343. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/EventEmitter.js +116 -116
  344. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Events.d.ts +81 -81
  345. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Events.js +86 -86
  346. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/ExecutionContext.d.ts +193 -193
  347. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/ExecutionContext.js +321 -321
  348. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/FileChooser.d.ts +58 -58
  349. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/FileChooser.js +71 -71
  350. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/FrameManager.d.ts +744 -744
  351. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/FrameManager.js +1047 -1047
  352. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/FrameManager.js.map +1 -1
  353. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/HTTPRequest.d.ts +350 -345
  354. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/HTTPRequest.d.ts.map +1 -1
  355. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/HTTPRequest.js +549 -549
  356. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/HTTPRequest.js.map +1 -1
  357. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/HTTPResponse.d.ts +134 -125
  358. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/HTTPResponse.d.ts.map +1 -1
  359. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/HTTPResponse.js +184 -164
  360. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/HTTPResponse.js.map +1 -1
  361. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Input.d.ts +358 -358
  362. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Input.js +543 -543
  363. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/JSHandle.d.ts +490 -490
  364. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/JSHandle.js +827 -827
  365. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/LifecycleWatcher.d.ts +65 -65
  366. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/LifecycleWatcher.d.ts.map +1 -1
  367. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/LifecycleWatcher.js +149 -148
  368. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/LifecycleWatcher.js.map +1 -1
  369. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/NetworkConditions.d.ts +26 -26
  370. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/NetworkConditions.js +33 -33
  371. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/NetworkManager.d.ts +126 -97
  372. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/NetworkManager.d.ts.map +1 -1
  373. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/NetworkManager.js +467 -342
  374. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/NetworkManager.js.map +1 -1
  375. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/PDFOptions.d.ts +161 -161
  376. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/PDFOptions.js +34 -34
  377. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Page.d.ts +2055 -2055
  378. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Page.js +2533 -2533
  379. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Product.d.ts +20 -20
  380. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Product.js +17 -17
  381. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Puppeteer.d.ts +159 -159
  382. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Puppeteer.js +161 -161
  383. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/PuppeteerViewport.d.ts +51 -51
  384. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/PuppeteerViewport.js +2 -2
  385. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/QueryHandler.d.ts +64 -64
  386. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/QueryHandler.js +165 -165
  387. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/SecurityDetails.d.ts +60 -60
  388. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/SecurityDetails.js +76 -76
  389. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Target.d.ts +100 -100
  390. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Target.js +145 -145
  391. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/TaskQueue.d.ts +20 -20
  392. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/TaskQueue.js +29 -29
  393. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/TimeoutSettings.d.ts +27 -27
  394. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/TimeoutSettings.js +47 -47
  395. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Tracing.d.ts +46 -46
  396. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/Tracing.js +109 -109
  397. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/USKeyboardLayout.d.ts +39 -39
  398. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/USKeyboardLayout.js +406 -406
  399. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/WebWorker.d.ts +98 -98
  400. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/WebWorker.js +112 -112
  401. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/assert.d.ts +22 -22
  402. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/assert.js +33 -33
  403. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/fetch.d.ts +16 -16
  404. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/fetch.js +43 -43
  405. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/helper.d.ts +84 -84
  406. data/node_modules/puppeteer-core/lib/cjs/puppeteer/common/helper.js +327 -327
  407. data/node_modules/puppeteer-core/lib/cjs/puppeteer/environment.d.ts +16 -16
  408. data/node_modules/puppeteer-core/lib/cjs/puppeteer/environment.js +19 -19
  409. data/node_modules/puppeteer-core/lib/cjs/puppeteer/global.d.ts +16 -16
  410. data/node_modules/puppeteer-core/lib/cjs/puppeteer/global.js +2 -2
  411. data/node_modules/puppeteer-core/lib/cjs/puppeteer/initialize-node.d.ts +17 -17
  412. data/node_modules/puppeteer-core/lib/cjs/puppeteer/initialize-node.js +44 -44
  413. data/node_modules/puppeteer-core/lib/cjs/puppeteer/initialize-web.d.ts +17 -17
  414. data/node_modules/puppeteer-core/lib/cjs/puppeteer/initialize-web.js +26 -26
  415. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/BrowserFetcher.d.ts +133 -133
  416. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/BrowserFetcher.js +500 -500
  417. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/BrowserRunner.d.ts +40 -39
  418. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/BrowserRunner.d.ts.map +1 -1
  419. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/BrowserRunner.js +256 -230
  420. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/BrowserRunner.js.map +1 -1
  421. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/LaunchOptions.d.ts +134 -134
  422. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/LaunchOptions.js +17 -17
  423. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/Launcher.d.ts +16 -16
  424. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/Launcher.d.ts.map +1 -1
  425. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/Launcher.js +655 -588
  426. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/Launcher.js.map +1 -1
  427. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/NodeWebSocketTransport.d.ts +26 -26
  428. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/NodeWebSocketTransport.js +47 -47
  429. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/PipeTransport.d.ts +29 -29
  430. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/PipeTransport.js +64 -64
  431. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/Puppeteer.d.ts +153 -153
  432. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/Puppeteer.js +188 -188
  433. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/install.d.ts +17 -17
  434. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node/install.js +173 -173
  435. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node-puppeteer-core.d.ts +17 -17
  436. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node-puppeteer-core.js +24 -24
  437. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node.d.ts +17 -17
  438. data/node_modules/puppeteer-core/lib/cjs/puppeteer/node.js +23 -23
  439. data/node_modules/puppeteer-core/lib/cjs/puppeteer/revisions.d.ts +21 -21
  440. data/node_modules/puppeteer-core/lib/cjs/puppeteer/revisions.js +22 -22
  441. data/node_modules/puppeteer-core/lib/cjs/puppeteer/web.d.ts +17 -17
  442. data/node_modules/puppeteer-core/lib/cjs/puppeteer/web.js +23 -23
  443. data/node_modules/puppeteer-core/lib/cjs/vendor/mitt/src/index.d.ts +27 -27
  444. data/node_modules/puppeteer-core/lib/cjs/vendor/mitt/src/index.js +56 -56
  445. data/node_modules/puppeteer-core/lib/esm/puppeteer/api-docs-entry.d.ts +110 -110
  446. data/node_modules/puppeteer-core/lib/esm/puppeteer/api-docs-entry.js +80 -80
  447. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Accessibility.d.ts +175 -175
  448. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Accessibility.js +356 -356
  449. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/AriaQueryHandler.d.ts +20 -20
  450. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/AriaQueryHandler.js +81 -81
  451. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/AriaQueryHandler.js.map +1 -1
  452. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Browser.d.ts +455 -455
  453. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Browser.js +535 -535
  454. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/BrowserConnector.d.ts +53 -53
  455. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/BrowserConnector.js +74 -74
  456. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/BrowserWebSocketTransport.d.ts +25 -25
  457. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/BrowserWebSocketTransport.js +30 -30
  458. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Connection.d.ts +135 -135
  459. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Connection.js +293 -293
  460. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/ConnectionTransport.d.ts +24 -24
  461. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/ConnectionTransport.js +16 -16
  462. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/ConsoleMessage.d.ts +72 -72
  463. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/ConsoleMessage.js +60 -60
  464. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Coverage.d.ts +204 -204
  465. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Coverage.js +329 -329
  466. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/DOMWorld.d.ts +175 -175
  467. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/DOMWorld.js +657 -657
  468. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Debug.d.ts +52 -52
  469. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Debug.js +77 -77
  470. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/DeviceDescriptors.d.ts +40 -40
  471. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/DeviceDescriptors.js +1067 -1067
  472. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Dialog.d.ts +74 -74
  473. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Dialog.js +93 -93
  474. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/EmulationManager.d.ts +24 -24
  475. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/EmulationManager.js +33 -33
  476. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Errors.d.ts +50 -50
  477. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Errors.js +50 -50
  478. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/EvalTypes.d.ts +60 -60
  479. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/EvalTypes.js +16 -16
  480. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/EventEmitter.d.ts +92 -92
  481. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/EventEmitter.js +109 -109
  482. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Events.d.ts +81 -81
  483. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Events.js +83 -83
  484. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/ExecutionContext.d.ts +193 -193
  485. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/ExecutionContext.js +317 -317
  486. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/FileChooser.d.ts +58 -58
  487. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/FileChooser.js +67 -67
  488. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/FrameManager.d.ts +744 -744
  489. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/FrameManager.js +1042 -1042
  490. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/FrameManager.js.map +1 -1
  491. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/HTTPRequest.d.ts +350 -345
  492. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/HTTPRequest.d.ts.map +1 -1
  493. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/HTTPRequest.js +545 -545
  494. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/HTTPRequest.js.map +1 -1
  495. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/HTTPResponse.d.ts +134 -125
  496. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/HTTPResponse.d.ts.map +1 -1
  497. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/HTTPResponse.js +180 -160
  498. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/HTTPResponse.js.map +1 -1
  499. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Input.d.ts +358 -358
  500. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Input.js +537 -537
  501. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/JSHandle.d.ts +490 -490
  502. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/JSHandle.js +802 -802
  503. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/LifecycleWatcher.d.ts +65 -65
  504. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/LifecycleWatcher.d.ts.map +1 -1
  505. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/LifecycleWatcher.js +145 -144
  506. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/LifecycleWatcher.js.map +1 -1
  507. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/NetworkConditions.d.ts +26 -26
  508. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/NetworkConditions.js +30 -30
  509. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/NetworkManager.d.ts +126 -97
  510. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/NetworkManager.d.ts.map +1 -1
  511. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/NetworkManager.js +463 -338
  512. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/NetworkManager.js.map +1 -1
  513. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/PDFOptions.d.ts +161 -161
  514. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/PDFOptions.js +31 -31
  515. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Page.d.ts +2055 -2055
  516. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Page.js +2529 -2529
  517. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Product.d.ts +20 -20
  518. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Product.js +16 -16
  519. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Puppeteer.d.ts +159 -159
  520. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Puppeteer.js +157 -157
  521. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/PuppeteerViewport.d.ts +51 -51
  522. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/PuppeteerViewport.js +1 -1
  523. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/QueryHandler.d.ts +64 -64
  524. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/QueryHandler.js +157 -157
  525. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/SecurityDetails.d.ts +60 -60
  526. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/SecurityDetails.js +72 -72
  527. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Target.d.ts +100 -100
  528. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Target.js +141 -141
  529. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/TaskQueue.d.ts +20 -20
  530. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/TaskQueue.js +25 -25
  531. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/TimeoutSettings.d.ts +27 -27
  532. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/TimeoutSettings.js +43 -43
  533. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Tracing.d.ts +46 -46
  534. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/Tracing.js +105 -105
  535. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/USKeyboardLayout.d.ts +39 -39
  536. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/USKeyboardLayout.js +403 -403
  537. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/WebWorker.d.ts +98 -98
  538. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/WebWorker.js +108 -108
  539. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/assert.d.ts +22 -22
  540. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/assert.js +28 -28
  541. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/fetch.d.ts +16 -16
  542. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/fetch.js +20 -20
  543. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/helper.d.ts +84 -84
  544. data/node_modules/puppeteer-core/lib/esm/puppeteer/common/helper.js +305 -305
  545. data/node_modules/puppeteer-core/lib/esm/puppeteer/environment.d.ts +16 -16
  546. data/node_modules/puppeteer-core/lib/esm/puppeteer/environment.js +16 -16
  547. data/node_modules/puppeteer-core/lib/esm/puppeteer/global.d.ts +16 -16
  548. data/node_modules/puppeteer-core/lib/esm/puppeteer/global.js +1 -1
  549. data/node_modules/puppeteer-core/lib/esm/puppeteer/initialize-node.d.ts +17 -17
  550. data/node_modules/puppeteer-core/lib/esm/puppeteer/initialize-node.js +37 -37
  551. data/node_modules/puppeteer-core/lib/esm/puppeteer/initialize-web.d.ts +17 -17
  552. data/node_modules/puppeteer-core/lib/esm/puppeteer/initialize-web.js +22 -22
  553. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/BrowserFetcher.d.ts +133 -133
  554. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/BrowserFetcher.js +474 -474
  555. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/BrowserRunner.d.ts +40 -39
  556. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/BrowserRunner.d.ts.map +1 -1
  557. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/BrowserRunner.js +230 -204
  558. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/BrowserRunner.js.map +1 -1
  559. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/LaunchOptions.d.ts +134 -134
  560. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/LaunchOptions.js +16 -16
  561. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/Launcher.d.ts +16 -16
  562. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/Launcher.d.ts.map +1 -1
  563. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/Launcher.js +633 -566
  564. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/Launcher.js.map +1 -1
  565. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/NodeWebSocketTransport.d.ts +26 -26
  566. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/NodeWebSocketTransport.js +40 -40
  567. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/PipeTransport.d.ts +29 -29
  568. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/PipeTransport.js +60 -60
  569. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/Puppeteer.d.ts +153 -153
  570. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/Puppeteer.js +181 -181
  571. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/install.d.ts +17 -17
  572. data/node_modules/puppeteer-core/lib/esm/puppeteer/node/install.js +165 -165
  573. data/node_modules/puppeteer-core/lib/esm/puppeteer/node-puppeteer-core.d.ts +17 -17
  574. data/node_modules/puppeteer-core/lib/esm/puppeteer/node-puppeteer-core.js +22 -22
  575. data/node_modules/puppeteer-core/lib/esm/puppeteer/node.d.ts +17 -17
  576. data/node_modules/puppeteer-core/lib/esm/puppeteer/node.js +21 -21
  577. data/node_modules/puppeteer-core/lib/esm/puppeteer/revisions.d.ts +21 -21
  578. data/node_modules/puppeteer-core/lib/esm/puppeteer/revisions.js +19 -19
  579. data/node_modules/puppeteer-core/lib/esm/puppeteer/web.d.ts +17 -17
  580. data/node_modules/puppeteer-core/lib/esm/puppeteer/web.js +21 -21
  581. data/node_modules/puppeteer-core/lib/esm/vendor/mitt/src/index.d.ts +27 -27
  582. data/node_modules/puppeteer-core/lib/esm/vendor/mitt/src/index.js +53 -53
  583. data/node_modules/puppeteer-core/lib/types.d.ts +67 -25
  584. data/node_modules/puppeteer-core/package.json +115 -115
  585. data/node_modules/puppeteer-core/typescript-if-required.js +61 -61
  586. data/node_modules/readable-stream/CONTRIBUTING.md +38 -38
  587. data/node_modules/readable-stream/GOVERNANCE.md +136 -136
  588. data/node_modules/readable-stream/LICENSE +47 -47
  589. data/node_modules/readable-stream/README.md +106 -106
  590. data/node_modules/readable-stream/errors-browser.js +127 -127
  591. data/node_modules/readable-stream/errors.js +116 -116
  592. data/node_modules/readable-stream/experimentalWarning.js +17 -17
  593. data/node_modules/readable-stream/lib/_stream_duplex.js +138 -138
  594. data/node_modules/readable-stream/lib/_stream_passthrough.js +38 -38
  595. data/node_modules/readable-stream/lib/_stream_readable.js +1123 -1123
  596. data/node_modules/readable-stream/lib/_stream_transform.js +200 -200
  597. data/node_modules/readable-stream/lib/_stream_writable.js +696 -696
  598. data/node_modules/readable-stream/lib/internal/streams/async_iterator.js +206 -206
  599. data/node_modules/readable-stream/lib/internal/streams/buffer_list.js +209 -209
  600. data/node_modules/readable-stream/lib/internal/streams/destroy.js +104 -104
  601. data/node_modules/readable-stream/lib/internal/streams/end-of-stream.js +103 -103
  602. data/node_modules/readable-stream/lib/internal/streams/from-browser.js +3 -3
  603. data/node_modules/readable-stream/lib/internal/streams/from.js +63 -63
  604. data/node_modules/readable-stream/lib/internal/streams/pipeline.js +96 -96
  605. data/node_modules/readable-stream/lib/internal/streams/state.js +26 -26
  606. data/node_modules/readable-stream/lib/internal/streams/stream-browser.js +1 -1
  607. data/node_modules/readable-stream/lib/internal/streams/stream.js +1 -1
  608. data/node_modules/readable-stream/package.json +68 -68
  609. data/node_modules/readable-stream/readable-browser.js +9 -9
  610. data/node_modules/readable-stream/readable.js +16 -16
  611. data/node_modules/rimraf/CHANGELOG.md +65 -65
  612. data/node_modules/rimraf/LICENSE +15 -15
  613. data/node_modules/rimraf/README.md +101 -101
  614. data/node_modules/rimraf/bin.js +68 -68
  615. data/node_modules/rimraf/package.json +32 -32
  616. data/node_modules/rimraf/rimraf.js +360 -360
  617. data/node_modules/safe-buffer/LICENSE +21 -21
  618. data/node_modules/safe-buffer/README.md +584 -584
  619. data/node_modules/safe-buffer/index.d.ts +186 -186
  620. data/node_modules/safe-buffer/index.js +65 -65
  621. data/node_modules/safe-buffer/package.json +51 -51
  622. data/node_modules/string_decoder/LICENSE +48 -48
  623. data/node_modules/string_decoder/README.md +47 -47
  624. data/node_modules/string_decoder/lib/string_decoder.js +295 -295
  625. data/node_modules/string_decoder/package.json +34 -34
  626. data/node_modules/tar-fs/.travis.yml +6 -6
  627. data/node_modules/tar-fs/LICENSE +20 -20
  628. data/node_modules/tar-fs/README.md +165 -165
  629. data/node_modules/tar-fs/index.js +351 -351
  630. data/node_modules/tar-fs/package.json +41 -41
  631. data/node_modules/tar-fs/test/fixtures/a/hello.txt +1 -1
  632. data/node_modules/tar-fs/test/fixtures/b/a/test.txt +1 -1
  633. data/node_modules/tar-fs/test/index.js +346 -346
  634. data/node_modules/tar-stream/LICENSE +20 -20
  635. data/node_modules/tar-stream/README.md +168 -168
  636. data/node_modules/tar-stream/extract.js +257 -257
  637. data/node_modules/tar-stream/headers.js +295 -295
  638. data/node_modules/tar-stream/index.js +2 -2
  639. data/node_modules/tar-stream/pack.js +255 -255
  640. data/node_modules/tar-stream/package.json +58 -58
  641. data/node_modules/tar-stream/sandbox.js +11 -11
  642. data/node_modules/through/.travis.yml +5 -5
  643. data/node_modules/through/LICENSE.APACHE2 +15 -15
  644. data/node_modules/through/LICENSE.MIT +24 -24
  645. data/node_modules/through/index.js +108 -108
  646. data/node_modules/through/package.json +36 -36
  647. data/node_modules/through/readme.markdown +64 -64
  648. data/node_modules/through/test/async.js +28 -28
  649. data/node_modules/through/test/auto-destroy.js +30 -30
  650. data/node_modules/through/test/buffering.js +71 -71
  651. data/node_modules/through/test/end.js +45 -45
  652. data/node_modules/through/test/index.js +133 -133
  653. data/node_modules/tr46/.npmignore +4 -4
  654. data/node_modules/tr46/index.js +193 -193
  655. data/node_modules/tr46/package.json +31 -31
  656. data/node_modules/unbzip2-stream/LICENSE +24 -24
  657. data/node_modules/unbzip2-stream/README.md +59 -59
  658. data/node_modules/unbzip2-stream/dist/unbzip2-stream.min.js +1 -1
  659. data/node_modules/unbzip2-stream/index.js +93 -93
  660. data/node_modules/unbzip2-stream/lib/bit_iterator.js +39 -39
  661. data/node_modules/unbzip2-stream/lib/bzip2.js +365 -365
  662. data/node_modules/unbzip2-stream/package.json +51 -51
  663. data/node_modules/util-deprecate/History.md +16 -16
  664. data/node_modules/util-deprecate/LICENSE +24 -24
  665. data/node_modules/util-deprecate/README.md +53 -53
  666. data/node_modules/util-deprecate/browser.js +67 -67
  667. data/node_modules/util-deprecate/node.js +6 -6
  668. data/node_modules/util-deprecate/package.json +27 -27
  669. data/node_modules/webidl-conversions/LICENSE.md +12 -12
  670. data/node_modules/webidl-conversions/README.md +53 -53
  671. data/node_modules/webidl-conversions/lib/index.js +189 -189
  672. data/node_modules/webidl-conversions/package.json +23 -23
  673. data/node_modules/whatwg-url/LICENSE.txt +21 -21
  674. data/node_modules/whatwg-url/README.md +67 -67
  675. data/node_modules/whatwg-url/lib/URL-impl.js +200 -200
  676. data/node_modules/whatwg-url/lib/URL.js +196 -196
  677. data/node_modules/whatwg-url/lib/public-api.js +11 -11
  678. data/node_modules/whatwg-url/lib/utils.js +20 -20
  679. data/node_modules/whatwg-url/package.json +32 -32
  680. data/node_modules/wrappy/LICENSE +15 -15
  681. data/node_modules/wrappy/README.md +36 -36
  682. data/node_modules/wrappy/package.json +29 -29
  683. data/node_modules/wrappy/wrappy.js +33 -33
  684. data/node_modules/ws/LICENSE +19 -19
  685. data/node_modules/ws/README.md +493 -493
  686. data/node_modules/ws/browser.js +8 -8
  687. data/node_modules/ws/index.js +13 -13
  688. data/node_modules/ws/lib/buffer-util.js +126 -126
  689. data/node_modules/ws/lib/constants.js +12 -12
  690. data/node_modules/ws/lib/event-target.js +266 -266
  691. data/node_modules/ws/lib/extension.js +203 -203
  692. data/node_modules/ws/lib/limiter.js +55 -55
  693. data/node_modules/ws/lib/permessage-deflate.js +511 -511
  694. data/node_modules/ws/lib/receiver.js +612 -612
  695. data/node_modules/ws/lib/sender.js +422 -422
  696. data/node_modules/ws/lib/stream.js +180 -180
  697. data/node_modules/ws/lib/subprotocol.js +62 -62
  698. data/node_modules/ws/lib/validation.js +124 -124
  699. data/node_modules/ws/lib/websocket-server.js +485 -485
  700. data/node_modules/ws/lib/websocket.js +1149 -1149
  701. data/node_modules/ws/package.json +61 -61
  702. data/node_modules/ws/wrapper.mjs +8 -8
  703. data/node_modules/yauzl/LICENSE +21 -21
  704. data/node_modules/yauzl/README.md +658 -658
  705. data/node_modules/yauzl/index.js +796 -796
  706. data/node_modules/yauzl/package.json +40 -40
  707. data/package.json +1 -1
  708. metadata +23 -25
  709. data/node_modules/devtools-protocol/changelog.md +0 -10491
  710. data/node_modules/devtools-protocol/externs/protocol_externs.js +0 -9734
@@ -1,953 +1,953 @@
1
- module Isomorfeus
2
- module Puppetmaster
3
- module Driver
4
- module PuppeteerDocument
5
- def document_accept_alert(document, **options, &block)
6
- # TODO maybe wrap in mutex
7
- text = options.key?(:text) ? "`#{options[:text]}`" : 'null'
8
- @context.exec <<~JAVASCRIPT
9
- ModalText = #{text};
10
- AllPageHandles[#{document.handle}].on('dialog', DialogAcceptHandler);
11
- JAVASCRIPT
12
- block.call
13
- sleep @reaction_timeout
14
- @context.eval 'ModalText'
15
- ensure
16
- matched = await <<~JAVASCRIPT
17
- LastResult = ModalTextMatched;
18
- ModalTextMatched = false;
19
- ModalText = null;
20
- AllPageHandles[#{document.handle}].removeListener('dialog', DialogAcceptHandler);
21
- JAVASCRIPT
22
- raise Isomorfeus::Puppetmaster::NoModalError if options.key?(:text) && !matched
23
- end
24
-
25
- def document_accept_confirm(document, **options, &block)
26
- # TODO maybe wrap in mutex
27
- text = options.key?(:text) ? "`#{options[:text]}`" : 'null'
28
- @context.exec <<~JAVASCRIPT
29
- ModalText = #{text};
30
- AllPageHandles[#{document.handle}].on('dialog', DialogAcceptHandler);
31
- JAVASCRIPT
32
- block.call
33
- sleep @reaction_timeout
34
- @context.eval 'ModalText'
35
- ensure
36
- matched = await <<~JAVASCRIPT
37
- LastResult = ModalTextMatched;
38
- ModalTextMatched = false;
39
- ModalText = null;
40
- AllPageHandles[#{document.handle}].removeListener('dialog', DialogAcceptHandler);
41
- JAVASCRIPT
42
- raise Isomorfeus::Puppetmaster::NoModalError if options.key?(:text) && !matched
43
- end
44
-
45
- def document_accept_leave_page(document, **options, &block)
46
- # TODO maybe wrap in mutex
47
- text = options.key?(:text) ? "`#{options[:text]}`" : 'null'
48
- @context.exec <<~JAVASCRIPT
49
- ModalText = #{text};
50
- AllPageHandles[#{document.handle}].on('dialog', DialogAcceptHandler);
51
- JAVASCRIPT
52
- block.call
53
- sleep @reaction_timeout
54
- @context.eval 'ModalText'
55
- ensure
56
- matched = await <<~JAVASCRIPT
57
- LastResult = ModalTextMatched;
58
- ModalTextMatched = false;
59
- ModalText = null;
60
- AllPageHandles[#{document.handle}].removeListener('dialog', DialogAcceptHandler);
61
- JAVASCRIPT
62
- raise Isomorfeus::Puppetmaster::NoModalError if options.key?(:text) && !matched
63
- end
64
-
65
- def document_accept_prompt(document, **options, &block)
66
- # TODO maybe wrap in mutex
67
- text = options.key?(:text) ? "`#{options[:text]}`" : 'null'
68
- @context.exec <<~JAVASCRIPT
69
- ModalText = #{text};
70
- AllPageHandles[#{document.handle}].on('dialog', DialogAcceptHandler);
71
- JAVASCRIPT
72
- block.call
73
- sleep @reaction_timeout
74
- @context.eval 'ModalText'
75
- ensure
76
- matched = await <<~JAVASCRIPT
77
- LastResult = ModalTextMatched;
78
- ModalTextMatched = false;
79
- ModalText = null;
80
- AllPageHandles[#{document.handle}].removeListener('dialog', DialogAcceptHandler);
81
- JAVASCRIPT
82
- raise Isomorfeus::Puppetmaster::NoModalError if options.key?(:text) && !matched
83
- end
84
-
85
- def document_all_text(document)
86
- await("LastResult = AllPageHandles[#{document.handle}].evaluate(function(){ return document.documentElement.textContent; });")
87
- end
88
-
89
- def document_body(document)
90
- node_data = await <<~JAVASCRIPT
91
- var element_handle = await AllPageHandles[#{document.handle}].$('body');
92
- if (element_handle) {
93
- var node_handle = RegisterElementHandle(element_handle);
94
- var tt = await AllElementHandles[node_handle].executionContext().evaluate((node) => {
95
- var name = node.nodeName;
96
- var tag = node.tagName.toLowerCase();
97
- return [name, tag, null, node.isContentEditable];
98
- }, AllElementHandles[node_handle]);
99
- LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
100
- }
101
- JAVASCRIPT
102
- if node_data
103
- node_data[:css_selector] = 'body'
104
- Isomorfeus::Puppetmaster::Node.new_by_tag(self, document, node_data)
105
- end
106
- end
107
-
108
- def document_bring_to_front(document)
109
- await("await AllPageHandles[#{document.handle}].bringToFront();")
110
- end
111
-
112
- def document_clear_authentication_credentials(document)
113
- await("AllPageHandles[#{document.handle}].authenticate(null);")
114
- end
115
-
116
- def document_clear_cookies(document)
117
- await <<~JAVASCRIPT
118
- var cookies = await AllPageHandles[#{document.handle}].cookies();
119
- cookies.forEach(async(cookie) => {await AllPageHandles[#{document.handle}].deleteCookie(cookie);});
120
- JAVASCRIPT
121
- end
122
-
123
- def document_clear_extra_headers(document)
124
- await ("AllPageHandles[#{document.handle}].setExtraHTTPHeaders({});")
125
- end
126
-
127
- def document_clear_url_blacklist(document)
128
- await <<~JAVASCRIPT
129
- var cdp_session = await AllPageHandles[#{document.handle}].target().createCDPSession();
130
- await cdp_session.send('Network.setBlockedURLs', {urls: []});
131
- await cdp_session.detach();
132
- JAVASCRIPT
133
- end
134
-
135
- def document_click(document, x: nil, y: nil, modifiers: nil)
136
- # modifier_keys: :alt, :control, :meta, :shift
137
- # await "await AllPageHandles[#{document.handle}].mouse.click(#{x},#{y},{button: 'left'});"
138
- # raise Isomorfeus::Pupppetmaster::InvalidActionError.new(:click) unless visible?
139
- modifiers = [modifiers] if modifiers.is_a?(Symbol)
140
- modifiers = [] unless modifiers
141
- modifiers = modifiers.map {|key| key.to_s.camelize(:lower) }
142
- await <<~JAVASCRIPT
143
- var response_event_occurred = false;
144
- var response_handler = function(event){ response_event_occurred = true; };
145
- var response_watcher = new Promise(function(resolve, reject){
146
- setTimeout(function(){
147
- if (!response_event_occurred) { resolve(true); }
148
- else { setTimeout(function(){ resolve(true); }, #{@puppeteer_timeout}); }
149
- AllPageHandles[#{document.handle}].removeListener('response', response_handler);
150
- }, #{@puppeteer_reaction_timeout});
151
- });
152
- AllPageHandles[#{document.handle}].on('response', response_handler);
153
- var navigation_watcher = AllPageHandles[#{document.handle}].waitForNavigation();
154
- await AllPageHandles[#{document.handle}].evaluate(function(){
155
- var options = {button: 0, bubbles: true, cancelable: true};
156
- var node = window;
157
- var x = #{x ? x : 'null'};
158
- var y = #{y ? y : 'null'};
159
- var modifiers = #{modifiers};
160
- if (x && y) {
161
- options['clientX'] = x;
162
- options['clientY'] = y;
163
- var n = document.elementFromPoint(x, y);
164
- if (n) { node = n };
165
- }
166
- if (modifiers.includes('meta')) { options['metaKey'] = true; }
167
- if (modifiers.includes('control')) { options['ctrlKey'] = true; }
168
- if (modifiers.includes('shift')) { options['shiftKey'] = true; }
169
- if (modifiers.includes('alt')) { options['altKey'] = true; }
170
- node.dispatchEvent(new MouseEvent('mousedown', options));
171
- node.dispatchEvent(new MouseEvent('mouseup', options));
172
- node.dispatchEvent(new MouseEvent('click', options));
173
- });
174
- await Promise.race([response_watcher, navigation_watcher]);
175
- JAVASCRIPT
176
- end
177
-
178
- def document_close(document)
179
- await <<~JAVASCRIPT
180
- await AllPageHandles[#{document.handle}].close();
181
- delete AllPageHandles[#{document.handle}];
182
- delete ConsoleMessages[#{document.handle}];
183
- JAVASCRIPT
184
- end
185
-
186
- def document_console(document)
187
- messages = @context.exec "return ConsoleMessages[#{document.handle}]"
188
- messages.map {|m| Isomorfeus::Puppetmaster::ConsoleMessage.new(m)}
189
- end
190
-
191
- def document_cookies(document)
192
- result = await("LastResult = await AllPageHandles[#{document.handle}].cookies();")
193
- result_hash = {}
194
- result.each { |cookie| result_hash[cookie['name']] = Isomorfeus::Puppetmaster::Cookie.new(cookie) }
195
- result_hash
196
- end
197
-
198
- def document_dismiss_confirm(document, **options, &block)
199
- # TODO
200
- text = options.key?(:text) ? "`#{options[:text]}`" : 'null'
201
- @context.exec <<~JAVASCRIPT
202
- ModalText = #{text};
203
- AllPageHandles[#{document.handle}].on('dialog', DialogDismissHandler);
204
- JAVASCRIPT
205
- block.call
206
- sleep @reaction_timeout
207
- @context.eval 'ModalText'
208
- ensure
209
- matched = await <<~JAVASCRIPT
210
- LastResult = ModalTextMatched;
211
- ModalTextMatched = false;
212
- ModalText = null;
213
- AllPageHandles[#{document.handle}].removeListener('dialog', DialogDismissHandler);
214
- JAVASCRIPT
215
- raise Isomorfeus::Puppetmaster::ModalNotFound if options.key?(:text) && !matched
216
- end
217
-
218
- def document_dismiss_leave_page(document, **options, &block)
219
- # TODO
220
- text = options.key?(:text) ? "`#{options[:text]}`" : 'null'
221
- @context.exec <<~JAVASCRIPT
222
- ModalText = #{text};
223
- AllPageHandles[#{document.handle}].on('dialog', DialogDismissHandler);
224
- JAVASCRIPT
225
- block.call
226
- sleep @reaction_timeout
227
- @context.eval 'ModalText'
228
- ensure
229
- matched = await <<~JAVASCRIPT
230
- LastResult = ModalTextMatched;
231
- ModalTextMatched = false;
232
- ModalText = null;
233
- AllPageHandles[#{document.handle}].removeListener('dialog', DialogDismissHandler);
234
- JAVASCRIPT
235
- raise Isomorfeus::Puppetmaster::ModalNotFound if options.key?(:text) && !matched
236
- end
237
-
238
- def document_dismiss_prompt(document, **options, &block)
239
- # TODO
240
- text = options.key?(:text) ? "`#{options[:text]}`" : 'null'
241
- @context.exec <<~JAVASCRIPT
242
- ModalText = #{text};
243
- AllPageHandles[#{document.handle}].on('dialog', DialogDismissHandler);
244
- JAVASCRIPT
245
- block.call
246
- sleep @reaction_timeout
247
- @context.eval 'ModalText'
248
- ensure
249
- matched = await <<~JAVASCRIPT
250
- LastResult = ModalTextMatched;
251
- ModalTextMatched = false;
252
- ModalText = null;
253
- AllPageHandles[#{document.handle}].removeListener('dialog', DialogDismissHandler);
254
- JAVASCRIPT
255
- raise Isomorfeus::Puppetmaster::ModalNotFound if options.key?(:text) && !matched
256
- end
257
-
258
- def document_dispatch_event(document, name, event_type = nil, **options)
259
- raise ArgumentError, 'Unknown event' unless EVENTS.key?(name.to_sym) || event_type
260
- event_type, opts = *EVENTS[name.to_s.downcase.tr('_', '').to_sym] if event_type.nil?
261
- opts.merge!(options)
262
- await <<~JAVASCRIPT
263
- handle = await AllPageHandles[#{document.handle}].evaluate(function(node){
264
- var event = new #{event_type}('#{name}'#{opts.empty? ? '' : opts});
265
- document.dispatchEvent(event);
266
- });
267
- JAVASCRIPT
268
- end
269
-
270
- def document_double_click(document, x: nil, y: nil, modifiers: nil)
271
- # modifier_keys: :alt, :control, :meta, :shift
272
- modifiers = [modifiers] if modifiers.is_a?(Symbol)
273
- modifiers = [] unless modifiers
274
- modifiers = modifiers.map {|key| key.to_s.camelize(:lower) }
275
- await <<~JAVASCRIPT
276
- var response_event_occurred = false;
277
- var response_handler = function(event){ response_event_occurred = true; };
278
- var response_watcher = new Promise(function(resolve, reject){
279
- setTimeout(function(){
280
- if (!response_event_occurred) { resolve(true); }
281
- else { setTimeout(function(){ resolve(true); }, #{@puppeteer_timeout}); }
282
- AllPageHandles[#{document.handle}].removeListener('response', response_handler);
283
- }, #{@puppeteer_reaction_timeout});
284
- });
285
- AllPageHandlers[#{document.handle}].on('response', response_handler);
286
- var navigation_watcher = AllPageHandles[#{document.handle}].waitForNavigation();
287
- await AllPageHandles[#{document.handle}].evaluate(function(){
288
- var options = {button: 0, bubbles: true, cancelable: true};
289
- var node = window;
290
- var x = #{x ? x : 'null'};
291
- var y = #{y ? y : 'null'};
292
- var modifiers = #{modifiers};
293
- if (x && y) {
294
- options['clientX'] = x;
295
- options['clientY'] = y;
296
- var n = document.elementFromPoint(x, y);
297
- if (n) { node = n };
298
- }
299
- if (modifiers.includes('meta')) { options['metaKey'] = true; }
300
- if (modifiers.includes('control')) { options['ctrlKey'] = true; }
301
- if (modifiers.includes('shift')) { options['shiftKey'] = true; }
302
- if (modifiers.includes('alt')) { options['altKey'] = true; }
303
- node.dispatchEvent(new MouseEvent('mousedown', options));
304
- node.dispatchEvent(new MouseEvent('mouseup', options));
305
- node.dispatchEvent(new MouseEvent('dblclick', options));
306
- });
307
- await Promise.race([response_watcher, navigation_watcher]);
308
- JAVASCRIPT
309
- end
310
-
311
- def document_evaluate_script(document, script, *args)
312
- await <<~JAVASCRIPT
313
- var result = await AllPageHandles[#{document.handle}].evaluate((arguments) => {
314
- try {
315
- var res = (function(arguments) {
316
- return #{script.strip};
317
- })(arguments);
318
- return [res, null];
319
- } catch (err) {
320
- return [null, {name: err.name, message: err.message, stack: err.stack}];
321
- }
322
- }, #{args});
323
- if (result) {
324
- LastResult = result[0];
325
- LastErr = result[1];
326
- }
327
- JAVASCRIPT
328
- end
329
-
330
- def document_execute_script(document, script, *args)
331
- await <<~JAVASCRIPT
332
- var result = await AllPageHandles[#{document.handle}].evaluate((arguments) => {
333
- try {
334
- var res = (function(arguments) {
335
- #{script.strip};
336
- })(arguments);
337
- return [res, null];
338
- } catch (err) {
339
- return [null, {name: err.name, message: err.message, stack: err.stack}];
340
- }
341
- }, #{args});
342
- if (result) {
343
- LastResult = result[0];
344
- LastErr = result[1];
345
- }
346
- JAVASCRIPT
347
- end
348
-
349
- def document_find(document, selector)
350
- js_escaped_selector = selector.gsub('\\', '\\\\\\').gsub('"', '\"')
351
- node_data = await <<~JAVASCRIPT
352
- var element_handle = await AllPageHandles[#{document.handle}].$("#{js_escaped_selector}");
353
- if (element_handle) {
354
- var node_handle = RegisterElementHandle(element_handle);
355
- var tt = await AllPageHandles[#{document.handle}].evaluate((node) => {
356
- var tag = node.tagName ? node.tagName.toLowerCase() : '';
357
- var name = node.nodeName;
358
- var type = null;
359
- if (tag === 'input') { type = node.getAttribute('type'); }
360
- return [name, tag, type, node.isContentEditable];
361
- }, AllElementHandles[node_handle]);
362
- LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
363
- }
364
- JAVASCRIPT
365
- if node_data
366
- node_data[:css_selector] = selector
367
- Isomorfeus::Puppetmaster::Node.new_by_tag(self, document, node_data)
368
- else
369
- raise Isomorfeus::Puppetmaster::ElementNotFound.new(selector)
370
- end
371
- end
372
-
373
- def document_find_all(document, selector)
374
- js_escaped_selector = selector.gsub('\\', '\\\\\\').gsub('"', '\"')
375
- node_data_array = await <<~JAVASCRIPT
376
- var node_data_array = [];
377
- var element_handle_array = await AllPageHandles[#{document.handle}].$$("#{js_escaped_selector}");
378
- if (element_handle_array) {
379
- for (var i=0; i<element_handle_array.length; i++) {
380
- var node_handle = RegisterElementHandle(element_handle_array[i]);
381
- var tt = await AllPageHandles[#{document.handle}].evaluate((node) => {
382
- var tag = node.tagName ? node.tagName.toLowerCase() : '';
383
- var name = node.nodeName;
384
- var type = null;
385
- if (tag === 'input') { type = node.getAttribute('type'); }
386
- return [name, tag, type, node.isContentEditable];
387
- }, AllElementHandles[node_handle]);
388
- node_data_array.push({handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]});
389
- }
390
- }
391
- LastResult = node_data_array;
392
- JAVASCRIPT
393
- node_data_array.map do |node_data|
394
- node_data[:css_selector] = selector
395
- Isomorfeus::Puppetmaster::Node.new_by_tag(self, document, node_data)
396
- end
397
- end
398
-
399
- def document_find_all_xpath(document, query)
400
- js_escaped_query = query.gsub('\\', '\\\\\\').gsub('"', '\"')
401
- node_data_array = await <<~JAVASCRIPT
402
- var node_data_array = [];
403
- var element_handle_array = await AllPageHandles[#{document.handle}].$x("#{js_escaped_query}");
404
- if (element_handle_array) {
405
- for (var i=0; i<element_handle_array.length; i++) {
406
- var node_handle = RegisterElementHandle(element_handle_array[i]);
407
- var tt = await AllPageHandles[#{document.handle}].evaluate((node) => {
408
- var tag = node.tagName ? node.tagName.toLowerCase() : '';
409
- var name = node.nodeName;
410
- var type = null;
411
- if (tag === 'input') { type = node.getAttribute('type'); }
412
- return [name, tag, type, node.isContentEditable];
413
- }, AllElementHandles[node_handle]);
414
- node_data_array.push({handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]});
415
- }
416
- }
417
- LastResult = node_data_array;
418
- JAVASCRIPT
419
- node_data_array.map do |node_data|
420
- node_data[:xpath_query] = query
421
- Isomorfeus::Puppetmaster::Node.new_by_tag(self, document, node_data)
422
- end
423
- end
424
-
425
- def document_find_xpath(document, query)
426
- js_escaped_query = query.gsub('\\', '\\\\\\').gsub('"', '\"')
427
- node_data = await <<~JAVASCRIPT
428
- var element_handle_array = await AllPageHandles[#{document.handle}].$x("#{js_escaped_query}");
429
- var element_handle = (element_handle_array) ? element_handle_array[0] : null;
430
- if (element_handle) {
431
- var node_handle = RegisterElementHandle(element_handle);
432
- var tt = await AllPageHandles[#{document.handle}].evaluate((node) => {
433
- var tag = node.tagName ? node.tagName.toLowerCase() : '';
434
- var name = node.nodeName;
435
- var type = null;
436
- if (tag === 'input') { type = node.getAttribute('type'); }
437
- return [name, tag, type, node.isContentEditable];
438
- }, AllElementHandles[node_handle]);
439
- LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
440
- }
441
- JAVASCRIPT
442
- if node_data
443
- node_data[:xpath_query] = query
444
- Isomorfeus::Puppetmaster::Node.new_by_tag(self, document, node_data)
445
- else
446
- raise Isomorfeus::Puppetmaster::ElementNotFound.new(query)
447
- end
448
- end
449
-
450
- def document_go_back(document)
451
- response_hash, messages = await <<~JAVASCRIPT
452
- ConsoleMessages[#{document.handle}] = [];
453
- var response = await AllPageHandles[#{document.handle}].goBack();
454
- if (response) {
455
- var request = response.request();
456
- var formatted_response = {
457
- headers: response.headers(),
458
- ok: response.ok(),
459
- remote_address: response.remoteAddress(),
460
- request: {
461
- failure: request.failure(),
462
- headers: request.headers(),
463
- method: request.method(),
464
- post_data: request.postData(),
465
- resource_type: request.resourceType(),
466
- url: request.url()
467
- },
468
- status: response.status(),
469
- status_text: response.statusText(),
470
- text: response.text(),
471
- url: response.url()
472
- };
473
- LastResult = [formatted_response, ConsoleMessages[#{document.handle}]];
474
- } else {
475
- LastResult = [null, ConsoleMessages[#{document.handle}]];
476
- }
477
- JAVASCRIPT
478
- con_messages = messages.map {|m| Isomorfeus::Puppetmaster::ConsoleMessage.new(m)}
479
- con_messages.each { |m| raise determine_error({ 'message' => m.text }) if m.level == 'error' && !m.text.start_with?('Failed to load resource:') }
480
- if response_hash
481
- response = Isomorfeus::Puppetmaster::Response.new(response_hash)
482
- document.instance_variable_set(:@response, response)
483
- end
484
- document.response
485
- end
486
-
487
- def document_go_forward(document)
488
- response_hash, messages = await <<~JAVASCRIPT
489
- ConsoleMessages[#{document.handle}] = [];
490
- var response = await AllPageHandles[#{document.handle}].goForward();
491
- if (response) {
492
- var request = response.request();
493
- var formatted_response = {
494
- headers: response.headers(),
495
- ok: response.ok(),
496
- remote_address: response.remoteAddress(),
497
- request: {
498
- failure: request.failure(),
499
- headers: request.headers(),
500
- method: request.method(),
501
- post_data: request.postData(),
502
- resource_type: request.resourceType(),
503
- url: request.url()
504
- },
505
- status: response.status(),
506
- status_text: response.statusText(),
507
- text: response.text(),
508
- url: response.url()
509
- };
510
- LastResult = [formatted_response, ConsoleMessages[#{document.handle}]];
511
- } else {
512
- LastResult = [null, ConsoleMessages[#{document.handle}]];
513
- }
514
- JAVASCRIPT
515
- con_messages = messages.map {|m| Isomorfeus::Puppetmaster::ConsoleMessage.new(m)}
516
- con_messages.each { |m| raise determine_error({ 'message' => m.text }) if m.level == 'error' && !m.text.start_with?('Failed to load resource:') }
517
- if response_hash
518
- response = Isomorfeus::Puppetmaster::Response.new(response_hash)
519
- document.instance_variable_set(:@response, response)
520
- end
521
- document.response
522
- end
523
-
524
- def document_goto(document, uri)
525
- parsed_uri = URI.parse(uri)
526
- parsed_uri.host = @app.host unless parsed_uri.host
527
- parsed_uri.port = @app.port unless parsed_uri.port
528
- parsed_uri.scheme = @app.scheme unless parsed_uri.scheme
529
- response_hash, messages = await <<~JAVASCRIPT
530
- ConsoleMessages[#{document.handle}] = [];
531
- var response = await AllPageHandles[#{document.handle}].goto('#{parsed_uri.to_s}');
532
- if (response) {
533
- var request = response.request();
534
- var formatted_response = {
535
- headers: response.headers(),
536
- ok: response.ok(),
537
- remote_address: response.remoteAddress(),
538
- request: {
539
- failure: request.failure(),
540
- headers: request.headers(),
541
- method: request.method(),
542
- post_data: request.postData(),
543
- resource_type: request.resourceType(),
544
- url: request.url()
545
- },
546
- status: response.status(),
547
- status_text: response.statusText(),
548
- text: response.text(),
549
- url: response.url()
550
- };
551
- LastResult = [formatted_response, ConsoleMessages[#{document.handle}]];
552
- } else {
553
- LastResult = [null, ConsoleMessages[#{document.handle}]];
554
- }
555
- JAVASCRIPT
556
- con_messages = messages.map {|m| Isomorfeus::Puppetmaster::ConsoleMessage.new(m)}
557
- con_messages.each { |m| raise determine_error({ 'message' => m.text }) if m.level == 'error' && !m.text.start_with?('Failed to load resource:') }
558
- if response_hash
559
- response = Isomorfeus::Puppetmaster::Response.new(response_hash)
560
- document.instance_variable_set(:@response, response)
561
- end
562
- document.response
563
- end
564
-
565
- def document_head(document)
566
- node_data = await <<~JAVASCRIPT
567
- var element_handle = await AllPageHandles[#{document.handle}].$('head');
568
- if (element_handle) {
569
- var node_handle = RegisterElementHandle(element_handle);
570
- var tt = await AllElementHandles[node_handle].executionContext().evaluate((node) => {
571
- var name = node.nodeName;
572
- var tag = node.tagName.toLower();
573
- return [name, tag, null, node.isContentEditable];
574
- }, AllElementHandles[node_handle]);
575
- LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
576
- }
577
- JAVASCRIPT
578
- if node_data
579
- node_data[:css_selector] = selector
580
- Isomorfeus::Puppetmaster::Node.new_by_tag(self, document, node_data)
581
- end
582
- end
583
-
584
- def document_html(document)
585
- await "LastResult = await AllPageHandles[#{document.handle}].content();"
586
- end
587
-
588
- def document_open_new_document(_document, uri = nil)
589
- if !uri || uri == 'about:blank'
590
- parsed_uri = 'about:blank'
591
- else
592
- parsed_uri = URI.parse(uri)
593
- parsed_uri.host = @app.host unless parsed_uri.host
594
- parsed_uri.port = @app.port unless parsed_uri.port
595
- parsed_uri.scheme = @app.scheme unless parsed_uri.scheme
596
- end
597
- handle, response_hash, messages = await <<~JAVASCRIPT
598
- var new_page = await CurrentBrowser.newPage();
599
- var url = '#{parsed_uri.to_s}';
600
- new_page.setDefaultTimeout(#{@puppeteer_timeout});
601
- await new_page.setViewport({width: #{@width}, height: #{@height}});
602
- var new_target = new_page.target();
603
- var cdp_session = await new_target.createCDPSession();
604
- await cdp_session.send('Page.setDownloadBehavior', {behavior: 'allow', downloadPath: '#{Isomorfeus::Puppetmaster.download_path}'});
605
- if (#{@url_blacklist}.length > 0) { await cdp_session.send('Network.setBlockedURLs', {urls: #{@url_blacklist}}); }
606
- await cdp_session.detach();
607
- var page_handle = RegisterPage(new_page);
608
- var result_response = null;
609
- if (url && url !== '') {
610
- var response = await new_page.goto(url);
611
- if (response) {
612
- var request = response.request();
613
- result_response = {
614
- headers: response.headers(),
615
- ok: response.ok(),
616
- remote_address: response.remoteAddress(),
617
- request: {
618
- failure: request.failure(),
619
- headers: request.headers(),
620
- method: request.method(),
621
- post_data: request.postData(),
622
- resource_type: request.resourceType(),
623
- url: request.url()
624
- },
625
- status: response.status(),
626
- status_text: response.statusText(),
627
- text: response.text(),
628
- url: response.url()
629
- }
630
- }
631
- };
632
- LastResult = [page_handle, result_response, ConsoleMessages[page_handle]];
633
- JAVASCRIPT
634
- con_messages = messages.map {|m| Isomorfeus::Puppetmaster::ConsoleMessage.new(m)}
635
- con_messages.each { |m| raise determine_error({ 'message' => m.text }) if m.level == 'error' && !m.text.start_with?('Failed to load resource:') }
636
- Isomorfeus::Puppetmaster::Document.new(self, handle, Isomorfeus::Puppetmaster::Response.new(response_hash))
637
- end
638
-
639
- def document_reload(document)
640
- response_hash = await"LastResult = await AllPageHandles[#{document.handle}].reload();"
641
- Isomorfeus::Puppetmaster::Response.new(response_hash)
642
- end
643
-
644
- def document_remove_cookie(document, name)
645
- await "await AllPageHandles[#{document.handle}].deleteCookie({name: '#{name}'})"
646
- end
647
-
648
- def document_render_base64(document, **options)
649
- # todo
650
- # https://pptr.dev/#?product=Puppeteer&version=v1.12.2&show=api-pagescreenshotoptions
651
- final_options = ["encoding: 'base64'"]
652
- if options.key?(:format)
653
- options[:format] = 'jpeg' if options[:format].to_s.downcase == 'jpg'
654
- final_options << "type: '#{options.delete(:format).to_s.downcase}'"
655
- end
656
- final_options << "quality: #{options.delete(:quality)}" if options.key?(:quality)
657
- final_options << "fullPage: #{options.delete(:full)}" if options.key?(:full)
658
- options.each do |k,v|
659
- final_options << "#{k.to_s.camelize(:lower)}: #{v}"
660
- end
661
- await "LastResult = await AllPageHandles[#{document.handle}].screenshot({#{final_options.join(', ')}});"
662
- end
663
-
664
- def document_reset_user_agent(document)
665
- await <<~JAVASCRIPT
666
- var original_user_agent = await CurrentBrowser.userAgent();
667
- await AllPageHandles[#{document.handle}].setUserAgent(original_user_agent);
668
- JAVASCRIPT
669
- end
670
-
671
- def document_right_click(document, x: nil, y: nil, modifiers: nil)
672
- # modifier_keys: :alt, :control, :meta, :shift
673
- # offset: { x: int, y: int }
674
- modifiers = [modifiers] if modifiers.is_a?(Symbol)
675
- modifiers = [] unless modifiers
676
- modifiers = modifiers.map {|key| key.to_s.camelize(:lower) }
677
- await <<~JAVASCRIPT
678
- var response_event_occurred = false;
679
- var response_handler = function(event){ response_event_occurred = true; };
680
- var response_watcher = new Promise(function(resolve, reject){
681
- setTimeout(function(){
682
- if (!response_event_occurred) { resolve(true); }
683
- else { setTimeout(function(){ resolve(true); }, #{@puppeteer_timeout}); }
684
- AllPageHandles[#{document.handle}].removeListener('response', response_handler);
685
- }, #{@puppeteer_reaction_timeout});
686
- });
687
- AllPageHandles[#{document.handle}].on('response', response_handler);
688
- var navigation_watcher = AllPageHandles[#{document.handle}].waitForNavigation();
689
- await AllPageHandles[#{document.handle}].evaluate(function(){
690
- var options = {button: 2, bubbles: true, cancelable: true};
691
- var node = window;
692
- var x = #{x ? x : 'null'};
693
- var y = #{y ? y : 'null'};
694
- var modifiers = #{modifiers};
695
- if (x && y) {
696
- options['clientX'] = x;
697
- options['clientY'] = y;
698
- var n = document.elementFromPoint(x, y);
699
- if (n) { node = n };
700
- }
701
- if (modifiers.includes('meta')) { options['metaKey'] = true; }
702
- if (modifiers.includes('control')) { options['ctrlKey'] = true; }
703
- if (modifiers.includes('shift')) { options['shiftKey'] = true; }
704
- if (modifiers.includes('alt')) { options['altKey'] = true; }
705
- node.dispatchEvent(new MouseEvent('mousedown', options));
706
- node.dispatchEvent(new MouseEvent('mouseup', options));
707
- node.dispatchEvent(new MouseEvent('contextmenu', options));
708
- });
709
- await Promise.race([response_watcher, navigation_watcher]);
710
- JAVASCRIPT
711
- end
712
-
713
- def document_save_pdf(document, path, **options)
714
- # todo
715
- # https://pptr.dev/#?product=Puppeteer&version=v1.12.2&show=api-pagepdfoptions
716
- absolute_path = File.absolute_path(path)
717
- final_options = ["path: '#{absolute_path}'"]
718
- final_options << "format: '#{options.delete(:format)}'" if options.key?(:format)
719
- final_options << "headerTemplate: `#{options.delete(:header_template)}`" if options.key?(:header_template)
720
- final_options << "footerTemplate: `#{options.delete(:footer_template)}`" if options.key?(:footer_template)
721
- final_options << "pageRanges: '#{options.delete(:page_ranges)}'" if options.key?(:page_ranges)
722
- final_options << "width: '#{options.delete(:width)}'" if options.key?(:width)
723
- final_options << "height: '#{options.delete(:height)}'" if options.key?(:height)
724
- options.each do |k,v|
725
- final_options << "#{k.to_s.camelize(:lower)}: #{v}"
726
- end
727
- await "await AllPageHandles[#{document.handle}].pdf({#{final_options.join(', ')}});"
728
- end
729
-
730
- def document_save_screenshot(document, path, **options)
731
- # todo
732
- # https://pptr.dev/#?product=Puppeteer&version=v1.12.2&show=api-pagescreenshotoptions
733
- absolute_path = File.absolute_path(path)
734
- final_options = ["path: '#{absolute_path}'"]
735
- if options.key?(:format)
736
- options[:format] = 'jpeg' if options[:format].to_s.downcase == 'jpg'
737
- final_options << "type: '#{options.delete(:format).to_s.downcase}'"
738
- end
739
- final_options << "quality: #{options.delete(:quality)}" if options.key?(:quality)
740
- final_options << "fullPage: #{options.delete(:full)}" if options.key?(:full)
741
- options.each do |k,v|
742
- final_options << "#{k.to_s.camelize(:lower)}: #{v}"
743
- end
744
- await "await AllPageHandles[#{document.handle}].screenshot({#{final_options.join(', ')}});"
745
- end
746
-
747
- def document_scroll_by(document, x, y)
748
- await "await AllPageHandles[#{document.handle}].evaluate('window.scrollBy(#{x}, #{y})');"
749
- end
750
-
751
- def document_scroll_to(document, x, y)
752
- await "await AllPageHandles[#{document.handle}].evaluate('window.scrollTo(#{x}, #{y})');"
753
- end
754
-
755
- def document_set_authentication_credentials(document, username, password)
756
- await "await AllPageHandles[#{document.handle}].authenticate({username: '#{username}', password: '#{password}'});"
757
- end
758
-
759
- def document_set_cookie(document, name, value, **options)
760
- options[:name] ||= name
761
- options[:value] ||= value
762
- uri = document_url(document)
763
- if uri == 'about:blank'
764
- uri = if Isomorfeus::Puppetmaster.server_host
765
- u = URI.new
766
- u.scheme = Isomorfeus::Puppetmaster.server_scheme if Isomorfeus::Puppetmaster.server_scheme
767
- u.host = Isomorfeus::Puppetmaster.server_host
768
- u.to_s
769
- else
770
- 'http://127.0.0.1'
771
- end
772
- end
773
- options[:domain] ||= URI.parse(uri).host
774
- final_options = []
775
- final_options << "expires: #{options.delete(:expires).to_i}" if options.key?(:expires)
776
- final_options << "httpOnly: #{options.delete(:http_only)}" if options.key?(:http_only)
777
- final_options << "secure: #{options.delete(:secure)}" if options.key?(:secure)
778
- final_options << "sameSite: '#{options.delete(:same_site)}'" if options.key?(:same_site)
779
- options.each do |k,v|
780
- final_options << "#{k}: '#{v}'"
781
- end
782
- await "await AllPageHandles[#{document.handle}].setCookie({#{final_options.join(', ')}});"
783
- end
784
-
785
- def document_set_extra_headers(document, headers_hash)
786
- await "await AllPageHandles[#{document.handle}].setExtraHTTPHeaders(#{Oj.dump(headers_hash, mode: :strict)});"
787
- end
788
-
789
- def document_set_url_blacklist(document, url_array)
790
- # https://www.chromium.org/administrators/url-blacklist-filter-format
791
- @url_blacklist = url_array
792
- await <<~JAVASCRIPT
793
- var cdp_session = await AllPageHandles[#{document.handle}].target().createCDPSession();
794
- await cdp_session.send('Network.setBlockedURLs', {urls: #{url_array}});
795
- await cdp_session.detach();
796
- JAVASCRIPT
797
- end
798
-
799
- def document_set_user_agent(document, agent_string)
800
- await "await AllPageHandles[#{document.handle}].setUserAgent('#{agent_string}');"
801
- end
802
-
803
- def document_title(document)
804
- await "LastResult = await AllPageHandles[#{document.handle}].title();"
805
- end
806
-
807
- def document_type_keys(document, *keys)
808
- cjs = "await AllPageHandles[#{document.handle}].bringToFront();"
809
- top_modifiers = []
810
- keys.each do |key|
811
- if key.is_a?(String)
812
- key.each_char do |c|
813
- need_shift = /[[:upper:]]/.match(c)
814
- cjs << "await AllPageHandles[#{document.handle}].keyboard.down('Shift');\n" if need_shift
815
- c = "Key#{c.upcase}" if /[[:alpha:]]/.match(c)
816
- cjs << "await AllPageHandles[#{document.handle}].keyboard.down('#{c}');\n"
817
- cjs << "await AllPageHandles[#{document.handle}].keyboard.up('#{c}');\n"
818
- cjs << "await AllPageHandles[#{document.handle}].keyboard.up('Shift');\n" if need_shift
819
- end
820
- elsif key.is_a?(Symbol)
821
- if %i[ctrl Ctrl].include?(key)
822
- key = :control
823
- elsif %i[command Command Meta].include?(key)
824
- key = :meta
825
- elsif %i[divide Divide].include?(key)
826
- key = :numpad_divide
827
- elsif %i[decimal Decimal].include?(key)
828
- key = :numpad_decimal
829
- elsif %i[left right up down].include?(key)
830
- key = "arrow_#{key}".to_sym
831
- end
832
- if %i[alt alt_left alt_right control control_left control_rigth meta meta_left meta_right shift shift_left shift_right].include?(key)
833
- top_modifiers << key
834
- cjs << "await AllPageHandles[#{document.handle}].keyboard.down('#{key.to_s.camelize}');\n"
835
- else
836
- cjs << "await AllPageHandles[#{document.handle}].keyboard.press('#{key.to_s.camelize}');\n"
837
- end
838
- elsif key.is_a?(Array)
839
- modifiers = []
840
- key.each do |k|
841
- if k.is_a?(Symbol)
842
- if %i[ctrl Ctrl].include?(k)
843
- k = :control
844
- elsif %i[command Command Meta].include?(k)
845
- k = :meta
846
- elsif %i[divide Divide].include?(k)
847
- k = :numpad_divide
848
- elsif %i[decimal Decimal].include?(k)
849
- k = :numpad_decimal
850
- elsif %i[left right up down].include?(key)
851
- k = "arrow_#{key}".to_sym
852
- end
853
- if %i[alt alt_left alt_right control control_left control_rigth meta meta_left meta_right shift shift_left shift_right].include?(k)
854
- modifiers << k
855
- cjs << "await AllPageHandles[#{document.handle}].keyboard.down('#{k.to_s.camelize}');\n"
856
- else
857
- cjs << "await AllPageHandles[#{document.handle}].keyboard.press('#{k.to_s.camelize}');\n"
858
- end
859
- elsif k.is_a?(String)
860
- k.each_char do |c|
861
- need_shift = /[[:upper:]]/.match(c)
862
- cjs << "await AllPageHandles[#{document.handle}].keyboard.down('Shift');\n" if need_shift
863
- c = "Key#{c.upcase}" if /[[:alpha:]]/.match(c)
864
- cjs << "await AllPageHandles[#{document.handle}].keyboard.press('#{c}');\n"
865
- cjs << "await AllPageHandles[#{document.handle}].keyboard.up('Shift');\n" if need_shift
866
- end
867
- end
868
- end
869
- modifiers.reverse.each do |k|
870
- cjs << "await AllPageHandles[#{document.handle}].keyboard.up('#{k.to_s.camelize}');\n"
871
- end
872
- end
873
- end
874
- top_modifiers.reverse.each do |key|
875
- cjs << "await AllPageHandles[#{document.handle}].keyboard.up('#{key.to_s.camelize}');\n"
876
- end
877
- await(cjs)
878
- end
879
-
880
- def document_url(document)
881
- await "LastResult = await AllPageHandles[#{document.handle}].evaluate('window.location.href');"
882
- end
883
-
884
- def document_user_agent(document)
885
- await "LastResult = await AllPageHandles[#{document.handle}].evaluate('window.navigator.userAgent');"
886
- end
887
-
888
- def document_viewport_maximize(document)
889
- document_viewport_resize(document, @max_width, @max_height)
890
- end
891
-
892
- def document_viewport_resize(document, width, height)
893
- width = @max_width if width > @max_width
894
- height = @max_height if width > @max_height
895
- await "await AllPageHandles[#{document.handle}].setViewport({width: #{width}, height: #{height}});"
896
- end
897
-
898
- def document_viewport_size(document)
899
- viewport = @context.eval "AllPageHandles[#{document.handle}].viewport()"
900
- [viewport['width'], viewport['height']]
901
- end
902
-
903
- def document_wait_for(document, selector)
904
- js_escaped_selector = selector.gsub('\\', '\\\\\\').gsub('"', '\"')
905
- node_data = await <<~JAVASCRIPT
906
- var element_handle = await AllPageHandles[#{document.handle}].waitForSelector("#{js_escaped_selector}");
907
- if (element_handle) {
908
- var node_handle = RegisterElementHandle(element_handle);
909
- var tt = await AllElementHandles[node_handle].executionContext().evaluate((node) => {
910
- var name = node.nodeName;
911
- var tag = node.tagName.toLowerCase();
912
- var type = null;
913
- if (tag === 'input') { type = node.getAttribute('type'); }
914
- return [name, tag, type, node.isContentEditable];
915
- }, AllElementHandles[node_handle]);
916
- LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
917
- }
918
- JAVASCRIPT
919
- if node_data
920
- node_data[:css_selector] = selector
921
- Isomorfeus::Puppetmaster::Node.new_by_tag(self, document, node_data)
922
- else
923
- raise Isomorfeus::Puppetmaster::ElementNotFound.new(selector)
924
- end
925
- end
926
-
927
- def document_wait_for_xpath(document, query)
928
- js_escaped_query = query.gsub('\\', '\\\\\\').gsub('"', '\"')
929
- node_data = await <<~JAVASCRIPT
930
- var element_handle = await AllPageHandles[#{document.handle}].waitForXPath("#{js_escaped_query}");
931
- if (element_handle) {
932
- var node_handle = RegisterElementHandle(element_handle);
933
- var tt = await AllElementHandles[node_handle].executionContext().evaluate((node) => {
934
- var name = node.nodeName;
935
- var tag = node.tagName.toLowerCase();
936
- var type = null;
937
- if (tag === 'input') { type = node.getAttribute('type'); }
938
- return [name, tag, type, node.isContentEditable];
939
- }, AllElementHandles[node_handle]);
940
- LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
941
- }
942
- JAVASCRIPT
943
- if node_data
944
- node_data[:xpath_query] = query
945
- Isomorfeus::Puppetmaster::Node.new_by_tag(self, document, node_data)
946
- else
947
- raise Isomorfeus::Puppetmaster::ElementNotFound.new(selector)
948
- end
949
- end
950
- end
951
- end
952
- end
953
- end
1
+ module Isomorfeus
2
+ module Puppetmaster
3
+ module Driver
4
+ module PuppeteerDocument
5
+ def document_accept_alert(document, **options, &block)
6
+ # TODO maybe wrap in mutex
7
+ text = options.key?(:text) ? "`#{options[:text]}`" : 'null'
8
+ @context.exec <<~JAVASCRIPT
9
+ ModalText = #{text};
10
+ AllPageHandles[#{document.handle}].on('dialog', DialogAcceptHandler);
11
+ JAVASCRIPT
12
+ block.call
13
+ sleep @reaction_timeout
14
+ @context.eval 'ModalText'
15
+ ensure
16
+ matched = await <<~JAVASCRIPT
17
+ LastResult = ModalTextMatched;
18
+ ModalTextMatched = false;
19
+ ModalText = null;
20
+ AllPageHandles[#{document.handle}].removeListener('dialog', DialogAcceptHandler);
21
+ JAVASCRIPT
22
+ raise Isomorfeus::Puppetmaster::NoModalError if options.key?(:text) && !matched
23
+ end
24
+
25
+ def document_accept_confirm(document, **options, &block)
26
+ # TODO maybe wrap in mutex
27
+ text = options.key?(:text) ? "`#{options[:text]}`" : 'null'
28
+ @context.exec <<~JAVASCRIPT
29
+ ModalText = #{text};
30
+ AllPageHandles[#{document.handle}].on('dialog', DialogAcceptHandler);
31
+ JAVASCRIPT
32
+ block.call
33
+ sleep @reaction_timeout
34
+ @context.eval 'ModalText'
35
+ ensure
36
+ matched = await <<~JAVASCRIPT
37
+ LastResult = ModalTextMatched;
38
+ ModalTextMatched = false;
39
+ ModalText = null;
40
+ AllPageHandles[#{document.handle}].removeListener('dialog', DialogAcceptHandler);
41
+ JAVASCRIPT
42
+ raise Isomorfeus::Puppetmaster::NoModalError if options.key?(:text) && !matched
43
+ end
44
+
45
+ def document_accept_leave_page(document, **options, &block)
46
+ # TODO maybe wrap in mutex
47
+ text = options.key?(:text) ? "`#{options[:text]}`" : 'null'
48
+ @context.exec <<~JAVASCRIPT
49
+ ModalText = #{text};
50
+ AllPageHandles[#{document.handle}].on('dialog', DialogAcceptHandler);
51
+ JAVASCRIPT
52
+ block.call
53
+ sleep @reaction_timeout
54
+ @context.eval 'ModalText'
55
+ ensure
56
+ matched = await <<~JAVASCRIPT
57
+ LastResult = ModalTextMatched;
58
+ ModalTextMatched = false;
59
+ ModalText = null;
60
+ AllPageHandles[#{document.handle}].removeListener('dialog', DialogAcceptHandler);
61
+ JAVASCRIPT
62
+ raise Isomorfeus::Puppetmaster::NoModalError if options.key?(:text) && !matched
63
+ end
64
+
65
+ def document_accept_prompt(document, **options, &block)
66
+ # TODO maybe wrap in mutex
67
+ text = options.key?(:text) ? "`#{options[:text]}`" : 'null'
68
+ @context.exec <<~JAVASCRIPT
69
+ ModalText = #{text};
70
+ AllPageHandles[#{document.handle}].on('dialog', DialogAcceptHandler);
71
+ JAVASCRIPT
72
+ block.call
73
+ sleep @reaction_timeout
74
+ @context.eval 'ModalText'
75
+ ensure
76
+ matched = await <<~JAVASCRIPT
77
+ LastResult = ModalTextMatched;
78
+ ModalTextMatched = false;
79
+ ModalText = null;
80
+ AllPageHandles[#{document.handle}].removeListener('dialog', DialogAcceptHandler);
81
+ JAVASCRIPT
82
+ raise Isomorfeus::Puppetmaster::NoModalError if options.key?(:text) && !matched
83
+ end
84
+
85
+ def document_all_text(document)
86
+ await("LastResult = AllPageHandles[#{document.handle}].evaluate(function(){ return document.documentElement.textContent; });")
87
+ end
88
+
89
+ def document_body(document)
90
+ node_data = await <<~JAVASCRIPT
91
+ var element_handle = await AllPageHandles[#{document.handle}].$('body');
92
+ if (element_handle) {
93
+ var node_handle = RegisterElementHandle(element_handle);
94
+ var tt = await AllElementHandles[node_handle].executionContext().evaluate((node) => {
95
+ var name = node.nodeName;
96
+ var tag = node.tagName.toLowerCase();
97
+ return [name, tag, null, node.isContentEditable];
98
+ }, AllElementHandles[node_handle]);
99
+ LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
100
+ }
101
+ JAVASCRIPT
102
+ if node_data
103
+ node_data[:css_selector] = 'body'
104
+ Isomorfeus::Puppetmaster::Node.new_by_tag(self, document, node_data)
105
+ end
106
+ end
107
+
108
+ def document_bring_to_front(document)
109
+ await("await AllPageHandles[#{document.handle}].bringToFront();")
110
+ end
111
+
112
+ def document_clear_authentication_credentials(document)
113
+ await("AllPageHandles[#{document.handle}].authenticate(null);")
114
+ end
115
+
116
+ def document_clear_cookies(document)
117
+ await <<~JAVASCRIPT
118
+ var cookies = await AllPageHandles[#{document.handle}].cookies();
119
+ cookies.forEach(async(cookie) => {await AllPageHandles[#{document.handle}].deleteCookie(cookie);});
120
+ JAVASCRIPT
121
+ end
122
+
123
+ def document_clear_extra_headers(document)
124
+ await ("AllPageHandles[#{document.handle}].setExtraHTTPHeaders({});")
125
+ end
126
+
127
+ def document_clear_url_blacklist(document)
128
+ await <<~JAVASCRIPT
129
+ var cdp_session = await AllPageHandles[#{document.handle}].target().createCDPSession();
130
+ await cdp_session.send('Network.setBlockedURLs', {urls: []});
131
+ await cdp_session.detach();
132
+ JAVASCRIPT
133
+ end
134
+
135
+ def document_click(document, x: nil, y: nil, modifiers: nil)
136
+ # modifier_keys: :alt, :control, :meta, :shift
137
+ # await "await AllPageHandles[#{document.handle}].mouse.click(#{x},#{y},{button: 'left'});"
138
+ # raise Isomorfeus::Pupppetmaster::InvalidActionError.new(:click) unless visible?
139
+ modifiers = [modifiers] if modifiers.is_a?(Symbol)
140
+ modifiers = [] unless modifiers
141
+ modifiers = modifiers.map {|key| key.to_s.camelize(:lower) }
142
+ await <<~JAVASCRIPT
143
+ var response_event_occurred = false;
144
+ var response_handler = function(event){ response_event_occurred = true; };
145
+ var response_watcher = new Promise(function(resolve, reject){
146
+ setTimeout(function(){
147
+ if (!response_event_occurred) { resolve(true); }
148
+ else { setTimeout(function(){ resolve(true); }, #{@puppeteer_timeout}); }
149
+ AllPageHandles[#{document.handle}].removeListener('response', response_handler);
150
+ }, #{@puppeteer_reaction_timeout});
151
+ });
152
+ AllPageHandles[#{document.handle}].on('response', response_handler);
153
+ var navigation_watcher = AllPageHandles[#{document.handle}].waitForNavigation();
154
+ await AllPageHandles[#{document.handle}].evaluate(function(){
155
+ var options = {button: 0, bubbles: true, cancelable: true};
156
+ var node = window;
157
+ var x = #{x ? x : 'null'};
158
+ var y = #{y ? y : 'null'};
159
+ var modifiers = #{modifiers};
160
+ if (x && y) {
161
+ options['clientX'] = x;
162
+ options['clientY'] = y;
163
+ var n = document.elementFromPoint(x, y);
164
+ if (n) { node = n };
165
+ }
166
+ if (modifiers.includes('meta')) { options['metaKey'] = true; }
167
+ if (modifiers.includes('control')) { options['ctrlKey'] = true; }
168
+ if (modifiers.includes('shift')) { options['shiftKey'] = true; }
169
+ if (modifiers.includes('alt')) { options['altKey'] = true; }
170
+ node.dispatchEvent(new MouseEvent('mousedown', options));
171
+ node.dispatchEvent(new MouseEvent('mouseup', options));
172
+ node.dispatchEvent(new MouseEvent('click', options));
173
+ });
174
+ await Promise.race([response_watcher, navigation_watcher]);
175
+ JAVASCRIPT
176
+ end
177
+
178
+ def document_close(document)
179
+ await <<~JAVASCRIPT
180
+ await AllPageHandles[#{document.handle}].close();
181
+ delete AllPageHandles[#{document.handle}];
182
+ delete ConsoleMessages[#{document.handle}];
183
+ JAVASCRIPT
184
+ end
185
+
186
+ def document_console(document)
187
+ messages = @context.exec "return ConsoleMessages[#{document.handle}]"
188
+ messages.map {|m| Isomorfeus::Puppetmaster::ConsoleMessage.new(m)}
189
+ end
190
+
191
+ def document_cookies(document)
192
+ result = await("LastResult = await AllPageHandles[#{document.handle}].cookies();")
193
+ result_hash = {}
194
+ result.each { |cookie| result_hash[cookie['name']] = Isomorfeus::Puppetmaster::Cookie.new(cookie) }
195
+ result_hash
196
+ end
197
+
198
+ def document_dismiss_confirm(document, **options, &block)
199
+ # TODO
200
+ text = options.key?(:text) ? "`#{options[:text]}`" : 'null'
201
+ @context.exec <<~JAVASCRIPT
202
+ ModalText = #{text};
203
+ AllPageHandles[#{document.handle}].on('dialog', DialogDismissHandler);
204
+ JAVASCRIPT
205
+ block.call
206
+ sleep @reaction_timeout
207
+ @context.eval 'ModalText'
208
+ ensure
209
+ matched = await <<~JAVASCRIPT
210
+ LastResult = ModalTextMatched;
211
+ ModalTextMatched = false;
212
+ ModalText = null;
213
+ AllPageHandles[#{document.handle}].removeListener('dialog', DialogDismissHandler);
214
+ JAVASCRIPT
215
+ raise Isomorfeus::Puppetmaster::ModalNotFound if options.key?(:text) && !matched
216
+ end
217
+
218
+ def document_dismiss_leave_page(document, **options, &block)
219
+ # TODO
220
+ text = options.key?(:text) ? "`#{options[:text]}`" : 'null'
221
+ @context.exec <<~JAVASCRIPT
222
+ ModalText = #{text};
223
+ AllPageHandles[#{document.handle}].on('dialog', DialogDismissHandler);
224
+ JAVASCRIPT
225
+ block.call
226
+ sleep @reaction_timeout
227
+ @context.eval 'ModalText'
228
+ ensure
229
+ matched = await <<~JAVASCRIPT
230
+ LastResult = ModalTextMatched;
231
+ ModalTextMatched = false;
232
+ ModalText = null;
233
+ AllPageHandles[#{document.handle}].removeListener('dialog', DialogDismissHandler);
234
+ JAVASCRIPT
235
+ raise Isomorfeus::Puppetmaster::ModalNotFound if options.key?(:text) && !matched
236
+ end
237
+
238
+ def document_dismiss_prompt(document, **options, &block)
239
+ # TODO
240
+ text = options.key?(:text) ? "`#{options[:text]}`" : 'null'
241
+ @context.exec <<~JAVASCRIPT
242
+ ModalText = #{text};
243
+ AllPageHandles[#{document.handle}].on('dialog', DialogDismissHandler);
244
+ JAVASCRIPT
245
+ block.call
246
+ sleep @reaction_timeout
247
+ @context.eval 'ModalText'
248
+ ensure
249
+ matched = await <<~JAVASCRIPT
250
+ LastResult = ModalTextMatched;
251
+ ModalTextMatched = false;
252
+ ModalText = null;
253
+ AllPageHandles[#{document.handle}].removeListener('dialog', DialogDismissHandler);
254
+ JAVASCRIPT
255
+ raise Isomorfeus::Puppetmaster::ModalNotFound if options.key?(:text) && !matched
256
+ end
257
+
258
+ def document_dispatch_event(document, name, event_type = nil, **options)
259
+ raise ArgumentError, 'Unknown event' unless EVENTS.key?(name.to_sym) || event_type
260
+ event_type, opts = *EVENTS[name.to_s.downcase.tr('_', '').to_sym] if event_type.nil?
261
+ opts.merge!(options)
262
+ await <<~JAVASCRIPT
263
+ handle = await AllPageHandles[#{document.handle}].evaluate(function(node){
264
+ var event = new #{event_type}('#{name}'#{opts.empty? ? '' : opts});
265
+ document.dispatchEvent(event);
266
+ });
267
+ JAVASCRIPT
268
+ end
269
+
270
+ def document_double_click(document, x: nil, y: nil, modifiers: nil)
271
+ # modifier_keys: :alt, :control, :meta, :shift
272
+ modifiers = [modifiers] if modifiers.is_a?(Symbol)
273
+ modifiers = [] unless modifiers
274
+ modifiers = modifiers.map {|key| key.to_s.camelize(:lower) }
275
+ await <<~JAVASCRIPT
276
+ var response_event_occurred = false;
277
+ var response_handler = function(event){ response_event_occurred = true; };
278
+ var response_watcher = new Promise(function(resolve, reject){
279
+ setTimeout(function(){
280
+ if (!response_event_occurred) { resolve(true); }
281
+ else { setTimeout(function(){ resolve(true); }, #{@puppeteer_timeout}); }
282
+ AllPageHandles[#{document.handle}].removeListener('response', response_handler);
283
+ }, #{@puppeteer_reaction_timeout});
284
+ });
285
+ AllPageHandlers[#{document.handle}].on('response', response_handler);
286
+ var navigation_watcher = AllPageHandles[#{document.handle}].waitForNavigation();
287
+ await AllPageHandles[#{document.handle}].evaluate(function(){
288
+ var options = {button: 0, bubbles: true, cancelable: true};
289
+ var node = window;
290
+ var x = #{x ? x : 'null'};
291
+ var y = #{y ? y : 'null'};
292
+ var modifiers = #{modifiers};
293
+ if (x && y) {
294
+ options['clientX'] = x;
295
+ options['clientY'] = y;
296
+ var n = document.elementFromPoint(x, y);
297
+ if (n) { node = n };
298
+ }
299
+ if (modifiers.includes('meta')) { options['metaKey'] = true; }
300
+ if (modifiers.includes('control')) { options['ctrlKey'] = true; }
301
+ if (modifiers.includes('shift')) { options['shiftKey'] = true; }
302
+ if (modifiers.includes('alt')) { options['altKey'] = true; }
303
+ node.dispatchEvent(new MouseEvent('mousedown', options));
304
+ node.dispatchEvent(new MouseEvent('mouseup', options));
305
+ node.dispatchEvent(new MouseEvent('dblclick', options));
306
+ });
307
+ await Promise.race([response_watcher, navigation_watcher]);
308
+ JAVASCRIPT
309
+ end
310
+
311
+ def document_evaluate_script(document, script, *args)
312
+ await <<~JAVASCRIPT
313
+ var result = await AllPageHandles[#{document.handle}].evaluate((arguments) => {
314
+ try {
315
+ var res = (function(arguments) {
316
+ return #{script.strip};
317
+ })(arguments);
318
+ return [res, null];
319
+ } catch (err) {
320
+ return [null, {name: err.name, message: err.message, stack: err.stack}];
321
+ }
322
+ }, #{args});
323
+ if (result) {
324
+ LastResult = result[0];
325
+ LastErr = result[1];
326
+ }
327
+ JAVASCRIPT
328
+ end
329
+
330
+ def document_execute_script(document, script, *args)
331
+ await <<~JAVASCRIPT
332
+ var result = await AllPageHandles[#{document.handle}].evaluate((arguments) => {
333
+ try {
334
+ var res = (function(arguments) {
335
+ #{script.strip};
336
+ })(arguments);
337
+ return [res, null];
338
+ } catch (err) {
339
+ return [null, {name: err.name, message: err.message, stack: err.stack}];
340
+ }
341
+ }, #{args});
342
+ if (result) {
343
+ LastResult = result[0];
344
+ LastErr = result[1];
345
+ }
346
+ JAVASCRIPT
347
+ end
348
+
349
+ def document_find(document, selector)
350
+ js_escaped_selector = selector.gsub('\\', '\\\\\\').gsub('"', '\"')
351
+ node_data = await <<~JAVASCRIPT
352
+ var element_handle = await AllPageHandles[#{document.handle}].$("#{js_escaped_selector}");
353
+ if (element_handle) {
354
+ var node_handle = RegisterElementHandle(element_handle);
355
+ var tt = await AllPageHandles[#{document.handle}].evaluate((node) => {
356
+ var tag = node.tagName ? node.tagName.toLowerCase() : '';
357
+ var name = node.nodeName;
358
+ var type = null;
359
+ if (tag === 'input') { type = node.getAttribute('type'); }
360
+ return [name, tag, type, node.isContentEditable];
361
+ }, AllElementHandles[node_handle]);
362
+ LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
363
+ }
364
+ JAVASCRIPT
365
+ if node_data
366
+ node_data[:css_selector] = selector
367
+ Isomorfeus::Puppetmaster::Node.new_by_tag(self, document, node_data)
368
+ else
369
+ raise Isomorfeus::Puppetmaster::ElementNotFound.new(selector)
370
+ end
371
+ end
372
+
373
+ def document_find_all(document, selector)
374
+ js_escaped_selector = selector.gsub('\\', '\\\\\\').gsub('"', '\"')
375
+ node_data_array = await <<~JAVASCRIPT
376
+ var node_data_array = [];
377
+ var element_handle_array = await AllPageHandles[#{document.handle}].$$("#{js_escaped_selector}");
378
+ if (element_handle_array) {
379
+ for (var i=0; i<element_handle_array.length; i++) {
380
+ var node_handle = RegisterElementHandle(element_handle_array[i]);
381
+ var tt = await AllPageHandles[#{document.handle}].evaluate((node) => {
382
+ var tag = node.tagName ? node.tagName.toLowerCase() : '';
383
+ var name = node.nodeName;
384
+ var type = null;
385
+ if (tag === 'input') { type = node.getAttribute('type'); }
386
+ return [name, tag, type, node.isContentEditable];
387
+ }, AllElementHandles[node_handle]);
388
+ node_data_array.push({handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]});
389
+ }
390
+ }
391
+ LastResult = node_data_array;
392
+ JAVASCRIPT
393
+ node_data_array.map do |node_data|
394
+ node_data[:css_selector] = selector
395
+ Isomorfeus::Puppetmaster::Node.new_by_tag(self, document, node_data)
396
+ end
397
+ end
398
+
399
+ def document_find_all_xpath(document, query)
400
+ js_escaped_query = query.gsub('\\', '\\\\\\').gsub('"', '\"')
401
+ node_data_array = await <<~JAVASCRIPT
402
+ var node_data_array = [];
403
+ var element_handle_array = await AllPageHandles[#{document.handle}].$x("#{js_escaped_query}");
404
+ if (element_handle_array) {
405
+ for (var i=0; i<element_handle_array.length; i++) {
406
+ var node_handle = RegisterElementHandle(element_handle_array[i]);
407
+ var tt = await AllPageHandles[#{document.handle}].evaluate((node) => {
408
+ var tag = node.tagName ? node.tagName.toLowerCase() : '';
409
+ var name = node.nodeName;
410
+ var type = null;
411
+ if (tag === 'input') { type = node.getAttribute('type'); }
412
+ return [name, tag, type, node.isContentEditable];
413
+ }, AllElementHandles[node_handle]);
414
+ node_data_array.push({handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]});
415
+ }
416
+ }
417
+ LastResult = node_data_array;
418
+ JAVASCRIPT
419
+ node_data_array.map do |node_data|
420
+ node_data[:xpath_query] = query
421
+ Isomorfeus::Puppetmaster::Node.new_by_tag(self, document, node_data)
422
+ end
423
+ end
424
+
425
+ def document_find_xpath(document, query)
426
+ js_escaped_query = query.gsub('\\', '\\\\\\').gsub('"', '\"')
427
+ node_data = await <<~JAVASCRIPT
428
+ var element_handle_array = await AllPageHandles[#{document.handle}].$x("#{js_escaped_query}");
429
+ var element_handle = (element_handle_array) ? element_handle_array[0] : null;
430
+ if (element_handle) {
431
+ var node_handle = RegisterElementHandle(element_handle);
432
+ var tt = await AllPageHandles[#{document.handle}].evaluate((node) => {
433
+ var tag = node.tagName ? node.tagName.toLowerCase() : '';
434
+ var name = node.nodeName;
435
+ var type = null;
436
+ if (tag === 'input') { type = node.getAttribute('type'); }
437
+ return [name, tag, type, node.isContentEditable];
438
+ }, AllElementHandles[node_handle]);
439
+ LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
440
+ }
441
+ JAVASCRIPT
442
+ if node_data
443
+ node_data[:xpath_query] = query
444
+ Isomorfeus::Puppetmaster::Node.new_by_tag(self, document, node_data)
445
+ else
446
+ raise Isomorfeus::Puppetmaster::ElementNotFound.new(query)
447
+ end
448
+ end
449
+
450
+ def document_go_back(document)
451
+ response_hash, messages = await <<~JAVASCRIPT
452
+ ConsoleMessages[#{document.handle}] = [];
453
+ var response = await AllPageHandles[#{document.handle}].goBack();
454
+ if (response) {
455
+ var request = response.request();
456
+ var formatted_response = {
457
+ headers: response.headers(),
458
+ ok: response.ok(),
459
+ remote_address: response.remoteAddress(),
460
+ request: {
461
+ failure: request.failure(),
462
+ headers: request.headers(),
463
+ method: request.method(),
464
+ post_data: request.postData(),
465
+ resource_type: request.resourceType(),
466
+ url: request.url()
467
+ },
468
+ status: response.status(),
469
+ status_text: response.statusText(),
470
+ text: response.text(),
471
+ url: response.url()
472
+ };
473
+ LastResult = [formatted_response, ConsoleMessages[#{document.handle}]];
474
+ } else {
475
+ LastResult = [null, ConsoleMessages[#{document.handle}]];
476
+ }
477
+ JAVASCRIPT
478
+ con_messages = messages.map {|m| Isomorfeus::Puppetmaster::ConsoleMessage.new(m)}
479
+ con_messages.each { |m| raise determine_error({ 'message' => m.text }) if m.level == 'error' && !m.text.start_with?('Failed to load resource:') }
480
+ if response_hash
481
+ response = Isomorfeus::Puppetmaster::Response.new(response_hash)
482
+ document.instance_variable_set(:@response, response)
483
+ end
484
+ document.response
485
+ end
486
+
487
+ def document_go_forward(document)
488
+ response_hash, messages = await <<~JAVASCRIPT
489
+ ConsoleMessages[#{document.handle}] = [];
490
+ var response = await AllPageHandles[#{document.handle}].goForward();
491
+ if (response) {
492
+ var request = response.request();
493
+ var formatted_response = {
494
+ headers: response.headers(),
495
+ ok: response.ok(),
496
+ remote_address: response.remoteAddress(),
497
+ request: {
498
+ failure: request.failure(),
499
+ headers: request.headers(),
500
+ method: request.method(),
501
+ post_data: request.postData(),
502
+ resource_type: request.resourceType(),
503
+ url: request.url()
504
+ },
505
+ status: response.status(),
506
+ status_text: response.statusText(),
507
+ text: response.text(),
508
+ url: response.url()
509
+ };
510
+ LastResult = [formatted_response, ConsoleMessages[#{document.handle}]];
511
+ } else {
512
+ LastResult = [null, ConsoleMessages[#{document.handle}]];
513
+ }
514
+ JAVASCRIPT
515
+ con_messages = messages.map {|m| Isomorfeus::Puppetmaster::ConsoleMessage.new(m)}
516
+ con_messages.each { |m| raise determine_error({ 'message' => m.text }) if m.level == 'error' && !m.text.start_with?('Failed to load resource:') }
517
+ if response_hash
518
+ response = Isomorfeus::Puppetmaster::Response.new(response_hash)
519
+ document.instance_variable_set(:@response, response)
520
+ end
521
+ document.response
522
+ end
523
+
524
+ def document_goto(document, uri)
525
+ parsed_uri = URI.parse(uri)
526
+ parsed_uri.host = @app.host unless parsed_uri.host
527
+ parsed_uri.port = @app.port unless parsed_uri.port
528
+ parsed_uri.scheme = @app.scheme unless parsed_uri.scheme
529
+ response_hash, messages = await <<~JAVASCRIPT
530
+ ConsoleMessages[#{document.handle}] = [];
531
+ var response = await AllPageHandles[#{document.handle}].goto('#{parsed_uri.to_s}');
532
+ if (response) {
533
+ var request = response.request();
534
+ var formatted_response = {
535
+ headers: response.headers(),
536
+ ok: response.ok(),
537
+ remote_address: response.remoteAddress(),
538
+ request: {
539
+ failure: request.failure(),
540
+ headers: request.headers(),
541
+ method: request.method(),
542
+ post_data: request.postData(),
543
+ resource_type: request.resourceType(),
544
+ url: request.url()
545
+ },
546
+ status: response.status(),
547
+ status_text: response.statusText(),
548
+ text: response.text(),
549
+ url: response.url()
550
+ };
551
+ LastResult = [formatted_response, ConsoleMessages[#{document.handle}]];
552
+ } else {
553
+ LastResult = [null, ConsoleMessages[#{document.handle}]];
554
+ }
555
+ JAVASCRIPT
556
+ con_messages = messages.map {|m| Isomorfeus::Puppetmaster::ConsoleMessage.new(m)}
557
+ con_messages.each { |m| raise determine_error({ 'message' => m.text }) if m.level == 'error' && !m.text.start_with?('Failed to load resource:') }
558
+ if response_hash
559
+ response = Isomorfeus::Puppetmaster::Response.new(response_hash)
560
+ document.instance_variable_set(:@response, response)
561
+ end
562
+ document.response
563
+ end
564
+
565
+ def document_head(document)
566
+ node_data = await <<~JAVASCRIPT
567
+ var element_handle = await AllPageHandles[#{document.handle}].$('head');
568
+ if (element_handle) {
569
+ var node_handle = RegisterElementHandle(element_handle);
570
+ var tt = await AllElementHandles[node_handle].executionContext().evaluate((node) => {
571
+ var name = node.nodeName;
572
+ var tag = node.tagName.toLower();
573
+ return [name, tag, null, node.isContentEditable];
574
+ }, AllElementHandles[node_handle]);
575
+ LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
576
+ }
577
+ JAVASCRIPT
578
+ if node_data
579
+ node_data[:css_selector] = selector
580
+ Isomorfeus::Puppetmaster::Node.new_by_tag(self, document, node_data)
581
+ end
582
+ end
583
+
584
+ def document_html(document)
585
+ await "LastResult = await AllPageHandles[#{document.handle}].content();"
586
+ end
587
+
588
+ def document_open_new_document(_document, uri = nil)
589
+ if !uri || uri == 'about:blank'
590
+ parsed_uri = 'about:blank'
591
+ else
592
+ parsed_uri = URI.parse(uri)
593
+ parsed_uri.host = @app.host unless parsed_uri.host
594
+ parsed_uri.port = @app.port unless parsed_uri.port
595
+ parsed_uri.scheme = @app.scheme unless parsed_uri.scheme
596
+ end
597
+ handle, response_hash, messages = await <<~JAVASCRIPT
598
+ var new_page = await CurrentBrowser.newPage();
599
+ var url = '#{parsed_uri.to_s}';
600
+ new_page.setDefaultTimeout(#{@puppeteer_timeout});
601
+ await new_page.setViewport({width: #{@width}, height: #{@height}});
602
+ var new_target = new_page.target();
603
+ var cdp_session = await new_target.createCDPSession();
604
+ await cdp_session.send('Page.setDownloadBehavior', {behavior: 'allow', downloadPath: '#{Isomorfeus::Puppetmaster.download_path}'});
605
+ if (#{@url_blacklist}.length > 0) { await cdp_session.send('Network.setBlockedURLs', {urls: #{@url_blacklist}}); }
606
+ await cdp_session.detach();
607
+ var page_handle = RegisterPage(new_page);
608
+ var result_response = null;
609
+ if (url && url !== '') {
610
+ var response = await new_page.goto(url);
611
+ if (response) {
612
+ var request = response.request();
613
+ result_response = {
614
+ headers: response.headers(),
615
+ ok: response.ok(),
616
+ remote_address: response.remoteAddress(),
617
+ request: {
618
+ failure: request.failure(),
619
+ headers: request.headers(),
620
+ method: request.method(),
621
+ post_data: request.postData(),
622
+ resource_type: request.resourceType(),
623
+ url: request.url()
624
+ },
625
+ status: response.status(),
626
+ status_text: response.statusText(),
627
+ text: response.text(),
628
+ url: response.url()
629
+ }
630
+ }
631
+ };
632
+ LastResult = [page_handle, result_response, ConsoleMessages[page_handle]];
633
+ JAVASCRIPT
634
+ con_messages = messages.map {|m| Isomorfeus::Puppetmaster::ConsoleMessage.new(m)}
635
+ con_messages.each { |m| raise determine_error({ 'message' => m.text }) if m.level == 'error' && !m.text.start_with?('Failed to load resource:') }
636
+ Isomorfeus::Puppetmaster::Document.new(self, handle, Isomorfeus::Puppetmaster::Response.new(response_hash))
637
+ end
638
+
639
+ def document_reload(document)
640
+ response_hash = await"LastResult = await AllPageHandles[#{document.handle}].reload();"
641
+ Isomorfeus::Puppetmaster::Response.new(response_hash)
642
+ end
643
+
644
+ def document_remove_cookie(document, name)
645
+ await "await AllPageHandles[#{document.handle}].deleteCookie({name: '#{name}'})"
646
+ end
647
+
648
+ def document_render_base64(document, **options)
649
+ # todo
650
+ # https://pptr.dev/#?product=Puppeteer&version=v1.12.2&show=api-pagescreenshotoptions
651
+ final_options = ["encoding: 'base64'"]
652
+ if options.key?(:format)
653
+ options[:format] = 'jpeg' if options[:format].to_s.downcase == 'jpg'
654
+ final_options << "type: '#{options.delete(:format).to_s.downcase}'"
655
+ end
656
+ final_options << "quality: #{options.delete(:quality)}" if options.key?(:quality)
657
+ final_options << "fullPage: #{options.delete(:full)}" if options.key?(:full)
658
+ options.each do |k,v|
659
+ final_options << "#{k.to_s.camelize(:lower)}: #{v}"
660
+ end
661
+ await "LastResult = await AllPageHandles[#{document.handle}].screenshot({#{final_options.join(', ')}});"
662
+ end
663
+
664
+ def document_reset_user_agent(document)
665
+ await <<~JAVASCRIPT
666
+ var original_user_agent = await CurrentBrowser.userAgent();
667
+ await AllPageHandles[#{document.handle}].setUserAgent(original_user_agent);
668
+ JAVASCRIPT
669
+ end
670
+
671
+ def document_right_click(document, x: nil, y: nil, modifiers: nil)
672
+ # modifier_keys: :alt, :control, :meta, :shift
673
+ # offset: { x: int, y: int }
674
+ modifiers = [modifiers] if modifiers.is_a?(Symbol)
675
+ modifiers = [] unless modifiers
676
+ modifiers = modifiers.map {|key| key.to_s.camelize(:lower) }
677
+ await <<~JAVASCRIPT
678
+ var response_event_occurred = false;
679
+ var response_handler = function(event){ response_event_occurred = true; };
680
+ var response_watcher = new Promise(function(resolve, reject){
681
+ setTimeout(function(){
682
+ if (!response_event_occurred) { resolve(true); }
683
+ else { setTimeout(function(){ resolve(true); }, #{@puppeteer_timeout}); }
684
+ AllPageHandles[#{document.handle}].removeListener('response', response_handler);
685
+ }, #{@puppeteer_reaction_timeout});
686
+ });
687
+ AllPageHandles[#{document.handle}].on('response', response_handler);
688
+ var navigation_watcher = AllPageHandles[#{document.handle}].waitForNavigation();
689
+ await AllPageHandles[#{document.handle}].evaluate(function(){
690
+ var options = {button: 2, bubbles: true, cancelable: true};
691
+ var node = window;
692
+ var x = #{x ? x : 'null'};
693
+ var y = #{y ? y : 'null'};
694
+ var modifiers = #{modifiers};
695
+ if (x && y) {
696
+ options['clientX'] = x;
697
+ options['clientY'] = y;
698
+ var n = document.elementFromPoint(x, y);
699
+ if (n) { node = n };
700
+ }
701
+ if (modifiers.includes('meta')) { options['metaKey'] = true; }
702
+ if (modifiers.includes('control')) { options['ctrlKey'] = true; }
703
+ if (modifiers.includes('shift')) { options['shiftKey'] = true; }
704
+ if (modifiers.includes('alt')) { options['altKey'] = true; }
705
+ node.dispatchEvent(new MouseEvent('mousedown', options));
706
+ node.dispatchEvent(new MouseEvent('mouseup', options));
707
+ node.dispatchEvent(new MouseEvent('contextmenu', options));
708
+ });
709
+ await Promise.race([response_watcher, navigation_watcher]);
710
+ JAVASCRIPT
711
+ end
712
+
713
+ def document_save_pdf(document, path, **options)
714
+ # todo
715
+ # https://pptr.dev/#?product=Puppeteer&version=v1.12.2&show=api-pagepdfoptions
716
+ absolute_path = File.absolute_path(path)
717
+ final_options = ["path: '#{absolute_path}'"]
718
+ final_options << "format: '#{options.delete(:format)}'" if options.key?(:format)
719
+ final_options << "headerTemplate: `#{options.delete(:header_template)}`" if options.key?(:header_template)
720
+ final_options << "footerTemplate: `#{options.delete(:footer_template)}`" if options.key?(:footer_template)
721
+ final_options << "pageRanges: '#{options.delete(:page_ranges)}'" if options.key?(:page_ranges)
722
+ final_options << "width: '#{options.delete(:width)}'" if options.key?(:width)
723
+ final_options << "height: '#{options.delete(:height)}'" if options.key?(:height)
724
+ options.each do |k,v|
725
+ final_options << "#{k.to_s.camelize(:lower)}: #{v}"
726
+ end
727
+ await "await AllPageHandles[#{document.handle}].pdf({#{final_options.join(', ')}});"
728
+ end
729
+
730
+ def document_save_screenshot(document, path, **options)
731
+ # todo
732
+ # https://pptr.dev/#?product=Puppeteer&version=v1.12.2&show=api-pagescreenshotoptions
733
+ absolute_path = File.absolute_path(path)
734
+ final_options = ["path: '#{absolute_path}'"]
735
+ if options.key?(:format)
736
+ options[:format] = 'jpeg' if options[:format].to_s.downcase == 'jpg'
737
+ final_options << "type: '#{options.delete(:format).to_s.downcase}'"
738
+ end
739
+ final_options << "quality: #{options.delete(:quality)}" if options.key?(:quality)
740
+ final_options << "fullPage: #{options.delete(:full)}" if options.key?(:full)
741
+ options.each do |k,v|
742
+ final_options << "#{k.to_s.camelize(:lower)}: #{v}"
743
+ end
744
+ await "await AllPageHandles[#{document.handle}].screenshot({#{final_options.join(', ')}});"
745
+ end
746
+
747
+ def document_scroll_by(document, x, y)
748
+ await "await AllPageHandles[#{document.handle}].evaluate('window.scrollBy(#{x}, #{y})');"
749
+ end
750
+
751
+ def document_scroll_to(document, x, y)
752
+ await "await AllPageHandles[#{document.handle}].evaluate('window.scrollTo(#{x}, #{y})');"
753
+ end
754
+
755
+ def document_set_authentication_credentials(document, username, password)
756
+ await "await AllPageHandles[#{document.handle}].authenticate({username: '#{username}', password: '#{password}'});"
757
+ end
758
+
759
+ def document_set_cookie(document, name, value, **options)
760
+ options[:name] ||= name
761
+ options[:value] ||= value
762
+ uri = document_url(document)
763
+ if uri == 'about:blank'
764
+ uri = if Isomorfeus::Puppetmaster.server_host
765
+ u = URI.new
766
+ u.scheme = Isomorfeus::Puppetmaster.server_scheme if Isomorfeus::Puppetmaster.server_scheme
767
+ u.host = Isomorfeus::Puppetmaster.server_host
768
+ u.to_s
769
+ else
770
+ 'http://127.0.0.1'
771
+ end
772
+ end
773
+ options[:domain] ||= URI.parse(uri).host
774
+ final_options = []
775
+ final_options << "expires: #{options.delete(:expires).to_i}" if options.key?(:expires)
776
+ final_options << "httpOnly: #{options.delete(:http_only)}" if options.key?(:http_only)
777
+ final_options << "secure: #{options.delete(:secure)}" if options.key?(:secure)
778
+ final_options << "sameSite: '#{options.delete(:same_site)}'" if options.key?(:same_site)
779
+ options.each do |k,v|
780
+ final_options << "#{k}: '#{v}'"
781
+ end
782
+ await "await AllPageHandles[#{document.handle}].setCookie({#{final_options.join(', ')}});"
783
+ end
784
+
785
+ def document_set_extra_headers(document, headers_hash)
786
+ await "await AllPageHandles[#{document.handle}].setExtraHTTPHeaders(#{Oj.dump(headers_hash, mode: :strict)});"
787
+ end
788
+
789
+ def document_set_url_blacklist(document, url_array)
790
+ # https://www.chromium.org/administrators/url-blacklist-filter-format
791
+ @url_blacklist = url_array
792
+ await <<~JAVASCRIPT
793
+ var cdp_session = await AllPageHandles[#{document.handle}].target().createCDPSession();
794
+ await cdp_session.send('Network.setBlockedURLs', {urls: #{url_array}});
795
+ await cdp_session.detach();
796
+ JAVASCRIPT
797
+ end
798
+
799
+ def document_set_user_agent(document, agent_string)
800
+ await "await AllPageHandles[#{document.handle}].setUserAgent('#{agent_string}');"
801
+ end
802
+
803
+ def document_title(document)
804
+ await "LastResult = await AllPageHandles[#{document.handle}].title();"
805
+ end
806
+
807
+ def document_type_keys(document, *keys)
808
+ cjs = "await AllPageHandles[#{document.handle}].bringToFront();"
809
+ top_modifiers = []
810
+ keys.each do |key|
811
+ if key.is_a?(String)
812
+ key.each_char do |c|
813
+ need_shift = /[[:upper:]]/.match(c)
814
+ cjs << "await AllPageHandles[#{document.handle}].keyboard.down('Shift');\n" if need_shift
815
+ c = "Key#{c.upcase}" if /[[:alpha:]]/.match(c)
816
+ cjs << "await AllPageHandles[#{document.handle}].keyboard.down('#{c}');\n"
817
+ cjs << "await AllPageHandles[#{document.handle}].keyboard.up('#{c}');\n"
818
+ cjs << "await AllPageHandles[#{document.handle}].keyboard.up('Shift');\n" if need_shift
819
+ end
820
+ elsif key.is_a?(Symbol)
821
+ if %i[ctrl Ctrl].include?(key)
822
+ key = :control
823
+ elsif %i[command Command Meta].include?(key)
824
+ key = :meta
825
+ elsif %i[divide Divide].include?(key)
826
+ key = :numpad_divide
827
+ elsif %i[decimal Decimal].include?(key)
828
+ key = :numpad_decimal
829
+ elsif %i[left right up down].include?(key)
830
+ key = "arrow_#{key}".to_sym
831
+ end
832
+ if %i[alt alt_left alt_right control control_left control_rigth meta meta_left meta_right shift shift_left shift_right].include?(key)
833
+ top_modifiers << key
834
+ cjs << "await AllPageHandles[#{document.handle}].keyboard.down('#{key.to_s.camelize}');\n"
835
+ else
836
+ cjs << "await AllPageHandles[#{document.handle}].keyboard.press('#{key.to_s.camelize}');\n"
837
+ end
838
+ elsif key.is_a?(Array)
839
+ modifiers = []
840
+ key.each do |k|
841
+ if k.is_a?(Symbol)
842
+ if %i[ctrl Ctrl].include?(k)
843
+ k = :control
844
+ elsif %i[command Command Meta].include?(k)
845
+ k = :meta
846
+ elsif %i[divide Divide].include?(k)
847
+ k = :numpad_divide
848
+ elsif %i[decimal Decimal].include?(k)
849
+ k = :numpad_decimal
850
+ elsif %i[left right up down].include?(key)
851
+ k = "arrow_#{key}".to_sym
852
+ end
853
+ if %i[alt alt_left alt_right control control_left control_rigth meta meta_left meta_right shift shift_left shift_right].include?(k)
854
+ modifiers << k
855
+ cjs << "await AllPageHandles[#{document.handle}].keyboard.down('#{k.to_s.camelize}');\n"
856
+ else
857
+ cjs << "await AllPageHandles[#{document.handle}].keyboard.press('#{k.to_s.camelize}');\n"
858
+ end
859
+ elsif k.is_a?(String)
860
+ k.each_char do |c|
861
+ need_shift = /[[:upper:]]/.match(c)
862
+ cjs << "await AllPageHandles[#{document.handle}].keyboard.down('Shift');\n" if need_shift
863
+ c = "Key#{c.upcase}" if /[[:alpha:]]/.match(c)
864
+ cjs << "await AllPageHandles[#{document.handle}].keyboard.press('#{c}');\n"
865
+ cjs << "await AllPageHandles[#{document.handle}].keyboard.up('Shift');\n" if need_shift
866
+ end
867
+ end
868
+ end
869
+ modifiers.reverse.each do |k|
870
+ cjs << "await AllPageHandles[#{document.handle}].keyboard.up('#{k.to_s.camelize}');\n"
871
+ end
872
+ end
873
+ end
874
+ top_modifiers.reverse.each do |key|
875
+ cjs << "await AllPageHandles[#{document.handle}].keyboard.up('#{key.to_s.camelize}');\n"
876
+ end
877
+ await(cjs)
878
+ end
879
+
880
+ def document_url(document)
881
+ await "LastResult = await AllPageHandles[#{document.handle}].evaluate('window.location.href');"
882
+ end
883
+
884
+ def document_user_agent(document)
885
+ await "LastResult = await AllPageHandles[#{document.handle}].evaluate('window.navigator.userAgent');"
886
+ end
887
+
888
+ def document_viewport_maximize(document)
889
+ document_viewport_resize(document, @max_width, @max_height)
890
+ end
891
+
892
+ def document_viewport_resize(document, width, height)
893
+ width = @max_width if width > @max_width
894
+ height = @max_height if width > @max_height
895
+ await "await AllPageHandles[#{document.handle}].setViewport({width: #{width}, height: #{height}});"
896
+ end
897
+
898
+ def document_viewport_size(document)
899
+ viewport = @context.eval "AllPageHandles[#{document.handle}].viewport()"
900
+ [viewport['width'], viewport['height']]
901
+ end
902
+
903
+ def document_wait_for(document, selector)
904
+ js_escaped_selector = selector.gsub('\\', '\\\\\\').gsub('"', '\"')
905
+ node_data = await <<~JAVASCRIPT
906
+ var element_handle = await AllPageHandles[#{document.handle}].waitForSelector("#{js_escaped_selector}");
907
+ if (element_handle) {
908
+ var node_handle = RegisterElementHandle(element_handle);
909
+ var tt = await AllElementHandles[node_handle].executionContext().evaluate((node) => {
910
+ var name = node.nodeName;
911
+ var tag = node.tagName.toLowerCase();
912
+ var type = null;
913
+ if (tag === 'input') { type = node.getAttribute('type'); }
914
+ return [name, tag, type, node.isContentEditable];
915
+ }, AllElementHandles[node_handle]);
916
+ LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
917
+ }
918
+ JAVASCRIPT
919
+ if node_data
920
+ node_data[:css_selector] = selector
921
+ Isomorfeus::Puppetmaster::Node.new_by_tag(self, document, node_data)
922
+ else
923
+ raise Isomorfeus::Puppetmaster::ElementNotFound.new(selector)
924
+ end
925
+ end
926
+
927
+ def document_wait_for_xpath(document, query)
928
+ js_escaped_query = query.gsub('\\', '\\\\\\').gsub('"', '\"')
929
+ node_data = await <<~JAVASCRIPT
930
+ var element_handle = await AllPageHandles[#{document.handle}].waitForXPath("#{js_escaped_query}");
931
+ if (element_handle) {
932
+ var node_handle = RegisterElementHandle(element_handle);
933
+ var tt = await AllElementHandles[node_handle].executionContext().evaluate((node) => {
934
+ var name = node.nodeName;
935
+ var tag = node.tagName.toLowerCase();
936
+ var type = null;
937
+ if (tag === 'input') { type = node.getAttribute('type'); }
938
+ return [name, tag, type, node.isContentEditable];
939
+ }, AllElementHandles[node_handle]);
940
+ LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
941
+ }
942
+ JAVASCRIPT
943
+ if node_data
944
+ node_data[:xpath_query] = query
945
+ Isomorfeus::Puppetmaster::Node.new_by_tag(self, document, node_data)
946
+ else
947
+ raise Isomorfeus::Puppetmaster::ElementNotFound.new(selector)
948
+ end
949
+ end
950
+ end
951
+ end
952
+ end
953
+ end