@wdio/image-comparison-core 1.0.0

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 (416) hide show
  1. package/CHANGELOG.md +82 -0
  2. package/LICENSE +21 -0
  3. package/README.md +12 -0
  4. package/assets/ios/ipadair4th.ipadair5th-bottom.png +0 -0
  5. package/assets/ios/ipadair4th.ipadair5th-top.png +0 -0
  6. package/assets/ios/ipadmini6th-bottom.png +0 -0
  7. package/assets/ios/ipadmini6th-top.png +0 -0
  8. package/assets/ios/ipadpro11-bottom.png +0 -0
  9. package/assets/ios/ipadpro11-top.png +0 -0
  10. package/assets/ios/ipadpro129-bottom.png +0 -0
  11. package/assets/ios/ipadpro129-top.png +0 -0
  12. package/assets/ios/iphone11promax-bottom.png +0 -0
  13. package/assets/ios/iphone11promax-top.png +0 -0
  14. package/assets/ios/iphone12.iphone12pro-top.png +0 -0
  15. package/assets/ios/iphone12.iphone12pro.iphone13.iphone13pro.iphone14-bottom.png +0 -0
  16. package/assets/ios/iphone12mini-top.png +0 -0
  17. package/assets/ios/iphone12mini.iphone13mini-bottom.png +0 -0
  18. package/assets/ios/iphone12promax-top.png +0 -0
  19. package/assets/ios/iphone12promax.iphone13promax.iphone14plus-bottom.png +0 -0
  20. package/assets/ios/iphone13.iphone13pro.iphone14-top.png +0 -0
  21. package/assets/ios/iphone13mini-top.png +0 -0
  22. package/assets/ios/iphone13promax.iphone14plus-top.png +0 -0
  23. package/assets/ios/iphone14pro-bottom.png +0 -0
  24. package/assets/ios/iphone14pro-top.png +0 -0
  25. package/assets/ios/iphone14promax-bottom.png +0 -0
  26. package/assets/ios/iphone14promax-top.png +0 -0
  27. package/assets/ios/iphone15-bottom.png +0 -0
  28. package/assets/ios/iphone15-top.png +0 -0
  29. package/assets/ios/iphonex.iphonexs.iphone11pro-bottom.png +0 -0
  30. package/assets/ios/iphonex.iphonexs.iphone11pro-top.png +0 -0
  31. package/assets/ios/iphonexr.iphone11-bottom.png +0 -0
  32. package/assets/ios/iphonexr.iphone11-top.png +0 -0
  33. package/assets/ios/iphonexsmax-bottom.png +0 -0
  34. package/assets/ios/iphonexsmax-top.png +0 -0
  35. package/dist/base.d.ts +18 -0
  36. package/dist/base.d.ts.map +1 -0
  37. package/dist/base.interfaces.d.ts +200 -0
  38. package/dist/base.interfaces.d.ts.map +1 -0
  39. package/dist/base.interfaces.js +1 -0
  40. package/dist/base.js +58 -0
  41. package/dist/base.test.d.ts +2 -0
  42. package/dist/base.test.d.ts.map +1 -0
  43. package/dist/base.test.js +45 -0
  44. package/dist/clientSideScripts/checkMetaTag.d.ts +2 -0
  45. package/dist/clientSideScripts/checkMetaTag.d.ts.map +1 -0
  46. package/dist/clientSideScripts/checkMetaTag.js +9 -0
  47. package/dist/clientSideScripts/checkMetaTag.test.d.ts +2 -0
  48. package/dist/clientSideScripts/checkMetaTag.test.d.ts.map +1 -0
  49. package/dist/clientSideScripts/checkMetaTag.test.js +25 -0
  50. package/dist/clientSideScripts/customCss.interfaces.d.ts +8 -0
  51. package/dist/clientSideScripts/customCss.interfaces.d.ts.map +1 -0
  52. package/dist/clientSideScripts/customCss.interfaces.js +1 -0
  53. package/dist/clientSideScripts/drawTabbableOnCanvas.d.ts +8 -0
  54. package/dist/clientSideScripts/drawTabbableOnCanvas.d.ts.map +1 -0
  55. package/dist/clientSideScripts/drawTabbableOnCanvas.interfaces.d.ts +4 -0
  56. package/dist/clientSideScripts/drawTabbableOnCanvas.interfaces.d.ts.map +1 -0
  57. package/dist/clientSideScripts/drawTabbableOnCanvas.interfaces.js +1 -0
  58. package/dist/clientSideScripts/drawTabbableOnCanvas.js +275 -0
  59. package/dist/clientSideScripts/drawTabbableOnCanvas.test.d.ts +2 -0
  60. package/dist/clientSideScripts/drawTabbableOnCanvas.test.d.ts.map +1 -0
  61. package/dist/clientSideScripts/drawTabbableOnCanvas.test.js +251 -0
  62. package/dist/clientSideScripts/elementPosition.interfaces.d.ts +3 -0
  63. package/dist/clientSideScripts/elementPosition.interfaces.d.ts.map +1 -0
  64. package/dist/clientSideScripts/elementPosition.interfaces.js +1 -0
  65. package/dist/clientSideScripts/getBoundingClientRect.d.ts +6 -0
  66. package/dist/clientSideScripts/getBoundingClientRect.d.ts.map +1 -0
  67. package/dist/clientSideScripts/getBoundingClientRect.js +12 -0
  68. package/dist/clientSideScripts/getBoundingClientRect.test.d.ts +2 -0
  69. package/dist/clientSideScripts/getBoundingClientRect.test.d.ts.map +1 -0
  70. package/dist/clientSideScripts/getBoundingClientRect.test.js +28 -0
  71. package/dist/clientSideScripts/getDocumentScrollHeight.d.ts +5 -0
  72. package/dist/clientSideScripts/getDocumentScrollHeight.d.ts.map +1 -0
  73. package/dist/clientSideScripts/getDocumentScrollHeight.js +48 -0
  74. package/dist/clientSideScripts/getDocumentScrollHeight.test.d.ts +2 -0
  75. package/dist/clientSideScripts/getDocumentScrollHeight.test.d.ts.map +1 -0
  76. package/dist/clientSideScripts/getDocumentScrollHeight.test.js +30 -0
  77. package/dist/clientSideScripts/getElementPositionTopDom.d.ts +6 -0
  78. package/dist/clientSideScripts/getElementPositionTopDom.d.ts.map +1 -0
  79. package/dist/clientSideScripts/getElementPositionTopDom.js +11 -0
  80. package/dist/clientSideScripts/getElementPositionTopDom.test.d.ts +2 -0
  81. package/dist/clientSideScripts/getElementPositionTopDom.test.d.ts.map +1 -0
  82. package/dist/clientSideScripts/getElementPositionTopDom.test.js +11 -0
  83. package/dist/clientSideScripts/getElementPositionTopScreenNativeMobile.d.ts +14 -0
  84. package/dist/clientSideScripts/getElementPositionTopScreenNativeMobile.d.ts.map +1 -0
  85. package/dist/clientSideScripts/getElementPositionTopScreenNativeMobile.js +19 -0
  86. package/dist/clientSideScripts/getElementPositionTopScreenNativeMobile.test.d.ts +2 -0
  87. package/dist/clientSideScripts/getElementPositionTopScreenNativeMobile.test.d.ts.map +1 -0
  88. package/dist/clientSideScripts/getElementPositionTopScreenNativeMobile.test.js +52 -0
  89. package/dist/clientSideScripts/getMobileWebviewClickAndDimensions.d.ts +6 -0
  90. package/dist/clientSideScripts/getMobileWebviewClickAndDimensions.d.ts.map +1 -0
  91. package/dist/clientSideScripts/getMobileWebviewClickAndDimensions.js +17 -0
  92. package/dist/clientSideScripts/getMobileWebviewClickAndDimensions.test.d.ts +2 -0
  93. package/dist/clientSideScripts/getMobileWebviewClickAndDimensions.test.d.ts.map +1 -0
  94. package/dist/clientSideScripts/getMobileWebviewClickAndDimensions.test.js +47 -0
  95. package/dist/clientSideScripts/getScreenDimensions.d.ts +6 -0
  96. package/dist/clientSideScripts/getScreenDimensions.d.ts.map +1 -0
  97. package/dist/clientSideScripts/getScreenDimensions.js +104 -0
  98. package/dist/clientSideScripts/getScreenDimensions.test.d.ts +2 -0
  99. package/dist/clientSideScripts/getScreenDimensions.test.d.ts.map +1 -0
  100. package/dist/clientSideScripts/getScreenDimensions.test.js +161 -0
  101. package/dist/clientSideScripts/hideRemoveElements.d.ts +8 -0
  102. package/dist/clientSideScripts/hideRemoveElements.d.ts.map +1 -0
  103. package/dist/clientSideScripts/hideRemoveElements.js +60 -0
  104. package/dist/clientSideScripts/hideRemoveElements.test.d.ts +2 -0
  105. package/dist/clientSideScripts/hideRemoveElements.test.d.ts.map +1 -0
  106. package/dist/clientSideScripts/hideRemoveElements.test.js +199 -0
  107. package/dist/clientSideScripts/hideScrollbars.d.ts +9 -0
  108. package/dist/clientSideScripts/hideScrollbars.d.ts.map +1 -0
  109. package/dist/clientSideScripts/hideScrollbars.js +15 -0
  110. package/dist/clientSideScripts/hideScrollbars.test.d.ts +2 -0
  111. package/dist/clientSideScripts/hideScrollbars.test.d.ts.map +1 -0
  112. package/dist/clientSideScripts/hideScrollbars.test.js +12 -0
  113. package/dist/clientSideScripts/injectWebviewOverlay.d.ts +5 -0
  114. package/dist/clientSideScripts/injectWebviewOverlay.d.ts.map +1 -0
  115. package/dist/clientSideScripts/injectWebviewOverlay.js +35 -0
  116. package/dist/clientSideScripts/injectWebviewOverlay.test.d.ts +2 -0
  117. package/dist/clientSideScripts/injectWebviewOverlay.test.d.ts.map +1 -0
  118. package/dist/clientSideScripts/injectWebviewOverlay.test.js +74 -0
  119. package/dist/clientSideScripts/removeElementFromDom.d.ts +5 -0
  120. package/dist/clientSideScripts/removeElementFromDom.d.ts.map +1 -0
  121. package/dist/clientSideScripts/removeElementFromDom.js +9 -0
  122. package/dist/clientSideScripts/removeElementFromDom.test.d.ts +2 -0
  123. package/dist/clientSideScripts/removeElementFromDom.test.d.ts.map +1 -0
  124. package/dist/clientSideScripts/removeElementFromDom.test.js +43 -0
  125. package/dist/clientSideScripts/screenDimensions.interfaces.d.ts +96 -0
  126. package/dist/clientSideScripts/screenDimensions.interfaces.d.ts.map +1 -0
  127. package/dist/clientSideScripts/screenDimensions.interfaces.js +1 -0
  128. package/dist/clientSideScripts/scrollElementIntoView.d.ts +5 -0
  129. package/dist/clientSideScripts/scrollElementIntoView.d.ts.map +1 -0
  130. package/dist/clientSideScripts/scrollElementIntoView.js +31 -0
  131. package/dist/clientSideScripts/scrollElementIntoView.test.d.ts +2 -0
  132. package/dist/clientSideScripts/scrollElementIntoView.test.d.ts.map +1 -0
  133. package/dist/clientSideScripts/scrollElementIntoView.test.js +79 -0
  134. package/dist/clientSideScripts/scrollToPosition.d.ts +5 -0
  135. package/dist/clientSideScripts/scrollToPosition.d.ts.map +1 -0
  136. package/dist/clientSideScripts/scrollToPosition.js +25 -0
  137. package/dist/clientSideScripts/scrollToPosition.test.d.ts +2 -0
  138. package/dist/clientSideScripts/scrollToPosition.test.d.ts.map +1 -0
  139. package/dist/clientSideScripts/scrollToPosition.test.js +72 -0
  140. package/dist/clientSideScripts/setCustomCss.d.ts +6 -0
  141. package/dist/clientSideScripts/setCustomCss.d.ts.map +1 -0
  142. package/dist/clientSideScripts/setCustomCss.js +36 -0
  143. package/dist/clientSideScripts/setCustomCss.test.d.ts +2 -0
  144. package/dist/clientSideScripts/setCustomCss.test.d.ts.map +1 -0
  145. package/dist/clientSideScripts/setCustomCss.test.js +68 -0
  146. package/dist/clientSideScripts/statusAddressToolBarOffsets.interfaces.d.ts +11 -0
  147. package/dist/clientSideScripts/statusAddressToolBarOffsets.interfaces.d.ts.map +1 -0
  148. package/dist/clientSideScripts/statusAddressToolBarOffsets.interfaces.js +1 -0
  149. package/dist/clientSideScripts/toggleTextTransparency.d.ts +5 -0
  150. package/dist/clientSideScripts/toggleTextTransparency.d.ts.map +1 -0
  151. package/dist/clientSideScripts/toggleTextTransparency.js +16 -0
  152. package/dist/clientSideScripts/toggleTextTransparency.test.d.ts +2 -0
  153. package/dist/clientSideScripts/toggleTextTransparency.test.d.ts.map +1 -0
  154. package/dist/clientSideScripts/toggleTextTransparency.test.js +35 -0
  155. package/dist/clientSideScripts/waitForFonts.d.ts +8 -0
  156. package/dist/clientSideScripts/waitForFonts.d.ts.map +1 -0
  157. package/dist/clientSideScripts/waitForFonts.js +20 -0
  158. package/dist/clientSideScripts/waitForFonts.test.d.ts +2 -0
  159. package/dist/clientSideScripts/waitForFonts.test.d.ts.map +1 -0
  160. package/dist/clientSideScripts/waitForFonts.test.js +37 -0
  161. package/dist/commands/check.interfaces.d.ts +35 -0
  162. package/dist/commands/check.interfaces.d.ts.map +1 -0
  163. package/dist/commands/check.interfaces.js +1 -0
  164. package/dist/commands/checkAppElement.d.ts +7 -0
  165. package/dist/commands/checkAppElement.d.ts.map +1 -0
  166. package/dist/commands/checkAppElement.js +44 -0
  167. package/dist/commands/checkAppElement.test.d.ts +2 -0
  168. package/dist/commands/checkAppElement.test.d.ts.map +1 -0
  169. package/dist/commands/checkAppElement.test.js +241 -0
  170. package/dist/commands/checkAppScreen.d.ts +7 -0
  171. package/dist/commands/checkAppScreen.d.ts.map +1 -0
  172. package/dist/commands/checkAppScreen.js +73 -0
  173. package/dist/commands/checkAppScreen.test.d.ts +2 -0
  174. package/dist/commands/checkAppScreen.test.d.ts.map +1 -0
  175. package/dist/commands/checkAppScreen.test.js +295 -0
  176. package/dist/commands/checkElement.d.ts +7 -0
  177. package/dist/commands/checkElement.d.ts.map +1 -0
  178. package/dist/commands/checkElement.js +10 -0
  179. package/dist/commands/checkElement.test.d.ts +2 -0
  180. package/dist/commands/checkElement.test.d.ts.map +1 -0
  181. package/dist/commands/checkElement.test.js +66 -0
  182. package/dist/commands/checkFullPageScreen.d.ts +7 -0
  183. package/dist/commands/checkFullPageScreen.d.ts.map +1 -0
  184. package/dist/commands/checkFullPageScreen.js +56 -0
  185. package/dist/commands/checkFullPageScreen.test.d.ts +2 -0
  186. package/dist/commands/checkFullPageScreen.test.d.ts.map +1 -0
  187. package/dist/commands/checkFullPageScreen.test.js +259 -0
  188. package/dist/commands/checkScreen.d.ts +7 -0
  189. package/dist/commands/checkScreen.d.ts.map +1 -0
  190. package/dist/commands/checkScreen.js +10 -0
  191. package/dist/commands/checkScreen.test.d.ts +2 -0
  192. package/dist/commands/checkScreen.test.d.ts.map +1 -0
  193. package/dist/commands/checkScreen.test.js +62 -0
  194. package/dist/commands/checkTabbablePage.d.ts +7 -0
  195. package/dist/commands/checkTabbablePage.d.ts.map +1 -0
  196. package/dist/commands/checkTabbablePage.js +28 -0
  197. package/dist/commands/checkTabbablePage.test.d.ts +2 -0
  198. package/dist/commands/checkTabbablePage.test.d.ts.map +1 -0
  199. package/dist/commands/checkTabbablePage.test.js +200 -0
  200. package/dist/commands/checkWebElement.d.ts +7 -0
  201. package/dist/commands/checkWebElement.d.ts.map +1 -0
  202. package/dist/commands/checkWebElement.js +52 -0
  203. package/dist/commands/checkWebElement.test.d.ts +2 -0
  204. package/dist/commands/checkWebElement.test.d.ts.map +1 -0
  205. package/dist/commands/checkWebElement.test.js +278 -0
  206. package/dist/commands/checkWebScreen.d.ts +7 -0
  207. package/dist/commands/checkWebScreen.d.ts.map +1 -0
  208. package/dist/commands/checkWebScreen.js +50 -0
  209. package/dist/commands/checkWebScreen.test.d.ts +2 -0
  210. package/dist/commands/checkWebScreen.test.d.ts.map +1 -0
  211. package/dist/commands/checkWebScreen.test.js +227 -0
  212. package/dist/commands/element.interfaces.d.ts +27 -0
  213. package/dist/commands/element.interfaces.d.ts.map +1 -0
  214. package/dist/commands/element.interfaces.js +1 -0
  215. package/dist/commands/fullPage.interfaces.d.ts +38 -0
  216. package/dist/commands/fullPage.interfaces.d.ts.map +1 -0
  217. package/dist/commands/fullPage.interfaces.js +1 -0
  218. package/dist/commands/save.interfaces.d.ts +27 -0
  219. package/dist/commands/save.interfaces.d.ts.map +1 -0
  220. package/dist/commands/save.interfaces.js +1 -0
  221. package/dist/commands/saveAppElement.d.ts +7 -0
  222. package/dist/commands/saveAppElement.d.ts.map +1 -0
  223. package/dist/commands/saveAppElement.js +30 -0
  224. package/dist/commands/saveAppElement.test.d.ts +2 -0
  225. package/dist/commands/saveAppElement.test.d.ts.map +1 -0
  226. package/dist/commands/saveAppElement.test.js +199 -0
  227. package/dist/commands/saveAppScreen.d.ts +7 -0
  228. package/dist/commands/saveAppScreen.d.ts.map +1 -0
  229. package/dist/commands/saveAppScreen.js +43 -0
  230. package/dist/commands/saveAppScreen.test.d.ts +2 -0
  231. package/dist/commands/saveAppScreen.test.d.ts.map +1 -0
  232. package/dist/commands/saveAppScreen.test.js +221 -0
  233. package/dist/commands/saveElement.d.ts +7 -0
  234. package/dist/commands/saveElement.d.ts.map +1 -0
  235. package/dist/commands/saveElement.js +10 -0
  236. package/dist/commands/saveElement.test.d.ts +2 -0
  237. package/dist/commands/saveElement.test.d.ts.map +1 -0
  238. package/dist/commands/saveElement.test.js +62 -0
  239. package/dist/commands/saveFullPageScreen.d.ts +7 -0
  240. package/dist/commands/saveFullPageScreen.d.ts.map +1 -0
  241. package/dist/commands/saveFullPageScreen.js +60 -0
  242. package/dist/commands/saveFullPageScreen.test.d.ts +2 -0
  243. package/dist/commands/saveFullPageScreen.test.d.ts.map +1 -0
  244. package/dist/commands/saveFullPageScreen.test.js +293 -0
  245. package/dist/commands/saveScreen.d.ts +7 -0
  246. package/dist/commands/saveScreen.d.ts.map +1 -0
  247. package/dist/commands/saveScreen.js +10 -0
  248. package/dist/commands/saveScreen.test.d.ts +2 -0
  249. package/dist/commands/saveScreen.test.d.ts.map +1 -0
  250. package/dist/commands/saveScreen.test.js +47 -0
  251. package/dist/commands/saveTabbablePage.d.ts +7 -0
  252. package/dist/commands/saveTabbablePage.d.ts.map +1 -0
  253. package/dist/commands/saveTabbablePage.js +20 -0
  254. package/dist/commands/saveTabbablePage.test.d.ts +2 -0
  255. package/dist/commands/saveTabbablePage.test.d.ts.map +1 -0
  256. package/dist/commands/saveTabbablePage.test.js +74 -0
  257. package/dist/commands/saveWebElement.d.ts +7 -0
  258. package/dist/commands/saveWebElement.d.ts.map +1 -0
  259. package/dist/commands/saveWebElement.js +53 -0
  260. package/dist/commands/saveWebElement.test.d.ts +2 -0
  261. package/dist/commands/saveWebElement.test.d.ts.map +1 -0
  262. package/dist/commands/saveWebElement.test.js +253 -0
  263. package/dist/commands/saveWebScreen.d.ts +7 -0
  264. package/dist/commands/saveWebScreen.d.ts.map +1 -0
  265. package/dist/commands/saveWebScreen.js +48 -0
  266. package/dist/commands/saveWebScreen.test.d.ts +2 -0
  267. package/dist/commands/saveWebScreen.test.d.ts.map +1 -0
  268. package/dist/commands/saveWebScreen.test.js +222 -0
  269. package/dist/commands/screen.interfaces.d.ts +16 -0
  270. package/dist/commands/screen.interfaces.d.ts.map +1 -0
  271. package/dist/commands/screen.interfaces.js +1 -0
  272. package/dist/commands/tabbable.interfaces.d.ts +29 -0
  273. package/dist/commands/tabbable.interfaces.d.ts.map +1 -0
  274. package/dist/commands/tabbable.interfaces.js +1 -0
  275. package/dist/helpers/afterScreenshot.d.ts +7 -0
  276. package/dist/helpers/afterScreenshot.d.ts.map +1 -0
  277. package/dist/helpers/afterScreenshot.interfaces.d.ts +46 -0
  278. package/dist/helpers/afterScreenshot.interfaces.d.ts.map +1 -0
  279. package/dist/helpers/afterScreenshot.interfaces.js +1 -0
  280. package/dist/helpers/afterScreenshot.js +55 -0
  281. package/dist/helpers/afterScreenshot.test.d.ts +2 -0
  282. package/dist/helpers/afterScreenshot.test.d.ts.map +1 -0
  283. package/dist/helpers/afterScreenshot.test.js +241 -0
  284. package/dist/helpers/beforeScreenshot.d.ts +6 -0
  285. package/dist/helpers/beforeScreenshot.d.ts.map +1 -0
  286. package/dist/helpers/beforeScreenshot.interfaces.d.ts +15 -0
  287. package/dist/helpers/beforeScreenshot.interfaces.d.ts.map +1 -0
  288. package/dist/helpers/beforeScreenshot.interfaces.js +1 -0
  289. package/dist/helpers/beforeScreenshot.js +79 -0
  290. package/dist/helpers/beforeScreenshot.test.d.ts +2 -0
  291. package/dist/helpers/beforeScreenshot.test.d.ts.map +1 -0
  292. package/dist/helpers/beforeScreenshot.test.js +261 -0
  293. package/dist/helpers/compare.interfaces.d.ts +16 -0
  294. package/dist/helpers/compare.interfaces.d.ts.map +1 -0
  295. package/dist/helpers/compare.interfaces.js +1 -0
  296. package/dist/helpers/constants.d.ts +108 -0
  297. package/dist/helpers/constants.d.ts.map +1 -0
  298. package/dist/helpers/constants.interfaces.d.ts +30 -0
  299. package/dist/helpers/constants.interfaces.d.ts.map +1 -0
  300. package/dist/helpers/constants.interfaces.js +11 -0
  301. package/dist/helpers/constants.js +436 -0
  302. package/dist/helpers/options.d.ts +64 -0
  303. package/dist/helpers/options.d.ts.map +1 -0
  304. package/dist/helpers/options.interfaces.d.ts +363 -0
  305. package/dist/helpers/options.interfaces.d.ts.map +1 -0
  306. package/dist/helpers/options.interfaces.js +1 -0
  307. package/dist/helpers/options.js +184 -0
  308. package/dist/helpers/options.test.d.ts +2 -0
  309. package/dist/helpers/options.test.d.ts.map +1 -0
  310. package/dist/helpers/options.test.js +428 -0
  311. package/dist/helpers/utils.d.ts +134 -0
  312. package/dist/helpers/utils.d.ts.map +1 -0
  313. package/dist/helpers/utils.interfaces.d.ts +254 -0
  314. package/dist/helpers/utils.interfaces.d.ts.map +1 -0
  315. package/dist/helpers/utils.interfaces.js +1 -0
  316. package/dist/helpers/utils.js +566 -0
  317. package/dist/helpers/utils.test.d.ts +2 -0
  318. package/dist/helpers/utils.test.d.ts.map +1 -0
  319. package/dist/helpers/utils.test.js +900 -0
  320. package/dist/index.d.ts +26 -0
  321. package/dist/index.d.ts.map +1 -0
  322. package/dist/index.js +18 -0
  323. package/dist/methods/compareReport.interfaces.d.ts +109 -0
  324. package/dist/methods/compareReport.interfaces.d.ts.map +1 -0
  325. package/dist/methods/compareReport.interfaces.js +1 -0
  326. package/dist/methods/createCompareReport.d.ts +7 -0
  327. package/dist/methods/createCompareReport.d.ts.map +1 -0
  328. package/dist/methods/createCompareReport.js +61 -0
  329. package/dist/methods/createCompareReport.test.d.ts +2 -0
  330. package/dist/methods/createCompareReport.test.d.ts.map +1 -0
  331. package/dist/methods/createCompareReport.test.js +236 -0
  332. package/dist/methods/elementPosition.d.ts +18 -0
  333. package/dist/methods/elementPosition.d.ts.map +1 -0
  334. package/dist/methods/elementPosition.interfaces.d.ts +14 -0
  335. package/dist/methods/elementPosition.interfaces.d.ts.map +1 -0
  336. package/dist/methods/elementPosition.interfaces.js +1 -0
  337. package/dist/methods/elementPosition.js +34 -0
  338. package/dist/methods/images.d.ts +69 -0
  339. package/dist/methods/images.d.ts.map +1 -0
  340. package/dist/methods/images.executeImageCompare.test.d.ts +2 -0
  341. package/dist/methods/images.executeImageCompare.test.d.ts.map +1 -0
  342. package/dist/methods/images.executeImageCompare.test.js +770 -0
  343. package/dist/methods/images.interfaces.d.ts +214 -0
  344. package/dist/methods/images.interfaces.d.ts.map +1 -0
  345. package/dist/methods/images.interfaces.js +1 -0
  346. package/dist/methods/images.js +428 -0
  347. package/dist/methods/images.test.d.ts +2 -0
  348. package/dist/methods/images.test.d.ts.map +1 -0
  349. package/dist/methods/images.test.js +1465 -0
  350. package/dist/methods/instanceData.d.ts +6 -0
  351. package/dist/methods/instanceData.d.ts.map +1 -0
  352. package/dist/methods/instanceData.interfaces.d.ts +57 -0
  353. package/dist/methods/instanceData.interfaces.d.ts.map +1 -0
  354. package/dist/methods/instanceData.interfaces.js +1 -0
  355. package/dist/methods/instanceData.js +42 -0
  356. package/dist/methods/instanceData.test.d.ts +2 -0
  357. package/dist/methods/instanceData.test.d.ts.map +1 -0
  358. package/dist/methods/instanceData.test.js +224 -0
  359. package/dist/methods/processDiffPixels.d.ts +59 -0
  360. package/dist/methods/processDiffPixels.d.ts.map +1 -0
  361. package/dist/methods/processDiffPixels.js +242 -0
  362. package/dist/methods/processDiffPixels.test.d.ts +2 -0
  363. package/dist/methods/processDiffPixels.test.d.ts.map +1 -0
  364. package/dist/methods/processDiffPixels.test.js +122 -0
  365. package/dist/methods/rectangles.d.ts +51 -0
  366. package/dist/methods/rectangles.d.ts.map +1 -0
  367. package/dist/methods/rectangles.interfaces.d.ts +146 -0
  368. package/dist/methods/rectangles.interfaces.d.ts.map +1 -0
  369. package/dist/methods/rectangles.interfaces.js +1 -0
  370. package/dist/methods/rectangles.js +266 -0
  371. package/dist/methods/rectangles.test.d.ts +2 -0
  372. package/dist/methods/rectangles.test.d.ts.map +1 -0
  373. package/dist/methods/rectangles.test.js +853 -0
  374. package/dist/methods/screenshots.d.ts +37 -0
  375. package/dist/methods/screenshots.d.ts.map +1 -0
  376. package/dist/methods/screenshots.interfaces.d.ts +203 -0
  377. package/dist/methods/screenshots.interfaces.d.ts.map +1 -0
  378. package/dist/methods/screenshots.interfaces.js +1 -0
  379. package/dist/methods/screenshots.js +394 -0
  380. package/dist/methods/screenshots.test.d.ts +2 -0
  381. package/dist/methods/screenshots.test.d.ts.map +1 -0
  382. package/dist/methods/screenshots.test.js +656 -0
  383. package/dist/methods/takeElementScreenshots.d.ts +3 -0
  384. package/dist/methods/takeElementScreenshots.d.ts.map +1 -0
  385. package/dist/methods/takeElementScreenshots.js +104 -0
  386. package/dist/methods/takeElementScreenshots.test.d.ts +2 -0
  387. package/dist/methods/takeElementScreenshots.test.d.ts.map +1 -0
  388. package/dist/methods/takeElementScreenshots.test.js +314 -0
  389. package/dist/methods/takeFullPageScreenshots.d.ts +3 -0
  390. package/dist/methods/takeFullPageScreenshots.d.ts.map +1 -0
  391. package/dist/methods/takeFullPageScreenshots.js +56 -0
  392. package/dist/methods/takeFullPageScreenshots.test.d.ts +2 -0
  393. package/dist/methods/takeFullPageScreenshots.test.d.ts.map +1 -0
  394. package/dist/methods/takeFullPageScreenshots.test.js +72 -0
  395. package/dist/methods/takeWebScreenshots.d.ts +3 -0
  396. package/dist/methods/takeWebScreenshots.d.ts.map +1 -0
  397. package/dist/methods/takeWebScreenshots.js +41 -0
  398. package/dist/methods/takeWebScreenshots.test.d.ts +2 -0
  399. package/dist/methods/takeWebScreenshots.test.d.ts.map +1 -0
  400. package/dist/methods/takeWebScreenshots.test.js +149 -0
  401. package/dist/mocks/image.d.ts +4 -0
  402. package/dist/mocks/image.d.ts.map +1 -0
  403. package/dist/mocks/image.js +3 -0
  404. package/dist/mocks/mocks.d.ts +745 -0
  405. package/dist/mocks/mocks.d.ts.map +1 -0
  406. package/dist/mocks/mocks.js +392 -0
  407. package/dist/resemble/compare.interfaces.d.ts +136 -0
  408. package/dist/resemble/compare.interfaces.d.ts.map +1 -0
  409. package/dist/resemble/compare.interfaces.js +1 -0
  410. package/dist/resemble/compareImages.d.ts +3 -0
  411. package/dist/resemble/compareImages.d.ts.map +1 -0
  412. package/dist/resemble/compareImages.js +21 -0
  413. package/dist/resemble/resemble.jimp.cjs +981 -0
  414. package/dist/resemble/resemble.jimp.d.cts +46 -0
  415. package/dist/resemble/resemble.jimp.d.cts.map +1 -0
  416. package/package.json +47 -0
@@ -0,0 +1,656 @@
1
+ import { afterEach, beforeEach, describe, it, expect, vi } from 'vitest';
2
+ import { join } from 'node:path';
3
+ import logger from '@wdio/logger';
4
+ import { getDesktopFullPageScreenshotsData, getAndroidChromeDriverFullPageScreenshotsData, logHiddenRemovedError, takeBase64BiDiScreenshot, takeWebElementScreenshot, getMobileFullPageNativeWebScreenshotsData } from './screenshots.js';
5
+ import { MEDIUM_IMAGE_STRING, SMALL_IMAGE_STRING } from '../mocks/image.js';
6
+ import { DEVICE_RECTANGLES } from '../helpers/constants.js';
7
+ import * as rectanglesModule from './rectangles.js';
8
+ import * as utilsModule from '../helpers/utils.js';
9
+ const log = logger('test');
10
+ vi.mock('@wdio/logger', () => import(join(process.cwd(), '__mocks__', '@wdio/logger')));
11
+ vi.mock('./rectangles.js', () => ({
12
+ determineElementRectangles: vi.fn()
13
+ }));
14
+ vi.mock('../helpers/utils.js', async () => {
15
+ const actual = await vi.importActual('../helpers/utils.js');
16
+ return {
17
+ ...actual,
18
+ getBase64ScreenshotSize: vi.fn(),
19
+ waitFor: vi.fn(),
20
+ calculateDprData: vi.fn()
21
+ };
22
+ });
23
+ vi.mock('../clientSideScripts/scrollToPosition.js', () => ({
24
+ default: vi.fn()
25
+ }));
26
+ vi.mock('../clientSideScripts/getDocumentScrollHeight.js', () => ({
27
+ default: vi.fn()
28
+ }));
29
+ vi.mock('../clientSideScripts/hideRemoveElements.js', () => ({
30
+ default: vi.fn()
31
+ }));
32
+ describe('screenshots', () => {
33
+ const createMockBrowserInstance = ({ takeScreenshot = SMALL_IMAGE_STRING, takeElementScreenshot = SMALL_IMAGE_STRING } = {}) => {
34
+ return {
35
+ takeScreenshot: vi.fn().mockResolvedValue(takeScreenshot),
36
+ takeElementScreenshot: vi.fn().mockResolvedValue(takeElementScreenshot),
37
+ getWindowHandle: vi.fn().mockResolvedValue('window-handle-123'),
38
+ browsingContextCaptureScreenshot: vi.fn().mockResolvedValue({ data: takeScreenshot }),
39
+ execute: vi.fn().mockResolvedValue(1000)
40
+ };
41
+ };
42
+ const createMockElement = () => {
43
+ return {
44
+ elementId: 'element-123'
45
+ };
46
+ };
47
+ let logWarnSpy;
48
+ describe('getMobileFullPageNativeWebScreenshotsData', () => {
49
+ const createMobileOptions = (overrides = {}) => ({
50
+ addressBarShadowPadding: 10,
51
+ devicePixelRatio: 2,
52
+ deviceRectangles: {
53
+ viewport: { x: 0, y: 100, width: 750, height: 1334 },
54
+ bottomBar: { x: 0, y: 1434, width: 750, height: 100 },
55
+ homeBar: { x: 0, y: 1534, width: 750, height: 34 },
56
+ leftSidePadding: { x: 0, y: 0, width: 0, height: 0 },
57
+ rightSidePadding: { x: 0, y: 0, width: 0, height: 0 },
58
+ statusBarAndAddressBar: { x: 0, y: 0, width: 750, height: 100 },
59
+ statusBar: { x: 0, y: 0, width: 750, height: 50 },
60
+ screenSize: { width: 750, height: 1668 }
61
+ },
62
+ fullPageScrollTimeout: 1000,
63
+ hideAfterFirstScroll: [],
64
+ isAndroid: false,
65
+ isIOS: true,
66
+ isLandscape: false,
67
+ innerHeight: 667,
68
+ toolBarShadowPadding: 5,
69
+ screenWidth: 375,
70
+ ...overrides
71
+ });
72
+ beforeEach(() => {
73
+ logWarnSpy = vi.spyOn(log, 'warn');
74
+ vi.mocked(utilsModule.waitFor).mockResolvedValue(undefined);
75
+ vi.mocked(utilsModule.calculateDprData).mockImplementation((data) => data);
76
+ });
77
+ afterEach(() => {
78
+ vi.clearAllMocks();
79
+ logWarnSpy.mockRestore();
80
+ });
81
+ it('should take single screenshot when content fits in viewport (iOS)', async () => {
82
+ const mockBrowserInstance = createMockBrowserInstance({ takeScreenshot: SMALL_IMAGE_STRING });
83
+ mockBrowserInstance.execute = vi.fn()
84
+ .mockResolvedValueOnce(undefined) // scrollToPosition
85
+ .mockResolvedValueOnce(undefined) // hideScrollBars
86
+ .mockResolvedValueOnce(652) // getDocumentScrollHeight (effective viewport height)
87
+ .mockResolvedValueOnce(undefined); // hideScrollBars
88
+ const options = createMobileOptions(); // iOS device by default
89
+ const result = await getMobileFullPageNativeWebScreenshotsData(mockBrowserInstance, options);
90
+ expect(result).toMatchSnapshot();
91
+ expect(mockBrowserInstance.takeScreenshot).toHaveBeenCalledTimes(1);
92
+ expect(result.data).toHaveLength(1);
93
+ });
94
+ it('should take multiple screenshots when content exceeds viewport (Android)', async () => {
95
+ const mockBrowserInstance = createMockBrowserInstance({ takeScreenshot: SMALL_IMAGE_STRING });
96
+ mockBrowserInstance.execute = vi.fn()
97
+ .mockResolvedValueOnce(undefined) // scrollToPosition 0 (i=0)
98
+ .mockResolvedValueOnce(undefined) // hideScrollBars true
99
+ .mockResolvedValueOnce(1304) // getDocumentScrollHeight (2x effectiveViewportHeight)
100
+ .mockResolvedValueOnce(undefined) // hideScrollBars false
101
+ .mockResolvedValueOnce(undefined) // scrollToPosition 652 (i=1)
102
+ .mockResolvedValueOnce(undefined) // hideScrollBars true
103
+ .mockResolvedValueOnce(1304) // getDocumentScrollHeight
104
+ .mockResolvedValueOnce(undefined); // hideScrollBars false
105
+ const options = createMobileOptions({ isAndroid: true });
106
+ const result = await getMobileFullPageNativeWebScreenshotsData(mockBrowserInstance, options);
107
+ expect(result).toMatchSnapshot();
108
+ expect(mockBrowserInstance.takeScreenshot).toHaveBeenCalledTimes(2);
109
+ expect(result.data).toHaveLength(2);
110
+ });
111
+ it('should handle landscape mode with rotation detection', async () => {
112
+ const mockBrowserInstance = createMockBrowserInstance({ takeScreenshot: SMALL_IMAGE_STRING });
113
+ mockBrowserInstance.execute = vi.fn()
114
+ .mockResolvedValueOnce(undefined) // scrollToPosition
115
+ .mockResolvedValueOnce(undefined) // hideScrollBars
116
+ .mockResolvedValueOnce(652) // getDocumentScrollHeight
117
+ .mockResolvedValueOnce(undefined); // hideScrollBars
118
+ const options = createMobileOptions({
119
+ isLandscape: true,
120
+ deviceRectangles: {
121
+ viewport: { x: 0, y: 100, width: 1334, height: 750 },
122
+ bottomBar: { x: 0, y: 850, width: 1334, height: 100 },
123
+ homeBar: { x: 0, y: 950, width: 1334, height: 34 },
124
+ leftSidePadding: { x: 0, y: 0, width: 0, height: 0 },
125
+ rightSidePadding: { x: 0, y: 0, width: 0, height: 0 },
126
+ statusBarAndAddressBar: { x: 0, y: 0, width: 1334, height: 100 },
127
+ statusBar: { x: 0, y: 0, width: 1334, height: 50 },
128
+ screenSize: { width: 1334, height: 984 }
129
+ }
130
+ });
131
+ const result = await getMobileFullPageNativeWebScreenshotsData(mockBrowserInstance, options);
132
+ expect(result).toMatchSnapshot();
133
+ expect(result.data).toHaveLength(1);
134
+ });
135
+ it('should hide elements after first scroll when hideAfterFirstScroll is provided', async () => {
136
+ const mockBrowserInstance = createMockBrowserInstance({ takeScreenshot: SMALL_IMAGE_STRING });
137
+ mockBrowserInstance.execute = vi.fn()
138
+ .mockResolvedValueOnce(undefined) // scrollToPosition 0 (i=0)
139
+ .mockResolvedValueOnce(undefined) // hideScrollBars true
140
+ .mockResolvedValueOnce(2638) // getDocumentScrollHeight (2x effectiveViewportHeight to trigger scroll)
141
+ .mockResolvedValueOnce(undefined) // hideScrollBars false
142
+ .mockResolvedValueOnce(undefined) // scrollToPosition 1319 (i=1)
143
+ .mockResolvedValueOnce(undefined) // hideScrollBars true
144
+ .mockResolvedValueOnce(undefined) // hideRemoveElements (i=1, hide elements)
145
+ .mockResolvedValueOnce(2638) // getDocumentScrollHeight
146
+ .mockResolvedValueOnce(undefined) // hideScrollBars false
147
+ .mockResolvedValueOnce(undefined); // hideRemoveElements (restore at end)
148
+ const mockElements = [{ tagName: 'div' }];
149
+ const options = createMobileOptions({ hideAfterFirstScroll: [mockElements] });
150
+ const result = await getMobileFullPageNativeWebScreenshotsData(mockBrowserInstance, options);
151
+ expect(result).toMatchSnapshot();
152
+ const executeCalls = vi.mocked(mockBrowserInstance.execute).mock.calls;
153
+ const hideElementsCalls = executeCalls.filter(call => call.length === 3 &&
154
+ typeof call[1] === 'object' &&
155
+ call[1] &&
156
+ typeof call[1] === 'object' &&
157
+ 'hide' in call[1] &&
158
+ Array.isArray(call[1].hide) &&
159
+ 'remove' in call[1] &&
160
+ Array.isArray(call[1].remove));
161
+ expect(hideElementsCalls).toHaveLength(2);
162
+ expect(hideElementsCalls[0][2]).toBe(true);
163
+ expect(hideElementsCalls[1][2]).toBe(false);
164
+ });
165
+ it('should handle error when hiding elements fails', async () => {
166
+ const mockBrowserInstance = createMockBrowserInstance({ takeScreenshot: SMALL_IMAGE_STRING });
167
+ const executeError = new Error('Element not found');
168
+ mockBrowserInstance.execute = vi.fn()
169
+ .mockResolvedValueOnce(undefined) // scrollToPosition 0 (i=0)
170
+ .mockResolvedValueOnce(undefined) // hideScrollBars true
171
+ .mockResolvedValueOnce(2638) // getDocumentScrollHeight (2x effectiveViewportHeight)
172
+ .mockResolvedValueOnce(undefined) // hideScrollBars false
173
+ .mockResolvedValueOnce(undefined) // scrollToPosition 1319 (i=1)
174
+ .mockResolvedValueOnce(undefined) // hideScrollBars true
175
+ .mockRejectedValueOnce(executeError) // hideRemoveElements fails
176
+ .mockResolvedValueOnce(2638) // getDocumentScrollHeight
177
+ .mockResolvedValueOnce(undefined) // hideScrollBars false
178
+ .mockRejectedValueOnce(executeError); // hideRemoveElements restore fails
179
+ const mockElements = [{ tagName: 'div' }];
180
+ const options = createMobileOptions({ hideAfterFirstScroll: [mockElements] });
181
+ const result = await getMobileFullPageNativeWebScreenshotsData(mockBrowserInstance, options);
182
+ expect(result).toBeDefined();
183
+ expect(result.data).toHaveLength(2);
184
+ expect(logWarnSpy).toHaveBeenCalledTimes(2);
185
+ });
186
+ it('should throw error when negative scrollY is detected', async () => {
187
+ const mockBrowserInstance = createMockBrowserInstance({ takeScreenshot: SMALL_IMAGE_STRING });
188
+ const options = createMobileOptions({
189
+ deviceRectangles: {
190
+ viewport: { x: 0, y: 100, width: 750, height: 50 },
191
+ bottomBar: { x: 0, y: 200, width: 750, height: 0 },
192
+ homeBar: { x: 0, y: 300, width: 750, height: 100 },
193
+ leftSidePadding: { x: 0, y: 0, width: 0, height: 0 },
194
+ rightSidePadding: { x: 0, y: 0, width: 0, height: 0 },
195
+ statusBarAndAddressBar: { x: 0, y: 0, width: 750, height: 100 },
196
+ statusBar: { x: 0, y: 0, width: 750, height: 50 },
197
+ screenSize: { width: 750, height: 500 }
198
+ },
199
+ addressBarShadowPadding: 20,
200
+ toolBarShadowPadding: 20,
201
+ isAndroid: false
202
+ });
203
+ mockBrowserInstance.execute = vi.fn()
204
+ .mockResolvedValueOnce(undefined) // scrollToPosition 0 (i=0, scrollY=0)
205
+ .mockResolvedValueOnce(undefined) // hideScrollBars true
206
+ .mockResolvedValueOnce(1000) // getDocumentScrollHeight
207
+ .mockResolvedValueOnce(undefined) // hideScrollBars false
208
+ // When trying to do i=1, scrollY would be negative, so it should error before the next execute calls
209
+ .mockResolvedValueOnce(0); // pageYOffset for error logging
210
+ await expect(getMobileFullPageNativeWebScreenshotsData(mockBrowserInstance, options))
211
+ .rejects.toThrow(/Negative scroll position detected/);
212
+ });
213
+ it('should throw error when scroll height cannot be determined', async () => {
214
+ const mockBrowserInstance = createMockBrowserInstance({ takeScreenshot: SMALL_IMAGE_STRING });
215
+ mockBrowserInstance.execute = vi.fn()
216
+ .mockResolvedValueOnce(undefined) // scrollToPosition
217
+ .mockResolvedValueOnce(undefined) // hideScrollBars
218
+ .mockResolvedValueOnce(undefined) // getDocumentScrollHeight returns undefined
219
+ .mockResolvedValueOnce(undefined); // hideScrollBars
220
+ const options = createMobileOptions();
221
+ await expect(getMobileFullPageNativeWebScreenshotsData(mockBrowserInstance, options))
222
+ .rejects.toThrow('Couldn\'t determine scroll height or screenshot size');
223
+ });
224
+ });
225
+ describe('getAndroidChromeDriverFullPageScreenshotsData', () => {
226
+ const createBaseOptions = (overrides = {}) => ({
227
+ devicePixelRatio: 1,
228
+ fullPageScrollTimeout: 1000,
229
+ innerHeight: 768,
230
+ hideAfterFirstScroll: [],
231
+ ...overrides
232
+ });
233
+ beforeEach(() => {
234
+ logWarnSpy = vi.spyOn(log, 'warn');
235
+ vi.mocked(utilsModule.waitFor).mockResolvedValue(undefined);
236
+ vi.mocked(utilsModule.calculateDprData).mockImplementation((data) => data);
237
+ });
238
+ afterEach(() => {
239
+ vi.clearAllMocks();
240
+ logWarnSpy.mockRestore();
241
+ });
242
+ it('should take single screenshot when content fits in viewport', async () => {
243
+ const mockBrowserInstance = createMockBrowserInstance({ takeScreenshot: SMALL_IMAGE_STRING });
244
+ vi.mocked(utilsModule.getBase64ScreenshotSize).mockReturnValue({
245
+ width: 1366,
246
+ height: 768
247
+ });
248
+ mockBrowserInstance.execute = vi.fn()
249
+ .mockResolvedValueOnce(undefined) // scrollToPosition
250
+ .mockResolvedValueOnce(undefined) // hideScrollBars
251
+ .mockResolvedValueOnce(768) // getDocumentScrollHeight
252
+ .mockResolvedValueOnce(undefined); // hideScrollBars
253
+ const options = createBaseOptions();
254
+ const result = await getAndroidChromeDriverFullPageScreenshotsData(mockBrowserInstance, options);
255
+ expect(result).toMatchSnapshot();
256
+ expect(mockBrowserInstance.takeScreenshot).toHaveBeenCalledTimes(1);
257
+ expect(result.data).toHaveLength(1);
258
+ });
259
+ it('should take multiple screenshots when content exceeds viewport', async () => {
260
+ const mockBrowserInstance = createMockBrowserInstance({ takeScreenshot: SMALL_IMAGE_STRING });
261
+ vi.mocked(utilsModule.getBase64ScreenshotSize).mockReturnValue({
262
+ width: 1366,
263
+ height: 768
264
+ });
265
+ mockBrowserInstance.execute = vi.fn()
266
+ .mockResolvedValueOnce(undefined) // scrollToPosition 0
267
+ .mockResolvedValueOnce(undefined) // hideScrollBars
268
+ .mockResolvedValueOnce(1536) // getDocumentScrollHeight (2x viewport)
269
+ .mockResolvedValueOnce(undefined) // hideScrollBars
270
+ .mockResolvedValueOnce(undefined) // scrollToPosition 768
271
+ .mockResolvedValueOnce(undefined) // hideScrollBars
272
+ .mockResolvedValueOnce(1536) // getDocumentScrollHeight
273
+ .mockResolvedValueOnce(undefined); // hideScrollBars
274
+ const options = createBaseOptions();
275
+ const result = await getAndroidChromeDriverFullPageScreenshotsData(mockBrowserInstance, options);
276
+ expect(result).toMatchSnapshot();
277
+ expect(mockBrowserInstance.takeScreenshot).toHaveBeenCalledTimes(2);
278
+ expect(result.data).toHaveLength(2);
279
+ });
280
+ it('should hide elements after first scroll when hideAfterFirstScroll is provided', async () => {
281
+ const mockBrowserInstance = createMockBrowserInstance({ takeScreenshot: SMALL_IMAGE_STRING });
282
+ vi.mocked(utilsModule.getBase64ScreenshotSize).mockReturnValue({
283
+ width: 1366,
284
+ height: 768
285
+ });
286
+ mockBrowserInstance.execute = vi.fn()
287
+ .mockResolvedValueOnce(undefined) // scrollToPosition 0
288
+ .mockResolvedValueOnce(undefined) // hideScrollBars
289
+ .mockResolvedValueOnce(1536) // getDocumentScrollHeight
290
+ .mockResolvedValueOnce(undefined) // hideScrollBars
291
+ .mockResolvedValueOnce(undefined) // scrollToPosition 768
292
+ .mockResolvedValueOnce(undefined) // hideScrollBars
293
+ .mockResolvedValueOnce(undefined) // hideRemoveElements
294
+ .mockResolvedValueOnce(1536) // getDocumentScrollHeight
295
+ .mockResolvedValueOnce(undefined) // hideScrollBars
296
+ .mockResolvedValueOnce(undefined); // hideRemoveElements (restore)
297
+ const mockElements = [{ tagName: 'div' }];
298
+ const options = createBaseOptions({ hideAfterFirstScroll: [mockElements] });
299
+ const result = await getAndroidChromeDriverFullPageScreenshotsData(mockBrowserInstance, options);
300
+ expect(result).toMatchSnapshot();
301
+ expect(mockBrowserInstance.execute).toHaveBeenCalledWith(expect.any(Function), { hide: [mockElements], remove: [] }, true);
302
+ expect(mockBrowserInstance.execute).toHaveBeenCalledWith(expect.any(Function), { hide: [mockElements], remove: [] }, false);
303
+ });
304
+ it('should handle error when hiding elements fails', async () => {
305
+ const mockBrowserInstance = createMockBrowserInstance({ takeScreenshot: SMALL_IMAGE_STRING });
306
+ vi.mocked(utilsModule.getBase64ScreenshotSize).mockReturnValue({
307
+ width: 1366,
308
+ height: 768
309
+ });
310
+ const executeError = new Error('Element not found');
311
+ mockBrowserInstance.execute = vi.fn()
312
+ .mockResolvedValueOnce(undefined) // scrollToPosition 0
313
+ .mockResolvedValueOnce(undefined) // hideScrollBars
314
+ .mockResolvedValueOnce(1536) // getDocumentScrollHeight
315
+ .mockResolvedValueOnce(undefined) // hideScrollBars
316
+ .mockResolvedValueOnce(undefined) // scrollToPosition 768
317
+ .mockResolvedValueOnce(undefined) // hideScrollBars
318
+ .mockRejectedValueOnce(executeError) // hideRemoveElements fails
319
+ .mockResolvedValueOnce(1536) // getDocumentScrollHeight
320
+ .mockResolvedValueOnce(undefined) // hideScrollBars
321
+ .mockRejectedValueOnce(executeError); // hideRemoveElements restore fails
322
+ const mockElements = [{ tagName: 'div' }];
323
+ const options = createBaseOptions({ hideAfterFirstScroll: [mockElements] });
324
+ const result = await getAndroidChromeDriverFullPageScreenshotsData(mockBrowserInstance, options);
325
+ expect(result).toBeDefined();
326
+ expect(result.data).toHaveLength(2);
327
+ expect(logWarnSpy).toHaveBeenCalledTimes(2);
328
+ });
329
+ it('should throw error when scroll height cannot be determined', async () => {
330
+ const mockBrowserInstance = createMockBrowserInstance({ takeScreenshot: SMALL_IMAGE_STRING });
331
+ vi.mocked(utilsModule.getBase64ScreenshotSize).mockReturnValue({
332
+ width: 1366,
333
+ height: 768
334
+ });
335
+ mockBrowserInstance.execute = vi.fn()
336
+ .mockResolvedValueOnce(undefined) // scrollToPosition
337
+ .mockResolvedValueOnce(undefined) // hideScrollBars
338
+ .mockResolvedValueOnce(undefined) // getDocumentScrollHeight returns undefined
339
+ .mockResolvedValueOnce(undefined); // hideScrollBars
340
+ const options = createBaseOptions();
341
+ await expect(getAndroidChromeDriverFullPageScreenshotsData(mockBrowserInstance, options))
342
+ .rejects.toThrow('Couldn\'t determine scroll height or screenshot size');
343
+ });
344
+ });
345
+ describe('getDesktopFullPageScreenshotsData', () => {
346
+ const createBaseOptions = (overrides = {}) => ({
347
+ devicePixelRatio: 1,
348
+ fullPageScrollTimeout: 1000,
349
+ innerHeight: 768,
350
+ hideAfterFirstScroll: [],
351
+ ...overrides
352
+ });
353
+ beforeEach(() => {
354
+ logWarnSpy = vi.spyOn(log, 'warn');
355
+ vi.mocked(utilsModule.waitFor).mockResolvedValue(undefined);
356
+ vi.mocked(utilsModule.calculateDprData).mockImplementation((data) => data);
357
+ });
358
+ afterEach(() => {
359
+ vi.clearAllMocks();
360
+ logWarnSpy.mockRestore();
361
+ });
362
+ it('should take single screenshot when content fits in viewport', async () => {
363
+ const mockBrowserInstance = createMockBrowserInstance({ takeScreenshot: SMALL_IMAGE_STRING });
364
+ vi.mocked(utilsModule.getBase64ScreenshotSize).mockReturnValue({
365
+ width: 1366,
366
+ height: 768
367
+ });
368
+ mockBrowserInstance.execute = vi.fn()
369
+ .mockResolvedValueOnce(undefined) // scrollToPosition
370
+ .mockResolvedValueOnce(768); // getDocumentScrollHeight
371
+ const options = createBaseOptions();
372
+ const result = await getDesktopFullPageScreenshotsData(mockBrowserInstance, options);
373
+ expect(result).toMatchSnapshot();
374
+ expect(mockBrowserInstance.takeScreenshot).toHaveBeenCalledTimes(1);
375
+ expect(mockBrowserInstance.execute).toHaveBeenCalledTimes(2); // scroll + getScrollHeight
376
+ expect(result.data).toHaveLength(1);
377
+ });
378
+ it('should take multiple screenshots when content exceeds viewport', async () => {
379
+ const mockBrowserInstance = createMockBrowserInstance({ takeScreenshot: SMALL_IMAGE_STRING });
380
+ vi.mocked(utilsModule.getBase64ScreenshotSize).mockReturnValue({
381
+ width: 1366,
382
+ height: 768
383
+ });
384
+ mockBrowserInstance.execute = vi.fn()
385
+ .mockResolvedValueOnce(undefined) // scrollToPosition 0
386
+ .mockResolvedValueOnce(1536) // getDocumentScrollHeight (2x viewport)
387
+ .mockResolvedValueOnce(undefined) // scrollToPosition 768
388
+ .mockResolvedValueOnce(1536); // getDocumentScrollHeight
389
+ const options = createBaseOptions();
390
+ const result = await getDesktopFullPageScreenshotsData(mockBrowserInstance, options);
391
+ expect(result).toMatchSnapshot();
392
+ expect(mockBrowserInstance.takeScreenshot).toHaveBeenCalledTimes(2);
393
+ expect(result.data).toHaveLength(2);
394
+ });
395
+ it('should handle screenshot size adjustment when different from inner height', async () => {
396
+ const mockBrowserInstance = createMockBrowserInstance({ takeScreenshot: SMALL_IMAGE_STRING });
397
+ vi.mocked(utilsModule.getBase64ScreenshotSize).mockReturnValue({
398
+ width: 1366,
399
+ height: 768.4
400
+ });
401
+ mockBrowserInstance.execute = vi.fn()
402
+ .mockResolvedValueOnce(undefined) // scrollToPosition
403
+ .mockResolvedValueOnce(768); // getDocumentScrollHeight
404
+ const options = createBaseOptions({ innerHeight: 768 });
405
+ const result = await getDesktopFullPageScreenshotsData(mockBrowserInstance, options);
406
+ expect(result).toMatchSnapshot();
407
+ expect(result.data).toHaveLength(1);
408
+ });
409
+ it('should hide elements after first scroll when hideAfterFirstScroll is provided', async () => {
410
+ const mockBrowserInstance = createMockBrowserInstance({ takeScreenshot: SMALL_IMAGE_STRING });
411
+ vi.mocked(utilsModule.getBase64ScreenshotSize).mockReturnValue({
412
+ width: 1366,
413
+ height: 768
414
+ });
415
+ mockBrowserInstance.execute = vi.fn()
416
+ .mockResolvedValueOnce(undefined) // scrollToPosition 0
417
+ .mockResolvedValueOnce(1536) // getDocumentScrollHeight
418
+ .mockResolvedValueOnce(undefined) // hideRemoveElements
419
+ .mockResolvedValueOnce(undefined) // scrollToPosition 768
420
+ .mockResolvedValueOnce(1536) // getDocumentScrollHeight
421
+ .mockResolvedValueOnce(undefined); // hideRemoveElements (restore)
422
+ const mockElements = [{ tagName: 'div' }];
423
+ const options = createBaseOptions({ hideAfterFirstScroll: [mockElements] });
424
+ const result = await getDesktopFullPageScreenshotsData(mockBrowserInstance, options);
425
+ expect(result).toMatchSnapshot();
426
+ expect(mockBrowserInstance.execute).toHaveBeenCalledWith(expect.any(Function), { hide: [mockElements], remove: [] }, true);
427
+ expect(mockBrowserInstance.execute).toHaveBeenCalledWith(expect.any(Function), { hide: [mockElements], remove: [] }, false);
428
+ });
429
+ it('should handle error when hiding elements fails', async () => {
430
+ const mockBrowserInstance = createMockBrowserInstance({ takeScreenshot: SMALL_IMAGE_STRING });
431
+ vi.mocked(utilsModule.getBase64ScreenshotSize).mockReturnValue({
432
+ width: 1366,
433
+ height: 768
434
+ });
435
+ const executeError = new Error('Element not found');
436
+ mockBrowserInstance.execute = vi.fn()
437
+ .mockResolvedValueOnce(undefined) // scrollToPosition 0 (i=0)
438
+ .mockResolvedValueOnce(1536) // getDocumentScrollHeight (i=0) - triggers another iteration
439
+ .mockResolvedValueOnce(undefined) // scrollToPosition 768 (i=1)
440
+ .mockRejectedValueOnce(executeError) // hideRemoveElements fails (i=1)
441
+ .mockResolvedValueOnce(1536) // getDocumentScrollHeight (i=1)
442
+ .mockRejectedValueOnce(executeError); // hideRemoveElements restore fails
443
+ const mockElements = [{ tagName: 'div' }];
444
+ const options = createBaseOptions({ hideAfterFirstScroll: [mockElements] });
445
+ const result = await getDesktopFullPageScreenshotsData(mockBrowserInstance, options);
446
+ expect(result).toBeDefined();
447
+ expect(result.data).toHaveLength(2);
448
+ expect(logWarnSpy).toHaveBeenCalledTimes(2);
449
+ });
450
+ it('should throw error when scroll height cannot be determined', async () => {
451
+ const mockBrowserInstance = createMockBrowserInstance({ takeScreenshot: SMALL_IMAGE_STRING });
452
+ vi.mocked(utilsModule.getBase64ScreenshotSize).mockReturnValue({
453
+ width: 1366,
454
+ height: 768
455
+ });
456
+ mockBrowserInstance.execute = vi.fn()
457
+ .mockResolvedValueOnce(undefined) // scrollToPosition
458
+ .mockResolvedValueOnce(undefined); // getDocumentScrollHeight returns undefined
459
+ const options = createBaseOptions();
460
+ await expect(getDesktopFullPageScreenshotsData(mockBrowserInstance, options))
461
+ .rejects.toThrow('Couldn\'t determine scroll height or screenshot size');
462
+ });
463
+ });
464
+ describe('takeBase64BiDiScreenshot', () => {
465
+ it('should take a BiDi screenshot with no arguments (uses defaults)', async () => {
466
+ const mockBrowserInstance = createMockBrowserInstance();
467
+ const result = await takeBase64BiDiScreenshot({ browserInstance: mockBrowserInstance });
468
+ expect(result).toBe(SMALL_IMAGE_STRING);
469
+ });
470
+ it('should take a BiDi screenshot with default viewport origin', async () => {
471
+ const mockBrowserInstance = createMockBrowserInstance();
472
+ const result = await takeBase64BiDiScreenshot({ browserInstance: mockBrowserInstance });
473
+ expect(result).toBe(SMALL_IMAGE_STRING);
474
+ });
475
+ it('should take a BiDi screenshot with document origin', async () => {
476
+ const mockBrowserInstance = createMockBrowserInstance();
477
+ const result = await takeBase64BiDiScreenshot({
478
+ browserInstance: mockBrowserInstance,
479
+ origin: 'document'
480
+ });
481
+ expect(result).toBe(SMALL_IMAGE_STRING);
482
+ });
483
+ it('should take a BiDi screenshot with clip rectangle', async () => {
484
+ const mockBrowserInstance = createMockBrowserInstance();
485
+ const clipRectangle = {
486
+ x: 10,
487
+ y: 20,
488
+ width: 300,
489
+ height: 400,
490
+ };
491
+ const result = await takeBase64BiDiScreenshot({
492
+ browserInstance: mockBrowserInstance,
493
+ clip: clipRectangle
494
+ });
495
+ expect(result).toBe(SMALL_IMAGE_STRING);
496
+ });
497
+ });
498
+ describe('logHiddenRemovedError', () => {
499
+ beforeEach(() => {
500
+ logWarnSpy = vi.spyOn(log, 'warn');
501
+ });
502
+ afterEach(() => {
503
+ vi.clearAllMocks();
504
+ logWarnSpy.mockRestore();
505
+ });
506
+ it('should log a warning when the elements are not found', () => {
507
+ logHiddenRemovedError(new Error('Element not found'));
508
+ expect(logWarnSpy.mock.calls).toMatchSnapshot();
509
+ });
510
+ });
511
+ describe('takeWebElementScreenshot', () => {
512
+ const createBaseTakeWebElementScreenshotOptions = (overrides = {}) => ({
513
+ addressBarShadowPadding: 10,
514
+ browserInstance: createMockBrowserInstance(),
515
+ devicePixelRatio: 1,
516
+ deviceRectangles: DEVICE_RECTANGLES,
517
+ element: Promise.resolve(createMockElement()),
518
+ fallback: false,
519
+ initialDevicePixelRatio: 1,
520
+ isEmulated: false,
521
+ innerHeight: 768,
522
+ isAndroid: false,
523
+ isAndroidChromeDriverScreenshot: false,
524
+ isAndroidNativeWebScreenshot: false,
525
+ isIOS: false,
526
+ isLandscape: false,
527
+ toolBarShadowPadding: 5,
528
+ ...overrides
529
+ });
530
+ beforeEach(() => {
531
+ logWarnSpy = vi.spyOn(log, 'warn');
532
+ });
533
+ afterEach(() => {
534
+ vi.clearAllMocks();
535
+ logWarnSpy.mockRestore();
536
+ });
537
+ describe('normal mode (fallback = false)', () => {
538
+ it('should successfully take element screenshot using webdriver element screenshot', async () => {
539
+ const mockBrowserInstance = createMockBrowserInstance({ takeScreenshot: MEDIUM_IMAGE_STRING, takeElementScreenshot: SMALL_IMAGE_STRING });
540
+ const mockElement = createMockElement();
541
+ vi.mocked(utilsModule.getBase64ScreenshotSize).mockReturnValue({
542
+ width: 300,
543
+ height: 200
544
+ });
545
+ const options = createBaseTakeWebElementScreenshotOptions({
546
+ browserInstance: mockBrowserInstance,
547
+ element: Promise.resolve(mockElement)
548
+ });
549
+ const result = await takeWebElementScreenshot(options);
550
+ expect(result).toMatchSnapshot();
551
+ expect(mockBrowserInstance.takeElementScreenshot).toHaveBeenCalled();
552
+ expect(mockBrowserInstance.takeScreenshot).not.toHaveBeenCalled();
553
+ });
554
+ it('should throw error when element has zero width', async () => {
555
+ const mockBrowserInstance = createMockBrowserInstance({ takeElementScreenshot: SMALL_IMAGE_STRING });
556
+ const mockElement = createMockElement();
557
+ vi.mocked(utilsModule.getBase64ScreenshotSize).mockReturnValue({
558
+ width: 0,
559
+ height: 200
560
+ });
561
+ const options = createBaseTakeWebElementScreenshotOptions({
562
+ browserInstance: mockBrowserInstance,
563
+ element: Promise.resolve(mockElement)
564
+ });
565
+ vi.mocked(rectanglesModule.determineElementRectangles).mockResolvedValue({
566
+ x: 10,
567
+ y: 20,
568
+ width: 300,
569
+ height: 200
570
+ });
571
+ const result = await takeWebElementScreenshot(options);
572
+ expect(logWarnSpy.mock.calls).toMatchSnapshot();
573
+ expect(result.isWebDriverElementScreenshot).toBe(false);
574
+ expect(mockBrowserInstance.takeElementScreenshot).toHaveBeenCalled();
575
+ expect(mockBrowserInstance.takeScreenshot).toHaveBeenCalled();
576
+ });
577
+ it('should throw error when element has zero height', async () => {
578
+ const mockBrowserInstance = createMockBrowserInstance({ takeElementScreenshot: SMALL_IMAGE_STRING });
579
+ const mockElement = createMockElement();
580
+ vi.mocked(utilsModule.getBase64ScreenshotSize).mockReturnValue({
581
+ width: 300,
582
+ height: 0
583
+ });
584
+ const options = createBaseTakeWebElementScreenshotOptions({
585
+ browserInstance: mockBrowserInstance,
586
+ element: Promise.resolve(mockElement)
587
+ });
588
+ vi.mocked(rectanglesModule.determineElementRectangles).mockResolvedValue({
589
+ x: 10,
590
+ y: 20,
591
+ width: 300,
592
+ height: 200
593
+ });
594
+ const result = await takeWebElementScreenshot(options);
595
+ expect(logWarnSpy.mock.calls).toMatchSnapshot();
596
+ expect(result.isWebDriverElementScreenshot).toBe(false);
597
+ expect(mockBrowserInstance.takeElementScreenshot).toHaveBeenCalled();
598
+ expect(mockBrowserInstance.takeScreenshot).toHaveBeenCalled();
599
+ });
600
+ it('should fallback when takeElementScreenshot throws an error', async () => {
601
+ const mockBrowserInstance = createMockBrowserInstance({ takeScreenshot: MEDIUM_IMAGE_STRING });
602
+ const mockElement = createMockElement();
603
+ mockBrowserInstance.takeElementScreenshot = vi.fn().mockRejectedValue(new Error('Element screenshot failed'));
604
+ vi.mocked(rectanglesModule.determineElementRectangles).mockResolvedValue({
605
+ x: 10,
606
+ y: 20,
607
+ width: 300,
608
+ height: 200
609
+ });
610
+ const options = createBaseTakeWebElementScreenshotOptions({
611
+ browserInstance: mockBrowserInstance,
612
+ element: Promise.resolve(mockElement)
613
+ });
614
+ const result = await takeWebElementScreenshot(options);
615
+ expect(logWarnSpy.mock.calls).toMatchSnapshot();
616
+ expect(result).toMatchSnapshot();
617
+ expect(mockBrowserInstance.takeElementScreenshot).toHaveBeenCalledWith('element-123');
618
+ expect(mockBrowserInstance.takeScreenshot).toHaveBeenCalled();
619
+ expect(result.isWebDriverElementScreenshot).toBe(false);
620
+ expect(rectanglesModule.determineElementRectangles).toHaveBeenCalled();
621
+ });
622
+ });
623
+ describe('fallback mode (fallback = true)', () => {
624
+ it('should take full screenshot and determine element rectangles', async () => {
625
+ const mockBrowserInstance = createMockBrowserInstance({ takeScreenshot: MEDIUM_IMAGE_STRING });
626
+ const mockElement = createMockElement();
627
+ const mockRectangles = { x: 50, y: 100, width: 250, height: 150 };
628
+ vi.mocked(rectanglesModule.determineElementRectangles).mockResolvedValue(mockRectangles);
629
+ const options = createBaseTakeWebElementScreenshotOptions({
630
+ browserInstance: mockBrowserInstance,
631
+ element: Promise.resolve(mockElement),
632
+ fallback: true
633
+ });
634
+ const result = await takeWebElementScreenshot(options);
635
+ expect(result).toMatchSnapshot();
636
+ expect(mockBrowserInstance.takeScreenshot).toHaveBeenCalled();
637
+ expect(mockBrowserInstance.takeElementScreenshot).not.toHaveBeenCalled();
638
+ expect(rectanglesModule.determineElementRectangles).toHaveBeenCalledWith({
639
+ browserInstance: mockBrowserInstance,
640
+ base64Image: MEDIUM_IMAGE_STRING,
641
+ element: Promise.resolve(mockElement),
642
+ options: {
643
+ devicePixelRatio: 1,
644
+ deviceRectangles: DEVICE_RECTANGLES,
645
+ initialDevicePixelRatio: 1,
646
+ innerHeight: 768,
647
+ isEmulated: false,
648
+ isAndroidNativeWebScreenshot: false,
649
+ isAndroid: false,
650
+ isIOS: false
651
+ }
652
+ });
653
+ });
654
+ });
655
+ });
656
+ });
@@ -0,0 +1,3 @@
1
+ import type { ElementScreenshotDataOptions, ElementScreenshotData } from './screenshots.interfaces.js';
2
+ export declare function takeElementScreenshot(browserInstance: WebdriverIO.Browser, options: ElementScreenshotDataOptions, shouldUseBidi?: boolean): Promise<ElementScreenshotData>;
3
+ //# sourceMappingURL=takeElementScreenshots.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"takeElementScreenshots.d.ts","sourceRoot":"","sources":["../../src/methods/takeElementScreenshots.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,4BAA4B,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAA;AAItG,wBAAsB,qBAAqB,CACvC,eAAe,EAAE,WAAW,CAAC,OAAO,EACpC,OAAO,EAAE,4BAA4B,EACrC,aAAa,GAAE,OAAe,GAC/B,OAAO,CAAC,qBAAqB,CAAC,CAKhC"}