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,851 +1,851 @@
1
- module Isomorfeus
2
- module Puppetmaster
3
- module Driver
4
- module PuppeteerNode
5
- def node_all_text(node)
6
- await <<~JAVASCRIPT
7
- LastResult = await AllElementHandles[#{node.handle}].executionContext().evaluate(function(node){
8
- return node.textContent;
9
- }, AllElementHandles[#{node.handle}]);
10
- JAVASCRIPT
11
- end
12
-
13
- def node_click(node, x: nil, y: nil, modifiers: nil)
14
- # modifier_keys: :alt, :control, :meta, :shift
15
- # raise Isomorfeus::Pupppetmaster::InvalidActionError.new(:click) unless visible?
16
- modifiers = [modifiers] if modifiers.is_a?(Symbol)
17
- modifiers = [] unless modifiers
18
- modifiers = modifiers.map {|key| key.to_s.camelize(:lower) }
19
- await <<~JAVASCRIPT
20
- var response_event_occurred = false;
21
- var response_handler = function(event){ response_event_occurred = true; };
22
- var response_watcher = new Promise(function(resolve, reject){
23
- setTimeout(function(){
24
- if (!response_event_occurred) { resolve(true); }
25
- else { setTimeout(function(){ resolve(true); }, #{@puppeteer_timeout}); }
26
- AllPageHandles[#{node.document.handle}].removeListener('response', response_handler);
27
- }, #{@puppeteer_reaction_timeout});
28
- });
29
- AllPageHandles[#{node.document.handle}].on('response', response_handler);
30
- var navigation_watcher = AllPageHandles[#{node.document.handle}].waitForNavigation();
31
- await AllElementHandles[#{node.handle}].executionContext().evaluate(function(node){
32
- var options = {button: 0, bubbles: true, cancelable: true};
33
- var x = #{x ? x : 'null'};
34
- var y = #{y ? y : 'null'};
35
- var modifiers = #{modifiers};
36
- if (x && y) {
37
- var bounding_box = node.getBoundingClientRect();
38
- options['clientX'] = bounding_box.x + x;
39
- options['clientY'] = bounding_box.y + y;
40
- }
41
- if (modifiers.includes('meta')) { options['metaKey'] = true; }
42
- if (modifiers.includes('control')) { options['ctrlKey'] = true; }
43
- if (modifiers.includes('shift')) { options['shiftKey'] = true; }
44
- if (modifiers.includes('alt')) { options['altKey'] = true; }
45
- node.dispatchEvent(new MouseEvent('mousedown', options));
46
- node.dispatchEvent(new MouseEvent('mouseup', options));
47
- node.dispatchEvent(new MouseEvent('click', options));
48
- }, AllElementHandles[#{node.handle}]);
49
- await Promise.race([response_watcher, navigation_watcher]);
50
- JAVASCRIPT
51
- end
52
-
53
- def node_disabled?(node)
54
- await <<~JAVASCRIPT
55
- LastResult = await AllElementHandles[#{node.handle}].executionContext().evaluate(node => {
56
- const xpath = `parent::optgroup[@disabled] | ancestor::select[@disabled] | parent::fieldset[@disabled] |
57
- ancestor::*[not(self::legend) or preceding-sibling::legend][parent::fieldset[@disabled]]`;
58
- return node.disabled || document.evaluate(xpath, node, null, XPathResult.BOOLEAN_TYPE, null).booleanValue;
59
- }, AllElementHandles[#{node.handle}]);
60
- JAVASCRIPT
61
- end
62
-
63
- def node_dispatch_event(node, name, event_type = nil, **options)
64
- raise ArgumentError, 'Unknown event' unless Isomorfeus::Puppetmaster::Driver::Puppeteer::EVENTS.key?(name.to_sym) || event_type
65
- event_type, opts = *Isomorfeus::Puppetmaster::Driver::Puppeteer::EVENTS[name.to_sym] if event_type.nil?
66
- opts.merge!(options)
67
- final_options = options.map { |k,v| "#{k}: '#{v}'" }
68
- await <<~JAVASCRIPT
69
- await AllElementHandles[#{node.handle}].executionContext().evaluate(function(node){
70
- var event = new #{event_type}('#{name}', { #{final_options.join(', ')} });
71
- node.dispatchEvent(event);
72
- }, AllElementHandles[#{node.handle}]);
73
- JAVASCRIPT
74
- end
75
-
76
- def node_double_click(node, x: nil, y: nil, modifiers: nil)
77
- # modifier_keys: :alt, :control, :meta, :shift
78
- # offset: { x: int, y: int }
79
- modifiers = [modifiers] if modifiers.is_a?(Symbol)
80
- modifiers = [] unless modifiers
81
- modifiers = modifiers.map {|key| key.to_s.camelize(:lower) }
82
- await <<~JAVASCRIPT
83
- var response_event_occurred = false;
84
- var response_handler = function(event){ response_event_occurred = true; };
85
- var response_watcher = new Promise(function(resolve, reject){
86
- setTimeout(function(){
87
- if (!response_event_occurred) { resolve(true); }
88
- else { setTimeout(function(){ resolve(true); }, #{@puppeteer_timeout}); }
89
- AllPageHandles[#{node.document.handle}].removeListener('response', response_handler);
90
- }, #{@puppeteer_reaction_timeout});
91
- });
92
- AllPageHandles[#{node.document.handle}].on('response', response_handler);
93
- var navigation_watcher = AllPageHandles[#{node.document.handle}].waitForNavigation();
94
- await AllElementHandles[#{node.handle}].executionContext().evaluate(function(node){
95
- var options = {button: 0, bubbles: true, cancelable: true};
96
- var x = #{x ? x : 'null'};
97
- var y = #{y ? y : 'null'};
98
- var modifiers = #{modifiers};
99
- if (x && y) {
100
- var bounding_box = node.getBoundingClientRect();
101
- options['clientX'] = bounding_box.left + x;
102
- options['clientY'] = bounding_box.top + y;
103
- }
104
- if (modifiers.includes('meta')) { options['metaKey'] = true; }
105
- if (modifiers.includes('control')) { options['ctrlKey'] = true; }
106
- if (modifiers.includes('shift')) { options['shiftKey'] = true; }
107
- if (modifiers.includes('alt')) { options['altKey'] = true; }
108
- node.dispatchEvent(new MouseEvent('mousedown', options));
109
- node.dispatchEvent(new MouseEvent('mouseup', options));
110
- node.dispatchEvent(new MouseEvent('dblclick', options));
111
- return options;
112
- }, AllElementHandles[#{node.handle}]);
113
- await Promise.race([response_watcher, navigation_watcher]);
114
- JAVASCRIPT
115
- end
116
-
117
- def node_drag_to(node, other_node)
118
- if node[:draggable]
119
- await <<~JAVASCRIPT
120
- await AllElementHandles[#{node.handle}].executionContext().evaluateHandle(function(node) {
121
- document.addEventListener('mousedown', event => {
122
- window.puppeteer_mousedown_prevented = event.defaultPrevented;
123
- }, { once: true, passive: true });
124
- }, AllElementHandles[#{node.handle}]);
125
- JAVASCRIPT
126
- # TODO use scrollIntoView once chromium bug is fixed
127
- # https://bugs.chromium.org/p/chromium/issues/detail?id=939740&can=2&start=0&num=100&q=mousemove%20scrollintoview&colspec=ID%20Type%20Status%20Priority%20Milestone%20Owner%20Summary&groupby=&sort=
128
- await <<~JAVASCRIPT
129
- var node_handle = #{node.handle};
130
- await AllElementHandles[node_handle].executionContext().evaluateHandle(function(node, other_node) {
131
- var n = node;
132
- var top = n.offsetTop, left = n.offsetLeft, width = n.offsetWidth, height = n.offsetHeight;
133
- while(n.offsetParent) { n = n.offsetParent; top += n.offsetTop; left += n.offsetLeft; }
134
- var node_in_view = (top >= window.pageYOffset && left >= window.pageXOffset &&
135
- (top + height) <= (window.pageYOffset + window.innerHeight) && (left + width) <= (window.pageXOffset + window.innerWidth));
136
- if (!node_in_view) { node.scrollTo(0,0); };
137
- setTimeout(function(){
138
- var client_rect = node.getBoundingClientRect();
139
- var x = (client_rect.left + (client_rect.width / 2));
140
- var y = (client_rect.top + (client_rect.height / 2));
141
- node.dispatchEvent(new MouseEvent('mousemove', {clientX: x, clientY: y, bubbles: true, cancelable: true}));
142
- setTimeout(function(){
143
- node.dispatchEvent(new MouseEvent('mousedown', {clientX: x, clientY: y, bubbles: true, cancelable: true}));
144
- if (window.puppeteer_mousedown_prevented) {
145
- n = other_node;
146
- top = n.offsetTop; left = n.offsetLeft; width = n.offsetWidth; height = n.offsetHeight;
147
- while(n.offsetParent) { n = n.offsetParent; top += n.offsetTop; left += n.offsetLeft; }
148
- var node_in_view = (top >= window.pageYOffset && left >= window.pageXOffset &&
149
- (top + height) <= (window.pageYOffset + window.innerHeight) && (left + width) <= (window.pageXOffset + window.innerWidth));
150
- if (!node_in_view) { other_node.scrollTo(0,0) };
151
- setTimeout(function(){
152
- client_rect = other_node.getBoundingClientRect();
153
- x = (client_rect.left + (client_rect.width / 2));
154
- y = (client_rect.top + (client_rect.height / 2));
155
- node.dispatchEvent(new MouseEvent('mousemove', {clientX: x, clientY: y, bubbles: true, cancelable: true}));
156
- setTimeout(function(){
157
- node.dispatchEvent(new MouseEvent('mouseup', {clientX: x, clientY: y, bubbles: true, cancelable: true}));
158
- }, #{@puppeteer_reaction_timeout/2});
159
- }, #{@puppeteer_reaction_timeout});
160
- } else {
161
- var dt = new DataTransfer();
162
- if (node.tagName == 'A'){ dt.setData('text/uri-list', node.href); dt.setData('text', node.href); }
163
- if (node.tagName == 'IMG'){ dt.setData('text/uri-list', node.src); dt.setData('text', node.src); }
164
- var opts = { cancelable: true, bubbles: true, dataTransfer: dt };
165
- var dragEvent = new DragEvent('dragstart', opts);
166
- node.dispatchEvent(dragEvent);
167
- n = other_node;
168
- top = n.offsetTop; left = n.offsetLeft; width = n.offsetWidth; height = n.offsetHeight;
169
- while(n.offsetParent) { n = n.offsetParent; top += n.offsetTop; left += n.offsetLeft; }
170
- var node_in_view = (top >= window.pageYOffset && left >= window.pageXOffset &&
171
- (top + height) <= (window.pageYOffset + window.innerHeight) && (left + width) <= (window.pageXOffset + window.innerWidth));
172
- if (!node_in_view) { other_node.scrollTo(0,0); };
173
- setTimeout(function(){
174
- var rect = node.getBoundingClientRect()
175
- var node_center = new DOMPoint((rect.left + rect.right)/2, (rect.top + rect.bottom)/2);
176
- var other_rect = other_node.getBoundingClientRect();
177
- var other_point = new DOMPoint((other_rect.left + other_rect.right)/2, (other_rect.top + other_rect.bottom)/2);
178
- var entry_point = null;
179
- var slope = (other_point.y - other_point.y) / (other_point.x - node_center.x);
180
- if (other_point.x <= other_point.x) { // left side
181
- var minXy = slope * (other_rect.left - node_center.x) + node_center.y;
182
- if (other_rect.top <= minXy && minXy <= other_rect.bottom) { entry_point = new DOMPoint(other_rect.left, minXy); }
183
- }
184
- if (node_center.x >= other_point.x) { // right side
185
- var maxXy = slope * (other_rect.right - node_center.x) + node_center.y;
186
- if (other_rect.top <= maxXy && maxXy <= other_rect.bottom) { entry_point = new DOMPoint(other_rect.right, maxXy); }
187
- }
188
- if (node_center.y <= other_point.y) { // top side
189
- var minYx = (other_point.top - node_center.y) / slope + node_center.x;
190
- if (other_rect.left <= minYx && minYx <= other_rect.right) { entry_point = new DOMPoint(minYx, other_rect.top); }
191
- }
192
- if (node_center.y >= other_point.y) { // bottom side
193
- var maxYx = (other_rect.bottom - node_center.y) / slope + node_center.x;
194
- if (other_rect.left <= maxYx && maxYx <= other_rect.right) { entry_point = new DOMPoint(maxYx, other_rect.bottom); }
195
- }
196
- if (!entry_point) {
197
- entry_point = new DOMPoint(node_center.x, node_center.y);
198
- }
199
- var drag_over_event = new DragEvent('dragover', {clientX: entry_point.x, clientY: entry_point.y, bubbles: true, cancelable: true});
200
- other_node.dispatchEvent(drag_over_event);
201
- var other_center = new DOMPoint((other_rect.left + other_rect.right)/2, (other_rect.top + other_rect.bottom)/2);
202
- drag_over_event = new DragEvent('dragover', {clientX: targetCenter.x, clientY: targetCenter.y, bubbles: true, cancelable: true});
203
- other_node.dispatchEvent(drag_over_event);
204
- other_node.dispatchEvent(new DragEvent('dragleave', {bubbles: true, cancelable: true}));
205
- if (drag_over_event.defaultPrevented) {
206
- other_node.dispatchEvent(new DragEvent('drop', {bubbles: true, cancelable: true}));
207
- }
208
- node.dispatchEvent(new DragEvent('dragend', {bubbles: true, cancelable: true}));
209
- client_rect = other_node.getBoundingClientRect();
210
- x = (client_rect.left + (client_rect.width / 2));
211
- y = (client_rect.top + (client_rect.height / 2));
212
- node.dispatchEvent(new MouseEvent('mouseup', {clientX: x, clientY: y, bubbles: true, cancelable: true}));
213
- }, #{@puppeteer_reaction_timeout});
214
- }
215
- }, #{@puppeteer_reaction_timeout/2});
216
- }, #{@puppeteer_reaction_timeout});
217
- }, AllElementHandles[node_handle], AllElementHandles[#{other_node.handle}]);
218
- JAVASCRIPT
219
- sleep (@reaction_timeout * 3) + 0.2
220
- else
221
- await <<~JAVASCRIPT
222
- var node_handle = #{node.handle};
223
- await AllElementHandles[node_handle].executionContext().evaluateHandle(function(node, other_node) {
224
- var n = node;
225
- var top = n.offsetTop, left = n.offsetLeft, width = n.offsetWidth, height = n.offsetHeight;
226
- while(n.offsetParent) { n = n.offsetParent; top += n.offsetTop; left += n.offsetLeft; }
227
- var node_in_view = (top >= window.pageYOffset && left >= window.pageXOffset &&
228
- (top + height) <= (window.pageYOffset + window.innerHeight) && (left + width) <= (window.pageXOffset + window.innerWidth));
229
- if (!node_in_view) { res = (n === node); node.scrollTo(0,0); };
230
- setTimeout(function() {
231
- var client_rect = node.getBoundingClientRect();
232
- var x = (client_rect.left + (client_rect.width / 2));
233
- var y = (client_rect.top + (client_rect.height / 2));
234
- node.dispatchEvent(new MouseEvent('mousemove', {clientX: x, clientY: y, bubbles: true, cancelable: true}));
235
- setTimeout(function() {
236
- node.dispatchEvent(new MouseEvent('mousedown', {button: 0, buttons: 1, clientX: x, clientY: y, bubbles: true, cancelable: true}));
237
- var n = other_node;
238
- var top = n.offsetTop, left = n.offsetLeft, width = n.offsetWidth, height = n.offsetHeight;
239
- while(n.offsetParent) { n = n.offsetParent; top += n.offsetTop; left += n.offsetLeft; }
240
- var other_node_in_view = (top >= window.pageYOffset && left >= window.pageXOffset &&
241
- (top + height) <= (window.pageYOffset + window.innerHeight) && (left + width) <= (window.pageXOffset + window.innerWidth));
242
- if (!other_node_in_view) { other_node.scrollTo(0,0); };
243
- setTimeout(function() {
244
- var other_client_rect = other_node.getBoundingClientRect();
245
- var x = (other_client_rect.left + (other_client_rect.width / 2));
246
- var y = (other_client_rect.top + (other_client_rect.height / 2));
247
- node.dispatchEvent(new MouseEvent('mousemove', {button: 0, buttons: 1, clientX: x, clientY: y, bubbles: true, cancelable: true}));
248
- setTimeout(function() {
249
- node.dispatchEvent(new MouseEvent('mouseup', {button: 0, buttons: 1, clientX: x, clientY: y, bubbles: true, cancelable: true}));
250
- }, #{@puppeteer_reaction_timeout/2});
251
- }, #{@puppeteer_reaction_timeout});
252
- }, #{@puppeteer_reaction_timeout/2});
253
- }, #{@puppeteer_reaction_timeout});
254
- }, AllElementHandles[node_handle], AllElementHandles[#{other_node.handle}]);
255
- JAVASCRIPT
256
- sleep (@reaction_timeout * 3) + 0.2
257
- end
258
- end
259
-
260
- def node_equal(node, other_node)
261
- await <<~JAVASCRIPT
262
- var node_handle = #{node.handle};
263
- var other_handle = #{other_node.handle};
264
- if (AllElementHandles[node_handle] && AllElementHandles[other_handle]) {
265
- try {
266
- var handle = await AllElementHandles[node_handle].executionContext().evaluateHandle(function(node, other_node){
267
- return (node === other_node);
268
- }, AllElementHandles[node_handle],AllElementHandles[other_handle]);
269
- LastResult = await handle.jsonValue();
270
- } catch (err) {
271
- LastResult = false;
272
- }
273
- }
274
- JAVASCRIPT
275
- end
276
-
277
- def node_execute_script(node, script, *args)
278
- await <<~JAVASCRIPT
279
- var node_handle = #{node.handle};
280
- await AllElementHandles[node_handle].executionContext().evaluateHandle((node, arguments) => {
281
- arguments.unshift(node);
282
- #{script}
283
- }, AllElementHandles[node_handle], #{args[1..-1]});
284
- JAVASCRIPT
285
- end
286
-
287
- def node_evaluate_script(node, script, *args)
288
- await <<~JAVASCRIPT
289
- var node_handle = #{node.handle};
290
- handle = await AllElementHandles[node_handle].executionContext().evaluateHandle((node, arguments) => {
291
- arguments.unshift(node);
292
- return #{script};
293
- }, AllElementHandles[node_handle], #{args[1..-1]});
294
- LastResult = await handle.jsonValue();
295
- JAVASCRIPT
296
- end
297
-
298
- def node_find(node, selector)
299
- js_escaped_selector = selector.gsub('\\', '\\\\\\').gsub('"', '\"')
300
- node_data = await <<~JAVASCRIPT
301
- var element_handle = await AllElementHandles[#{node.handle}].$("#{js_escaped_selector}");
302
- if (element_handle) {
303
- var node_handle = RegisterElementHandle(element_handle);
304
- var tt = await AllElementHandles[node_handle].executionContext().evaluate((node) => {
305
- var name = node.nodeName;
306
- var tag = node.tagName.toLowerCase();
307
- var type = null;
308
- if (tag === 'input') { type = node.getAttribute('type'); }
309
- return [name, tag, type, node.isContentEditable];
310
- }, AllElementHandles[node_handle]);
311
- LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
312
- }
313
- JAVASCRIPT
314
- if node_data
315
- node_data[:css_selector] = selector
316
- Isomorfeus::Puppetmaster::Node.new_by_tag(self, node.document, node_data)
317
- else
318
- raise Isomorfeus::Puppetmaster::ElementNotFound.new(selector)
319
- end
320
- end
321
-
322
- def node_find_all(node, selector)
323
- js_escaped_selector = selector.gsub('\\', '\\\\\\').gsub('"', '\"')
324
- node_data_array = await <<~JAVASCRIPT
325
- var node_data_array = [];
326
- var element_handle_array = await AllElementHandles[#{node.handle}].$("#{js_escaped_selector}");
327
- if (element_handle_array) {
328
-
329
- for (var i=0; i<element_handle_array.length; i++) {
330
- var node_handle = RegisterElementHandle(element_handle_array[i]);
331
- var tt = await AllElementHandles[node_handle].executionContext().evaluate((node) => {
332
- var name = node.nodeName;
333
- var tag = node.tagName.toLowerCase();
334
- var type = null;
335
- if (tag === 'input') { type = node.getAttribute('type'); }
336
- return [name, tag, type, node.isContentEditable];
337
- }, AllElementHandles[node_handle]);
338
- node_data_array.push({handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]});
339
- }
340
- }
341
- LastResult = node_data_array;
342
- JAVASCRIPT
343
- node_data_array.map do |node_data|
344
- node_data[:css_selector] = selector
345
- Isomorfeus::Puppetmaster::Node.new_by_tag(self, node.document, node_data)
346
- end
347
- end
348
-
349
- def node_find_all_xpath(node, query)
350
- js_escaped_query = query.gsub('\\', '\\\\\\').gsub('"', '\"')
351
- node_data_array = await <<~JAVASCRIPT
352
- var node_data_array = [];
353
- var element_handle_array = await AllElementHandles[#{node.handle}].$x("#{js_escaped_query}");
354
- if (element_handle_array) {
355
- for (var i=0; i<element_handle_array.length; i++) {
356
- var node_handle = RegisterElementHandle(element_handle_array[i]);
357
- var tt = await AllElementHandles[node_handle].executionContext().evaluate((node) => {
358
- var name = node.nodeName;
359
- var tag = node.tagName.toLowerCase();
360
- var type = null;
361
- if (tag === 'input') { type = node.getAttribute('type'); }
362
- return [name, tag, type, node.isContentEditable];
363
- }, AllElementHandles[node_handle]);
364
- node_data_array.push({handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]});
365
- }
366
- }
367
- LastResult = node_data_array;
368
- JAVASCRIPT
369
- node_data_array.map do |node_data|
370
- node_data[:xpath_query] = query
371
- Isomorfeus::Puppetmaster::Node.new_by_tag(self, node.document, node_data)
372
- end
373
- end
374
-
375
- def node_find_xpath(node, query)
376
- js_escaped_query = query.gsub('\\', '\\\\\\').gsub('"', '\"')
377
- node_data = await <<~JAVASCRIPT
378
- var element_handle_array = await AllElementHandles[#{node.handle}].$x("#{js_escaped_query}");
379
- var element_handle = (element_handle_array) ? element_handle_array[0] : null;
380
- if (element_handle) {
381
- var node_handle = RegisterElementHandle(element_handle);
382
- var tt = await AllElementHandles[node_handle].executionContext().evaluate((node) => {
383
- var name = node.nodeName;
384
- var tag = node.tagName.toLowerCase();
385
- var type = null;
386
- if (tag === 'input') { type = node.getAttribute('type'); }
387
- return [name, tag, type, node.isContentEditable];
388
- }, AllElementHandles[node_handle]);
389
- LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
390
- }
391
- JAVASCRIPT
392
- if node_data
393
- node_data[:xpath_query] = query
394
- Isomorfeus::Puppetmaster::Node.new_by_tag(self, node.document, node_data)
395
- else
396
- raise Isomorfeus::Puppetmaster::ElementNotFound.new(query)
397
- end
398
- end
399
-
400
- def node_focus(node)
401
- await "await AllElementHandles[#{node.handle}].focus();"
402
- end
403
-
404
- def node_get_attribute(node, attribute)
405
- await <<~JAVASCRIPT
406
- LastResult = await AllElementHandles[#{node.handle}].executionContext().evaluate(function(node, attribute){
407
- return node.getAttribute(attribute);
408
- }, AllElementHandles[#{node.handle}], '#{attribute}');
409
- JAVASCRIPT
410
- end
411
-
412
- def node_get_property(node, property)
413
- await <<~JAVASCRIPT
414
- LastResult = await AllElementHandles[#{node.handle}].executionContext().evaluate(function(node, property){
415
- return node[property];
416
- }, AllElementHandles[#{node.handle}], '#{property}');
417
- JAVASCRIPT
418
- end
419
-
420
- def node_hover(node)
421
- await "await AllElementHandles[#{node.handle}].hover(); }"
422
- end
423
-
424
- def node_in_viewport?(node)
425
- await <<~JAVASCRIPT
426
- var node_handle = #{node.handle};
427
- var handle = await AllElementHandles[node_handle].executionContext().evaluateHandle(function(node) {
428
- var top = node.offsetTop, left = node.offsetLeft, width = node.offsetWidth, height = node.offsetHeight;
429
- while(node.offsetParent) { node = node.offsetParent; top += node.offsetTop; left += node.offsetLeft; }
430
- return (top >= window.pageYOffset && left >= window.pageXOffset &&
431
- (top + height) <= (window.pageYOffset + window.innerHeight) && (left + width) <= (window.pageXOffset + window.innerWidth));
432
- }, AllElementHandles[node_handle]);
433
- LastResult = await handle.jsonValue();
434
- JAVASCRIPT
435
- end
436
-
437
- def node_render_base64(node, **options)
438
- # https://pptr.dev/#?product=Puppeteer&version=v1.12.2&show=api-pagescreenshotoptions
439
- final_options = ["encoding: 'base64'"]
440
- if options.key?(:format)
441
- options[:format] = 'jpeg' if options[:format].to_s.downcase == 'jpg'
442
- final_options << "type: '#{options.delete(:format).to_s.downcase}'"
443
- end
444
- final_options << "quality: #{options.delete(:quality)}" if options.key?(:quality)
445
- box = await "LastResult = await AllElementHandles[#{node.handle}].boundingBox();"
446
- final_options << "clip: {x: #{box['x']}, y: #{box['y']}, width: #{box['width']}, height: #{box['height']}}"
447
- options.each { |k,v| final_options << "#{k.to_s.camelize(:lower)}: #{v}" }
448
- await "LastResult = await AllPageHandles[#{node.document.handle}].screenshot({#{final_options.join(', ')}});"
449
- end
450
-
451
- def node_right_click(node, x: nil, y: nil, modifiers: nil)
452
- # modifier_keys: :alt, :control, :meta, :shift
453
- # offset: { x: int, y: int }
454
- modifiers = [modifiers] if modifiers.is_a?(Symbol)
455
- modifiers = [] unless modifiers
456
- modifiers = modifiers.map {|key| key.to_s.camelize(:lower) }
457
- await <<~JAVASCRIPT
458
- var response_event_occurred = false;
459
- var response_handler = function(event){ response_event_occurred = true; };
460
- var response_watcher = new Promise(function(resolve, reject){
461
- setTimeout(function(){
462
- if (!response_event_occurred) { resolve(true); }
463
- else { setTimeout(function(){ resolve(true); }, #{@puppeteer_timeout}); }
464
- AllPageHandles[#{node.document.handle}].removeListener('response', response_handler);
465
- }, #{@puppeteer_reaction_timeout});
466
- });
467
- AllPageHandles[#{node.document.handle}].on('response', response_handler);
468
- var navigation_watcher = AllPageHandles[#{node.document.handle}].waitForNavigation();
469
- await AllElementHandles[#{node.handle}].executionContext().evaluate(function(node){
470
- var options = {button: 2, bubbles: true, cancelable: true};
471
- var x = #{x ? x : 'null'};
472
- var y = #{y ? y : 'null'};
473
- var modifiers = #{modifiers};
474
- if (x && y) {
475
- var bounding_box = node.getBoundingClientRect();
476
- options['clientX'] = bounding_box.left + x;
477
- options['clientY'] = bounding_box.top + y;
478
- }
479
- if (modifiers.includes('meta')) { options['metaKey'] = true; }
480
- if (modifiers.includes('control')) { options['ctrlKey'] = true; }
481
- if (modifiers.includes('shift')) { options['shiftKey'] = true; }
482
- if (modifiers.includes('alt')) { options['altKey'] = true; }
483
- node.dispatchEvent(new MouseEvent('mousedown', options));
484
- node.dispatchEvent(new MouseEvent('mouseup', options));
485
- node.dispatchEvent(new MouseEvent('contextmenu', options));
486
- return options;
487
- }, AllElementHandles[#{node.handle}]);
488
- await Promise.race([response_watcher, navigation_watcher]);
489
- JAVASCRIPT
490
- end
491
-
492
- def node_save_screenshot(node, path, **options)
493
- # https://pptr.dev/#?product=Puppeteer&version=v1.12.2&show=api-pagescreenshotoptions
494
- absolute_path = File.absolute_path(path)
495
- final_options = ["path: '#{absolute_path}'"]
496
- if options.key?(:format)
497
- options[:format] = 'jpeg' if options[:format].to_s.downcase == 'jpg'
498
- final_options << "type: '#{options.delete(:format).to_s.downcase}'"
499
- end
500
- final_options << "quality: #{options.delete(:quality)}" if options.key?(:quality)
501
- box = await "LastResult = await AllElementHandles[#{node.handle}].boundingBox();"
502
- final_options << "clip: {x: #{box['x']}, y: #{box['y']}, width: #{box['width']}, height: #{box['height']}}"
503
- options.each { |k,v| final_options << "#{k.to_s.camelize(:lower)}: #{v}" }
504
- await "await AllPageHandles[#{node.document.handle}].screenshot({#{final_options.join(', ')}});"
505
- end
506
-
507
- def node_scroll_by(node, x, y)
508
- await <<~JAVASCRIPT
509
- await AllElementHandles[#{node.handle}].executionContext().evaluateHandle(function(node) {
510
- node.scrollBy(#{x}, #{y});
511
- }, AllElementHandles[#{node.handle}]);
512
- JAVASCRIPT
513
- end
514
-
515
- def node_scroll_into_view(node)
516
- await <<~JAVASCRIPT
517
- await AllElementHandles[#{node.handle}].executionContext().evaluateHandle(function(node) {
518
- node.scrollIntoView();
519
- }, AllElementHandles[#{node.handle}]);
520
- JAVASCRIPT
521
- end
522
-
523
- def node_scroll_to(node, x, y)
524
- await <<~JAVASCRIPT
525
- await AllElementHandles[#{node.handle}].executionContext().evaluateHandle(function(node) {
526
- node.scrollTo(#{x}, #{y});
527
- }, AllElementHandles[#{node.handle}]);
528
- JAVASCRIPT
529
- end
530
-
531
- def node_select(node)
532
- # In the case of an OPTION tag, the change event should come
533
- # from the parent SELECT
534
- await <<~JAVASCRIPT
535
- await AllElementHandles[#{node.handle}].executionContext().evaluateHandle(function(node){
536
- var xpath = "parent::optgroup[@disabled] | ancestor::select[@disabled] | parent::fieldset[@disabled] | \
537
- ancestor::*[not(self::legend) or preceding-sibling::legend][parent::fieldset[@disabled]]";
538
- if (node.disabled || document.evaluate(xpath, node, null, XPathResult.BOOLEAN_TYPE, null).booleanValue) { return false; }
539
- else if (node.value == false && !node.parentNode.multiple) { return false; }
540
- else {
541
- node.parentNode.dispatchEvent(new FocusEvent('focus',{bubbles: true, cancelable: true}));
542
- node.selected = true;
543
- var element;
544
- if (node.nodeName == "OPTION") {
545
- element = node.parentNode;
546
- if (element.nodeName == "OPTGROUP") { element = element.parentNode; }
547
- } else { element = node; }
548
- element.dispatchEvent(new Event('change',{bubbles: true, cancelable: false}));
549
- node.parentNode.dispatchEvent(new FocusEvent('blur',{bubbles: true, cancelable: true}));
550
- return true;
551
- }
552
- }, AllElementHandles[#{node.handle}]);
553
- JAVASCRIPT
554
- end
555
-
556
- def node_style(node, *styles)
557
- await <<~JAVASCRIPT
558
- var handle = await AllElementHandles[#{node.handle}].executionContext().evaluateHandle(function(node, styles){
559
- return = window.getComputedStyle(node);
560
- }, AllElementHandles[#{node.handle}], #{styles});
561
- LastResult = await handle.jsonValue();
562
- JAVASCRIPT
563
- end
564
-
565
- def node_type_keys(node, *keys)
566
- cjs = "await AllElementHandles[#{node.handle}].focus();\n"
567
- top_modifiers = []
568
- keys.each do |key|
569
- if key.is_a?(String)
570
- key.each_char do |c|
571
- need_shift = /[[:upper:]]/.match(c)
572
- cjs << "await AllPageHandles[#{node.document.handle}].keyboard.down('Shift');\n" if need_shift
573
- c = "Key#{c.upcase}" if /[[:alpha:]]/.match(c)
574
- cjs << "await AllPageHandles[#{node.document.handle}].keyboard.press('#{c}');\n"
575
- cjs << "await AllPageHandles[#{node.document.handle}].keyboard.up('Shift');\n" if need_shift
576
- end
577
- elsif key.is_a?(Symbol)
578
- if %i[ctrl Ctrl].include?(key)
579
- key = :control
580
- elsif %i[command Command Meta].include?(key)
581
- key = :meta
582
- elsif %i[divide Divide].include?(key)
583
- key = :numpad_divide
584
- elsif %i[decimal Decimal].include?(key)
585
- key = :numpad_decimal
586
- elsif %i[left right up down].include?(key)
587
- key = "arrow_#{key}".to_sym
588
- end
589
- if %i[alt alt_left alt_right control control_left control_rigth meta meta_left meta_right shift shift_left shift_right].include?(key)
590
- top_modifiers << key
591
- cjs << "await AllPageHandles[#{node.document.handle}].keyboard.down('#{key.to_s.camelize}');\n"
592
- else
593
- cjs << "await AllElementHandles[#{node.handle}].press('#{key.to_s.camelize}');\n"
594
- end
595
- elsif key.is_a?(Array)
596
- modifiers = []
597
- key.each do |k|
598
- if k.is_a?(Symbol)
599
- if %i[ctrl Ctrl].include?(k)
600
- k = :control
601
- elsif %i[command Command Meta].include?(k)
602
- k = :meta
603
- elsif %i[divide Divide].include?(k)
604
- k = :numpad_divide
605
- elsif %i[decimal Decimal].include?(k)
606
- k = :numpad_decimal
607
- elsif %i[left right up down].include?(key)
608
- k = "arrow_#{key}".to_sym
609
- end
610
- if %i[alt alt_left alt_right control control_left control_rigth meta meta_left meta_right shift shift_left shift_right].include?(k)
611
- modifiers << k
612
- cjs << "await AllPageHandles[#{node.document.handle}].keyboard.down('#{k.to_s.camelize}');\n"
613
- else
614
- cjs << "await AllElementHandles[#{node.handle}].press('#{k.to_s.camelize}');\n"
615
- end
616
- elsif k.is_a?(String)
617
- k.each_char do |c|
618
- need_shift = /[[:upper:]]/.match(c)
619
- cjs << "await AllPageHandles[#{node.document.handle}].keyboard.down('Shift');\n" if need_shift
620
- c = "Key#{c.upcase}" if /[[:alpha:]]/.match(c)
621
- cjs << "await AllPageHandles[#{node.document.handle}].keyboard.press('#{c}');\n"
622
- cjs << "await AllPageHandles[#{node.document.handle}].keyboard.up('Shift');\n" if need_shift
623
- end
624
- end
625
- end
626
- modifiers.reverse.each do |k|
627
- cjs << "await AllPageHandles[#{node.document.handle}].keyboard.up('#{k.to_s.camelize}');\n"
628
- end
629
- end
630
- end
631
- top_modifiers.reverse.each do |key|
632
- cjs << "await AllPageHandles[#{node.document.handle}].keyboard.up('#{key.to_s.camelize}');\n"
633
- end
634
- await(cjs)
635
- end
636
-
637
- def node_unselect(node)
638
- # In the case of an OPTION tag, the change event should come
639
- # from the parent SELECT
640
- await <<~JAVASCRIPT
641
- await AllElementHandles[#{node.handle}].executionContext().evaluateHandle(function(node){
642
- var xpath = "parent::optgroup[@disabled] | ancestor::select[@disabled] | parent::fieldset[@disabled] | \
643
- ancestor::*[not(self::legend) or preceding-sibling::legend][parent::fieldset[@disabled]]";
644
- if (node.disabled || document.evaluate(xpath, node, null, XPathResult.BOOLEAN_TYPE, null).booleanValue) { return false; }
645
- else if (node.value == false && !node.parentNode.multiple) { return false; }
646
- else {
647
- node.parentNode.dispatchEvent(new FocusEvent('focus',{bubbles: true, cancelable: true}));
648
- node.selected = false;
649
- var element;
650
- if (node.nodeName == "OPTION") {
651
- element = node.parentNode;
652
- if (element.nodeName == "OPTGROUP") { element = element.parentNode; }
653
- } else { element = node; }
654
- element.dispatchEvent(new Event('change',{bubbles: true, cancelable: false}));
655
- node.parentNode.dispatchEvent(new FocusEvent('blur',{bubbles: true, cancelable: true}));
656
- return true;
657
- }
658
- }, AllElementHandles[#{node.handle}]);
659
- JAVASCRIPT
660
- end
661
-
662
- def node_value(node)
663
- await <<~JAVASCRIPT
664
- LastResult = await AllElementHandles[#{node.handle}].executionContext().evaluate(function(node){
665
- if (node.tagName == "SELECT" && node.multiple) {
666
- var result = []
667
- for (let i = 0, len = node.children.length; i < len; i++) {
668
- var option = node.children[i];
669
- if (option.selected) { result.push(option.value); }
670
- }
671
- return result;
672
- } else if (node.isContentEditable) { return node.textContent; }
673
- else { return node.value; }
674
- }, AllElementHandles[#{node.handle}]);
675
- JAVASCRIPT
676
- end
677
-
678
- def node_value=(node, value)
679
- raise Isomorfeus::Puppetmaster::ReadOnlyElementError if node.readonly?
680
- real_value = "`#{value}`"
681
- if %w[input textarea].include?(node.tag)
682
- await <<~JAVASCRIPT
683
- await AllElementHandles[#{node.handle}].executionContext().evaluate(function(node, value){
684
- if (node.maxLength >= 0) { value = value.substr(0, node.maxLength); }
685
- node.dispatchEvent(new FocusEvent("focus",{bubbles: true, cancelable: true}));
686
- var tag_name = node.tagName.toLowerCase();
687
- if (tag_name === 'input') {
688
- node.value = '';
689
- if (node.type === "number" || node.type === "date") {
690
- for (var i = 0; i < value.length; i++) {
691
- node.dispatchEvent(new KeyboardEvent("keydown", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
692
- node.dispatchEvent(new KeyboardEvent("keyup", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
693
- node.dispatchEvent(new KeyboardEvent("keypress", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
694
- }
695
- node.value = value;
696
- }
697
- else if (node.type == "time") { node.value = new Date(value).toTimeString().split(" ")[0]; }
698
- else if (node.type == "datetime-local") {
699
- value = new Date(value);
700
- var year = value.getFullYear();
701
- var month = ("0" + (value.getMonth() + 1)).slice(-2);
702
- var date = ("0" + value.getDate()).slice(-2);
703
- var hour = ("0" + value.getHours()).slice(-2);
704
- var min = ("0" + value.getMinutes()).slice(-2);
705
- var sec = ("0" + value.getSeconds()).slice(-2);
706
- value = `${year}-${month}-${date}T${hour}:${min}:${sec}`;
707
- for (var i = 0; i < value.length; i++) {
708
- node.dispatchEvent(new KeyboardEvent("keydown", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
709
- node.value = node.value + value[i];
710
- node.dispatchEvent(new KeyboardEvent("keyup", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
711
- node.dispatchEvent(new KeyboardEvent("keypress", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
712
- }
713
- } else if (node.type === 'checkbox' || node.type === 'radio') { node.checked = value; }
714
- else {
715
- for (var i = 0; i < value.length; i++) {
716
- node.dispatchEvent(new KeyboardEvent("keydown", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
717
- node.value = node.value + value[i];
718
- node.dispatchEvent(new KeyboardEvent("keyup", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
719
- node.dispatchEvent(new KeyboardEvent("keypress", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
720
- }
721
- }
722
- } else if (tag_name === 'textarea') {
723
- for (var i = 0; i < value.length; i++) {
724
- node.dispatchEvent(new KeyboardEvent("keydown", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
725
- node.value = node.value + value[i];
726
- node.dispatchEvent(new KeyboardEvent("keyup", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
727
- node.dispatchEvent(new KeyboardEvent("keypress", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
728
- }
729
- }
730
- }, AllElementHandles[#{node.handle}], #{real_value});
731
- JAVASCRIPT
732
- else
733
- await <<~JAVASCRIPT
734
- await AllElementHandles[#{node.handle}].executionContext().evaluate(function(node, value){
735
- if (node.isContentEditable) {
736
- var range = document.createRange();
737
- range.selectNodeContents(node);
738
- window.getSelection().removeAllRanges();
739
- window.getSelection().addRange(range);
740
- window.getSelection().deleteFromDocument();
741
- window.getSelection().removeAllRanges();
742
- node.dispatchEvent(new KeyboardEvent("keydown", {key: value[0], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
743
- node.textContent = value;
744
- node.dispatchEvent(new KeyboardEvent("keyup", {key: value[0], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
745
- }
746
- }, AllElementHandles[#{node.handle}], #{real_value});
747
- JAVASCRIPT
748
- end
749
- real_value
750
- end
751
-
752
- def node_visible_text(node)
753
- # if node is AREA, check visibility of relevant image
754
- text = await <<~JAVASCRIPT
755
- var handle = await AllElementHandles[#{node.handle}].executionContext().evaluateHandle(function(node){
756
- var temp_node = node;
757
- var mapName, style;
758
- if (node.tagName === "AREA") {
759
- mapName = document.evaluate("./ancestor::map/@name", node, null, XPathResult.STRING_TYPE, null).stringValue;
760
- temp_node = document.querySelector(`img[usemap="#${mapName}"]`);
761
- if (temp_node == null) { return ''; }
762
- }
763
- temp_node = node;
764
- while (temp_node) {
765
- style = window.getComputedStyle(node);
766
- if (style.display === "none" || style.visibility === "hidden" || parseFloat(style.opacity) === 0) { return ''; }
767
- temp_node = temp_node.parentElement;
768
- }
769
- if (node.nodeName == "TEXTAREA" || node instanceof SVGElement) { return node.textContent; }
770
- else { return node.innerText; }
771
- }, AllElementHandles[#{node.handle}]);
772
- LastResult = await handle.jsonValue();
773
- JAVASCRIPT
774
- text.gsub(/\A[[:space:]&&[^\u00a0]]+/, "").gsub(/[[:space:]&&[^\u00a0]]+\z/, "").gsub(/\n+/, "\n").tr("\u00a0", " ")
775
- end
776
-
777
- def node_visible?(node)
778
- await <<~JAVASCRIPT
779
- var handle = await AllElementHandles[#{node.handle}].executionContext().evaluateHandle(function(node){
780
- if (node.tagName == 'AREA'){
781
- const map_name = document.evaluate('./ancestor::map/@name', node, null, XPathResult.STRING_TYPE, null).stringValue;
782
- node = document.querySelector(`img[usemap='#${map_name}']`);
783
- if (!node){ return false; }
784
- }
785
- var forced_visible = false;
786
- while (node) {
787
- const style = window.getComputedStyle(node);
788
- if (style.visibility == 'visible') { forced_visible = true; }
789
- if ((style.display == 'none') || ((style.visibility == 'hidden') && !forced_visible) || (parseFloat(style.opacity) == 0)) {
790
- return false;
791
- }
792
- node = node.parentElement;
793
- }
794
- return true;
795
- }, AllElementHandles[#{node.handle}]);
796
- LastResult = await handle.jsonValue();
797
- JAVASCRIPT
798
- end
799
-
800
- def node_wait_for(node, selector)
801
- # TODO setTimeout
802
- js_escaped_selector = selector.gsub('\\', '\\\\\\').gsub('"', '\"')
803
- node_data = await <<~JAVASCRIPT
804
- var element_handle = await AllElementHandles[#{node.handle}].$("#{js_escaped_selector}");
805
- if (element_handle) {
806
- var node_handle = RegisterElementHandle(element_handle);
807
- var handle = await AllElementHandles[node_handle].evaluate((node) => {
808
- var name = node.nodeName;
809
- var tag = node.tagName.toLower();
810
- var type = null;
811
- if (tag === 'input') { type = node.getAttribute('type'); }
812
- return [name, tag, type, node.isContentEditable];
813
- }, AllElementHandles[node_handle]);
814
- var tt = await handle.jsonValue();
815
- LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
816
- }
817
- JAVASCRIPT
818
- if node_data
819
- node_data[:css_selector] = selector
820
- Isomorfeus::Puppetmaster::Node.new_by_tag(self, document, node_data)
821
- end
822
- end
823
-
824
- def node_wait_for_xpath(node, query)
825
- # TODO setTimeout
826
- js_escaped_query = query.gsub('\\', '\\\\\\').gsub('"', '\"')
827
- node_data = await <<~JAVASCRIPT
828
- var element_handle_array = await AllElementHandles[#{node.handle}].$x("#{js_escaped_query}");
829
- var element_handle = (element_handle_array) ? element_handle_array[0] : null;
830
- if (element_handle) {
831
- var node_handle = RegisterElementHandle(element_handle);
832
- var handle = await AllElementHandles[node_handle].evaluate((node) => {
833
- var name = node.nodeName;
834
- var tag = node.tagName.toLower();
835
- var type = null;
836
- if (tag === 'input') { type = node.getAttribute('type'); }
837
- return [name, tag, type, node.isContentEditable];
838
- }, AllElementHandles[node_handle]);
839
- var tt = await handle.jsonValue();
840
- LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
841
- }
842
- JAVASCRIPT
843
- if node_data
844
- node_data[:xpath_query] = query
845
- Isomorfeus::Puppetmaster::Node.new_by_tag(self, document, node_data)
846
- end
847
- end
848
- end
849
- end
850
- end
851
- end
1
+ module Isomorfeus
2
+ module Puppetmaster
3
+ module Driver
4
+ module PuppeteerNode
5
+ def node_all_text(node)
6
+ await <<~JAVASCRIPT
7
+ LastResult = await AllElementHandles[#{node.handle}].executionContext().evaluate(function(node){
8
+ return node.textContent;
9
+ }, AllElementHandles[#{node.handle}]);
10
+ JAVASCRIPT
11
+ end
12
+
13
+ def node_click(node, x: nil, y: nil, modifiers: nil)
14
+ # modifier_keys: :alt, :control, :meta, :shift
15
+ # raise Isomorfeus::Pupppetmaster::InvalidActionError.new(:click) unless visible?
16
+ modifiers = [modifiers] if modifiers.is_a?(Symbol)
17
+ modifiers = [] unless modifiers
18
+ modifiers = modifiers.map {|key| key.to_s.camelize(:lower) }
19
+ await <<~JAVASCRIPT
20
+ var response_event_occurred = false;
21
+ var response_handler = function(event){ response_event_occurred = true; };
22
+ var response_watcher = new Promise(function(resolve, reject){
23
+ setTimeout(function(){
24
+ if (!response_event_occurred) { resolve(true); }
25
+ else { setTimeout(function(){ resolve(true); }, #{@puppeteer_timeout}); }
26
+ AllPageHandles[#{node.document.handle}].removeListener('response', response_handler);
27
+ }, #{@puppeteer_reaction_timeout});
28
+ });
29
+ AllPageHandles[#{node.document.handle}].on('response', response_handler);
30
+ var navigation_watcher = AllPageHandles[#{node.document.handle}].waitForNavigation();
31
+ await AllElementHandles[#{node.handle}].executionContext().evaluate(function(node){
32
+ var options = {button: 0, bubbles: true, cancelable: true};
33
+ var x = #{x ? x : 'null'};
34
+ var y = #{y ? y : 'null'};
35
+ var modifiers = #{modifiers};
36
+ if (x && y) {
37
+ var bounding_box = node.getBoundingClientRect();
38
+ options['clientX'] = bounding_box.x + x;
39
+ options['clientY'] = bounding_box.y + y;
40
+ }
41
+ if (modifiers.includes('meta')) { options['metaKey'] = true; }
42
+ if (modifiers.includes('control')) { options['ctrlKey'] = true; }
43
+ if (modifiers.includes('shift')) { options['shiftKey'] = true; }
44
+ if (modifiers.includes('alt')) { options['altKey'] = true; }
45
+ node.dispatchEvent(new MouseEvent('mousedown', options));
46
+ node.dispatchEvent(new MouseEvent('mouseup', options));
47
+ node.dispatchEvent(new MouseEvent('click', options));
48
+ }, AllElementHandles[#{node.handle}]);
49
+ await Promise.race([response_watcher, navigation_watcher]);
50
+ JAVASCRIPT
51
+ end
52
+
53
+ def node_disabled?(node)
54
+ await <<~JAVASCRIPT
55
+ LastResult = await AllElementHandles[#{node.handle}].executionContext().evaluate(node => {
56
+ const xpath = `parent::optgroup[@disabled] | ancestor::select[@disabled] | parent::fieldset[@disabled] |
57
+ ancestor::*[not(self::legend) or preceding-sibling::legend][parent::fieldset[@disabled]]`;
58
+ return node.disabled || document.evaluate(xpath, node, null, XPathResult.BOOLEAN_TYPE, null).booleanValue;
59
+ }, AllElementHandles[#{node.handle}]);
60
+ JAVASCRIPT
61
+ end
62
+
63
+ def node_dispatch_event(node, name, event_type = nil, **options)
64
+ raise ArgumentError, 'Unknown event' unless Isomorfeus::Puppetmaster::Driver::Puppeteer::EVENTS.key?(name.to_sym) || event_type
65
+ event_type, opts = *Isomorfeus::Puppetmaster::Driver::Puppeteer::EVENTS[name.to_sym] if event_type.nil?
66
+ opts.merge!(options)
67
+ final_options = options.map { |k,v| "#{k}: '#{v}'" }
68
+ await <<~JAVASCRIPT
69
+ await AllElementHandles[#{node.handle}].executionContext().evaluate(function(node){
70
+ var event = new #{event_type}('#{name}', { #{final_options.join(', ')} });
71
+ node.dispatchEvent(event);
72
+ }, AllElementHandles[#{node.handle}]);
73
+ JAVASCRIPT
74
+ end
75
+
76
+ def node_double_click(node, x: nil, y: nil, modifiers: nil)
77
+ # modifier_keys: :alt, :control, :meta, :shift
78
+ # offset: { x: int, y: int }
79
+ modifiers = [modifiers] if modifiers.is_a?(Symbol)
80
+ modifiers = [] unless modifiers
81
+ modifiers = modifiers.map {|key| key.to_s.camelize(:lower) }
82
+ await <<~JAVASCRIPT
83
+ var response_event_occurred = false;
84
+ var response_handler = function(event){ response_event_occurred = true; };
85
+ var response_watcher = new Promise(function(resolve, reject){
86
+ setTimeout(function(){
87
+ if (!response_event_occurred) { resolve(true); }
88
+ else { setTimeout(function(){ resolve(true); }, #{@puppeteer_timeout}); }
89
+ AllPageHandles[#{node.document.handle}].removeListener('response', response_handler);
90
+ }, #{@puppeteer_reaction_timeout});
91
+ });
92
+ AllPageHandles[#{node.document.handle}].on('response', response_handler);
93
+ var navigation_watcher = AllPageHandles[#{node.document.handle}].waitForNavigation();
94
+ await AllElementHandles[#{node.handle}].executionContext().evaluate(function(node){
95
+ var options = {button: 0, bubbles: true, cancelable: true};
96
+ var x = #{x ? x : 'null'};
97
+ var y = #{y ? y : 'null'};
98
+ var modifiers = #{modifiers};
99
+ if (x && y) {
100
+ var bounding_box = node.getBoundingClientRect();
101
+ options['clientX'] = bounding_box.left + x;
102
+ options['clientY'] = bounding_box.top + y;
103
+ }
104
+ if (modifiers.includes('meta')) { options['metaKey'] = true; }
105
+ if (modifiers.includes('control')) { options['ctrlKey'] = true; }
106
+ if (modifiers.includes('shift')) { options['shiftKey'] = true; }
107
+ if (modifiers.includes('alt')) { options['altKey'] = true; }
108
+ node.dispatchEvent(new MouseEvent('mousedown', options));
109
+ node.dispatchEvent(new MouseEvent('mouseup', options));
110
+ node.dispatchEvent(new MouseEvent('dblclick', options));
111
+ return options;
112
+ }, AllElementHandles[#{node.handle}]);
113
+ await Promise.race([response_watcher, navigation_watcher]);
114
+ JAVASCRIPT
115
+ end
116
+
117
+ def node_drag_to(node, other_node)
118
+ if node[:draggable]
119
+ await <<~JAVASCRIPT
120
+ await AllElementHandles[#{node.handle}].executionContext().evaluateHandle(function(node) {
121
+ document.addEventListener('mousedown', event => {
122
+ window.puppeteer_mousedown_prevented = event.defaultPrevented;
123
+ }, { once: true, passive: true });
124
+ }, AllElementHandles[#{node.handle}]);
125
+ JAVASCRIPT
126
+ # TODO use scrollIntoView once chromium bug is fixed
127
+ # https://bugs.chromium.org/p/chromium/issues/detail?id=939740&can=2&start=0&num=100&q=mousemove%20scrollintoview&colspec=ID%20Type%20Status%20Priority%20Milestone%20Owner%20Summary&groupby=&sort=
128
+ await <<~JAVASCRIPT
129
+ var node_handle = #{node.handle};
130
+ await AllElementHandles[node_handle].executionContext().evaluateHandle(function(node, other_node) {
131
+ var n = node;
132
+ var top = n.offsetTop, left = n.offsetLeft, width = n.offsetWidth, height = n.offsetHeight;
133
+ while(n.offsetParent) { n = n.offsetParent; top += n.offsetTop; left += n.offsetLeft; }
134
+ var node_in_view = (top >= window.pageYOffset && left >= window.pageXOffset &&
135
+ (top + height) <= (window.pageYOffset + window.innerHeight) && (left + width) <= (window.pageXOffset + window.innerWidth));
136
+ if (!node_in_view) { node.scrollTo(0,0); };
137
+ setTimeout(function(){
138
+ var client_rect = node.getBoundingClientRect();
139
+ var x = (client_rect.left + (client_rect.width / 2));
140
+ var y = (client_rect.top + (client_rect.height / 2));
141
+ node.dispatchEvent(new MouseEvent('mousemove', {clientX: x, clientY: y, bubbles: true, cancelable: true}));
142
+ setTimeout(function(){
143
+ node.dispatchEvent(new MouseEvent('mousedown', {clientX: x, clientY: y, bubbles: true, cancelable: true}));
144
+ if (window.puppeteer_mousedown_prevented) {
145
+ n = other_node;
146
+ top = n.offsetTop; left = n.offsetLeft; width = n.offsetWidth; height = n.offsetHeight;
147
+ while(n.offsetParent) { n = n.offsetParent; top += n.offsetTop; left += n.offsetLeft; }
148
+ var node_in_view = (top >= window.pageYOffset && left >= window.pageXOffset &&
149
+ (top + height) <= (window.pageYOffset + window.innerHeight) && (left + width) <= (window.pageXOffset + window.innerWidth));
150
+ if (!node_in_view) { other_node.scrollTo(0,0) };
151
+ setTimeout(function(){
152
+ client_rect = other_node.getBoundingClientRect();
153
+ x = (client_rect.left + (client_rect.width / 2));
154
+ y = (client_rect.top + (client_rect.height / 2));
155
+ node.dispatchEvent(new MouseEvent('mousemove', {clientX: x, clientY: y, bubbles: true, cancelable: true}));
156
+ setTimeout(function(){
157
+ node.dispatchEvent(new MouseEvent('mouseup', {clientX: x, clientY: y, bubbles: true, cancelable: true}));
158
+ }, #{@puppeteer_reaction_timeout/2});
159
+ }, #{@puppeteer_reaction_timeout});
160
+ } else {
161
+ var dt = new DataTransfer();
162
+ if (node.tagName == 'A'){ dt.setData('text/uri-list', node.href); dt.setData('text', node.href); }
163
+ if (node.tagName == 'IMG'){ dt.setData('text/uri-list', node.src); dt.setData('text', node.src); }
164
+ var opts = { cancelable: true, bubbles: true, dataTransfer: dt };
165
+ var dragEvent = new DragEvent('dragstart', opts);
166
+ node.dispatchEvent(dragEvent);
167
+ n = other_node;
168
+ top = n.offsetTop; left = n.offsetLeft; width = n.offsetWidth; height = n.offsetHeight;
169
+ while(n.offsetParent) { n = n.offsetParent; top += n.offsetTop; left += n.offsetLeft; }
170
+ var node_in_view = (top >= window.pageYOffset && left >= window.pageXOffset &&
171
+ (top + height) <= (window.pageYOffset + window.innerHeight) && (left + width) <= (window.pageXOffset + window.innerWidth));
172
+ if (!node_in_view) { other_node.scrollTo(0,0); };
173
+ setTimeout(function(){
174
+ var rect = node.getBoundingClientRect()
175
+ var node_center = new DOMPoint((rect.left + rect.right)/2, (rect.top + rect.bottom)/2);
176
+ var other_rect = other_node.getBoundingClientRect();
177
+ var other_point = new DOMPoint((other_rect.left + other_rect.right)/2, (other_rect.top + other_rect.bottom)/2);
178
+ var entry_point = null;
179
+ var slope = (other_point.y - other_point.y) / (other_point.x - node_center.x);
180
+ if (other_point.x <= other_point.x) { // left side
181
+ var minXy = slope * (other_rect.left - node_center.x) + node_center.y;
182
+ if (other_rect.top <= minXy && minXy <= other_rect.bottom) { entry_point = new DOMPoint(other_rect.left, minXy); }
183
+ }
184
+ if (node_center.x >= other_point.x) { // right side
185
+ var maxXy = slope * (other_rect.right - node_center.x) + node_center.y;
186
+ if (other_rect.top <= maxXy && maxXy <= other_rect.bottom) { entry_point = new DOMPoint(other_rect.right, maxXy); }
187
+ }
188
+ if (node_center.y <= other_point.y) { // top side
189
+ var minYx = (other_point.top - node_center.y) / slope + node_center.x;
190
+ if (other_rect.left <= minYx && minYx <= other_rect.right) { entry_point = new DOMPoint(minYx, other_rect.top); }
191
+ }
192
+ if (node_center.y >= other_point.y) { // bottom side
193
+ var maxYx = (other_rect.bottom - node_center.y) / slope + node_center.x;
194
+ if (other_rect.left <= maxYx && maxYx <= other_rect.right) { entry_point = new DOMPoint(maxYx, other_rect.bottom); }
195
+ }
196
+ if (!entry_point) {
197
+ entry_point = new DOMPoint(node_center.x, node_center.y);
198
+ }
199
+ var drag_over_event = new DragEvent('dragover', {clientX: entry_point.x, clientY: entry_point.y, bubbles: true, cancelable: true});
200
+ other_node.dispatchEvent(drag_over_event);
201
+ var other_center = new DOMPoint((other_rect.left + other_rect.right)/2, (other_rect.top + other_rect.bottom)/2);
202
+ drag_over_event = new DragEvent('dragover', {clientX: targetCenter.x, clientY: targetCenter.y, bubbles: true, cancelable: true});
203
+ other_node.dispatchEvent(drag_over_event);
204
+ other_node.dispatchEvent(new DragEvent('dragleave', {bubbles: true, cancelable: true}));
205
+ if (drag_over_event.defaultPrevented) {
206
+ other_node.dispatchEvent(new DragEvent('drop', {bubbles: true, cancelable: true}));
207
+ }
208
+ node.dispatchEvent(new DragEvent('dragend', {bubbles: true, cancelable: true}));
209
+ client_rect = other_node.getBoundingClientRect();
210
+ x = (client_rect.left + (client_rect.width / 2));
211
+ y = (client_rect.top + (client_rect.height / 2));
212
+ node.dispatchEvent(new MouseEvent('mouseup', {clientX: x, clientY: y, bubbles: true, cancelable: true}));
213
+ }, #{@puppeteer_reaction_timeout});
214
+ }
215
+ }, #{@puppeteer_reaction_timeout/2});
216
+ }, #{@puppeteer_reaction_timeout});
217
+ }, AllElementHandles[node_handle], AllElementHandles[#{other_node.handle}]);
218
+ JAVASCRIPT
219
+ sleep (@reaction_timeout * 3) + 0.2
220
+ else
221
+ await <<~JAVASCRIPT
222
+ var node_handle = #{node.handle};
223
+ await AllElementHandles[node_handle].executionContext().evaluateHandle(function(node, other_node) {
224
+ var n = node;
225
+ var top = n.offsetTop, left = n.offsetLeft, width = n.offsetWidth, height = n.offsetHeight;
226
+ while(n.offsetParent) { n = n.offsetParent; top += n.offsetTop; left += n.offsetLeft; }
227
+ var node_in_view = (top >= window.pageYOffset && left >= window.pageXOffset &&
228
+ (top + height) <= (window.pageYOffset + window.innerHeight) && (left + width) <= (window.pageXOffset + window.innerWidth));
229
+ if (!node_in_view) { res = (n === node); node.scrollTo(0,0); };
230
+ setTimeout(function() {
231
+ var client_rect = node.getBoundingClientRect();
232
+ var x = (client_rect.left + (client_rect.width / 2));
233
+ var y = (client_rect.top + (client_rect.height / 2));
234
+ node.dispatchEvent(new MouseEvent('mousemove', {clientX: x, clientY: y, bubbles: true, cancelable: true}));
235
+ setTimeout(function() {
236
+ node.dispatchEvent(new MouseEvent('mousedown', {button: 0, buttons: 1, clientX: x, clientY: y, bubbles: true, cancelable: true}));
237
+ var n = other_node;
238
+ var top = n.offsetTop, left = n.offsetLeft, width = n.offsetWidth, height = n.offsetHeight;
239
+ while(n.offsetParent) { n = n.offsetParent; top += n.offsetTop; left += n.offsetLeft; }
240
+ var other_node_in_view = (top >= window.pageYOffset && left >= window.pageXOffset &&
241
+ (top + height) <= (window.pageYOffset + window.innerHeight) && (left + width) <= (window.pageXOffset + window.innerWidth));
242
+ if (!other_node_in_view) { other_node.scrollTo(0,0); };
243
+ setTimeout(function() {
244
+ var other_client_rect = other_node.getBoundingClientRect();
245
+ var x = (other_client_rect.left + (other_client_rect.width / 2));
246
+ var y = (other_client_rect.top + (other_client_rect.height / 2));
247
+ node.dispatchEvent(new MouseEvent('mousemove', {button: 0, buttons: 1, clientX: x, clientY: y, bubbles: true, cancelable: true}));
248
+ setTimeout(function() {
249
+ node.dispatchEvent(new MouseEvent('mouseup', {button: 0, buttons: 1, clientX: x, clientY: y, bubbles: true, cancelable: true}));
250
+ }, #{@puppeteer_reaction_timeout/2});
251
+ }, #{@puppeteer_reaction_timeout});
252
+ }, #{@puppeteer_reaction_timeout/2});
253
+ }, #{@puppeteer_reaction_timeout});
254
+ }, AllElementHandles[node_handle], AllElementHandles[#{other_node.handle}]);
255
+ JAVASCRIPT
256
+ sleep (@reaction_timeout * 3) + 0.2
257
+ end
258
+ end
259
+
260
+ def node_equal(node, other_node)
261
+ await <<~JAVASCRIPT
262
+ var node_handle = #{node.handle};
263
+ var other_handle = #{other_node.handle};
264
+ if (AllElementHandles[node_handle] && AllElementHandles[other_handle]) {
265
+ try {
266
+ var handle = await AllElementHandles[node_handle].executionContext().evaluateHandle(function(node, other_node){
267
+ return (node === other_node);
268
+ }, AllElementHandles[node_handle],AllElementHandles[other_handle]);
269
+ LastResult = await handle.jsonValue();
270
+ } catch (err) {
271
+ LastResult = false;
272
+ }
273
+ }
274
+ JAVASCRIPT
275
+ end
276
+
277
+ def node_execute_script(node, script, *args)
278
+ await <<~JAVASCRIPT
279
+ var node_handle = #{node.handle};
280
+ await AllElementHandles[node_handle].executionContext().evaluateHandle((node, arguments) => {
281
+ arguments.unshift(node);
282
+ #{script}
283
+ }, AllElementHandles[node_handle], #{args[1..-1]});
284
+ JAVASCRIPT
285
+ end
286
+
287
+ def node_evaluate_script(node, script, *args)
288
+ await <<~JAVASCRIPT
289
+ var node_handle = #{node.handle};
290
+ handle = await AllElementHandles[node_handle].executionContext().evaluateHandle((node, arguments) => {
291
+ arguments.unshift(node);
292
+ return #{script};
293
+ }, AllElementHandles[node_handle], #{args[1..-1]});
294
+ LastResult = await handle.jsonValue();
295
+ JAVASCRIPT
296
+ end
297
+
298
+ def node_find(node, selector)
299
+ js_escaped_selector = selector.gsub('\\', '\\\\\\').gsub('"', '\"')
300
+ node_data = await <<~JAVASCRIPT
301
+ var element_handle = await AllElementHandles[#{node.handle}].$("#{js_escaped_selector}");
302
+ if (element_handle) {
303
+ var node_handle = RegisterElementHandle(element_handle);
304
+ var tt = await AllElementHandles[node_handle].executionContext().evaluate((node) => {
305
+ var name = node.nodeName;
306
+ var tag = node.tagName.toLowerCase();
307
+ var type = null;
308
+ if (tag === 'input') { type = node.getAttribute('type'); }
309
+ return [name, tag, type, node.isContentEditable];
310
+ }, AllElementHandles[node_handle]);
311
+ LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
312
+ }
313
+ JAVASCRIPT
314
+ if node_data
315
+ node_data[:css_selector] = selector
316
+ Isomorfeus::Puppetmaster::Node.new_by_tag(self, node.document, node_data)
317
+ else
318
+ raise Isomorfeus::Puppetmaster::ElementNotFound.new(selector)
319
+ end
320
+ end
321
+
322
+ def node_find_all(node, selector)
323
+ js_escaped_selector = selector.gsub('\\', '\\\\\\').gsub('"', '\"')
324
+ node_data_array = await <<~JAVASCRIPT
325
+ var node_data_array = [];
326
+ var element_handle_array = await AllElementHandles[#{node.handle}].$("#{js_escaped_selector}");
327
+ if (element_handle_array) {
328
+
329
+ for (var i=0; i<element_handle_array.length; i++) {
330
+ var node_handle = RegisterElementHandle(element_handle_array[i]);
331
+ var tt = await AllElementHandles[node_handle].executionContext().evaluate((node) => {
332
+ var name = node.nodeName;
333
+ var tag = node.tagName.toLowerCase();
334
+ var type = null;
335
+ if (tag === 'input') { type = node.getAttribute('type'); }
336
+ return [name, tag, type, node.isContentEditable];
337
+ }, AllElementHandles[node_handle]);
338
+ node_data_array.push({handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]});
339
+ }
340
+ }
341
+ LastResult = node_data_array;
342
+ JAVASCRIPT
343
+ node_data_array.map do |node_data|
344
+ node_data[:css_selector] = selector
345
+ Isomorfeus::Puppetmaster::Node.new_by_tag(self, node.document, node_data)
346
+ end
347
+ end
348
+
349
+ def node_find_all_xpath(node, query)
350
+ js_escaped_query = query.gsub('\\', '\\\\\\').gsub('"', '\"')
351
+ node_data_array = await <<~JAVASCRIPT
352
+ var node_data_array = [];
353
+ var element_handle_array = await AllElementHandles[#{node.handle}].$x("#{js_escaped_query}");
354
+ if (element_handle_array) {
355
+ for (var i=0; i<element_handle_array.length; i++) {
356
+ var node_handle = RegisterElementHandle(element_handle_array[i]);
357
+ var tt = await AllElementHandles[node_handle].executionContext().evaluate((node) => {
358
+ var name = node.nodeName;
359
+ var tag = node.tagName.toLowerCase();
360
+ var type = null;
361
+ if (tag === 'input') { type = node.getAttribute('type'); }
362
+ return [name, tag, type, node.isContentEditable];
363
+ }, AllElementHandles[node_handle]);
364
+ node_data_array.push({handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]});
365
+ }
366
+ }
367
+ LastResult = node_data_array;
368
+ JAVASCRIPT
369
+ node_data_array.map do |node_data|
370
+ node_data[:xpath_query] = query
371
+ Isomorfeus::Puppetmaster::Node.new_by_tag(self, node.document, node_data)
372
+ end
373
+ end
374
+
375
+ def node_find_xpath(node, query)
376
+ js_escaped_query = query.gsub('\\', '\\\\\\').gsub('"', '\"')
377
+ node_data = await <<~JAVASCRIPT
378
+ var element_handle_array = await AllElementHandles[#{node.handle}].$x("#{js_escaped_query}");
379
+ var element_handle = (element_handle_array) ? element_handle_array[0] : null;
380
+ if (element_handle) {
381
+ var node_handle = RegisterElementHandle(element_handle);
382
+ var tt = await AllElementHandles[node_handle].executionContext().evaluate((node) => {
383
+ var name = node.nodeName;
384
+ var tag = node.tagName.toLowerCase();
385
+ var type = null;
386
+ if (tag === 'input') { type = node.getAttribute('type'); }
387
+ return [name, tag, type, node.isContentEditable];
388
+ }, AllElementHandles[node_handle]);
389
+ LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
390
+ }
391
+ JAVASCRIPT
392
+ if node_data
393
+ node_data[:xpath_query] = query
394
+ Isomorfeus::Puppetmaster::Node.new_by_tag(self, node.document, node_data)
395
+ else
396
+ raise Isomorfeus::Puppetmaster::ElementNotFound.new(query)
397
+ end
398
+ end
399
+
400
+ def node_focus(node)
401
+ await "await AllElementHandles[#{node.handle}].focus();"
402
+ end
403
+
404
+ def node_get_attribute(node, attribute)
405
+ await <<~JAVASCRIPT
406
+ LastResult = await AllElementHandles[#{node.handle}].executionContext().evaluate(function(node, attribute){
407
+ return node.getAttribute(attribute);
408
+ }, AllElementHandles[#{node.handle}], '#{attribute}');
409
+ JAVASCRIPT
410
+ end
411
+
412
+ def node_get_property(node, property)
413
+ await <<~JAVASCRIPT
414
+ LastResult = await AllElementHandles[#{node.handle}].executionContext().evaluate(function(node, property){
415
+ return node[property];
416
+ }, AllElementHandles[#{node.handle}], '#{property}');
417
+ JAVASCRIPT
418
+ end
419
+
420
+ def node_hover(node)
421
+ await "await AllElementHandles[#{node.handle}].hover(); }"
422
+ end
423
+
424
+ def node_in_viewport?(node)
425
+ await <<~JAVASCRIPT
426
+ var node_handle = #{node.handle};
427
+ var handle = await AllElementHandles[node_handle].executionContext().evaluateHandle(function(node) {
428
+ var top = node.offsetTop, left = node.offsetLeft, width = node.offsetWidth, height = node.offsetHeight;
429
+ while(node.offsetParent) { node = node.offsetParent; top += node.offsetTop; left += node.offsetLeft; }
430
+ return (top >= window.pageYOffset && left >= window.pageXOffset &&
431
+ (top + height) <= (window.pageYOffset + window.innerHeight) && (left + width) <= (window.pageXOffset + window.innerWidth));
432
+ }, AllElementHandles[node_handle]);
433
+ LastResult = await handle.jsonValue();
434
+ JAVASCRIPT
435
+ end
436
+
437
+ def node_render_base64(node, **options)
438
+ # https://pptr.dev/#?product=Puppeteer&version=v1.12.2&show=api-pagescreenshotoptions
439
+ final_options = ["encoding: 'base64'"]
440
+ if options.key?(:format)
441
+ options[:format] = 'jpeg' if options[:format].to_s.downcase == 'jpg'
442
+ final_options << "type: '#{options.delete(:format).to_s.downcase}'"
443
+ end
444
+ final_options << "quality: #{options.delete(:quality)}" if options.key?(:quality)
445
+ box = await "LastResult = await AllElementHandles[#{node.handle}].boundingBox();"
446
+ final_options << "clip: {x: #{box['x']}, y: #{box['y']}, width: #{box['width']}, height: #{box['height']}}"
447
+ options.each { |k,v| final_options << "#{k.to_s.camelize(:lower)}: #{v}" }
448
+ await "LastResult = await AllPageHandles[#{node.document.handle}].screenshot({#{final_options.join(', ')}});"
449
+ end
450
+
451
+ def node_right_click(node, x: nil, y: nil, modifiers: nil)
452
+ # modifier_keys: :alt, :control, :meta, :shift
453
+ # offset: { x: int, y: int }
454
+ modifiers = [modifiers] if modifiers.is_a?(Symbol)
455
+ modifiers = [] unless modifiers
456
+ modifiers = modifiers.map {|key| key.to_s.camelize(:lower) }
457
+ await <<~JAVASCRIPT
458
+ var response_event_occurred = false;
459
+ var response_handler = function(event){ response_event_occurred = true; };
460
+ var response_watcher = new Promise(function(resolve, reject){
461
+ setTimeout(function(){
462
+ if (!response_event_occurred) { resolve(true); }
463
+ else { setTimeout(function(){ resolve(true); }, #{@puppeteer_timeout}); }
464
+ AllPageHandles[#{node.document.handle}].removeListener('response', response_handler);
465
+ }, #{@puppeteer_reaction_timeout});
466
+ });
467
+ AllPageHandles[#{node.document.handle}].on('response', response_handler);
468
+ var navigation_watcher = AllPageHandles[#{node.document.handle}].waitForNavigation();
469
+ await AllElementHandles[#{node.handle}].executionContext().evaluate(function(node){
470
+ var options = {button: 2, bubbles: true, cancelable: true};
471
+ var x = #{x ? x : 'null'};
472
+ var y = #{y ? y : 'null'};
473
+ var modifiers = #{modifiers};
474
+ if (x && y) {
475
+ var bounding_box = node.getBoundingClientRect();
476
+ options['clientX'] = bounding_box.left + x;
477
+ options['clientY'] = bounding_box.top + y;
478
+ }
479
+ if (modifiers.includes('meta')) { options['metaKey'] = true; }
480
+ if (modifiers.includes('control')) { options['ctrlKey'] = true; }
481
+ if (modifiers.includes('shift')) { options['shiftKey'] = true; }
482
+ if (modifiers.includes('alt')) { options['altKey'] = true; }
483
+ node.dispatchEvent(new MouseEvent('mousedown', options));
484
+ node.dispatchEvent(new MouseEvent('mouseup', options));
485
+ node.dispatchEvent(new MouseEvent('contextmenu', options));
486
+ return options;
487
+ }, AllElementHandles[#{node.handle}]);
488
+ await Promise.race([response_watcher, navigation_watcher]);
489
+ JAVASCRIPT
490
+ end
491
+
492
+ def node_save_screenshot(node, path, **options)
493
+ # https://pptr.dev/#?product=Puppeteer&version=v1.12.2&show=api-pagescreenshotoptions
494
+ absolute_path = File.absolute_path(path)
495
+ final_options = ["path: '#{absolute_path}'"]
496
+ if options.key?(:format)
497
+ options[:format] = 'jpeg' if options[:format].to_s.downcase == 'jpg'
498
+ final_options << "type: '#{options.delete(:format).to_s.downcase}'"
499
+ end
500
+ final_options << "quality: #{options.delete(:quality)}" if options.key?(:quality)
501
+ box = await "LastResult = await AllElementHandles[#{node.handle}].boundingBox();"
502
+ final_options << "clip: {x: #{box['x']}, y: #{box['y']}, width: #{box['width']}, height: #{box['height']}}"
503
+ options.each { |k,v| final_options << "#{k.to_s.camelize(:lower)}: #{v}" }
504
+ await "await AllPageHandles[#{node.document.handle}].screenshot({#{final_options.join(', ')}});"
505
+ end
506
+
507
+ def node_scroll_by(node, x, y)
508
+ await <<~JAVASCRIPT
509
+ await AllElementHandles[#{node.handle}].executionContext().evaluateHandle(function(node) {
510
+ node.scrollBy(#{x}, #{y});
511
+ }, AllElementHandles[#{node.handle}]);
512
+ JAVASCRIPT
513
+ end
514
+
515
+ def node_scroll_into_view(node)
516
+ await <<~JAVASCRIPT
517
+ await AllElementHandles[#{node.handle}].executionContext().evaluateHandle(function(node) {
518
+ node.scrollIntoView();
519
+ }, AllElementHandles[#{node.handle}]);
520
+ JAVASCRIPT
521
+ end
522
+
523
+ def node_scroll_to(node, x, y)
524
+ await <<~JAVASCRIPT
525
+ await AllElementHandles[#{node.handle}].executionContext().evaluateHandle(function(node) {
526
+ node.scrollTo(#{x}, #{y});
527
+ }, AllElementHandles[#{node.handle}]);
528
+ JAVASCRIPT
529
+ end
530
+
531
+ def node_select(node)
532
+ # In the case of an OPTION tag, the change event should come
533
+ # from the parent SELECT
534
+ await <<~JAVASCRIPT
535
+ await AllElementHandles[#{node.handle}].executionContext().evaluateHandle(function(node){
536
+ var xpath = "parent::optgroup[@disabled] | ancestor::select[@disabled] | parent::fieldset[@disabled] | \
537
+ ancestor::*[not(self::legend) or preceding-sibling::legend][parent::fieldset[@disabled]]";
538
+ if (node.disabled || document.evaluate(xpath, node, null, XPathResult.BOOLEAN_TYPE, null).booleanValue) { return false; }
539
+ else if (node.value == false && !node.parentNode.multiple) { return false; }
540
+ else {
541
+ node.parentNode.dispatchEvent(new FocusEvent('focus',{bubbles: true, cancelable: true}));
542
+ node.selected = true;
543
+ var element;
544
+ if (node.nodeName == "OPTION") {
545
+ element = node.parentNode;
546
+ if (element.nodeName == "OPTGROUP") { element = element.parentNode; }
547
+ } else { element = node; }
548
+ element.dispatchEvent(new Event('change',{bubbles: true, cancelable: false}));
549
+ node.parentNode.dispatchEvent(new FocusEvent('blur',{bubbles: true, cancelable: true}));
550
+ return true;
551
+ }
552
+ }, AllElementHandles[#{node.handle}]);
553
+ JAVASCRIPT
554
+ end
555
+
556
+ def node_style(node, *styles)
557
+ await <<~JAVASCRIPT
558
+ var handle = await AllElementHandles[#{node.handle}].executionContext().evaluateHandle(function(node, styles){
559
+ return = window.getComputedStyle(node);
560
+ }, AllElementHandles[#{node.handle}], #{styles});
561
+ LastResult = await handle.jsonValue();
562
+ JAVASCRIPT
563
+ end
564
+
565
+ def node_type_keys(node, *keys)
566
+ cjs = "await AllElementHandles[#{node.handle}].focus();\n"
567
+ top_modifiers = []
568
+ keys.each do |key|
569
+ if key.is_a?(String)
570
+ key.each_char do |c|
571
+ need_shift = /[[:upper:]]/.match(c)
572
+ cjs << "await AllPageHandles[#{node.document.handle}].keyboard.down('Shift');\n" if need_shift
573
+ c = "Key#{c.upcase}" if /[[:alpha:]]/.match(c)
574
+ cjs << "await AllPageHandles[#{node.document.handle}].keyboard.press('#{c}');\n"
575
+ cjs << "await AllPageHandles[#{node.document.handle}].keyboard.up('Shift');\n" if need_shift
576
+ end
577
+ elsif key.is_a?(Symbol)
578
+ if %i[ctrl Ctrl].include?(key)
579
+ key = :control
580
+ elsif %i[command Command Meta].include?(key)
581
+ key = :meta
582
+ elsif %i[divide Divide].include?(key)
583
+ key = :numpad_divide
584
+ elsif %i[decimal Decimal].include?(key)
585
+ key = :numpad_decimal
586
+ elsif %i[left right up down].include?(key)
587
+ key = "arrow_#{key}".to_sym
588
+ end
589
+ if %i[alt alt_left alt_right control control_left control_rigth meta meta_left meta_right shift shift_left shift_right].include?(key)
590
+ top_modifiers << key
591
+ cjs << "await AllPageHandles[#{node.document.handle}].keyboard.down('#{key.to_s.camelize}');\n"
592
+ else
593
+ cjs << "await AllElementHandles[#{node.handle}].press('#{key.to_s.camelize}');\n"
594
+ end
595
+ elsif key.is_a?(Array)
596
+ modifiers = []
597
+ key.each do |k|
598
+ if k.is_a?(Symbol)
599
+ if %i[ctrl Ctrl].include?(k)
600
+ k = :control
601
+ elsif %i[command Command Meta].include?(k)
602
+ k = :meta
603
+ elsif %i[divide Divide].include?(k)
604
+ k = :numpad_divide
605
+ elsif %i[decimal Decimal].include?(k)
606
+ k = :numpad_decimal
607
+ elsif %i[left right up down].include?(key)
608
+ k = "arrow_#{key}".to_sym
609
+ end
610
+ if %i[alt alt_left alt_right control control_left control_rigth meta meta_left meta_right shift shift_left shift_right].include?(k)
611
+ modifiers << k
612
+ cjs << "await AllPageHandles[#{node.document.handle}].keyboard.down('#{k.to_s.camelize}');\n"
613
+ else
614
+ cjs << "await AllElementHandles[#{node.handle}].press('#{k.to_s.camelize}');\n"
615
+ end
616
+ elsif k.is_a?(String)
617
+ k.each_char do |c|
618
+ need_shift = /[[:upper:]]/.match(c)
619
+ cjs << "await AllPageHandles[#{node.document.handle}].keyboard.down('Shift');\n" if need_shift
620
+ c = "Key#{c.upcase}" if /[[:alpha:]]/.match(c)
621
+ cjs << "await AllPageHandles[#{node.document.handle}].keyboard.press('#{c}');\n"
622
+ cjs << "await AllPageHandles[#{node.document.handle}].keyboard.up('Shift');\n" if need_shift
623
+ end
624
+ end
625
+ end
626
+ modifiers.reverse.each do |k|
627
+ cjs << "await AllPageHandles[#{node.document.handle}].keyboard.up('#{k.to_s.camelize}');\n"
628
+ end
629
+ end
630
+ end
631
+ top_modifiers.reverse.each do |key|
632
+ cjs << "await AllPageHandles[#{node.document.handle}].keyboard.up('#{key.to_s.camelize}');\n"
633
+ end
634
+ await(cjs)
635
+ end
636
+
637
+ def node_unselect(node)
638
+ # In the case of an OPTION tag, the change event should come
639
+ # from the parent SELECT
640
+ await <<~JAVASCRIPT
641
+ await AllElementHandles[#{node.handle}].executionContext().evaluateHandle(function(node){
642
+ var xpath = "parent::optgroup[@disabled] | ancestor::select[@disabled] | parent::fieldset[@disabled] | \
643
+ ancestor::*[not(self::legend) or preceding-sibling::legend][parent::fieldset[@disabled]]";
644
+ if (node.disabled || document.evaluate(xpath, node, null, XPathResult.BOOLEAN_TYPE, null).booleanValue) { return false; }
645
+ else if (node.value == false && !node.parentNode.multiple) { return false; }
646
+ else {
647
+ node.parentNode.dispatchEvent(new FocusEvent('focus',{bubbles: true, cancelable: true}));
648
+ node.selected = false;
649
+ var element;
650
+ if (node.nodeName == "OPTION") {
651
+ element = node.parentNode;
652
+ if (element.nodeName == "OPTGROUP") { element = element.parentNode; }
653
+ } else { element = node; }
654
+ element.dispatchEvent(new Event('change',{bubbles: true, cancelable: false}));
655
+ node.parentNode.dispatchEvent(new FocusEvent('blur',{bubbles: true, cancelable: true}));
656
+ return true;
657
+ }
658
+ }, AllElementHandles[#{node.handle}]);
659
+ JAVASCRIPT
660
+ end
661
+
662
+ def node_value(node)
663
+ await <<~JAVASCRIPT
664
+ LastResult = await AllElementHandles[#{node.handle}].executionContext().evaluate(function(node){
665
+ if (node.tagName == "SELECT" && node.multiple) {
666
+ var result = []
667
+ for (let i = 0, len = node.children.length; i < len; i++) {
668
+ var option = node.children[i];
669
+ if (option.selected) { result.push(option.value); }
670
+ }
671
+ return result;
672
+ } else if (node.isContentEditable) { return node.textContent; }
673
+ else { return node.value; }
674
+ }, AllElementHandles[#{node.handle}]);
675
+ JAVASCRIPT
676
+ end
677
+
678
+ def node_value=(node, value)
679
+ raise Isomorfeus::Puppetmaster::ReadOnlyElementError if node.readonly?
680
+ real_value = "`#{value}`"
681
+ if %w[input textarea].include?(node.tag)
682
+ await <<~JAVASCRIPT
683
+ await AllElementHandles[#{node.handle}].executionContext().evaluate(function(node, value){
684
+ if (node.maxLength >= 0) { value = value.substr(0, node.maxLength); }
685
+ node.dispatchEvent(new FocusEvent("focus",{bubbles: true, cancelable: true}));
686
+ var tag_name = node.tagName.toLowerCase();
687
+ if (tag_name === 'input') {
688
+ node.value = '';
689
+ if (node.type === "number" || node.type === "date") {
690
+ for (var i = 0; i < value.length; i++) {
691
+ node.dispatchEvent(new KeyboardEvent("keydown", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
692
+ node.dispatchEvent(new KeyboardEvent("keyup", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
693
+ node.dispatchEvent(new KeyboardEvent("keypress", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
694
+ }
695
+ node.value = value;
696
+ }
697
+ else if (node.type == "time") { node.value = new Date(value).toTimeString().split(" ")[0]; }
698
+ else if (node.type == "datetime-local") {
699
+ value = new Date(value);
700
+ var year = value.getFullYear();
701
+ var month = ("0" + (value.getMonth() + 1)).slice(-2);
702
+ var date = ("0" + value.getDate()).slice(-2);
703
+ var hour = ("0" + value.getHours()).slice(-2);
704
+ var min = ("0" + value.getMinutes()).slice(-2);
705
+ var sec = ("0" + value.getSeconds()).slice(-2);
706
+ value = `${year}-${month}-${date}T${hour}:${min}:${sec}`;
707
+ for (var i = 0; i < value.length; i++) {
708
+ node.dispatchEvent(new KeyboardEvent("keydown", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
709
+ node.value = node.value + value[i];
710
+ node.dispatchEvent(new KeyboardEvent("keyup", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
711
+ node.dispatchEvent(new KeyboardEvent("keypress", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
712
+ }
713
+ } else if (node.type === 'checkbox' || node.type === 'radio') { node.checked = value; }
714
+ else {
715
+ for (var i = 0; i < value.length; i++) {
716
+ node.dispatchEvent(new KeyboardEvent("keydown", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
717
+ node.value = node.value + value[i];
718
+ node.dispatchEvent(new KeyboardEvent("keyup", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
719
+ node.dispatchEvent(new KeyboardEvent("keypress", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
720
+ }
721
+ }
722
+ } else if (tag_name === 'textarea') {
723
+ for (var i = 0; i < value.length; i++) {
724
+ node.dispatchEvent(new KeyboardEvent("keydown", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
725
+ node.value = node.value + value[i];
726
+ node.dispatchEvent(new KeyboardEvent("keyup", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
727
+ node.dispatchEvent(new KeyboardEvent("keypress", {key: value[i], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
728
+ }
729
+ }
730
+ }, AllElementHandles[#{node.handle}], #{real_value});
731
+ JAVASCRIPT
732
+ else
733
+ await <<~JAVASCRIPT
734
+ await AllElementHandles[#{node.handle}].executionContext().evaluate(function(node, value){
735
+ if (node.isContentEditable) {
736
+ var range = document.createRange();
737
+ range.selectNodeContents(node);
738
+ window.getSelection().removeAllRanges();
739
+ window.getSelection().addRange(range);
740
+ window.getSelection().deleteFromDocument();
741
+ window.getSelection().removeAllRanges();
742
+ node.dispatchEvent(new KeyboardEvent("keydown", {key: value[0], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
743
+ node.textContent = value;
744
+ node.dispatchEvent(new KeyboardEvent("keyup", {key: value[0], code: value.charCodeAt(0), bubbles: true, cancelable: true}));
745
+ }
746
+ }, AllElementHandles[#{node.handle}], #{real_value});
747
+ JAVASCRIPT
748
+ end
749
+ real_value
750
+ end
751
+
752
+ def node_visible_text(node)
753
+ # if node is AREA, check visibility of relevant image
754
+ text = await <<~JAVASCRIPT
755
+ var handle = await AllElementHandles[#{node.handle}].executionContext().evaluateHandle(function(node){
756
+ var temp_node = node;
757
+ var mapName, style;
758
+ if (node.tagName === "AREA") {
759
+ mapName = document.evaluate("./ancestor::map/@name", node, null, XPathResult.STRING_TYPE, null).stringValue;
760
+ temp_node = document.querySelector(`img[usemap="#${mapName}"]`);
761
+ if (temp_node == null) { return ''; }
762
+ }
763
+ temp_node = node;
764
+ while (temp_node) {
765
+ style = window.getComputedStyle(node);
766
+ if (style.display === "none" || style.visibility === "hidden" || parseFloat(style.opacity) === 0) { return ''; }
767
+ temp_node = temp_node.parentElement;
768
+ }
769
+ if (node.nodeName == "TEXTAREA" || node instanceof SVGElement) { return node.textContent; }
770
+ else { return node.innerText; }
771
+ }, AllElementHandles[#{node.handle}]);
772
+ LastResult = await handle.jsonValue();
773
+ JAVASCRIPT
774
+ text.gsub(/\A[[:space:]&&[^\u00a0]]+/, "").gsub(/[[:space:]&&[^\u00a0]]+\z/, "").gsub(/\n+/, "\n").tr("\u00a0", " ")
775
+ end
776
+
777
+ def node_visible?(node)
778
+ await <<~JAVASCRIPT
779
+ var handle = await AllElementHandles[#{node.handle}].executionContext().evaluateHandle(function(node){
780
+ if (node.tagName == 'AREA'){
781
+ const map_name = document.evaluate('./ancestor::map/@name', node, null, XPathResult.STRING_TYPE, null).stringValue;
782
+ node = document.querySelector(`img[usemap='#${map_name}']`);
783
+ if (!node){ return false; }
784
+ }
785
+ var forced_visible = false;
786
+ while (node) {
787
+ const style = window.getComputedStyle(node);
788
+ if (style.visibility == 'visible') { forced_visible = true; }
789
+ if ((style.display == 'none') || ((style.visibility == 'hidden') && !forced_visible) || (parseFloat(style.opacity) == 0)) {
790
+ return false;
791
+ }
792
+ node = node.parentElement;
793
+ }
794
+ return true;
795
+ }, AllElementHandles[#{node.handle}]);
796
+ LastResult = await handle.jsonValue();
797
+ JAVASCRIPT
798
+ end
799
+
800
+ def node_wait_for(node, selector)
801
+ # TODO setTimeout
802
+ js_escaped_selector = selector.gsub('\\', '\\\\\\').gsub('"', '\"')
803
+ node_data = await <<~JAVASCRIPT
804
+ var element_handle = await AllElementHandles[#{node.handle}].$("#{js_escaped_selector}");
805
+ if (element_handle) {
806
+ var node_handle = RegisterElementHandle(element_handle);
807
+ var handle = await AllElementHandles[node_handle].evaluate((node) => {
808
+ var name = node.nodeName;
809
+ var tag = node.tagName.toLower();
810
+ var type = null;
811
+ if (tag === 'input') { type = node.getAttribute('type'); }
812
+ return [name, tag, type, node.isContentEditable];
813
+ }, AllElementHandles[node_handle]);
814
+ var tt = await handle.jsonValue();
815
+ LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
816
+ }
817
+ JAVASCRIPT
818
+ if node_data
819
+ node_data[:css_selector] = selector
820
+ Isomorfeus::Puppetmaster::Node.new_by_tag(self, document, node_data)
821
+ end
822
+ end
823
+
824
+ def node_wait_for_xpath(node, query)
825
+ # TODO setTimeout
826
+ js_escaped_query = query.gsub('\\', '\\\\\\').gsub('"', '\"')
827
+ node_data = await <<~JAVASCRIPT
828
+ var element_handle_array = await AllElementHandles[#{node.handle}].$x("#{js_escaped_query}");
829
+ var element_handle = (element_handle_array) ? element_handle_array[0] : null;
830
+ if (element_handle) {
831
+ var node_handle = RegisterElementHandle(element_handle);
832
+ var handle = await AllElementHandles[node_handle].evaluate((node) => {
833
+ var name = node.nodeName;
834
+ var tag = node.tagName.toLower();
835
+ var type = null;
836
+ if (tag === 'input') { type = node.getAttribute('type'); }
837
+ return [name, tag, type, node.isContentEditable];
838
+ }, AllElementHandles[node_handle]);
839
+ var tt = await handle.jsonValue();
840
+ LastResult = {handle: node_handle, name: tt[0], tag: tt[1], type: tt[2], content_editable: tt[3]};
841
+ }
842
+ JAVASCRIPT
843
+ if node_data
844
+ node_data[:xpath_query] = query
845
+ Isomorfeus::Puppetmaster::Node.new_by_tag(self, document, node_data)
846
+ end
847
+ end
848
+ end
849
+ end
850
+ end
851
+ end