@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.
- package/CHANGELOG.md +82 -0
- package/LICENSE +21 -0
- package/README.md +12 -0
- package/assets/ios/ipadair4th.ipadair5th-bottom.png +0 -0
- package/assets/ios/ipadair4th.ipadair5th-top.png +0 -0
- package/assets/ios/ipadmini6th-bottom.png +0 -0
- package/assets/ios/ipadmini6th-top.png +0 -0
- package/assets/ios/ipadpro11-bottom.png +0 -0
- package/assets/ios/ipadpro11-top.png +0 -0
- package/assets/ios/ipadpro129-bottom.png +0 -0
- package/assets/ios/ipadpro129-top.png +0 -0
- package/assets/ios/iphone11promax-bottom.png +0 -0
- package/assets/ios/iphone11promax-top.png +0 -0
- package/assets/ios/iphone12.iphone12pro-top.png +0 -0
- package/assets/ios/iphone12.iphone12pro.iphone13.iphone13pro.iphone14-bottom.png +0 -0
- package/assets/ios/iphone12mini-top.png +0 -0
- package/assets/ios/iphone12mini.iphone13mini-bottom.png +0 -0
- package/assets/ios/iphone12promax-top.png +0 -0
- package/assets/ios/iphone12promax.iphone13promax.iphone14plus-bottom.png +0 -0
- package/assets/ios/iphone13.iphone13pro.iphone14-top.png +0 -0
- package/assets/ios/iphone13mini-top.png +0 -0
- package/assets/ios/iphone13promax.iphone14plus-top.png +0 -0
- package/assets/ios/iphone14pro-bottom.png +0 -0
- package/assets/ios/iphone14pro-top.png +0 -0
- package/assets/ios/iphone14promax-bottom.png +0 -0
- package/assets/ios/iphone14promax-top.png +0 -0
- package/assets/ios/iphone15-bottom.png +0 -0
- package/assets/ios/iphone15-top.png +0 -0
- package/assets/ios/iphonex.iphonexs.iphone11pro-bottom.png +0 -0
- package/assets/ios/iphonex.iphonexs.iphone11pro-top.png +0 -0
- package/assets/ios/iphonexr.iphone11-bottom.png +0 -0
- package/assets/ios/iphonexr.iphone11-top.png +0 -0
- package/assets/ios/iphonexsmax-bottom.png +0 -0
- package/assets/ios/iphonexsmax-top.png +0 -0
- package/dist/base.d.ts +18 -0
- package/dist/base.d.ts.map +1 -0
- package/dist/base.interfaces.d.ts +200 -0
- package/dist/base.interfaces.d.ts.map +1 -0
- package/dist/base.interfaces.js +1 -0
- package/dist/base.js +58 -0
- package/dist/base.test.d.ts +2 -0
- package/dist/base.test.d.ts.map +1 -0
- package/dist/base.test.js +45 -0
- package/dist/clientSideScripts/checkMetaTag.d.ts +2 -0
- package/dist/clientSideScripts/checkMetaTag.d.ts.map +1 -0
- package/dist/clientSideScripts/checkMetaTag.js +9 -0
- package/dist/clientSideScripts/checkMetaTag.test.d.ts +2 -0
- package/dist/clientSideScripts/checkMetaTag.test.d.ts.map +1 -0
- package/dist/clientSideScripts/checkMetaTag.test.js +25 -0
- package/dist/clientSideScripts/customCss.interfaces.d.ts +8 -0
- package/dist/clientSideScripts/customCss.interfaces.d.ts.map +1 -0
- package/dist/clientSideScripts/customCss.interfaces.js +1 -0
- package/dist/clientSideScripts/drawTabbableOnCanvas.d.ts +8 -0
- package/dist/clientSideScripts/drawTabbableOnCanvas.d.ts.map +1 -0
- package/dist/clientSideScripts/drawTabbableOnCanvas.interfaces.d.ts +4 -0
- package/dist/clientSideScripts/drawTabbableOnCanvas.interfaces.d.ts.map +1 -0
- package/dist/clientSideScripts/drawTabbableOnCanvas.interfaces.js +1 -0
- package/dist/clientSideScripts/drawTabbableOnCanvas.js +275 -0
- package/dist/clientSideScripts/drawTabbableOnCanvas.test.d.ts +2 -0
- package/dist/clientSideScripts/drawTabbableOnCanvas.test.d.ts.map +1 -0
- package/dist/clientSideScripts/drawTabbableOnCanvas.test.js +251 -0
- package/dist/clientSideScripts/elementPosition.interfaces.d.ts +3 -0
- package/dist/clientSideScripts/elementPosition.interfaces.d.ts.map +1 -0
- package/dist/clientSideScripts/elementPosition.interfaces.js +1 -0
- package/dist/clientSideScripts/getBoundingClientRect.d.ts +6 -0
- package/dist/clientSideScripts/getBoundingClientRect.d.ts.map +1 -0
- package/dist/clientSideScripts/getBoundingClientRect.js +12 -0
- package/dist/clientSideScripts/getBoundingClientRect.test.d.ts +2 -0
- package/dist/clientSideScripts/getBoundingClientRect.test.d.ts.map +1 -0
- package/dist/clientSideScripts/getBoundingClientRect.test.js +28 -0
- package/dist/clientSideScripts/getDocumentScrollHeight.d.ts +5 -0
- package/dist/clientSideScripts/getDocumentScrollHeight.d.ts.map +1 -0
- package/dist/clientSideScripts/getDocumentScrollHeight.js +48 -0
- package/dist/clientSideScripts/getDocumentScrollHeight.test.d.ts +2 -0
- package/dist/clientSideScripts/getDocumentScrollHeight.test.d.ts.map +1 -0
- package/dist/clientSideScripts/getDocumentScrollHeight.test.js +30 -0
- package/dist/clientSideScripts/getElementPositionTopDom.d.ts +6 -0
- package/dist/clientSideScripts/getElementPositionTopDom.d.ts.map +1 -0
- package/dist/clientSideScripts/getElementPositionTopDom.js +11 -0
- package/dist/clientSideScripts/getElementPositionTopDom.test.d.ts +2 -0
- package/dist/clientSideScripts/getElementPositionTopDom.test.d.ts.map +1 -0
- package/dist/clientSideScripts/getElementPositionTopDom.test.js +11 -0
- package/dist/clientSideScripts/getElementPositionTopScreenNativeMobile.d.ts +14 -0
- package/dist/clientSideScripts/getElementPositionTopScreenNativeMobile.d.ts.map +1 -0
- package/dist/clientSideScripts/getElementPositionTopScreenNativeMobile.js +19 -0
- package/dist/clientSideScripts/getElementPositionTopScreenNativeMobile.test.d.ts +2 -0
- package/dist/clientSideScripts/getElementPositionTopScreenNativeMobile.test.d.ts.map +1 -0
- package/dist/clientSideScripts/getElementPositionTopScreenNativeMobile.test.js +52 -0
- package/dist/clientSideScripts/getMobileWebviewClickAndDimensions.d.ts +6 -0
- package/dist/clientSideScripts/getMobileWebviewClickAndDimensions.d.ts.map +1 -0
- package/dist/clientSideScripts/getMobileWebviewClickAndDimensions.js +17 -0
- package/dist/clientSideScripts/getMobileWebviewClickAndDimensions.test.d.ts +2 -0
- package/dist/clientSideScripts/getMobileWebviewClickAndDimensions.test.d.ts.map +1 -0
- package/dist/clientSideScripts/getMobileWebviewClickAndDimensions.test.js +47 -0
- package/dist/clientSideScripts/getScreenDimensions.d.ts +6 -0
- package/dist/clientSideScripts/getScreenDimensions.d.ts.map +1 -0
- package/dist/clientSideScripts/getScreenDimensions.js +104 -0
- package/dist/clientSideScripts/getScreenDimensions.test.d.ts +2 -0
- package/dist/clientSideScripts/getScreenDimensions.test.d.ts.map +1 -0
- package/dist/clientSideScripts/getScreenDimensions.test.js +161 -0
- package/dist/clientSideScripts/hideRemoveElements.d.ts +8 -0
- package/dist/clientSideScripts/hideRemoveElements.d.ts.map +1 -0
- package/dist/clientSideScripts/hideRemoveElements.js +60 -0
- package/dist/clientSideScripts/hideRemoveElements.test.d.ts +2 -0
- package/dist/clientSideScripts/hideRemoveElements.test.d.ts.map +1 -0
- package/dist/clientSideScripts/hideRemoveElements.test.js +199 -0
- package/dist/clientSideScripts/hideScrollbars.d.ts +9 -0
- package/dist/clientSideScripts/hideScrollbars.d.ts.map +1 -0
- package/dist/clientSideScripts/hideScrollbars.js +15 -0
- package/dist/clientSideScripts/hideScrollbars.test.d.ts +2 -0
- package/dist/clientSideScripts/hideScrollbars.test.d.ts.map +1 -0
- package/dist/clientSideScripts/hideScrollbars.test.js +12 -0
- package/dist/clientSideScripts/injectWebviewOverlay.d.ts +5 -0
- package/dist/clientSideScripts/injectWebviewOverlay.d.ts.map +1 -0
- package/dist/clientSideScripts/injectWebviewOverlay.js +35 -0
- package/dist/clientSideScripts/injectWebviewOverlay.test.d.ts +2 -0
- package/dist/clientSideScripts/injectWebviewOverlay.test.d.ts.map +1 -0
- package/dist/clientSideScripts/injectWebviewOverlay.test.js +74 -0
- package/dist/clientSideScripts/removeElementFromDom.d.ts +5 -0
- package/dist/clientSideScripts/removeElementFromDom.d.ts.map +1 -0
- package/dist/clientSideScripts/removeElementFromDom.js +9 -0
- package/dist/clientSideScripts/removeElementFromDom.test.d.ts +2 -0
- package/dist/clientSideScripts/removeElementFromDom.test.d.ts.map +1 -0
- package/dist/clientSideScripts/removeElementFromDom.test.js +43 -0
- package/dist/clientSideScripts/screenDimensions.interfaces.d.ts +96 -0
- package/dist/clientSideScripts/screenDimensions.interfaces.d.ts.map +1 -0
- package/dist/clientSideScripts/screenDimensions.interfaces.js +1 -0
- package/dist/clientSideScripts/scrollElementIntoView.d.ts +5 -0
- package/dist/clientSideScripts/scrollElementIntoView.d.ts.map +1 -0
- package/dist/clientSideScripts/scrollElementIntoView.js +31 -0
- package/dist/clientSideScripts/scrollElementIntoView.test.d.ts +2 -0
- package/dist/clientSideScripts/scrollElementIntoView.test.d.ts.map +1 -0
- package/dist/clientSideScripts/scrollElementIntoView.test.js +79 -0
- package/dist/clientSideScripts/scrollToPosition.d.ts +5 -0
- package/dist/clientSideScripts/scrollToPosition.d.ts.map +1 -0
- package/dist/clientSideScripts/scrollToPosition.js +25 -0
- package/dist/clientSideScripts/scrollToPosition.test.d.ts +2 -0
- package/dist/clientSideScripts/scrollToPosition.test.d.ts.map +1 -0
- package/dist/clientSideScripts/scrollToPosition.test.js +72 -0
- package/dist/clientSideScripts/setCustomCss.d.ts +6 -0
- package/dist/clientSideScripts/setCustomCss.d.ts.map +1 -0
- package/dist/clientSideScripts/setCustomCss.js +36 -0
- package/dist/clientSideScripts/setCustomCss.test.d.ts +2 -0
- package/dist/clientSideScripts/setCustomCss.test.d.ts.map +1 -0
- package/dist/clientSideScripts/setCustomCss.test.js +68 -0
- package/dist/clientSideScripts/statusAddressToolBarOffsets.interfaces.d.ts +11 -0
- package/dist/clientSideScripts/statusAddressToolBarOffsets.interfaces.d.ts.map +1 -0
- package/dist/clientSideScripts/statusAddressToolBarOffsets.interfaces.js +1 -0
- package/dist/clientSideScripts/toggleTextTransparency.d.ts +5 -0
- package/dist/clientSideScripts/toggleTextTransparency.d.ts.map +1 -0
- package/dist/clientSideScripts/toggleTextTransparency.js +16 -0
- package/dist/clientSideScripts/toggleTextTransparency.test.d.ts +2 -0
- package/dist/clientSideScripts/toggleTextTransparency.test.d.ts.map +1 -0
- package/dist/clientSideScripts/toggleTextTransparency.test.js +35 -0
- package/dist/clientSideScripts/waitForFonts.d.ts +8 -0
- package/dist/clientSideScripts/waitForFonts.d.ts.map +1 -0
- package/dist/clientSideScripts/waitForFonts.js +20 -0
- package/dist/clientSideScripts/waitForFonts.test.d.ts +2 -0
- package/dist/clientSideScripts/waitForFonts.test.d.ts.map +1 -0
- package/dist/clientSideScripts/waitForFonts.test.js +37 -0
- package/dist/commands/check.interfaces.d.ts +35 -0
- package/dist/commands/check.interfaces.d.ts.map +1 -0
- package/dist/commands/check.interfaces.js +1 -0
- package/dist/commands/checkAppElement.d.ts +7 -0
- package/dist/commands/checkAppElement.d.ts.map +1 -0
- package/dist/commands/checkAppElement.js +44 -0
- package/dist/commands/checkAppElement.test.d.ts +2 -0
- package/dist/commands/checkAppElement.test.d.ts.map +1 -0
- package/dist/commands/checkAppElement.test.js +241 -0
- package/dist/commands/checkAppScreen.d.ts +7 -0
- package/dist/commands/checkAppScreen.d.ts.map +1 -0
- package/dist/commands/checkAppScreen.js +73 -0
- package/dist/commands/checkAppScreen.test.d.ts +2 -0
- package/dist/commands/checkAppScreen.test.d.ts.map +1 -0
- package/dist/commands/checkAppScreen.test.js +295 -0
- package/dist/commands/checkElement.d.ts +7 -0
- package/dist/commands/checkElement.d.ts.map +1 -0
- package/dist/commands/checkElement.js +10 -0
- package/dist/commands/checkElement.test.d.ts +2 -0
- package/dist/commands/checkElement.test.d.ts.map +1 -0
- package/dist/commands/checkElement.test.js +66 -0
- package/dist/commands/checkFullPageScreen.d.ts +7 -0
- package/dist/commands/checkFullPageScreen.d.ts.map +1 -0
- package/dist/commands/checkFullPageScreen.js +56 -0
- package/dist/commands/checkFullPageScreen.test.d.ts +2 -0
- package/dist/commands/checkFullPageScreen.test.d.ts.map +1 -0
- package/dist/commands/checkFullPageScreen.test.js +259 -0
- package/dist/commands/checkScreen.d.ts +7 -0
- package/dist/commands/checkScreen.d.ts.map +1 -0
- package/dist/commands/checkScreen.js +10 -0
- package/dist/commands/checkScreen.test.d.ts +2 -0
- package/dist/commands/checkScreen.test.d.ts.map +1 -0
- package/dist/commands/checkScreen.test.js +62 -0
- package/dist/commands/checkTabbablePage.d.ts +7 -0
- package/dist/commands/checkTabbablePage.d.ts.map +1 -0
- package/dist/commands/checkTabbablePage.js +28 -0
- package/dist/commands/checkTabbablePage.test.d.ts +2 -0
- package/dist/commands/checkTabbablePage.test.d.ts.map +1 -0
- package/dist/commands/checkTabbablePage.test.js +200 -0
- package/dist/commands/checkWebElement.d.ts +7 -0
- package/dist/commands/checkWebElement.d.ts.map +1 -0
- package/dist/commands/checkWebElement.js +52 -0
- package/dist/commands/checkWebElement.test.d.ts +2 -0
- package/dist/commands/checkWebElement.test.d.ts.map +1 -0
- package/dist/commands/checkWebElement.test.js +278 -0
- package/dist/commands/checkWebScreen.d.ts +7 -0
- package/dist/commands/checkWebScreen.d.ts.map +1 -0
- package/dist/commands/checkWebScreen.js +50 -0
- package/dist/commands/checkWebScreen.test.d.ts +2 -0
- package/dist/commands/checkWebScreen.test.d.ts.map +1 -0
- package/dist/commands/checkWebScreen.test.js +227 -0
- package/dist/commands/element.interfaces.d.ts +27 -0
- package/dist/commands/element.interfaces.d.ts.map +1 -0
- package/dist/commands/element.interfaces.js +1 -0
- package/dist/commands/fullPage.interfaces.d.ts +38 -0
- package/dist/commands/fullPage.interfaces.d.ts.map +1 -0
- package/dist/commands/fullPage.interfaces.js +1 -0
- package/dist/commands/save.interfaces.d.ts +27 -0
- package/dist/commands/save.interfaces.d.ts.map +1 -0
- package/dist/commands/save.interfaces.js +1 -0
- package/dist/commands/saveAppElement.d.ts +7 -0
- package/dist/commands/saveAppElement.d.ts.map +1 -0
- package/dist/commands/saveAppElement.js +30 -0
- package/dist/commands/saveAppElement.test.d.ts +2 -0
- package/dist/commands/saveAppElement.test.d.ts.map +1 -0
- package/dist/commands/saveAppElement.test.js +199 -0
- package/dist/commands/saveAppScreen.d.ts +7 -0
- package/dist/commands/saveAppScreen.d.ts.map +1 -0
- package/dist/commands/saveAppScreen.js +43 -0
- package/dist/commands/saveAppScreen.test.d.ts +2 -0
- package/dist/commands/saveAppScreen.test.d.ts.map +1 -0
- package/dist/commands/saveAppScreen.test.js +221 -0
- package/dist/commands/saveElement.d.ts +7 -0
- package/dist/commands/saveElement.d.ts.map +1 -0
- package/dist/commands/saveElement.js +10 -0
- package/dist/commands/saveElement.test.d.ts +2 -0
- package/dist/commands/saveElement.test.d.ts.map +1 -0
- package/dist/commands/saveElement.test.js +62 -0
- package/dist/commands/saveFullPageScreen.d.ts +7 -0
- package/dist/commands/saveFullPageScreen.d.ts.map +1 -0
- package/dist/commands/saveFullPageScreen.js +60 -0
- package/dist/commands/saveFullPageScreen.test.d.ts +2 -0
- package/dist/commands/saveFullPageScreen.test.d.ts.map +1 -0
- package/dist/commands/saveFullPageScreen.test.js +293 -0
- package/dist/commands/saveScreen.d.ts +7 -0
- package/dist/commands/saveScreen.d.ts.map +1 -0
- package/dist/commands/saveScreen.js +10 -0
- package/dist/commands/saveScreen.test.d.ts +2 -0
- package/dist/commands/saveScreen.test.d.ts.map +1 -0
- package/dist/commands/saveScreen.test.js +47 -0
- package/dist/commands/saveTabbablePage.d.ts +7 -0
- package/dist/commands/saveTabbablePage.d.ts.map +1 -0
- package/dist/commands/saveTabbablePage.js +20 -0
- package/dist/commands/saveTabbablePage.test.d.ts +2 -0
- package/dist/commands/saveTabbablePage.test.d.ts.map +1 -0
- package/dist/commands/saveTabbablePage.test.js +74 -0
- package/dist/commands/saveWebElement.d.ts +7 -0
- package/dist/commands/saveWebElement.d.ts.map +1 -0
- package/dist/commands/saveWebElement.js +53 -0
- package/dist/commands/saveWebElement.test.d.ts +2 -0
- package/dist/commands/saveWebElement.test.d.ts.map +1 -0
- package/dist/commands/saveWebElement.test.js +253 -0
- package/dist/commands/saveWebScreen.d.ts +7 -0
- package/dist/commands/saveWebScreen.d.ts.map +1 -0
- package/dist/commands/saveWebScreen.js +48 -0
- package/dist/commands/saveWebScreen.test.d.ts +2 -0
- package/dist/commands/saveWebScreen.test.d.ts.map +1 -0
- package/dist/commands/saveWebScreen.test.js +222 -0
- package/dist/commands/screen.interfaces.d.ts +16 -0
- package/dist/commands/screen.interfaces.d.ts.map +1 -0
- package/dist/commands/screen.interfaces.js +1 -0
- package/dist/commands/tabbable.interfaces.d.ts +29 -0
- package/dist/commands/tabbable.interfaces.d.ts.map +1 -0
- package/dist/commands/tabbable.interfaces.js +1 -0
- package/dist/helpers/afterScreenshot.d.ts +7 -0
- package/dist/helpers/afterScreenshot.d.ts.map +1 -0
- package/dist/helpers/afterScreenshot.interfaces.d.ts +46 -0
- package/dist/helpers/afterScreenshot.interfaces.d.ts.map +1 -0
- package/dist/helpers/afterScreenshot.interfaces.js +1 -0
- package/dist/helpers/afterScreenshot.js +55 -0
- package/dist/helpers/afterScreenshot.test.d.ts +2 -0
- package/dist/helpers/afterScreenshot.test.d.ts.map +1 -0
- package/dist/helpers/afterScreenshot.test.js +241 -0
- package/dist/helpers/beforeScreenshot.d.ts +6 -0
- package/dist/helpers/beforeScreenshot.d.ts.map +1 -0
- package/dist/helpers/beforeScreenshot.interfaces.d.ts +15 -0
- package/dist/helpers/beforeScreenshot.interfaces.d.ts.map +1 -0
- package/dist/helpers/beforeScreenshot.interfaces.js +1 -0
- package/dist/helpers/beforeScreenshot.js +79 -0
- package/dist/helpers/beforeScreenshot.test.d.ts +2 -0
- package/dist/helpers/beforeScreenshot.test.d.ts.map +1 -0
- package/dist/helpers/beforeScreenshot.test.js +261 -0
- package/dist/helpers/compare.interfaces.d.ts +16 -0
- package/dist/helpers/compare.interfaces.d.ts.map +1 -0
- package/dist/helpers/compare.interfaces.js +1 -0
- package/dist/helpers/constants.d.ts +108 -0
- package/dist/helpers/constants.d.ts.map +1 -0
- package/dist/helpers/constants.interfaces.d.ts +30 -0
- package/dist/helpers/constants.interfaces.d.ts.map +1 -0
- package/dist/helpers/constants.interfaces.js +11 -0
- package/dist/helpers/constants.js +436 -0
- package/dist/helpers/options.d.ts +64 -0
- package/dist/helpers/options.d.ts.map +1 -0
- package/dist/helpers/options.interfaces.d.ts +363 -0
- package/dist/helpers/options.interfaces.d.ts.map +1 -0
- package/dist/helpers/options.interfaces.js +1 -0
- package/dist/helpers/options.js +184 -0
- package/dist/helpers/options.test.d.ts +2 -0
- package/dist/helpers/options.test.d.ts.map +1 -0
- package/dist/helpers/options.test.js +428 -0
- package/dist/helpers/utils.d.ts +134 -0
- package/dist/helpers/utils.d.ts.map +1 -0
- package/dist/helpers/utils.interfaces.d.ts +254 -0
- package/dist/helpers/utils.interfaces.d.ts.map +1 -0
- package/dist/helpers/utils.interfaces.js +1 -0
- package/dist/helpers/utils.js +566 -0
- package/dist/helpers/utils.test.d.ts +2 -0
- package/dist/helpers/utils.test.d.ts.map +1 -0
- package/dist/helpers/utils.test.js +900 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/methods/compareReport.interfaces.d.ts +109 -0
- package/dist/methods/compareReport.interfaces.d.ts.map +1 -0
- package/dist/methods/compareReport.interfaces.js +1 -0
- package/dist/methods/createCompareReport.d.ts +7 -0
- package/dist/methods/createCompareReport.d.ts.map +1 -0
- package/dist/methods/createCompareReport.js +61 -0
- package/dist/methods/createCompareReport.test.d.ts +2 -0
- package/dist/methods/createCompareReport.test.d.ts.map +1 -0
- package/dist/methods/createCompareReport.test.js +236 -0
- package/dist/methods/elementPosition.d.ts +18 -0
- package/dist/methods/elementPosition.d.ts.map +1 -0
- package/dist/methods/elementPosition.interfaces.d.ts +14 -0
- package/dist/methods/elementPosition.interfaces.d.ts.map +1 -0
- package/dist/methods/elementPosition.interfaces.js +1 -0
- package/dist/methods/elementPosition.js +34 -0
- package/dist/methods/images.d.ts +69 -0
- package/dist/methods/images.d.ts.map +1 -0
- package/dist/methods/images.executeImageCompare.test.d.ts +2 -0
- package/dist/methods/images.executeImageCompare.test.d.ts.map +1 -0
- package/dist/methods/images.executeImageCompare.test.js +770 -0
- package/dist/methods/images.interfaces.d.ts +214 -0
- package/dist/methods/images.interfaces.d.ts.map +1 -0
- package/dist/methods/images.interfaces.js +1 -0
- package/dist/methods/images.js +428 -0
- package/dist/methods/images.test.d.ts +2 -0
- package/dist/methods/images.test.d.ts.map +1 -0
- package/dist/methods/images.test.js +1465 -0
- package/dist/methods/instanceData.d.ts +6 -0
- package/dist/methods/instanceData.d.ts.map +1 -0
- package/dist/methods/instanceData.interfaces.d.ts +57 -0
- package/dist/methods/instanceData.interfaces.d.ts.map +1 -0
- package/dist/methods/instanceData.interfaces.js +1 -0
- package/dist/methods/instanceData.js +42 -0
- package/dist/methods/instanceData.test.d.ts +2 -0
- package/dist/methods/instanceData.test.d.ts.map +1 -0
- package/dist/methods/instanceData.test.js +224 -0
- package/dist/methods/processDiffPixels.d.ts +59 -0
- package/dist/methods/processDiffPixels.d.ts.map +1 -0
- package/dist/methods/processDiffPixels.js +242 -0
- package/dist/methods/processDiffPixels.test.d.ts +2 -0
- package/dist/methods/processDiffPixels.test.d.ts.map +1 -0
- package/dist/methods/processDiffPixels.test.js +122 -0
- package/dist/methods/rectangles.d.ts +51 -0
- package/dist/methods/rectangles.d.ts.map +1 -0
- package/dist/methods/rectangles.interfaces.d.ts +146 -0
- package/dist/methods/rectangles.interfaces.d.ts.map +1 -0
- package/dist/methods/rectangles.interfaces.js +1 -0
- package/dist/methods/rectangles.js +266 -0
- package/dist/methods/rectangles.test.d.ts +2 -0
- package/dist/methods/rectangles.test.d.ts.map +1 -0
- package/dist/methods/rectangles.test.js +853 -0
- package/dist/methods/screenshots.d.ts +37 -0
- package/dist/methods/screenshots.d.ts.map +1 -0
- package/dist/methods/screenshots.interfaces.d.ts +203 -0
- package/dist/methods/screenshots.interfaces.d.ts.map +1 -0
- package/dist/methods/screenshots.interfaces.js +1 -0
- package/dist/methods/screenshots.js +394 -0
- package/dist/methods/screenshots.test.d.ts +2 -0
- package/dist/methods/screenshots.test.d.ts.map +1 -0
- package/dist/methods/screenshots.test.js +656 -0
- package/dist/methods/takeElementScreenshots.d.ts +3 -0
- package/dist/methods/takeElementScreenshots.d.ts.map +1 -0
- package/dist/methods/takeElementScreenshots.js +104 -0
- package/dist/methods/takeElementScreenshots.test.d.ts +2 -0
- package/dist/methods/takeElementScreenshots.test.d.ts.map +1 -0
- package/dist/methods/takeElementScreenshots.test.js +314 -0
- package/dist/methods/takeFullPageScreenshots.d.ts +3 -0
- package/dist/methods/takeFullPageScreenshots.d.ts.map +1 -0
- package/dist/methods/takeFullPageScreenshots.js +56 -0
- package/dist/methods/takeFullPageScreenshots.test.d.ts +2 -0
- package/dist/methods/takeFullPageScreenshots.test.d.ts.map +1 -0
- package/dist/methods/takeFullPageScreenshots.test.js +72 -0
- package/dist/methods/takeWebScreenshots.d.ts +3 -0
- package/dist/methods/takeWebScreenshots.d.ts.map +1 -0
- package/dist/methods/takeWebScreenshots.js +41 -0
- package/dist/methods/takeWebScreenshots.test.d.ts +2 -0
- package/dist/methods/takeWebScreenshots.test.d.ts.map +1 -0
- package/dist/methods/takeWebScreenshots.test.js +149 -0
- package/dist/mocks/image.d.ts +4 -0
- package/dist/mocks/image.d.ts.map +1 -0
- package/dist/mocks/image.js +3 -0
- package/dist/mocks/mocks.d.ts +745 -0
- package/dist/mocks/mocks.d.ts.map +1 -0
- package/dist/mocks/mocks.js +392 -0
- package/dist/resemble/compare.interfaces.d.ts +136 -0
- package/dist/resemble/compare.interfaces.d.ts.map +1 -0
- package/dist/resemble/compare.interfaces.js +1 -0
- package/dist/resemble/compareImages.d.ts +3 -0
- package/dist/resemble/compareImages.d.ts.map +1 -0
- package/dist/resemble/compareImages.js +21 -0
- package/dist/resemble/resemble.jimp.cjs +981 -0
- package/dist/resemble/resemble.jimp.d.cts +46 -0
- package/dist/resemble/resemble.jimp.d.cts.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import logger from '@wdio/logger';
|
|
2
|
+
import { takeBase64BiDiScreenshot, takeWebElementScreenshot } from './screenshots.js';
|
|
3
|
+
import { makeCroppedBase64Image } from './images.js';
|
|
4
|
+
import scrollElementIntoView from '../clientSideScripts/scrollElementIntoView.js';
|
|
5
|
+
import scrollToPosition from '../clientSideScripts/scrollToPosition.js';
|
|
6
|
+
import { getBase64ScreenshotSize, hasResizeDimensions, waitFor } from '../helpers/utils.js';
|
|
7
|
+
const log = logger('@wdio/visual-service:@wdio/image-comparison-core:takeElementScreenshot');
|
|
8
|
+
export async function takeElementScreenshot(browserInstance, options, shouldUseBidi = false) {
|
|
9
|
+
if (shouldUseBidi) {
|
|
10
|
+
return await takeBiDiElementScreenshot(browserInstance, options);
|
|
11
|
+
}
|
|
12
|
+
return await takeWebDriverElementScreenshot(browserInstance, options);
|
|
13
|
+
}
|
|
14
|
+
async function takeBiDiElementScreenshot(browserInstance, options) {
|
|
15
|
+
let base64Image;
|
|
16
|
+
const isWebDriverElementScreenshot = false;
|
|
17
|
+
// We also need to clip the image to the element size, taking into account the DPR
|
|
18
|
+
// and also clip it from the document, not the viewport
|
|
19
|
+
const rect = await browserInstance.getElementRect((await options.element).elementId);
|
|
20
|
+
const clip = { x: Math.floor(rect.x), y: Math.floor(rect.y), width: Math.floor(rect.width), height: Math.floor(rect.height) };
|
|
21
|
+
const takeBiDiElementScreenshot = (origin) => takeBase64BiDiScreenshot({ browserInstance, origin, clip });
|
|
22
|
+
try {
|
|
23
|
+
// By default we take the screenshot from the viewport
|
|
24
|
+
base64Image = await takeBiDiElementScreenshot('viewport');
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
// But when we get a zero dimension error (meaning the element might be bigger than the
|
|
28
|
+
// viewport or it might not be in the viewport), we need to take the screenshot from the document.
|
|
29
|
+
const isZeroDimensionError = typeof err?.message === 'string' && err.message.includes('WebDriver Bidi command "browsingContext.captureScreenshot" failed with error: unable to capture screen - Unable to capture screenshot with zero dimensions');
|
|
30
|
+
if (!isZeroDimensionError) {
|
|
31
|
+
throw err;
|
|
32
|
+
}
|
|
33
|
+
base64Image = await takeBiDiElementScreenshot('document');
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
base64Image,
|
|
37
|
+
isWebDriverElementScreenshot,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
async function takeWebDriverElementScreenshot(browserInstance, options) {
|
|
41
|
+
let base64Image;
|
|
42
|
+
let isWebDriverElementScreenshot = false;
|
|
43
|
+
// Scroll the element into top of the viewport and return the current scroll position
|
|
44
|
+
let currentPosition;
|
|
45
|
+
if (options.autoElementScroll) {
|
|
46
|
+
currentPosition = await browserInstance.execute(scrollElementIntoView, options.element, options.addressBarShadowPadding);
|
|
47
|
+
// We need to wait for the scroll to finish before taking the screenshot
|
|
48
|
+
await waitFor(100);
|
|
49
|
+
}
|
|
50
|
+
// Take the screenshot and determine the rectangles
|
|
51
|
+
const screenshotResult = await takeWebElementScreenshot({
|
|
52
|
+
addressBarShadowPadding: options.addressBarShadowPadding,
|
|
53
|
+
browserInstance,
|
|
54
|
+
devicePixelRatio: options.devicePixelRatio,
|
|
55
|
+
deviceRectangles: options.deviceRectangles,
|
|
56
|
+
element: options.element,
|
|
57
|
+
initialDevicePixelRatio: options.initialDevicePixelRatio,
|
|
58
|
+
isEmulated: options.isEmulated,
|
|
59
|
+
innerHeight: options.innerHeight,
|
|
60
|
+
isAndroid: options.isAndroid,
|
|
61
|
+
isAndroidChromeDriverScreenshot: options.isAndroidChromeDriverScreenshot,
|
|
62
|
+
isAndroidNativeWebScreenshot: options.isAndroidNativeWebScreenshot,
|
|
63
|
+
isIOS: options.isIOS,
|
|
64
|
+
isLandscape: options.isLandscape,
|
|
65
|
+
toolBarShadowPadding: options.toolBarShadowPadding,
|
|
66
|
+
// When the element needs to be resized, we need to take a screenshot of the whole page
|
|
67
|
+
// also when it's emulated
|
|
68
|
+
fallback: (hasResizeDimensions(options.resizeDimensions) || options.isEmulated) || false,
|
|
69
|
+
});
|
|
70
|
+
base64Image = screenshotResult.base64Image;
|
|
71
|
+
const { rectangles } = screenshotResult;
|
|
72
|
+
isWebDriverElementScreenshot = screenshotResult.isWebDriverElementScreenshot;
|
|
73
|
+
// When the screenshot has been taken and the element position has been determined,
|
|
74
|
+
// we can scroll back to the original position
|
|
75
|
+
// We don't need to wait for the scroll here because we don't take a screenshot after this
|
|
76
|
+
if (options.autoElementScroll && currentPosition) {
|
|
77
|
+
await browserInstance.execute(scrollToPosition, currentPosition);
|
|
78
|
+
}
|
|
79
|
+
// When the element has no height or width, we default to the viewport screen size
|
|
80
|
+
if (rectangles.width === 0 || rectangles.height === 0) {
|
|
81
|
+
const { height, width } = getBase64ScreenshotSize(base64Image);
|
|
82
|
+
rectangles.width = width;
|
|
83
|
+
rectangles.height = height;
|
|
84
|
+
rectangles.x = 0;
|
|
85
|
+
rectangles.y = 0;
|
|
86
|
+
log.error(`The element has no width or height. We defaulted to the viewport screen size of width: ${width} and height: ${height}.`);
|
|
87
|
+
}
|
|
88
|
+
// Make a cropped base64 image with resizeDimensions
|
|
89
|
+
base64Image = await makeCroppedBase64Image({
|
|
90
|
+
addIOSBezelCorners: false,
|
|
91
|
+
base64Image,
|
|
92
|
+
deviceName: options.deviceName,
|
|
93
|
+
devicePixelRatio: options.devicePixelRatio || NaN,
|
|
94
|
+
isWebDriverElementScreenshot,
|
|
95
|
+
isIOS: options.isIOS,
|
|
96
|
+
isLandscape: options.isLandscape,
|
|
97
|
+
rectangles,
|
|
98
|
+
resizeDimensions: options.resizeDimensions,
|
|
99
|
+
});
|
|
100
|
+
return {
|
|
101
|
+
base64Image,
|
|
102
|
+
isWebDriverElementScreenshot,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"takeElementScreenshots.test.d.ts","sourceRoot":"","sources":["../../src/methods/takeElementScreenshots.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
import { beforeEach, describe, it, expect, vi, afterEach } from 'vitest';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import logger from '@wdio/logger';
|
|
4
|
+
import { takeElementScreenshot } from './takeElementScreenshots.js';
|
|
5
|
+
import { takeBase64BiDiScreenshot, takeWebElementScreenshot } from './screenshots.js';
|
|
6
|
+
import { makeCroppedBase64Image } from './images.js';
|
|
7
|
+
import { getBase64ScreenshotSize, waitFor, hasResizeDimensions } from '../helpers/utils.js';
|
|
8
|
+
const log = logger('test');
|
|
9
|
+
vi.mock('./screenshots.js', () => ({
|
|
10
|
+
takeBase64BiDiScreenshot: vi.fn().mockResolvedValue('bidi-screenshot-data'),
|
|
11
|
+
takeWebElementScreenshot: vi.fn().mockResolvedValue({
|
|
12
|
+
base64Image: 'web-element-screenshot-data',
|
|
13
|
+
rectangles: { x: 0, y: 0, width: 100, height: 100 },
|
|
14
|
+
isWebDriverElementScreenshot: false
|
|
15
|
+
})
|
|
16
|
+
}));
|
|
17
|
+
vi.mock('./images.js', () => ({
|
|
18
|
+
makeCroppedBase64Image: vi.fn().mockResolvedValue('cropped-screenshot-data')
|
|
19
|
+
}));
|
|
20
|
+
vi.mock('../clientSideScripts/scrollElementIntoView.js', () => ({
|
|
21
|
+
default: vi.fn()
|
|
22
|
+
}));
|
|
23
|
+
vi.mock('../clientSideScripts/scrollToPosition.js', () => ({
|
|
24
|
+
default: vi.fn()
|
|
25
|
+
}));
|
|
26
|
+
vi.mock('../helpers/utils.js', () => ({
|
|
27
|
+
getBase64ScreenshotSize: vi.fn().mockReturnValue({ width: 100, height: 100 }),
|
|
28
|
+
waitFor: vi.fn().mockResolvedValue(undefined),
|
|
29
|
+
hasResizeDimensions: vi.fn().mockReturnValue(false)
|
|
30
|
+
}));
|
|
31
|
+
vi.mock('@wdio/logger', () => import(join(process.cwd(), '__mocks__', '@wdio/logger')));
|
|
32
|
+
describe('takeElementScreenshot', () => {
|
|
33
|
+
const takeBase64BiDiScreenshotSpy = vi.mocked(takeBase64BiDiScreenshot);
|
|
34
|
+
const takeWebElementScreenshotSpy = vi.mocked(takeWebElementScreenshot);
|
|
35
|
+
const makeCroppedBase64ImageSpy = vi.mocked(makeCroppedBase64Image);
|
|
36
|
+
const getBase64ScreenshotSizeSpy = vi.mocked(getBase64ScreenshotSize);
|
|
37
|
+
const waitForSpy = vi.mocked(waitFor);
|
|
38
|
+
const hasResizeDimensionsSpy = vi.mocked(hasResizeDimensions);
|
|
39
|
+
const executeMock = vi.fn().mockResolvedValue(undefined);
|
|
40
|
+
const getElementRectMock = vi.fn().mockResolvedValue({ x: 10, y: 20, width: 100, height: 200 });
|
|
41
|
+
const browserInstance = {
|
|
42
|
+
execute: executeMock,
|
|
43
|
+
getElementRect: getElementRectMock
|
|
44
|
+
};
|
|
45
|
+
const baseOptions = {
|
|
46
|
+
addressBarShadowPadding: 6,
|
|
47
|
+
autoElementScroll: false,
|
|
48
|
+
deviceName: 'desktop',
|
|
49
|
+
devicePixelRatio: 2,
|
|
50
|
+
deviceRectangles: {
|
|
51
|
+
bottomBar: { height: 0, width: 390, x: 0, y: 800 },
|
|
52
|
+
homeBar: { height: 34, width: 390, x: 0, y: 780 },
|
|
53
|
+
leftSidePadding: { height: 0, width: 0, x: 0, y: 0 },
|
|
54
|
+
rightSidePadding: { height: 0, width: 0, x: 0, y: 0 },
|
|
55
|
+
screenSize: { height: 844, width: 390 },
|
|
56
|
+
statusBar: { height: 47, width: 390, x: 0, y: 0 },
|
|
57
|
+
statusBarAndAddressBar: { height: 47, width: 390, x: 0, y: 0 },
|
|
58
|
+
viewport: { height: 733, width: 390, x: 0, y: 47 }
|
|
59
|
+
},
|
|
60
|
+
element: { elementId: 'test-element' },
|
|
61
|
+
isEmulated: false,
|
|
62
|
+
initialDevicePixelRatio: 2,
|
|
63
|
+
innerHeight: 900,
|
|
64
|
+
isAndroid: false,
|
|
65
|
+
isAndroidChromeDriverScreenshot: false,
|
|
66
|
+
isAndroidNativeWebScreenshot: false,
|
|
67
|
+
isIOS: false,
|
|
68
|
+
isLandscape: false,
|
|
69
|
+
isMobile: false,
|
|
70
|
+
resizeDimensions: { top: 0, right: 0, bottom: 0, left: 0 },
|
|
71
|
+
toolBarShadowPadding: 5
|
|
72
|
+
};
|
|
73
|
+
afterEach(() => {
|
|
74
|
+
vi.clearAllMocks();
|
|
75
|
+
});
|
|
76
|
+
describe('BiDi screenshots', () => {
|
|
77
|
+
it('should take BiDi screenshot from viewport when shouldUseBidi is true', async () => {
|
|
78
|
+
const result = await takeElementScreenshot(browserInstance, baseOptions, true);
|
|
79
|
+
expect(result).toEqual({
|
|
80
|
+
base64Image: 'bidi-screenshot-data',
|
|
81
|
+
isWebDriverElementScreenshot: false
|
|
82
|
+
});
|
|
83
|
+
expect(getElementRectMock).toHaveBeenCalledWith('test-element');
|
|
84
|
+
expect(takeBase64BiDiScreenshotSpy).toHaveBeenCalledWith({
|
|
85
|
+
browserInstance,
|
|
86
|
+
origin: 'viewport',
|
|
87
|
+
clip: { x: 10, y: 20, width: 100, height: 200 }
|
|
88
|
+
});
|
|
89
|
+
expect(takeWebElementScreenshotSpy).not.toHaveBeenCalled();
|
|
90
|
+
expect(makeCroppedBase64ImageSpy).not.toHaveBeenCalled();
|
|
91
|
+
});
|
|
92
|
+
it('should fallback to document screenshot when viewport fails with zero dimensions error', async () => {
|
|
93
|
+
takeBase64BiDiScreenshotSpy.mockRejectedValueOnce(new Error('WebDriver Bidi command "browsingContext.captureScreenshot" failed with error: unable to capture screen - Unable to capture screenshot with zero dimensions'));
|
|
94
|
+
const result = await takeElementScreenshot(browserInstance, baseOptions, true);
|
|
95
|
+
expect(result).toEqual({
|
|
96
|
+
base64Image: 'bidi-screenshot-data',
|
|
97
|
+
isWebDriverElementScreenshot: false
|
|
98
|
+
});
|
|
99
|
+
expect(takeBase64BiDiScreenshotSpy).toHaveBeenCalledTimes(2);
|
|
100
|
+
expect(takeBase64BiDiScreenshotSpy.mock.calls[0][0]).toEqual({
|
|
101
|
+
browserInstance,
|
|
102
|
+
origin: 'viewport',
|
|
103
|
+
clip: { x: 10, y: 20, width: 100, height: 200 }
|
|
104
|
+
});
|
|
105
|
+
expect(takeBase64BiDiScreenshotSpy.mock.calls[1][0]).toEqual({
|
|
106
|
+
browserInstance,
|
|
107
|
+
origin: 'document',
|
|
108
|
+
clip: { x: 10, y: 20, width: 100, height: 200 }
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
it('should throw error when BiDi screenshot fails with non-zero dimension error', async () => {
|
|
112
|
+
const error = new Error('Some other BiDi error');
|
|
113
|
+
takeBase64BiDiScreenshotSpy.mockRejectedValueOnce(error);
|
|
114
|
+
await expect(takeElementScreenshot(browserInstance, baseOptions, true)).rejects.toThrow(error);
|
|
115
|
+
expect(takeBase64BiDiScreenshotSpy).toHaveBeenCalledTimes(1);
|
|
116
|
+
expect(takeWebElementScreenshotSpy).not.toHaveBeenCalled();
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
describe('Legacy screenshots', () => {
|
|
120
|
+
let logErrorSpy;
|
|
121
|
+
beforeEach(() => {
|
|
122
|
+
logErrorSpy = vi.spyOn(log, 'error').mockImplementation(() => { });
|
|
123
|
+
});
|
|
124
|
+
afterEach(() => {
|
|
125
|
+
vi.clearAllMocks();
|
|
126
|
+
logErrorSpy.mockRestore();
|
|
127
|
+
});
|
|
128
|
+
it('should take legacy screenshot when shouldUseBidi is false', async () => {
|
|
129
|
+
const result = await takeElementScreenshot(browserInstance, baseOptions, false);
|
|
130
|
+
expect(result).toEqual({
|
|
131
|
+
base64Image: 'cropped-screenshot-data',
|
|
132
|
+
isWebDriverElementScreenshot: false
|
|
133
|
+
});
|
|
134
|
+
expect(takeWebElementScreenshotSpy).toHaveBeenCalledWith({
|
|
135
|
+
addressBarShadowPadding: 6,
|
|
136
|
+
browserInstance,
|
|
137
|
+
devicePixelRatio: 2,
|
|
138
|
+
deviceRectangles: baseOptions.deviceRectangles,
|
|
139
|
+
element: baseOptions.element,
|
|
140
|
+
initialDevicePixelRatio: 2,
|
|
141
|
+
isEmulated: false,
|
|
142
|
+
innerHeight: 900,
|
|
143
|
+
isAndroid: false,
|
|
144
|
+
isAndroidChromeDriverScreenshot: false,
|
|
145
|
+
isAndroidNativeWebScreenshot: false,
|
|
146
|
+
isIOS: false,
|
|
147
|
+
isLandscape: false,
|
|
148
|
+
toolBarShadowPadding: 5,
|
|
149
|
+
fallback: false
|
|
150
|
+
});
|
|
151
|
+
expect(makeCroppedBase64ImageSpy).toHaveBeenCalledWith({
|
|
152
|
+
addIOSBezelCorners: false,
|
|
153
|
+
base64Image: 'web-element-screenshot-data',
|
|
154
|
+
deviceName: 'desktop',
|
|
155
|
+
devicePixelRatio: 2,
|
|
156
|
+
isWebDriverElementScreenshot: false,
|
|
157
|
+
isIOS: false,
|
|
158
|
+
isLandscape: false,
|
|
159
|
+
rectangles: { x: 0, y: 0, width: 100, height: 100 },
|
|
160
|
+
resizeDimensions: { top: 0, right: 0, bottom: 0, left: 0 }
|
|
161
|
+
});
|
|
162
|
+
expect(takeBase64BiDiScreenshotSpy).not.toHaveBeenCalled();
|
|
163
|
+
});
|
|
164
|
+
it('should handle auto scroll when enabled', async () => {
|
|
165
|
+
const optionsWithScroll = { ...baseOptions, autoElementScroll: true };
|
|
166
|
+
executeMock.mockResolvedValueOnce(100); // scroll position
|
|
167
|
+
const result = await takeElementScreenshot(browserInstance, optionsWithScroll, false);
|
|
168
|
+
expect(result).toEqual({
|
|
169
|
+
base64Image: 'cropped-screenshot-data',
|
|
170
|
+
isWebDriverElementScreenshot: false
|
|
171
|
+
});
|
|
172
|
+
expect(executeMock).toHaveBeenCalledTimes(2);
|
|
173
|
+
// First call for scrolling element into view
|
|
174
|
+
expect(executeMock.mock.calls[0]).toMatchSnapshot();
|
|
175
|
+
// Second call for scrolling back to original position
|
|
176
|
+
expect(executeMock.mock.calls[1]).toMatchSnapshot();
|
|
177
|
+
expect(waitForSpy).toHaveBeenCalledWith(100);
|
|
178
|
+
});
|
|
179
|
+
it('should not scroll back when autoElementScroll is enabled but no current position', async () => {
|
|
180
|
+
const optionsWithScroll = { ...baseOptions, autoElementScroll: true };
|
|
181
|
+
executeMock.mockResolvedValueOnce(undefined); // no scroll position returned
|
|
182
|
+
const result = await takeElementScreenshot(browserInstance, optionsWithScroll, false);
|
|
183
|
+
expect(result).toMatchSnapshot();
|
|
184
|
+
expect(executeMock).toHaveBeenCalledTimes(1); // Only the scroll into view call
|
|
185
|
+
expect(waitForSpy).toHaveBeenCalledWith(100);
|
|
186
|
+
});
|
|
187
|
+
it('should enable fallback when resizeDimensions is provided', async () => {
|
|
188
|
+
const optionsWithResize = {
|
|
189
|
+
...baseOptions,
|
|
190
|
+
resizeDimensions: { top: 10, right: 10, bottom: 10, left: 10 }
|
|
191
|
+
};
|
|
192
|
+
hasResizeDimensionsSpy.mockReturnValueOnce(true);
|
|
193
|
+
const result = await takeElementScreenshot(browserInstance, optionsWithResize, false);
|
|
194
|
+
expect(result).toMatchSnapshot();
|
|
195
|
+
expect(hasResizeDimensionsSpy).toHaveBeenCalledWith(optionsWithResize.resizeDimensions);
|
|
196
|
+
expect(takeWebElementScreenshotSpy).toHaveBeenCalledWith(expect.objectContaining({
|
|
197
|
+
fallback: true
|
|
198
|
+
}));
|
|
199
|
+
});
|
|
200
|
+
it('should enable fallback when device is emulated', async () => {
|
|
201
|
+
const optionsEmulated = { ...baseOptions, isEmulated: true };
|
|
202
|
+
const result = await takeElementScreenshot(browserInstance, optionsEmulated, false);
|
|
203
|
+
expect(result).toMatchSnapshot();
|
|
204
|
+
expect(takeWebElementScreenshotSpy).toHaveBeenCalledWith(expect.objectContaining({
|
|
205
|
+
fallback: true
|
|
206
|
+
}));
|
|
207
|
+
});
|
|
208
|
+
it('should disable fallback when no resizeDimensions and not emulated', async () => {
|
|
209
|
+
const optionsNoResize = {
|
|
210
|
+
...baseOptions,
|
|
211
|
+
resizeDimensions: undefined,
|
|
212
|
+
isEmulated: false
|
|
213
|
+
};
|
|
214
|
+
hasResizeDimensionsSpy.mockReturnValueOnce(false);
|
|
215
|
+
const result = await takeElementScreenshot(browserInstance, optionsNoResize, false);
|
|
216
|
+
expect(result).toMatchSnapshot();
|
|
217
|
+
expect(hasResizeDimensionsSpy).toHaveBeenCalledWith(undefined);
|
|
218
|
+
expect(takeWebElementScreenshotSpy).toHaveBeenCalledWith(expect.objectContaining({
|
|
219
|
+
fallback: false
|
|
220
|
+
}));
|
|
221
|
+
});
|
|
222
|
+
it('should handle zero dimensions by falling back to viewport size', async () => {
|
|
223
|
+
takeWebElementScreenshotSpy.mockResolvedValueOnce({
|
|
224
|
+
base64Image: 'web-element-screenshot-data',
|
|
225
|
+
rectangles: { x: 0, y: 0, width: 0, height: 0 },
|
|
226
|
+
isWebDriverElementScreenshot: false
|
|
227
|
+
});
|
|
228
|
+
const result = await takeElementScreenshot(browserInstance, baseOptions, false);
|
|
229
|
+
expect(result).toMatchSnapshot();
|
|
230
|
+
expect(getBase64ScreenshotSizeSpy).toHaveBeenCalledWith('web-element-screenshot-data');
|
|
231
|
+
expect(logErrorSpy.mock.calls).toMatchSnapshot();
|
|
232
|
+
expect(makeCroppedBase64ImageSpy).toHaveBeenCalledWith(expect.objectContaining({
|
|
233
|
+
rectangles: { x: 0, y: 0, width: 100, height: 100 }
|
|
234
|
+
}));
|
|
235
|
+
});
|
|
236
|
+
it('should handle zero width only', async () => {
|
|
237
|
+
takeWebElementScreenshotSpy.mockResolvedValueOnce({
|
|
238
|
+
base64Image: 'web-element-screenshot-data',
|
|
239
|
+
rectangles: { x: 50, y: 100, width: 0, height: 150 },
|
|
240
|
+
isWebDriverElementScreenshot: true
|
|
241
|
+
});
|
|
242
|
+
const result = await takeElementScreenshot(browserInstance, baseOptions, false);
|
|
243
|
+
expect(result).toMatchSnapshot();
|
|
244
|
+
expect(getBase64ScreenshotSizeSpy).toHaveBeenCalledWith('web-element-screenshot-data');
|
|
245
|
+
expect(logErrorSpy.mock.calls).toMatchSnapshot();
|
|
246
|
+
});
|
|
247
|
+
it('should handle zero height only', async () => {
|
|
248
|
+
takeWebElementScreenshotSpy.mockResolvedValueOnce({
|
|
249
|
+
base64Image: 'web-element-screenshot-data',
|
|
250
|
+
rectangles: { x: 50, y: 100, width: 150, height: 0 },
|
|
251
|
+
isWebDriverElementScreenshot: true
|
|
252
|
+
});
|
|
253
|
+
const result = await takeElementScreenshot(browserInstance, baseOptions, false);
|
|
254
|
+
expect(result).toMatchSnapshot();
|
|
255
|
+
expect(getBase64ScreenshotSizeSpy).toHaveBeenCalledWith('web-element-screenshot-data');
|
|
256
|
+
expect(logErrorSpy.mock.calls).toMatchSnapshot();
|
|
257
|
+
});
|
|
258
|
+
it('should pass correct WebDriver element screenshot flag', async () => {
|
|
259
|
+
takeWebElementScreenshotSpy.mockResolvedValueOnce({
|
|
260
|
+
base64Image: 'web-element-screenshot-data',
|
|
261
|
+
rectangles: { x: 0, y: 0, width: 100, height: 100 },
|
|
262
|
+
isWebDriverElementScreenshot: true
|
|
263
|
+
});
|
|
264
|
+
const result = await takeElementScreenshot(browserInstance, baseOptions, false);
|
|
265
|
+
expect(result).toEqual({
|
|
266
|
+
base64Image: 'cropped-screenshot-data',
|
|
267
|
+
isWebDriverElementScreenshot: true
|
|
268
|
+
});
|
|
269
|
+
expect(makeCroppedBase64ImageSpy).toHaveBeenCalledWith(expect.objectContaining({
|
|
270
|
+
isWebDriverElementScreenshot: true
|
|
271
|
+
}));
|
|
272
|
+
});
|
|
273
|
+
});
|
|
274
|
+
describe('Edge cases', () => {
|
|
275
|
+
it('should handle devicePixelRatio values and fallback to NaN when falsy', async () => {
|
|
276
|
+
const optionsWithValidDPR = { ...baseOptions, devicePixelRatio: 1 };
|
|
277
|
+
const result1 = await takeElementScreenshot(browserInstance, optionsWithValidDPR, false);
|
|
278
|
+
expect(result1).toMatchSnapshot();
|
|
279
|
+
expect(takeWebElementScreenshotSpy).toHaveBeenCalledWith(expect.objectContaining({
|
|
280
|
+
devicePixelRatio: 1
|
|
281
|
+
}));
|
|
282
|
+
expect(makeCroppedBase64ImageSpy).toHaveBeenCalledWith(expect.objectContaining({
|
|
283
|
+
devicePixelRatio: 1
|
|
284
|
+
}));
|
|
285
|
+
vi.clearAllMocks();
|
|
286
|
+
const optionsWithZeroDPR = { ...baseOptions, devicePixelRatio: 0 };
|
|
287
|
+
const result2 = await takeElementScreenshot(browserInstance, optionsWithZeroDPR, false);
|
|
288
|
+
expect(result2).toMatchSnapshot();
|
|
289
|
+
expect(takeWebElementScreenshotSpy).toHaveBeenCalledWith(expect.objectContaining({
|
|
290
|
+
devicePixelRatio: 0
|
|
291
|
+
}));
|
|
292
|
+
expect(makeCroppedBase64ImageSpy).toHaveBeenCalledWith(expect.objectContaining({
|
|
293
|
+
devicePixelRatio: NaN
|
|
294
|
+
}));
|
|
295
|
+
});
|
|
296
|
+
it('should handle undefined innerHeight', async () => {
|
|
297
|
+
const optionsWithUndefinedHeight = { ...baseOptions, innerHeight: undefined };
|
|
298
|
+
const result = await takeElementScreenshot(browserInstance, optionsWithUndefinedHeight, false);
|
|
299
|
+
expect(result).toMatchSnapshot();
|
|
300
|
+
expect(takeWebElementScreenshotSpy).toHaveBeenCalledWith(expect.objectContaining({
|
|
301
|
+
innerHeight: undefined
|
|
302
|
+
}));
|
|
303
|
+
});
|
|
304
|
+
it('should default shouldUseBidi to false when not provided', async () => {
|
|
305
|
+
const result = await takeElementScreenshot(browserInstance, baseOptions);
|
|
306
|
+
expect(result).toEqual({
|
|
307
|
+
base64Image: 'cropped-screenshot-data',
|
|
308
|
+
isWebDriverElementScreenshot: false
|
|
309
|
+
});
|
|
310
|
+
expect(takeBase64BiDiScreenshotSpy).not.toHaveBeenCalled();
|
|
311
|
+
expect(takeWebElementScreenshotSpy).toHaveBeenCalled();
|
|
312
|
+
});
|
|
313
|
+
});
|
|
314
|
+
});
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { FullPageScreenshotsData, FullPageScreenshotDataOptions } from './screenshots.interfaces.js';
|
|
2
|
+
export declare function takeFullPageScreenshots(browserInstance: WebdriverIO.Browser, options: FullPageScreenshotDataOptions, shouldUseBidi?: boolean): Promise<FullPageScreenshotsData>;
|
|
3
|
+
//# sourceMappingURL=takeFullPageScreenshots.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"takeFullPageScreenshots.d.ts","sourceRoot":"","sources":["../../src/methods/takeFullPageScreenshots.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,6BAA6B,EAAE,MAAM,6BAA6B,CAAA;AAQzG,wBAAsB,uBAAuB,CACzC,eAAe,EAAE,WAAW,CAAC,OAAO,EACpC,OAAO,EAAE,6BAA6B,EACtC,aAAa,GAAE,OAAe,GAC/B,OAAO,CAAC,uBAAuB,CAAC,CA6BlC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { getMobileFullPageNativeWebScreenshotsData, getAndroidChromeDriverFullPageScreenshotsData, getDesktopFullPageScreenshotsData, takeBase64BiDiScreenshot } from './screenshots.js';
|
|
2
|
+
export async function takeFullPageScreenshots(browserInstance, options, shouldUseBidi = false) {
|
|
3
|
+
if (shouldUseBidi) {
|
|
4
|
+
const screenshot = await takeBase64BiDiScreenshot({ browserInstance, origin: 'document' });
|
|
5
|
+
return {
|
|
6
|
+
fullPageHeight: -1,
|
|
7
|
+
fullPageWidth: -1,
|
|
8
|
+
data: [{
|
|
9
|
+
canvasWidth: 0,
|
|
10
|
+
canvasYPosition: 0,
|
|
11
|
+
imageHeight: 0,
|
|
12
|
+
imageWidth: 0,
|
|
13
|
+
imageXPosition: 0,
|
|
14
|
+
imageYPosition: 0,
|
|
15
|
+
screenshot,
|
|
16
|
+
}]
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
if (isAndroidNativeWeb(options) || options.isIOS) {
|
|
20
|
+
return getMobileFullPageNativeWebScreenshotsData(browserInstance, createMobileOptions(options));
|
|
21
|
+
}
|
|
22
|
+
if (isAndroidChromeDriver(options)) {
|
|
23
|
+
return getAndroidChromeDriverFullPageScreenshotsData(browserInstance, createDesktopOptions(options));
|
|
24
|
+
}
|
|
25
|
+
// Default to desktop
|
|
26
|
+
return getDesktopFullPageScreenshotsData(browserInstance, createDesktopOptions(options));
|
|
27
|
+
}
|
|
28
|
+
function isAndroidNativeWeb(options) {
|
|
29
|
+
return options.isAndroid && options.isAndroidNativeWebScreenshot;
|
|
30
|
+
}
|
|
31
|
+
function isAndroidChromeDriver(options) {
|
|
32
|
+
return options.isAndroid && options.isAndroidChromeDriverScreenshot;
|
|
33
|
+
}
|
|
34
|
+
function createMobileOptions(options) {
|
|
35
|
+
return {
|
|
36
|
+
addressBarShadowPadding: options.addressBarShadowPadding,
|
|
37
|
+
devicePixelRatio: options.devicePixelRatio,
|
|
38
|
+
deviceRectangles: options.deviceRectangles,
|
|
39
|
+
fullPageScrollTimeout: options.fullPageScrollTimeout,
|
|
40
|
+
hideAfterFirstScroll: options.hideAfterFirstScroll,
|
|
41
|
+
innerHeight: options.innerHeight,
|
|
42
|
+
isAndroid: options.isAndroid,
|
|
43
|
+
isIOS: options.isIOS,
|
|
44
|
+
isLandscape: options.isLandscape,
|
|
45
|
+
screenWidth: options.screenWidth,
|
|
46
|
+
toolBarShadowPadding: options.toolBarShadowPadding,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function createDesktopOptions(options) {
|
|
50
|
+
return {
|
|
51
|
+
devicePixelRatio: options.devicePixelRatio,
|
|
52
|
+
fullPageScrollTimeout: options.fullPageScrollTimeout,
|
|
53
|
+
hideAfterFirstScroll: options.hideAfterFirstScroll,
|
|
54
|
+
innerHeight: options.innerHeight,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"takeFullPageScreenshots.test.d.ts","sourceRoot":"","sources":["../../src/methods/takeFullPageScreenshots.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
+
import { takeFullPageScreenshots } from './takeFullPageScreenshots.js';
|
|
3
|
+
vi.mock('./screenshots.js', () => ({
|
|
4
|
+
getMobileFullPageNativeWebScreenshotsData: vi.fn().mockResolvedValue({ data: ['mobile'] }),
|
|
5
|
+
getAndroidChromeDriverFullPageScreenshotsData: vi.fn().mockResolvedValue({ data: ['chromedriver'] }),
|
|
6
|
+
getDesktopFullPageScreenshotsData: vi.fn().mockResolvedValue({ data: ['desktop'] }),
|
|
7
|
+
takeBase64BiDiScreenshot: vi.fn().mockResolvedValue('bidi-screenshot')
|
|
8
|
+
}));
|
|
9
|
+
vi.mock('../helpers/utils.js', () => ({
|
|
10
|
+
canUseBidiScreenshot: vi.fn()
|
|
11
|
+
}));
|
|
12
|
+
describe('takeFullPageScreenshots', () => {
|
|
13
|
+
const mockBrowser = {};
|
|
14
|
+
const createOptions = (overrides = {}) => ({
|
|
15
|
+
addressBarShadowPadding: 0,
|
|
16
|
+
devicePixelRatio: 1,
|
|
17
|
+
deviceRectangles: {},
|
|
18
|
+
fullPageScrollTimeout: 1000,
|
|
19
|
+
hideAfterFirstScroll: [],
|
|
20
|
+
innerHeight: 800,
|
|
21
|
+
isAndroid: false,
|
|
22
|
+
isAndroidNativeWebScreenshot: false,
|
|
23
|
+
isAndroidChromeDriverScreenshot: false,
|
|
24
|
+
isIOS: false,
|
|
25
|
+
isLandscape: false,
|
|
26
|
+
screenHeight: 1024,
|
|
27
|
+
screenWidth: 768,
|
|
28
|
+
toolBarShadowPadding: 0,
|
|
29
|
+
...overrides
|
|
30
|
+
});
|
|
31
|
+
beforeEach(() => {
|
|
32
|
+
vi.clearAllMocks();
|
|
33
|
+
});
|
|
34
|
+
it('should use BiDi when shouldUseBidi is true and browser supports it', async () => {
|
|
35
|
+
const { canUseBidiScreenshot } = await import('../helpers/utils.js');
|
|
36
|
+
vi.mocked(canUseBidiScreenshot).mockReturnValue(true);
|
|
37
|
+
const options = createOptions();
|
|
38
|
+
const result = await takeFullPageScreenshots(mockBrowser, options, true);
|
|
39
|
+
expect(result.data[0].screenshot).toBe('bidi-screenshot');
|
|
40
|
+
});
|
|
41
|
+
it('should route to mobile native web for Android native web screenshots', async () => {
|
|
42
|
+
const { getMobileFullPageNativeWebScreenshotsData } = await import('./screenshots.js');
|
|
43
|
+
const options = createOptions({
|
|
44
|
+
isAndroid: true,
|
|
45
|
+
isAndroidNativeWebScreenshot: true
|
|
46
|
+
});
|
|
47
|
+
const result = await takeFullPageScreenshots(mockBrowser, options, false);
|
|
48
|
+
expect(getMobileFullPageNativeWebScreenshotsData).toHaveBeenCalledWith(mockBrowser, expect.any(Object));
|
|
49
|
+
expect(result.data).toEqual(['mobile']);
|
|
50
|
+
});
|
|
51
|
+
it('should route to mobile native web for iOS devices', async () => {
|
|
52
|
+
const { getMobileFullPageNativeWebScreenshotsData } = await import('./screenshots.js');
|
|
53
|
+
const options = createOptions({ isIOS: true });
|
|
54
|
+
await takeFullPageScreenshots(mockBrowser, options, false);
|
|
55
|
+
expect(getMobileFullPageNativeWebScreenshotsData).toHaveBeenCalledWith(mockBrowser, expect.any(Object));
|
|
56
|
+
});
|
|
57
|
+
it('should route to Android ChromeDriver for Android ChromeDriver screenshots', async () => {
|
|
58
|
+
const { getAndroidChromeDriverFullPageScreenshotsData } = await import('./screenshots.js');
|
|
59
|
+
const options = createOptions({
|
|
60
|
+
isAndroid: true,
|
|
61
|
+
isAndroidChromeDriverScreenshot: true
|
|
62
|
+
});
|
|
63
|
+
await takeFullPageScreenshots(mockBrowser, options, false);
|
|
64
|
+
expect(getAndroidChromeDriverFullPageScreenshotsData).toHaveBeenCalledWith(mockBrowser, expect.any(Object));
|
|
65
|
+
});
|
|
66
|
+
it('should default to desktop for other cases', async () => {
|
|
67
|
+
const { getDesktopFullPageScreenshotsData } = await import('./screenshots.js');
|
|
68
|
+
const options = createOptions();
|
|
69
|
+
await takeFullPageScreenshots(mockBrowser, options, false);
|
|
70
|
+
expect(getDesktopFullPageScreenshotsData).toHaveBeenCalledWith(mockBrowser, expect.any(Object));
|
|
71
|
+
});
|
|
72
|
+
});
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { WebScreenshotDataOptions, WebScreenshotData } from './screenshots.interfaces.js';
|
|
2
|
+
export declare function takeWebScreenshot(browserInstance: WebdriverIO.Browser, options: WebScreenshotDataOptions, shouldUseBidi?: boolean): Promise<WebScreenshotData>;
|
|
3
|
+
//# sourceMappingURL=takeWebScreenshots.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"takeWebScreenshots.d.ts","sourceRoot":"","sources":["../../src/methods/takeWebScreenshots.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAA;AAG9F,wBAAsB,iBAAiB,CACnC,eAAe,EAAE,WAAW,CAAC,OAAO,EACpC,OAAO,EAAE,wBAAwB,EACjC,aAAa,GAAE,OAAe,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CAwC5B"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { takeBase64BiDiScreenshot, takeBase64Screenshot } from './screenshots.js';
|
|
2
|
+
import { makeCroppedBase64Image } from './images.js';
|
|
3
|
+
import { determineScreenRectangles } from './rectangles.js';
|
|
4
|
+
export async function takeWebScreenshot(browserInstance, options, shouldUseBidi = false) {
|
|
5
|
+
let base64Image;
|
|
6
|
+
if (shouldUseBidi) {
|
|
7
|
+
// Take the screenshot with the BiDi method
|
|
8
|
+
base64Image = await takeBase64BiDiScreenshot({ browserInstance });
|
|
9
|
+
}
|
|
10
|
+
else {
|
|
11
|
+
// Take the screenshot with the regular method
|
|
12
|
+
base64Image = await takeBase64Screenshot(browserInstance);
|
|
13
|
+
// Determine the rectangles
|
|
14
|
+
const screenRectangleOptions = {
|
|
15
|
+
devicePixelRatio: options.devicePixelRatio || NaN,
|
|
16
|
+
enableLegacyScreenshotMethod: options.enableLegacyScreenshotMethod,
|
|
17
|
+
innerHeight: options.innerHeight || NaN,
|
|
18
|
+
innerWidth: options.innerWidth || NaN,
|
|
19
|
+
isAndroidChromeDriverScreenshot: options.isAndroidChromeDriverScreenshot,
|
|
20
|
+
isAndroidNativeWebScreenshot: options.isAndroidNativeWebScreenshot,
|
|
21
|
+
isEmulated: options.isEmulated || false,
|
|
22
|
+
initialDevicePixelRatio: options.initialDevicePixelRatio || NaN,
|
|
23
|
+
isIOS: options.isIOS,
|
|
24
|
+
isLandscape: options.isLandscape,
|
|
25
|
+
};
|
|
26
|
+
const rectangles = determineScreenRectangles(base64Image, screenRectangleOptions);
|
|
27
|
+
// Make a cropped base64 image
|
|
28
|
+
base64Image = await makeCroppedBase64Image({
|
|
29
|
+
addIOSBezelCorners: options.addIOSBezelCorners,
|
|
30
|
+
base64Image,
|
|
31
|
+
deviceName: options.deviceName,
|
|
32
|
+
devicePixelRatio: options.devicePixelRatio || NaN,
|
|
33
|
+
isIOS: options.isIOS,
|
|
34
|
+
isLandscape: options.isLandscape,
|
|
35
|
+
rectangles,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
base64Image,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"takeWebScreenshots.test.d.ts","sourceRoot":"","sources":["../../src/methods/takeWebScreenshots.test.ts"],"names":[],"mappings":""}
|