├── .changeset ├── README.md └── config.json ├── .editorconfig ├── .gitattributes ├── .github ├── ISSUE_TEMPLATE │ ├── --bug-report.md │ ├── --documentation.md │ ├── --feature-request.md │ └── --question.md ├── assets │ └── powered-by-saucelabs.png ├── dependabot.yml ├── stale.yml └── workflows │ ├── alpha.release.yml │ ├── deploy-visual-reporter.yml │ ├── expense.yml │ ├── release.yml │ ├── tests.yml │ └── update.yml ├── .gitignore ├── .husky ├── .gitignore ├── pre-commit └── pre-push ├── .npmignore ├── .nvmrc ├── .vscode └── settings.json ├── LICENSE ├── README.md ├── __mocks__ └── @wdio │ └── logger.ts ├── eng.traineddata ├── eslint.config.cjs ├── package.json ├── packages ├── ocr-service │ ├── .npmignore │ ├── CHANGELOG.md │ ├── LICENSE │ ├── README.md │ ├── assets │ │ └── target.png │ ├── package.json │ ├── src │ │ ├── cli.ts │ │ ├── commands │ │ │ ├── ocrClickOnText.ts │ │ │ ├── ocrGetElementPositionByText.ts │ │ │ ├── ocrGetText.ts │ │ │ ├── ocrSetValue.ts │ │ │ └── ocrWaitForTextDisplayed.ts │ │ ├── index.ts │ │ ├── service.ts │ │ ├── types.ts │ │ └── utils │ │ │ ├── constants.ts │ │ │ ├── fuzzySearch.ts │ │ │ ├── getData.ts │ │ │ ├── getTextPositions.ts │ │ │ ├── imageProcessing.ts │ │ │ ├── index.ts │ │ │ ├── sendKeys.ts │ │ │ └── tesseract.ts │ ├── tests │ │ ├── __snapshots__ │ │ │ └── ocrGetText.test.ts.snap │ │ ├── commands │ │ │ ├── __snapshots__ │ │ │ │ ├── ocrGetText.test.ts.snap │ │ │ │ └── tesseract.test.ts.snap │ │ │ ├── ocrClickOnText.test.ts │ │ │ ├── ocrGetText.test.ts │ │ │ ├── ocrKeys.test.ts │ │ │ ├── ocrSetValue.test.ts │ │ │ ├── ocrWaitForTextDisplayed.test.ts │ │ │ ├── orcGetElementPositionByText.test.ts │ │ │ └── tesseract.test.ts │ │ ├── service.test.ts │ │ └── utils │ │ │ ├── __snapshots__ │ │ │ ├── ocrGetData.test.ts.snap │ │ │ └── ocrGetTextPositions.test.ts.snap │ │ │ ├── fuzzySearch.test.ts │ │ │ ├── imageProcessing.test.ts │ │ │ ├── index.test.ts │ │ │ ├── ocrGetData.test.ts │ │ │ └── ocrGetTextPositions.test.ts │ └── tsconfig.json ├── visual-reporter │ ├── .eslintrc.cjs │ ├── .gitignore │ ├── .npmignore │ ├── CHANGELOG.md │ ├── README.md │ ├── app │ │ ├── components │ │ │ ├── BrowserIcon.module.css │ │ │ ├── BrowserIcon.tsx │ │ │ ├── Canvas.module.css │ │ │ ├── Canvas.tsx │ │ │ ├── Description.module.css │ │ │ ├── Description.tsx │ │ │ ├── Header.module.css │ │ │ ├── Header.tsx │ │ │ ├── LoadingContainer.module.css │ │ │ ├── LoadingContainer.tsx │ │ │ ├── MethodItem.module.css │ │ │ ├── MethodItem.tsx │ │ │ ├── Overlay.module.css │ │ │ ├── Overlay.tsx │ │ │ ├── OverlayHeader.module.css │ │ │ ├── OverlayHeader.tsx │ │ │ ├── PlatformIcon.tsx │ │ │ ├── SelectCustomMultiValueContainer.module.css │ │ │ ├── SelectCustomMultiValueContainer.tsx │ │ │ ├── SelectCustomPlaceholder.tsx │ │ │ ├── SelectHeader.module.css │ │ │ ├── SelectHeader.tsx │ │ │ ├── Test.module.css │ │ │ └── Test.tsx │ │ ├── entry.client.tsx │ │ ├── entry.server.tsx │ │ ├── hooks │ │ │ ├── filterSnapshotData.ts │ │ │ ├── getSnapshotData.ts │ │ │ ├── useCanvasDrawing.ts │ │ │ ├── useChangeNavigation.ts │ │ │ ├── useImageLoader.ts │ │ │ └── useTransform.ts │ │ ├── images │ │ │ └── logo-webdriver-io.png │ │ ├── root.tsx │ │ ├── routes │ │ │ └── _index.tsx │ │ ├── styles │ │ │ ├── globals.css │ │ │ └── index.module.css │ │ ├── tailwind.css │ │ ├── types │ │ │ └── index.ts │ │ └── utils │ │ │ ├── boundingBoxUtils.ts │ │ │ └── sortSnapshotData.ts │ ├── demo │ │ ├── actual │ │ │ ├── android_googleapi_emulator │ │ │ │ ├── fullPage-EmulatorAndroidGoogleAPIPortraitChromeDriver13.0-384x640-VHTMLR-THUMBNAIL.png │ │ │ │ ├── fullPage-EmulatorAndroidGoogleAPIPortraitChromeDriver13.0-384x640.png │ │ │ │ ├── fullPage-EmulatorAndroidGoogleAPIPortraitNativeWebScreenshot14.0-384x640-VHTMLR-THUMBNAIL.png │ │ │ │ ├── fullPage-EmulatorAndroidGoogleAPIPortraitNativeWebScreenshot14.0-384x640.png │ │ │ │ ├── screenshot-EmulatorAndroidGoogleAPIPortraitChromeDriver13.0-384x640-VHTMLR-THUMBNAIL.png │ │ │ │ ├── screenshot-EmulatorAndroidGoogleAPIPortraitChromeDriver13.0-384x640.png │ │ │ │ ├── screenshot-EmulatorAndroidGoogleAPIPortraitChromeDriver14.0-384x640-VHTMLR-THUMBNAIL.png │ │ │ │ ├── screenshot-EmulatorAndroidGoogleAPIPortraitChromeDriver14.0-384x640.png │ │ │ │ ├── wdioLogo-EmulatorAndroidGoogleAPIPortraitChromeDriver13.0-384x640-VHTMLR-THUMBNAIL.png │ │ │ │ ├── wdioLogo-EmulatorAndroidGoogleAPIPortraitChromeDriver13.0-384x640.png │ │ │ │ ├── wdioLogo-EmulatorAndroidGoogleAPIPortraitChromeDriver14.0-384x640-VHTMLR-THUMBNAIL.png │ │ │ │ ├── wdioLogo-EmulatorAndroidGoogleAPIPortraitChromeDriver14.0-384x640.png │ │ │ │ ├── wdioLogo-EmulatorAndroidGoogleAPIPortraitNativeWebScreenshot14.0-384x640-VHTMLR-THUMBNAIL.png │ │ │ │ └── wdioLogo-EmulatorAndroidGoogleAPIPortraitNativeWebScreenshot14.0-384x640.png │ │ │ ├── desktop_chrome │ │ │ │ ├── fullPage-chrome-latest-1366x768.png │ │ │ │ ├── viewportScreenshot-chrome-latest-1-1366x768.png │ │ │ │ ├── viewportScreenshot-chrome-latest-1366x768.png │ │ │ │ ├── wdioLogo-chrome-latest-1-1366x768.png │ │ │ │ └── wdioLogo-chrome-latest-1366x768.png │ │ │ ├── desktop_firefox │ │ │ │ ├── tabbable-Firefox_latest-1366x768.png │ │ │ │ ├── viewportScreenshot-Firefox_latest-1-1366x768.png │ │ │ │ ├── viewportScreenshot-Firefox_latest-1366x768.png │ │ │ │ ├── wdioLogo-Firefox_latest-1-1366x768.png │ │ │ │ └── wdioLogo-Firefox_latest-1366x768.png │ │ │ ├── desktop_microsoftedge │ │ │ │ ├── viewportScreenshot-Microsoft_Edge_latest-1-1366x768.png │ │ │ │ ├── viewportScreenshot-Microsoft_Edge_latest-1366x768.png │ │ │ │ ├── wdioLogo-Microsoft_Edge_latest-1-1366x768.png │ │ │ │ └── wdioLogo-Microsoft_Edge_latest-1366x768.png │ │ │ ├── desktop_safari │ │ │ │ ├── viewportScreenshot-macOS12-16-1366x768.png │ │ │ │ ├── viewportScreenshot-macOS13-17-1366x768.png │ │ │ │ ├── wdioLogo-macOS12-16-1366x768.png │ │ │ │ └── wdioLogo-macOS13-17-1366x768.png │ │ │ ├── galaxy_tab_s7_plus_googleapi_emulator │ │ │ │ ├── screenshot-EmulatorGalaxyTabS7PlusGoogleAPIPortraitChromeDriver13.0-1002x1601.png │ │ │ │ ├── screenshot-EmulatorGalaxyTabS7PlusGoogleAPIPortraitNativeWebScreenshot12.0-1002x1601.png │ │ │ │ └── wdioLogo-EmulatorGalaxyTabS7PlusGoogleAPIPortraitChromeDriver13.0-1002x1601.png │ │ │ ├── ipad_(10th_generation)_simulator │ │ │ │ ├── screenshot-Ipad10thGenerationPortrait17-820x1180-report.json │ │ │ │ └── screenshot-Ipad10thGenerationPortrait17-820x1180.png │ │ │ ├── ipad_mini_(5th_generation)_simulator │ │ │ │ ├── screenshot-IpadMini5thGenerationPortrait17-768x1024-report.json │ │ │ │ └── screenshot-IpadMini5thGenerationPortrait17-768x1024.png │ │ │ ├── ipad_pro_(12.9_inch)_(5th_generation)_simulator │ │ │ │ ├── fullPage-IpadPro12.9Inch5thGenerationPortrait17-1024x1366-report.json │ │ │ │ ├── fullPage-IpadPro12.9Inch5thGenerationPortrait17-1024x1366.png │ │ │ │ ├── screenshot-IpadPro12.9Inch5thGenerationPortrait17-1024x1366-report.json │ │ │ │ └── screenshot-IpadPro12.9Inch5thGenerationPortrait17-1024x1366.png │ │ │ ├── iphone_14_pro_max_simulator │ │ │ │ └── screenshot-Iphone14ProMaxPortrait16-430x932.png │ │ │ ├── iphone_15_pro_max_simulator │ │ │ │ └── screenshot-Iphone15ProMaxPortrait17-430x932.png │ │ │ └── iphone_15_simulator │ │ │ │ ├── fullPage-Iphone15Portrait17-393x852.png │ │ │ │ └── screenshot-Iphone15Portrait17-393x852.png │ │ ├── baseline │ │ │ ├── android_googleapi_emulator │ │ │ │ ├── fullPage-EmulatorAndroidGoogleAPIPortraitChromeDriver13.0-384x640.png │ │ │ │ ├── fullPage-EmulatorAndroidGoogleAPIPortraitNativeWebScreenshot14.0-384x640.png │ │ │ │ ├── screenshot-EmulatorAndroidGoogleAPIPortraitChromeDriver13.0-384x640.png │ │ │ │ ├── screenshot-EmulatorAndroidGoogleAPIPortraitChromeDriver14.0-384x640.png │ │ │ │ ├── screenshot-EmulatorAndroidGoogleAPIPortraitNativeWebScreenshot14.0-384x640.png │ │ │ │ ├── wdioLogo-EmulatorAndroidGoogleAPIPortraitChromeDriver13.0-384x640.png │ │ │ │ ├── wdioLogo-EmulatorAndroidGoogleAPIPortraitChromeDriver14.0-384x640.png │ │ │ │ └── wdioLogo-EmulatorAndroidGoogleAPIPortraitNativeWebScreenshot14.0-384x640.png │ │ │ ├── desktop_chrome │ │ │ │ ├── fullPage-chrome-latest-1366x768.png │ │ │ │ ├── viewportScreenshot-chrome-latest-1-1366x768.png │ │ │ │ ├── viewportScreenshot-chrome-latest-1366x768.png │ │ │ │ ├── wdioLogo-chrome-latest-1-1366x768.png │ │ │ │ └── wdioLogo-chrome-latest-1366x768.png │ │ │ ├── desktop_firefox │ │ │ │ ├── tabbable-Firefox_latest-1366x768.png │ │ │ │ ├── viewportScreenshot-Firefox_latest-1-1366x768.png │ │ │ │ ├── viewportScreenshot-Firefox_latest-1366x768.png │ │ │ │ ├── wdioLogo-Firefox_latest-1-1366x768.png │ │ │ │ └── wdioLogo-Firefox_latest-1366x768.png │ │ │ ├── desktop_microsoftedge │ │ │ │ ├── viewportScreenshot-Microsoft_Edge_latest-1-1366x768.png │ │ │ │ ├── viewportScreenshot-Microsoft_Edge_latest-1366x768.png │ │ │ │ ├── wdioLogo-Microsoft_Edge_latest-1-1366x768.png │ │ │ │ └── wdioLogo-Microsoft_Edge_latest-1366x768.png │ │ │ ├── desktop_safari │ │ │ │ ├── viewportScreenshot-macOS12-16-1366x768.png │ │ │ │ ├── viewportScreenshot-macOS13-17-1366x768.png │ │ │ │ ├── wdioLogo-macOS12-16-1366x768.png │ │ │ │ └── wdioLogo-macOS13-17-1366x768.png │ │ │ ├── galaxy_tab_s7_plus_googleapi_emulator │ │ │ │ ├── screenshot-EmulatorGalaxyTabS7PlusGoogleAPIPortraitChromeDriver13.0-1002x1601.png │ │ │ │ ├── screenshot-EmulatorGalaxyTabS7PlusGoogleAPIPortraitNativeWebScreenshot12.0-1002x1601.png │ │ │ │ └── wdioLogo-EmulatorGalaxyTabS7PlusGoogleAPIPortraitChromeDriver13.0-1002x1601.png │ │ │ ├── ipad_(10th_generation)_simulator │ │ │ │ └── screenshot-Ipad10thGenerationPortrait17-820x1180.png │ │ │ ├── ipad_mini_(5th_generation)_simulator │ │ │ │ └── screenshot-IpadMini5thGenerationPortrait17-768x1024.png │ │ │ ├── ipad_pro_(12.9_inch)_(5th_generation)_simulator │ │ │ │ ├── fullPage-IpadPro12.9Inch5thGenerationPortrait17-1024x1366.png │ │ │ │ └── screenshot-IpadPro12.9Inch5thGenerationPortrait17-1024x1366.png │ │ │ ├── iphone_14_pro_max_simulator │ │ │ │ └── screenshot-Iphone14ProMaxPortrait16-430x932.png │ │ │ ├── iphone_15_pro_max_simulator │ │ │ │ └── screenshot-Iphone15ProMaxPortrait17-430x932.png │ │ │ └── iphone_15_simulator │ │ │ │ ├── fullPage-Iphone15Portrait17-393x852.png │ │ │ │ └── screenshot-Iphone15Portrait17-393x852.png │ │ ├── diff │ │ │ ├── android_googleapi_emulator │ │ │ │ ├── fullPage-EmulatorAndroidGoogleAPIPortraitChromeDriver13.0-384x640-VHTMLR-THUMBNAIL.png │ │ │ │ ├── fullPage-EmulatorAndroidGoogleAPIPortraitChromeDriver13.0-384x640.png │ │ │ │ ├── fullPage-EmulatorAndroidGoogleAPIPortraitNativeWebScreenshot14.0-384x640-VHTMLR-THUMBNAIL.png │ │ │ │ ├── fullPage-EmulatorAndroidGoogleAPIPortraitNativeWebScreenshot14.0-384x640.png │ │ │ │ ├── screenshot-EmulatorAndroidGoogleAPIPortraitChromeDriver13.0-384x640-VHTMLR-THUMBNAIL.png │ │ │ │ ├── screenshot-EmulatorAndroidGoogleAPIPortraitChromeDriver13.0-384x640.png │ │ │ │ ├── screenshot-EmulatorAndroidGoogleAPIPortraitChromeDriver14.0-384x640-VHTMLR-THUMBNAIL.png │ │ │ │ └── screenshot-EmulatorAndroidGoogleAPIPortraitChromeDriver14.0-384x640.png │ │ │ ├── desktop_chrome │ │ │ │ ├── fullPage-chrome-latest-1366x768.png │ │ │ │ ├── viewportScreenshot-chrome-latest-1-1366x768.png │ │ │ │ └── viewportScreenshot-chrome-latest-1366x768.png │ │ │ ├── desktop_firefox │ │ │ │ ├── tabbable-Firefox_latest-1366x768.png │ │ │ │ ├── viewportScreenshot-Firefox_latest-1-1366x768.png │ │ │ │ └── viewportScreenshot-Firefox_latest-1366x768.png │ │ │ ├── desktop_microsoftedge │ │ │ │ ├── viewportScreenshot-Microsoft_Edge_latest-1-1366x768.png │ │ │ │ └── viewportScreenshot-Microsoft_Edge_latest-1366x768.png │ │ │ ├── desktop_safari │ │ │ │ ├── viewportScreenshot-macOS12-16-1366x768.png │ │ │ │ └── viewportScreenshot-macOS13-17-1366x768.png │ │ │ ├── galaxy_tab_s7_plus_googleapi_emulator │ │ │ │ ├── fullPage-EmulatorGalaxyTabS7PlusGoogleAPIPortraitChromeDriver13.0-1002x1601.png │ │ │ │ └── screenshot-EmulatorGalaxyTabS7PlusGoogleAPIPortraitChromeDriver13.0-1002x1601.png │ │ │ ├── ipad_pro_(12.9_inch)_(5th_generation)_simulator │ │ │ │ └── fullPage-IpadPro12.9Inch5thGenerationPortrait17-1024x1366.png │ │ │ └── iphone_15_simulator │ │ │ │ └── fullPage-Iphone15Portrait17-393x852.png │ │ └── output.json │ ├── package.json │ ├── postcss.config.js │ ├── public │ │ └── favicon.ico │ ├── scripts │ │ ├── cli.ts │ │ ├── prepareReportAssets.ts │ │ ├── types.ts │ │ └── utils │ │ │ ├── cliUtils.ts │ │ │ ├── constants.ts │ │ │ ├── fileHandling.ts │ │ │ ├── inquirerUtils.ts │ │ │ └── validateOutput.ts │ ├── tailwind.config.ts │ ├── tsconfig.json │ ├── tsconfig.scripts.json │ └── vite.config.ts ├── visual-service │ ├── .npmignore │ ├── CHANGELOG.md │ ├── LICENSE │ ├── README.md │ ├── package.json │ ├── src │ │ ├── constants.ts │ │ ├── contextManager.ts │ │ ├── index.ts │ │ ├── matcher.ts │ │ ├── reporter.ts │ │ ├── service.ts │ │ ├── storybook │ │ │ ├── Types.ts │ │ │ ├── deviceDescriptors.ts │ │ │ ├── launcher.ts │ │ │ └── utils.ts │ │ ├── types.ts │ │ ├── utils.ts │ │ └── wrapWithContext.ts │ ├── tests │ │ ├── ContextManager.test.ts │ │ ├── __snapshots__ │ │ │ ├── matcher.test.ts.snap │ │ │ ├── reporter.test.ts.snap │ │ │ ├── service.test.ts.snap │ │ │ ├── storybook.utils.mocked.test.ts.snap │ │ │ ├── storybook.utils.test.ts.snap │ │ │ └── utils.test.ts.snap │ │ ├── matcher.test.ts │ │ ├── reporter.test.ts │ │ ├── reporter.tests.mockdata.ts │ │ ├── service.expect.test.ts │ │ ├── service.test.ts │ │ ├── storybook │ │ │ ├── __snapshots__ │ │ │ │ ├── launcher.test.ts.snap │ │ │ │ ├── storybook.utils.mocked.test.ts.snap │ │ │ │ ├── storybook.utils.test.ts.snap │ │ │ │ └── utils.test.ts.snap │ │ │ ├── launcher.test.ts │ │ │ └── utils.test.ts │ │ ├── utils.test.ts │ │ └── wrapWithContext.test.ts │ └── tsconfig.json └── webdriver-image-comparison │ ├── .npmignore │ ├── CHANGELOG.md │ ├── LICENSE │ ├── README.md │ ├── assets │ └── ios │ │ ├── ipadair4th.ipadair5th-bottom.png │ │ ├── ipadair4th.ipadair5th-top.png │ │ ├── ipadmini6th-bottom.png │ │ ├── ipadmini6th-top.png │ │ ├── ipadpro11-bottom.png │ │ ├── ipadpro11-top.png │ │ ├── ipadpro129-bottom.png │ │ ├── ipadpro129-top.png │ │ ├── iphone11promax-bottom.png │ │ ├── iphone11promax-top.png │ │ ├── iphone12.iphone12pro-top.png │ │ ├── iphone12.iphone12pro.iphone13.iphone13pro.iphone14-bottom.png │ │ ├── iphone12mini-top.png │ │ ├── iphone12mini.iphone13mini-bottom.png │ │ ├── iphone12promax-top.png │ │ ├── iphone12promax.iphone13promax.iphone14plus-bottom.png │ │ ├── iphone13.iphone13pro.iphone14-top.png │ │ ├── iphone13mini-top.png │ │ ├── iphone13promax.iphone14plus-top.png │ │ ├── iphone14pro-bottom.png │ │ ├── iphone14pro-top.png │ │ ├── iphone14promax-bottom.png │ │ ├── iphone14promax-top.png │ │ ├── iphone15-bottom.png │ │ ├── iphone15-top.png │ │ ├── iphonex.iphonexs.iphone11pro-bottom.png │ │ ├── iphonex.iphonexs.iphone11pro-top.png │ │ ├── iphonexr.iphone11-bottom.png │ │ ├── iphonexr.iphone11-top.png │ │ ├── iphonexsmax-bottom.png │ │ └── iphonexsmax-top.png │ ├── package.json │ ├── src │ ├── __snapshots__ │ │ └── base.test.ts.snap │ ├── base.interfaces.ts │ ├── base.test.ts │ ├── base.ts │ ├── clientSideScripts │ │ ├── __snapshots__ │ │ │ ├── getAndroidStatusAddressToolBarHeight.test.ts.snap │ │ │ ├── getElementPositionTopScreenNativeMobile.test.ts.snap │ │ │ ├── getElementPositionTopWindow.test.ts.snap │ │ │ ├── getIosStatusAddressToolBarOffsets.test.ts.snap │ │ │ ├── getScreenDimensions.test.ts.snap │ │ │ ├── hideRemoveElements.test.ts.snap │ │ │ ├── hideScrollbars.test.ts.snap │ │ │ ├── removeElementFromDom.test.ts.snap │ │ │ ├── setCustomCss.test.ts.snap │ │ │ └── toggleTextTransparency.test.ts.snap │ │ ├── checkMetaTag.test.ts │ │ ├── checkMetaTag.ts │ │ ├── customCss.interfaces.ts │ │ ├── drawTabbableOnCanvas.interfaces.ts │ │ ├── drawTabbableOnCanvas.ts │ │ ├── elementPosition.interfaces.ts │ │ ├── getBoundingClientRect.test.ts │ │ ├── getBoundingClientRect.ts │ │ ├── getDocumentScrollHeight.test.ts │ │ ├── getDocumentScrollHeight.ts │ │ ├── getElementPositionTopDom.test.ts │ │ ├── getElementPositionTopDom.ts │ │ ├── getElementPositionTopScreenNativeMobile.test.ts │ │ ├── getElementPositionTopScreenNativeMobile.ts │ │ ├── getMobileWebviewClickAndDimensions.test.ts │ │ ├── getMobileWebviewClickAndDimensions.ts │ │ ├── getScreenDimensions.test.ts │ │ ├── getScreenDimensions.ts │ │ ├── hideRemoveElements.test.ts │ │ ├── hideRemoveElements.ts │ │ ├── hideScrollbars.test.ts │ │ ├── hideScrollbars.ts │ │ ├── injectWebviewOverlay.test.ts │ │ ├── injectWebviewOverlay.ts │ │ ├── removeElementFromDom.test.ts │ │ ├── removeElementFromDom.ts │ │ ├── screenDimensions.interfaces.ts │ │ ├── scrollElementIntoView.ts │ │ ├── scrollToPosition.ts │ │ ├── setCustomCss.test.ts │ │ ├── setCustomCss.ts │ │ ├── statusAddressToolBarOffsets.interfaces.ts │ │ ├── toggleTextTransparency.test.ts │ │ ├── toggleTextTransparency.ts │ │ ├── waitForFonts.test.ts │ │ └── waitForFonts.ts │ ├── commands │ │ ├── check.interfaces.ts │ │ ├── checkAppElement.ts │ │ ├── checkAppScreen.ts │ │ ├── checkElement.ts │ │ ├── checkFullPageScreen.ts │ │ ├── checkScreen.ts │ │ ├── checkTabbablePage.ts │ │ ├── checkWebElement.ts │ │ ├── checkWebScreen.ts │ │ ├── element.interfaces.ts │ │ ├── fullPage.interfaces.ts │ │ ├── save.interfaces.ts │ │ ├── saveAppElement.ts │ │ ├── saveAppScreen.ts │ │ ├── saveElement.ts │ │ ├── saveFullPageScreen.ts │ │ ├── saveScreen.ts │ │ ├── saveTabbablePage.ts │ │ ├── saveWebElement.ts │ │ ├── saveWebScreen.ts │ │ ├── screen.interfaces.ts │ │ └── tabbable.interfaces.ts │ ├── helpers │ │ ├── __snapshots__ │ │ │ ├── beforeScreenshot.test.ts.snap │ │ │ ├── options.test.ts.snap │ │ │ └── utils.test.ts.snap │ │ ├── afterScreenshot.interfaces.ts │ │ ├── afterScreenshot.test.ts │ │ ├── afterScreenshot.ts │ │ ├── beforeScreenshot.interfaces.ts │ │ ├── beforeScreenshot.test.ts │ │ ├── beforeScreenshot.ts │ │ ├── constants.interfaces.ts │ │ ├── constants.ts │ │ ├── options.interfaces.ts │ │ ├── options.test.ts │ │ ├── options.ts │ │ ├── utils.interfaces.ts │ │ ├── utils.test.ts │ │ └── utils.ts │ ├── index.ts │ ├── methods │ │ ├── __snapshots__ │ │ │ ├── instanceData.spec.ts.snap │ │ │ ├── instanceData.test.ts.snap │ │ │ ├── rectangles.spec.ts.snap │ │ │ ├── rectangles.test.ts.snap │ │ │ ├── screenshots.spec.ts.snap │ │ │ └── screenshots.test.ts.snap │ │ ├── createCompareReport.ts │ │ ├── elementPosition.ts │ │ ├── images.interfaces.ts │ │ ├── images.ts │ │ ├── instanceData.interfaces.ts │ │ ├── instanceData.test.ts │ │ ├── instanceData.ts │ │ ├── methods.interfaces.ts │ │ ├── processDiffPixels.ts │ │ ├── rectangles.interfaces.ts │ │ ├── rectangles.test.ts │ │ ├── rectangles.ts │ │ ├── screenshots.interfaces.ts │ │ ├── screenshots.test.ts │ │ └── screenshots.ts │ ├── mocks │ │ └── mocks.ts │ └── resemble │ │ ├── compare.interfaces.ts │ │ ├── compareImages.d.ts │ │ ├── compareImages.ts │ │ └── resemble.jimp.cjs │ └── tsconfig.json ├── pnpm-lock.yaml ├── pnpm-workspace.yaml ├── scripts └── update.packages.mjs ├── tests ├── .eslintrc.json ├── configs │ ├── browserstack.real.device.conf.ts │ ├── lambdatest.android.emus.web.ts │ ├── lambdatest.desktop.browsers.ts │ ├── lambdatest.ios.sims.web.ts │ ├── sauce.android.emus.app.ts │ ├── sauce.android.emus.web.ts │ ├── sauce.desktop.browsers.ts │ ├── sauce.ios.sims.app.ts │ ├── sauce.ios.sims.web.ts │ ├── wdio.browserstack.shared.conf.ts │ ├── wdio.lambdatest.shared.conf.ts │ ├── wdio.lambdatest.web.conf.ts │ ├── wdio.local.android.emus.app.conf.ts │ ├── wdio.local.android.emus.web.conf.ts │ ├── wdio.local.appium.shared.conf.ts │ ├── wdio.local.desktop.conf.ts │ ├── wdio.local.desktop.multi.conf.ts │ ├── wdio.local.desktop.storybook.conf.ts │ ├── wdio.local.init.conf.ts │ ├── wdio.local.ios.sims.app.conf.ts │ ├── wdio.local.ios.sims.web.conf.ts │ ├── wdio.local.multi.web.app.conf.ts │ ├── wdio.ocr.lambdatest.conf.ts │ ├── wdio.ocr.local.desktop.conf.ts │ ├── wdio.ocr.saucelabs.conf.ts │ ├── wdio.saucelabs.app.conf.ts │ ├── wdio.saucelabs.shared.conf.ts │ ├── wdio.saucelabs.web.conf.ts │ └── wdio.shared.conf.ts ├── helpers │ ├── copy.ts │ └── fileExists.ts ├── lambdaTestBaseline │ ├── desktop_chrome │ │ ├── bidiEmulatedFullPage-chrome-latest-320x658.png │ │ ├── bidiEmulatedViewportScreenshot-chrome-latest-320x658.png │ │ ├── bidiEmulatedWdioLogo-chrome-latest-320x658.png │ │ ├── bidiLegacyEmulatedFullPage-chrome-latest-320x658.png │ │ ├── examplePageFail-chrome-latest-1366x768.png │ │ ├── fullPage-chrome-latest-1366x768.png │ │ ├── legacyEmulatedViewportScreenshot-chrome-latest-320x658.png │ │ ├── legacyEmulatedWdioLogo-chrome-latest-320x658.png │ │ ├── tabbable-chrome-latest-1366x768.png │ │ ├── viewportScreenshot-chrome-latest-1366x768.png │ │ └── wdioLogo-chrome-latest-1366x768.png │ ├── desktop_firefox │ │ ├── fullPage-Firefox_latest-1366x768.png │ │ ├── tabbable-Firefox_latest-1366x768.png │ │ ├── viewportScreenshot-Firefox_latest-1366x768.png │ │ └── wdioLogo-Firefox_latest-1366x768.png │ ├── desktop_microsoftedge │ │ ├── fullPage-Microsoft_Edge_latest-1366x768.png │ │ ├── tabbable-Microsoft_Edge_latest-1366x768.png │ │ ├── viewportScreenshot-Microsoft_Edge_latest-1366x768.png │ │ └── wdioLogo-Microsoft_Edge_latest-1366x768.png │ ├── desktop_safari │ │ ├── fullPage-SafariLatest-1366x768.png │ │ ├── tabbable-SafariLatest-1366x768.png │ │ ├── viewportScreenshot-SafariLatest-1366x768.png │ │ └── wdioLogo-SafariLatest-1366x768.png │ ├── galaxy_tab_s8 │ │ ├── fullPage-EmulatorGalaxyTabS8LandscapeNativeWebScreenshot13-1707x1067.png │ │ ├── fullPage-EmulatorGalaxyTabS8LandscapeNativeWebScreenshot14-1707x1067.png │ │ ├── fullPage-EmulatorGalaxyTabS8PortraitNativeWebScreenshot13-1067x1707.png │ │ ├── fullPage-EmulatorGalaxyTabS8PortraitNativeWebScreenshot14-1067x1707.png │ │ ├── screenshot-EmulatorGalaxyTabS8LandscapeNativeWebScreenshot13-1707x1067.png │ │ ├── screenshot-EmulatorGalaxyTabS8LandscapeNativeWebScreenshot14-1707x1067.png │ │ ├── screenshot-EmulatorGalaxyTabS8PortraitNativeWebScreenshot13-1067x1707.png │ │ ├── screenshot-EmulatorGalaxyTabS8PortraitNativeWebScreenshot14-1067x1707.png │ │ ├── screenshot-landscape-EmulatorGalaxyTabS8PortraitNativeWebScreenshot13-1707x1067.png │ │ ├── screenshot-landscape-EmulatorGalaxyTabS8PortraitNativeWebScreenshot14-1707x1067.png │ │ ├── screenshot-portrait-EmulatorGalaxyTabS8LandscapeNativeWebScreenshot13-1067x1707.png │ │ ├── screenshot-portrait-EmulatorGalaxyTabS8LandscapeNativeWebScreenshot14-1067x1707.png │ │ ├── wdioLogo-EmulatorGalaxyTabS8LandscapeNativeWebScreenshot13-1707x1067.png │ │ ├── wdioLogo-EmulatorGalaxyTabS8LandscapeNativeWebScreenshot14-1707x1067.png │ │ ├── wdioLogo-EmulatorGalaxyTabS8PortraitNativeWebScreenshot13-1067x1707.png │ │ └── wdioLogo-EmulatorGalaxyTabS8PortraitNativeWebScreenshot14-1067x1707.png │ ├── iphone_13_mini │ │ ├── fullPage-Iphone13MiniLandscape17-375x812.png │ │ ├── fullPage-Iphone13MiniPortrait17-375x812.png │ │ ├── screenshot-Iphone13MiniLandscape17-375x812.png │ │ ├── screenshot-Iphone13MiniPortrait17-375x812.png │ │ ├── screenshot-landscape-Iphone13MiniPortrait17-375x812.png │ │ ├── screenshot-portrait-Iphone13MiniLandscape17-375x812.png │ │ ├── wdioLogo-Iphone13MiniLandscape17-375x812.png │ │ └── wdioLogo-Iphone13MiniPortrait17-375x812.png │ ├── iphone_13_pro │ │ ├── fullPage-Iphone13ProLandscape16-390x844.png │ │ ├── fullPage-Iphone13ProPortrait16-390x844.png │ │ ├── screenshot-Iphone13ProLandscape16-390x844.png │ │ ├── screenshot-Iphone13ProPortrait16-390x844.png │ │ ├── screenshot-landscape-Iphone13ProPortrait16-390x844.png │ │ ├── screenshot-portrait-Iphone13ProLandscape16-390x844.png │ │ ├── wdioLogo-Iphone13ProLandscape16-390x844.png │ │ └── wdioLogo-Iphone13ProPortrait16-390x844.png │ ├── iphone_14_pro │ │ ├── fullPage-Iphone14ProLandscape17-393x852.png │ │ ├── fullPage-Iphone14ProPortrait17-393x852.png │ │ ├── screenshot-Iphone14ProLandscape17-393x852.png │ │ ├── screenshot-Iphone14ProPortrait17-393x852.png │ │ ├── screenshot-landscape-Iphone14ProPortrait17-393x852.png │ │ ├── screenshot-portrait-Iphone14ProLandscape17-393x852.png │ │ ├── wdioLogo-Iphone14ProLandscape17-393x852.png │ │ └── wdioLogo-Iphone14ProPortrait17-393x852.png │ ├── iphone_15_pro_max │ │ ├── fullPage-Iphone15ProMaxLandscape18-430x932.png │ │ ├── fullPage-Iphone15ProMaxPortrait18-430x932.png │ │ ├── screenshot-Iphone15ProMaxLandscape18-430x932.png │ │ ├── screenshot-Iphone15ProMaxPortrait18-430x932.png │ │ ├── screenshot-landscape-Iphone15ProMaxPortrait18-430x932.png │ │ ├── screenshot-portrait-Iphone15ProMaxLandscape18-430x932.png │ │ ├── wdioLogo-Iphone15ProMaxLandscape18-430x932.png │ │ └── wdioLogo-Iphone15ProMaxPortrait18-430x932.png │ ├── pixel_4 │ │ ├── fullPage-EmulatorPixel4LandscapeNativeWebScreenshot11-652x309.png │ │ ├── fullPage-EmulatorPixel4LandscapeNativeWebScreenshot12-760x360.png │ │ ├── fullPage-EmulatorPixel4LandscapeNativeWebScreenshot13-760x360.png │ │ ├── fullPage-EmulatorPixel4PortraitNativeWebScreenshot11-309x652.png │ │ ├── fullPage-EmulatorPixel4PortraitNativeWebScreenshot12-360x760.png │ │ ├── fullPage-EmulatorPixel4PortraitNativeWebScreenshot13-360x760.png │ │ ├── screenshot-EmulatorPixel4LandscapeNativeWebScreenshot11-652x309.png │ │ ├── screenshot-EmulatorPixel4LandscapeNativeWebScreenshot12-760x360.png │ │ ├── screenshot-EmulatorPixel4LandscapeNativeWebScreenshot13-760x360.png │ │ ├── screenshot-EmulatorPixel4PortraitNativeWebScreenshot11-309x652.png │ │ ├── screenshot-EmulatorPixel4PortraitNativeWebScreenshot12-360x760.png │ │ ├── screenshot-EmulatorPixel4PortraitNativeWebScreenshot13-360x760.png │ │ ├── screenshot-landscape-EmulatorPixel4PortraitNativeWebScreenshot11-652x309.png │ │ ├── screenshot-landscape-EmulatorPixel4PortraitNativeWebScreenshot12-760x360.png │ │ ├── screenshot-landscape-EmulatorPixel4PortraitNativeWebScreenshot13-760x360.png │ │ ├── screenshot-portrait-EmulatorPixel4LandscapeNativeWebScreenshot11-309x652.png │ │ ├── screenshot-portrait-EmulatorPixel4LandscapeNativeWebScreenshot12-360x760.png │ │ ├── screenshot-portrait-EmulatorPixel4LandscapeNativeWebScreenshot13-360x760.png │ │ ├── wdioLogo-EmulatorPixel4LandscapeNativeWebScreenshot11-652x309.png │ │ ├── wdioLogo-EmulatorPixel4LandscapeNativeWebScreenshot12-760x360.png │ │ ├── wdioLogo-EmulatorPixel4LandscapeNativeWebScreenshot13-760x360.png │ │ ├── wdioLogo-EmulatorPixel4PortraitNativeWebScreenshot11-309x652.png │ │ ├── wdioLogo-EmulatorPixel4PortraitNativeWebScreenshot12-360x760.png │ │ └── wdioLogo-EmulatorPixel4PortraitNativeWebScreenshot13-360x760.png │ └── pixel_9_pro │ │ ├── fullPage-EmulatorPixel9ProLandscapeNativeWebScreenshot14-952x427.png │ │ ├── fullPage-EmulatorPixel9ProLandscapeNativeWebScreenshot15-952x427.png │ │ ├── fullPage-EmulatorPixel9ProPortraitNativeWebScreenshot14-427x952.png │ │ ├── fullPage-EmulatorPixel9ProPortraitNativeWebScreenshot15-427x952.png │ │ ├── screenshot-EmulatorPixel9ProLandscapeNativeWebScreenshot14-952x427.png │ │ ├── screenshot-EmulatorPixel9ProLandscapeNativeWebScreenshot15-952x427.png │ │ ├── screenshot-EmulatorPixel9ProPortraitNativeWebScreenshot14-427x952.png │ │ ├── screenshot-EmulatorPixel9ProPortraitNativeWebScreenshot15-427x952.png │ │ ├── screenshot-landscape-EmulatorPixel9ProPortraitNativeWebScreenshot14-952x427.png │ │ ├── screenshot-landscape-EmulatorPixel9ProPortraitNativeWebScreenshot15-952x427.png │ │ ├── screenshot-portrait-EmulatorPixel9ProLandscapeNativeWebScreenshot14-427x952.png │ │ ├── screenshot-portrait-EmulatorPixel9ProLandscapeNativeWebScreenshot15-427x952.png │ │ ├── wdioLogo-EmulatorPixel9ProLandscapeNativeWebScreenshot14-952x427.png │ │ ├── wdioLogo-EmulatorPixel9ProLandscapeNativeWebScreenshot15-952x427.png │ │ ├── wdioLogo-EmulatorPixel9ProPortraitNativeWebScreenshot14-427x952.png │ │ └── wdioLogo-EmulatorPixel9ProPortraitNativeWebScreenshot15-427x952.png ├── sauceLabsBaseline │ ├── google_pixel_4_xl_googleapi_emulator │ │ ├── app-forms-app-EmulatorGooglePixel4XLGoogleAPIPortrait11.0-1440x2872.png │ │ ├── app-forms-app-EmulatorGooglePixel4XLGoogleAPIPortrait11.0-1440x3040.png │ │ ├── app-forms-app-EmulatorGooglePixel4XLGoogleAPIPortrait12.0-1440x2872.png │ │ ├── app-forms-app-EmulatorGooglePixel4XLGoogleAPIPortrait12.0-1440x3040.png │ │ ├── app-forms-app-EmulatorGooglePixel4XLGoogleAPIPortrait13.0-1440x2956.png │ │ ├── app-forms-app-EmulatorGooglePixel4XLGoogleAPIPortrait13.0-1440x3040.png │ │ ├── app-forms-app-EmulatorGooglePixel4XLGoogleAPIPortrait14.0-1440x2956.png │ │ ├── app-forms-app-EmulatorGooglePixel4XLGoogleAPIPortrait14.0-1440x3040.png │ │ ├── app-forms-app-EmulatorGooglePixel4XLGoogleAPIPortrait15.0-1440x3040.png │ │ ├── app-login-button-app-EmulatorGooglePixel4XLGoogleAPIPortrait11.0-1440x2872.png │ │ ├── app-login-button-app-EmulatorGooglePixel4XLGoogleAPIPortrait11.0-1440x3040.png │ │ ├── app-login-button-app-EmulatorGooglePixel4XLGoogleAPIPortrait12.0-1440x2872.png │ │ ├── app-login-button-app-EmulatorGooglePixel4XLGoogleAPIPortrait12.0-1440x3040.png │ │ ├── app-login-button-app-EmulatorGooglePixel4XLGoogleAPIPortrait13.0-1440x2956.png │ │ ├── app-login-button-app-EmulatorGooglePixel4XLGoogleAPIPortrait14.0-1440x2956.png │ │ ├── app-login-button-app-EmulatorGooglePixel4XLGoogleAPIPortrait15.0-1440x3040.png │ │ ├── app-login-button-resized-app-EmulatorGooglePixel4XLGoogleAPIPortrait11.0-1440x2872.png │ │ ├── app-login-button-resized-app-EmulatorGooglePixel4XLGoogleAPIPortrait11.0-1440x3040.png │ │ ├── app-login-button-resized-app-EmulatorGooglePixel4XLGoogleAPIPortrait12.0-1440x2872.png │ │ ├── app-login-button-resized-app-EmulatorGooglePixel4XLGoogleAPIPortrait12.0-1440x3040.png │ │ ├── app-login-button-resized-app-EmulatorGooglePixel4XLGoogleAPIPortrait13.0-1440x2956.png │ │ ├── app-login-button-resized-app-EmulatorGooglePixel4XLGoogleAPIPortrait14.0-1440x2956.png │ │ ├── app-login-button-resized-app-EmulatorGooglePixel4XLGoogleAPIPortrait15.0-1440x3040.png │ │ ├── web-app-app-EmulatorGooglePixel4XLGoogleAPIPortrait13.0-412x869.png │ │ ├── web-app-app-EmulatorGooglePixel4XLGoogleAPIPortrait14.0-412x869.png │ │ └── web-app-app-EmulatorGooglePixel4XLGoogleAPIPortrait15.0-412x869.png │ ├── iphone_11_simulator │ │ ├── app-forms-app-Iphone11Portrait15-414x896.png │ │ ├── app-login-button-app-Iphone11Portrait15-414x896.png │ │ ├── app-login-button-resized-app-Iphone11Portrait15-414x896.png │ │ └── web-app-app-Iphone11Portrait15-414x896.png │ ├── iphone_12_pro_max_simulator │ │ ├── app-forms-app-Iphone12ProMaxPortrait16-428x926.png │ │ ├── app-login-button-app-Iphone12ProMaxPortrait16-428x926.png │ │ ├── app-login-button-resized-app-Iphone12ProMaxPortrait16-428x926.png │ │ └── web-app-app-Iphone12ProMaxPortrait16-428x926.png │ ├── iphone_12_simulator │ │ ├── app-forms-app-Iphone12Portrait16-390x844.png │ │ ├── app-login-button-app-Iphone12Portrait16-390x844.png │ │ ├── app-login-button-resized-app-Iphone12Portrait16-390x844.png │ │ └── web-app-app-Iphone12Portrait16-390x844.png │ ├── iphone_8_plus_simulator │ │ ├── app-forms-app-Iphone8PlusPortrait14-414x736.png │ │ ├── app-login-button-app-Iphone8PlusPortrait14-414x736.png │ │ ├── app-login-button-resized-app-Iphone8PlusPortrait14-414x736.png │ │ └── web-app-app-Iphone8PlusPortrait14-414x736.png │ ├── iphone_8_simulator │ │ ├── app-forms-app-Iphone8Portrait14-375x667.png │ │ ├── app-login-button-app-Iphone8Portrait14-375x667.png │ │ ├── app-login-button-resized-app-Iphone8Portrait14-375x667.png │ │ └── web-app-app-Iphone8Portrait14-375x667.png │ └── iphone_xs_simulator │ │ ├── app-forms-app-IphoneXsPortrait15-375x812.png │ │ ├── app-login-button-app-IphoneXsPortrait15-375x812.png │ │ ├── app-login-button-resized-app-IphoneXsPortrait15-375x812.png │ │ └── web-app-app-IphoneXsPortrait15-375x812.png ├── specs │ ├── basics.spec.ts │ ├── checkMethodsFolders.spec.ts │ ├── desktop.bidi.emulated.spec.ts │ ├── desktop.ocr.spec.ts │ ├── desktop.spec.ts │ ├── init.spec.ts │ ├── matcher.spec.ts │ ├── mobile.app.spec.ts │ ├── mobile.web.spec.ts │ ├── multiremote.spec.ts │ ├── multiremote.web.app.spec.ts │ ├── saveMethodsFolders.spec.ts │ ├── standalone.spec.js │ └── storybook-interaction │ │ └── example.page.logged.spec.ts ├── tsconfig.json └── types │ ├── types.ts │ └── wdio.d.ts ├── tsconfig.json └── vitest.config.ts /.changeset/README.md: -------------------------------------------------------------------------------- 1 | # Changesets 2 | 3 | Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works 4 | with multi-package repos, or single-package repos to help you version and publish your code. You can 5 | find the full documentation for it [in our repository](https://github.com/changesets/changesets) 6 | 7 | We have a quick list of common questions to get you started engaging with this project in 8 | [our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) 9 | -------------------------------------------------------------------------------- /.changeset/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://unpkg.com/@changesets/config@3.0.2/schema.json", 3 | "changelog": "@changesets/cli/changelog", 4 | "commit": false, 5 | "fixed": [], 6 | "linked": [], 7 | "access": "public", 8 | "baseBranch": "main", 9 | "updateInternalDependencies": "patch", 10 | "ignore": [] 11 | } -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig helps developers define and maintain consistent 2 | # coding styles between different editors and IDEs 3 | # editorconfig.org 4 | 5 | root = true 6 | 7 | [*] 8 | 9 | indent_style = space 10 | indent_size = 4 11 | 12 | end_of_line = lf 13 | charset = utf-8 14 | trim_trailing_whitespace = true 15 | insert_final_newline = true 16 | 17 | [{**/*.json,.github/**/*.yml}] 18 | indent_size = 2 19 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.ts text eol=lf 2 | *.js text eol=lf 3 | *.md text eol=lf 4 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/--bug-report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: "\U0001F41BBug report" 3 | about: Create a report to help us improve. 4 | --- 5 | 6 | **Environment (please complete the following information):** 7 | - Node.js version: [e.g. 8.9.1] 8 | - NPM version: [e.g. 5.8.0] 9 | - Browser name and version: [e.g. Chrome 68] 10 | - Platform name and version: [e.g. Windows 10] 11 | - WebdriverIO version: [e.g. 5.1.0] 12 | - `@wdio/visual-service` version: [e.g. 1.0.0] 13 | 14 | **Config of WebdriverIO + `@wdio/visual-service`** 15 | An example of how you configured the `@wdio/visual-service` 16 | 17 | **Describe the bug** 18 | A clear and concise description of what the bug is. 19 | 20 | **To Reproduce** 21 | Steps to reproduce the behavior: 22 | 23 | [Include code or an example repository that can easily be set up] 24 | 25 | **Expected behavior** 26 | A clear and concise description of what you expected to happen. 27 | 28 | **Log** 29 | If applicable, add logs to help explain your problem. If you don't have log, enable 'debug:true' in the config and paste the log here. 30 | Please use proper markdown to style it 31 | 32 | **Additional context** 33 | Add any other context about the problem here. 34 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/--documentation.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: "\U0001F4D6Documentation" 3 | about: Suggest improvements or report missing/unclear documentation. 4 | 5 | --- 6 | 7 | **Pre-check** 8 | - [ ] I'm aware that I can [edit the docs](https://github.com/webdriverio/webdriverio/tree/main/website/docs/visual-testing) and submit a pull request 9 | 10 | **Describe the improvement** 11 | 12 | I'd like to report 13 | - [ ] Unclear documentation 14 | - [ ] A typo 15 | - [ ] Missing documentation 16 | - [ ] Other 17 | 18 | **Description of the improvement / report** 19 | A clear and concise description. 20 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/--feature-request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: "\U0001F4A1Feature request" 3 | about: Suggest an idea for this module. 4 | 5 | --- 6 | 7 | **Is your feature request related to a problem? Please describe.** 8 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 9 | 10 | **Describe the solution you'd like** 11 | A clear and concise description of what you want to happen. 12 | 13 | **Describe alternatives you've considered** 14 | A clear and concise description of any alternative solutions or features you've considered. 15 | 16 | **Additional context** 17 | Add any other context or screenshots about the feature request here. 18 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/--question.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: "\U0001F4ACQuestion" 3 | about: Ask questions. 4 | 5 | --- 6 | 7 | **Describe your question with as much detail as possible** 8 | A clear and concise question that doesn't require too much conversation. Need more help? [Join us on Discord](https://discord.webdriver.io) 9 | 10 | 11 | **If it's about a specific piece of code, try and include some of it to support your question.** 12 | [...] 13 | 14 | 15 | **Environment (please complete the following information):** 16 | - Node.js version: [e.g. 8.9.1] 17 | - NPM version: [e.g. 5.8.0] 18 | - Browser name and version: [e.g. Chrome 68] 19 | - Platform name and version: [e.g. Windows 10] 20 | - WebdriverIO version: [e.g. 5.1.0] 21 | - `@wdio/visual-service` version: [e.g. 1.0.0] 22 | 23 | 24 | **Additional context** 25 | Add any other context about the problem here. 26 | -------------------------------------------------------------------------------- /.github/assets/powered-by-saucelabs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/.github/assets/powered-by-saucelabs.png -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: npm 4 | directory: "/" 5 | schedule: 6 | interval: weekly 7 | open-pull-requests-limit: 10 8 | -------------------------------------------------------------------------------- /.github/stale.yml: -------------------------------------------------------------------------------- 1 | # Number of days of inactivity before an issue becomes stale 2 | daysUntilStale: 90 3 | # Number of days of inactivity before a stale issue is closed 4 | daysUntilClose: 14 5 | # Issues with these labels will never be considered stale 6 | exemptLabels: 7 | - bug 8 | - PR please ;-) 9 | - feature 10 | - help wanted 11 | # Label to use when marking an issue as stale 12 | staleLabel: wontfix 13 | # Comment to post when marking an issue as stale. Set to `false` to disable 14 | markComment: > 15 | This issue has been automatically marked as stale because it has not had 16 | recent activity. It will be closed if no further activity occurs. Thank you 17 | for your contributions. 18 | # Comment to post when closing a stale issue. Set to `false` to disable 19 | closeComment: false 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Directory for instrumented libs generated by jscoverage/JSCover 9 | lib-cov 10 | 11 | # Coverage directory used by tools like istanbul 12 | coverage 13 | .vitest-ui 14 | 15 | # Dependency directories 16 | node_modules/ 17 | 18 | # Optional npm cache directory 19 | .npm 20 | 21 | build 22 | 23 | # folders 24 | .tmp 25 | /__snapshots__/ 26 | .idea/ 27 | localBaseline/ 28 | apps/ 29 | logs/ 30 | 31 | # files 32 | .DS_Store 33 | .eslintcache 34 | dist 35 | *.tsbuildinfo 36 | 37 | *.tgz 38 | bugreport*.zip 39 | -------------------------------------------------------------------------------- /.husky/.gitignore: -------------------------------------------------------------------------------- 1 | _ 2 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | git diff-index --cached --name-only --diff-filter=d HEAD | grep -E ".*\\.[cm]?[jt]sx?$" | xargs -r node_modules/eslint/bin/eslint.js 2 | -------------------------------------------------------------------------------- /.husky/pre-push: -------------------------------------------------------------------------------- 1 | pnpm test:lint 2 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | 5 | # Directory for instrumented libs generated by jscoverage/JSCover 6 | lib-cov 7 | 8 | # Coverage directory used by tools like istanbul 9 | coverage 10 | 11 | # Dependency directory 12 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git 13 | node_modules 14 | 15 | # JetBrains IDE 16 | .idea 17 | 18 | # extra files 19 | docs/ 20 | .tmp/ 21 | localBaseline/ 22 | .DS_Store 23 | .github/ 24 | tests/ 25 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | v20.10.0 2 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.codeActionsOnSave": { 3 | "source.fixAll.eslint": "explicit" 4 | }, 5 | "eslint.validate": [ 6 | "javascript", 7 | "javascriptreact", 8 | "typescript", 9 | "typescriptreact" 10 | ], 11 | "[javascript]": { 12 | "editor.formatOnSave": false 13 | }, 14 | "[javascriptreact]": { 15 | "editor.formatOnSave": false 16 | }, 17 | "[typescript]": { 18 | "editor.formatOnSave": false 19 | }, 20 | "[typescriptreact]": { 21 | "editor.formatOnSave": false 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 OpenJS Foundation 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /__mocks__/@wdio/logger.ts: -------------------------------------------------------------------------------- 1 | import { vi } from 'vitest' 2 | 3 | export const logMock = { 4 | error: vi.fn(), 5 | debug: vi.fn(), 6 | warn: vi.fn(), 7 | info: vi.fn(), 8 | trace: vi.fn(), 9 | progress: vi.fn() 10 | } 11 | const mock = () => logMock 12 | mock.setLevel = vi.fn() 13 | mock.setLogLevelsConfig = vi.fn() 14 | mock.waitForBuffer = vi.fn() 15 | mock.clearLogger = vi.fn() 16 | export default mock 17 | -------------------------------------------------------------------------------- /eng.traineddata: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/eng.traineddata -------------------------------------------------------------------------------- /packages/ocr-service/.npmignore: -------------------------------------------------------------------------------- 1 | tsconfig.json 2 | src 3 | tests 4 | *.tgz 5 | -------------------------------------------------------------------------------- /packages/ocr-service/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 OpenJS Foundation 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /packages/ocr-service/README.md: -------------------------------------------------------------------------------- 1 | # WebdriverIO OCR Service 2 | 3 | > A WebdriverIO service for using OCR to interact with elements on a page. 4 | 5 | ## Installation 6 | 7 | The easiest way is to keep `@wdio/ocr-service` as a dev-dependency in your `package.json`, via: 8 | 9 | ```sh 10 | npm install @wdio/ocr-service --save-dev 11 | ``` 12 | 13 | Instructions on how to get started can be found in the [visual testing](https://webdriver.io/docs/visual-testing) docs on the WebdriverIO project page. 14 | -------------------------------------------------------------------------------- /packages/ocr-service/assets/target.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/ocr-service/assets/target.png -------------------------------------------------------------------------------- /packages/ocr-service/src/commands/ocrGetText.ts: -------------------------------------------------------------------------------- 1 | import getData from '../utils/getData.js' 2 | import type { OcrGetTextOptions } from '../types.js' 3 | 4 | export default async function ocrGetText(this: WebdriverIO.Browser, options: OcrGetTextOptions): Promise { 5 | const { text } = await getData(this, options) 6 | 7 | return text.replace(/\n\s*\n/g, '\n') 8 | } 9 | -------------------------------------------------------------------------------- /packages/ocr-service/src/commands/ocrWaitForTextDisplayed.ts: -------------------------------------------------------------------------------- 1 | import type { OcrWaitForTextDisplayedOptions } from '../types.js' 2 | import ocrGetElementPositionByText from './ocrGetElementPositionByText.js' 3 | 4 | export default async function ocrWaitForTextDisplayed( 5 | this: WebdriverIO.Browser, 6 | options: OcrWaitForTextDisplayedOptions 7 | ) { 8 | const { timeout, timeoutMsg } = options 9 | 10 | return this.waitUntil( 11 | async () => ocrGetElementPositionByText.bind(this)(options), 12 | { 13 | timeout: timeout || 180000, 14 | timeoutMsg: timeoutMsg || `Could not find the text "${options.text}" within the requested time.`, 15 | } 16 | ) 17 | } 18 | -------------------------------------------------------------------------------- /packages/ocr-service/src/utils/fuzzySearch.ts: -------------------------------------------------------------------------------- 1 | import Fuse from 'fuse.js' 2 | import type { FuzzyElement, FuzzyFindOptions } from '../types.js' 3 | import { DEFAULT_FUZZY_OPTIONS } from './constants.js' 4 | 5 | export function fuzzyFind(options: FuzzyFindOptions): FuzzyElement[] | [] { 6 | const { textArray, pattern, searchOptions } = options 7 | 8 | const fuzzyOptions = { 9 | // Defaults that can be overwritten 10 | ...DEFAULT_FUZZY_OPTIONS, 11 | // Provided options 12 | ...searchOptions, 13 | // Defaults that should not be overwritten 14 | // See https://fusejs.io/api/options.html for more options 15 | ...{ 16 | includeMatches: false, 17 | includeScore: true, 18 | ignoreFieldNorm: false, 19 | ignoreLocation: false, 20 | keys: ['text'], 21 | shouldSort: true, 22 | useExtendedSearch: false, 23 | }, 24 | } 25 | const fuse = new Fuse(textArray, fuzzyOptions) 26 | 27 | return fuse.search(pattern).map((item) => { 28 | if (item.score) { 29 | item.score = item.score < 1e-10 ? 0 : item.score 30 | return item 31 | } 32 | }).filter((item): item is FuzzyElement => item !== undefined) 33 | } 34 | -------------------------------------------------------------------------------- /packages/ocr-service/src/utils/getTextPositions.ts: -------------------------------------------------------------------------------- 1 | import getData from './getData.js' 2 | import { getDprPositions } from './index.js' 3 | import type { Line, GetTextPositions, GetTextPositionsOptions } from '../types.js' 4 | 5 | export default async function getTextPositions(browser: WebdriverIO.Browser, options: GetTextPositionsOptions): Promise { 6 | const { dpr, filePath, words } = await getData(browser, options) 7 | 8 | return ( 9 | words 10 | .map(({ text, bbox }:Line) => ({ 11 | dprPosition: getDprPositions(JSON.parse(JSON.stringify(bbox)), dpr), 12 | filePath, 13 | originalPosition: bbox, 14 | text: text.replace(/(^\s+|\s+$)/g, ''), 15 | })) 16 | .filter((word) => word.text) 17 | ) 18 | } 19 | -------------------------------------------------------------------------------- /packages/ocr-service/src/utils/sendKeys.ts: -------------------------------------------------------------------------------- 1 | import { Key } from 'webdriverio' 2 | 3 | export default async function sendKeys(browser: WebdriverIO.Browser, value: string, submitValue: boolean): Promise { 4 | const actionChain = browser.action('key'); 5 | 6 | [...value].forEach((char: string) => { 7 | actionChain.down(char) 8 | }); 9 | [...value].forEach((char: string) => { 10 | actionChain.up(char) 11 | }) 12 | 13 | if (submitValue) { 14 | /** 15 | * XCTest API only allows to send keypresses (e.g. keydown+keyup). 16 | */ 17 | if (!browser.isIOS){ 18 | actionChain.pause(50) 19 | } 20 | actionChain.down(Key.Enter) 21 | actionChain.up(Key.Enter) 22 | } 23 | await actionChain.perform() 24 | } 25 | -------------------------------------------------------------------------------- /packages/ocr-service/tests/__snapshots__/ocrGetText.test.ts.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[`ocrGetText > should return text 1`] = ` 4 | " 5 | Next-gen browser and mobile automation 6 | test framework for Node.js 7 | " 8 | `; 9 | -------------------------------------------------------------------------------- /packages/ocr-service/tests/commands/__snapshots__/ocrGetText.test.ts.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[`ocrGetText > should return text 1`] = ` 4 | " 5 | Next-gen browser and mobile automation 6 | test framework for Node.js 7 | " 8 | `; 9 | -------------------------------------------------------------------------------- /packages/ocr-service/tests/utils/__snapshots__/ocrGetTextPositions.test.ts.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[`getTextPositions > processes words and adjusts their positions based on DPR 1`] = ` 4 | [ 5 | { 6 | "dprPosition": { 7 | "bottom": 0.5, 8 | "left": 0.5, 9 | "right": 0.5, 10 | "top": 0.5, 11 | }, 12 | "filePath": "sample/path/to/image.png", 13 | "originalPosition": { 14 | "bottom": 1, 15 | "left": 1, 16 | "right": 1, 17 | "top": 1, 18 | }, 19 | "text": "Sample", 20 | }, 21 | { 22 | "dprPosition": { 23 | "bottom": 1, 24 | "left": 1, 25 | "right": 1, 26 | "top": 1, 27 | }, 28 | "filePath": "sample/path/to/image.png", 29 | "originalPosition": { 30 | "bottom": 2, 31 | "left": 2, 32 | "right": 2, 33 | "top": 2, 34 | }, 35 | "text": "OCR t", 36 | }, 37 | { 38 | "dprPosition": { 39 | "bottom": 1.5, 40 | "left": 1.5, 41 | "right": 1.5, 42 | "top": 1.5, 43 | }, 44 | "filePath": "sample/path/to/image.png", 45 | "originalPosition": { 46 | "bottom": 3, 47 | "left": 3, 48 | "right": 3, 49 | "top": 3, 50 | }, 51 | "text": "ext", 52 | }, 53 | ] 54 | `; 55 | -------------------------------------------------------------------------------- /packages/ocr-service/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "rootDir": "./src", 5 | "outDir": "./dist", 6 | "baseUrl": "." 7 | }, 8 | "include": ["./src/**/*", "../ocr-service/src/cli.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /packages/visual-reporter/.gitignore: -------------------------------------------------------------------------------- 1 | # dependencies 2 | /node_modules 3 | /.pnp 4 | .pnp.js 5 | .yarn/install-state.gz 6 | 7 | # testing 8 | /coverage 9 | 10 | # production 11 | /build 12 | 13 | # public report data 14 | public/static/report 15 | 16 | # cache 17 | /.cache 18 | 19 | # misc 20 | .DS_Store 21 | *.pem 22 | dist 23 | 24 | # debug 25 | npm-debug.log* 26 | yarn-debug.log* 27 | yarn-error.log* 28 | 29 | # local env files 30 | .env*.local 31 | 32 | # typescript 33 | *.tsbuildinfo 34 | -------------------------------------------------------------------------------- /packages/visual-reporter/.npmignore: -------------------------------------------------------------------------------- 1 | # Node modules and lock files 2 | node_modules/ 3 | npm-debug.log 4 | yarn.lock 5 | package-lock.json 6 | 7 | # Test and coverage folders 8 | tests/ 9 | coverage/ 10 | 11 | # Build and temporary directories 12 | tmp/ 13 | temp/ 14 | out/ 15 | public/ 16 | build/static/report/ 17 | demo/ 18 | app/ 19 | scripts/ 20 | 21 | # Configuration files and scripts 22 | .env 23 | .gitignore 24 | .gitattributes 25 | .github/ 26 | .vscode/ 27 | .DS_Store 28 | .eslintrc.cjs 29 | .gitignore 30 | tsconfig.json 31 | tsconfig.scripts.json 32 | *.config.ts 33 | *.config.js 34 | 35 | *.mp4 36 | *.tsbuildinfo 37 | -------------------------------------------------------------------------------- /packages/visual-reporter/app/components/BrowserIcon.module.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/app/components/BrowserIcon.module.css -------------------------------------------------------------------------------- /packages/visual-reporter/app/components/Canvas.module.css: -------------------------------------------------------------------------------- 1 | .canvas { 2 | width: 50vw; 3 | height: 100%; 4 | } 5 | 6 | .canvas:nth-of-type(2) { 7 | border-left: 1px solid rgba(var(--foreground-rgb), 0.5); 8 | } 9 | 10 | 11 | @keyframes highlightAnimation { 12 | 0% { 13 | width: 20px; 14 | height: 20px; 15 | opacity: 1; 16 | } 17 | 18 | 100% { 19 | width: 100px; 20 | height: 100px; 21 | opacity: 0; 22 | } 23 | } 24 | 25 | .highlightCircle { 26 | position: absolute; 27 | border-radius: var(--border-radius-50); 28 | background-color: rgba(var(--primary-color-rgb), 1); 29 | pointer-events: none; 30 | animation: highlightAnimation 1s forwards; 31 | transform: translate(-50%, -50%); 32 | } 33 | -------------------------------------------------------------------------------- /packages/visual-reporter/app/components/Description.module.css: -------------------------------------------------------------------------------- 1 | .description { 2 | display: flex; 3 | flex-direction: column; 4 | justify-content: inherit; 5 | align-items: inherit; 6 | font-size: 0.85rem; 7 | width: 100%; 8 | z-index: 2; 9 | font-family: var(--font-mono); 10 | margin-bottom: 2rem; 11 | } 12 | 13 | .descriptionTitle { 14 | cursor: pointer; 15 | margin-bottom: 2rem; 16 | user-select: none; 17 | } 18 | 19 | .descriptionContainer { 20 | padding: 1rem 1.2rem; 21 | border-radius: var(--border-radius-large); 22 | background: rgba(var(--card-rgb), 0.1); 23 | border: 1px solid rgba(var(--card-border-rgb), 0.15); 24 | transition: background 200ms, border 200ms; 25 | margin-left: 2rem; 26 | } -------------------------------------------------------------------------------- /packages/visual-reporter/app/components/Header.module.css: -------------------------------------------------------------------------------- 1 | .navbarContainer { 2 | position: fixed; 3 | top: 0; 4 | height: 85px; 5 | background-color: var(--header-background); 6 | display: flex; 7 | flex-direction: column; 8 | width: 100%; 9 | z-index: 10; 10 | } 11 | 12 | .navbarInner { 13 | display: flex; 14 | flex-wrap: wrap; 15 | justify-content: space-between; 16 | width: 100%; 17 | } 18 | 19 | .navbarItems { 20 | align-items: center; 21 | display: flex; 22 | flex: 1; 23 | min-width: 0; 24 | } 25 | 26 | .navbarBrand { 27 | margin: 10px 10px 10px 25px; 28 | } 29 | 30 | .navbarItems h1 { 31 | padding: 0.25rem 0.75rem; 32 | text-wrap: nowrap; 33 | } -------------------------------------------------------------------------------- /packages/visual-reporter/app/components/LoadingContainer.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | display: flex; 3 | flex-direction: column; 4 | justify-content: flex-start; 5 | align-items: flex-start; 6 | width: 450px; 7 | border: 1px solid rgba(var(--foreground-rgb), 0.5); 8 | margin: 0 auto; 9 | padding: 10px; 10 | border-radius: var(--border-radius-large); 11 | } 12 | 13 | .header { 14 | display: flex; 15 | align-items: center; 16 | justify-content: center; 17 | width: 100%; 18 | margin: 10px 0; 19 | } 20 | 21 | .header h1 { 22 | margin-left: 5px; 23 | } 24 | 25 | .container p { 26 | padding-bottom: 10px; 27 | } 28 | 29 | .text { 30 | font-size: 18px; 31 | } 32 | 33 | .container ul { 34 | margin-left: 20px; 35 | } -------------------------------------------------------------------------------- /packages/visual-reporter/app/components/LoadingContainer.tsx: -------------------------------------------------------------------------------- 1 | import styles from './LoadingContainer.module.css' 2 | import logo from '~/images/logo-webdriver-io.png' 3 | 4 | const LoadingContainer = () => { 5 | return ( 6 |
7 |
8 | WebdriverIO Visual Report 14 |

Visual Report

15 |
16 |

Please wait while we create your report.

17 |
    18 |
  • Fetching data...
  • 19 |
  • Sorting data...
  • 20 |
  • Attaching thumbnails...
  • 21 |
  • Attaching snapshots...
  • 22 |
  • Stitching it all together...
  • 23 |
24 |
25 | ) 26 | } 27 | 28 | export default LoadingContainer 29 | -------------------------------------------------------------------------------- /packages/visual-reporter/app/components/Overlay.module.css: -------------------------------------------------------------------------------- 1 | .overlay { 2 | position: fixed; 3 | top: 0; 4 | left: 0; 5 | width: 100%; 6 | height: 100%; 7 | background: var(--white); 8 | display: flex; 9 | flex-direction: column; 10 | z-index: 1000; 11 | } 12 | 13 | .content { 14 | background: rgba(var(--foreground-rgb), 0.1); 15 | display: flex; 16 | flex: 1; 17 | flex-direction: row; 18 | overflow-y: auto; 19 | color: inherit; 20 | } 21 | 22 | .canvasContainer { 23 | display: flex; 24 | justify-content: center; 25 | align-items: center; 26 | flex: 1; 27 | position: relative; 28 | } 29 | 30 | @media (prefers-color-scheme: dark) { 31 | .overlay { 32 | background-color: var(--black); 33 | } 34 | } -------------------------------------------------------------------------------- /packages/visual-reporter/app/components/SelectCustomMultiValueContainer.module.css: -------------------------------------------------------------------------------- 1 | .ellipsis { 2 | display: flex; 3 | white-space: nowrap; 4 | overflow: hidden; 5 | text-overflow: ellipsis; 6 | max-width: 100px; 7 | } 8 | 9 | .overflowBadge {} -------------------------------------------------------------------------------- /packages/visual-reporter/app/components/SelectCustomMultiValueContainer.tsx: -------------------------------------------------------------------------------- 1 | import type { MultiValueGenericProps } from 'react-select' 2 | import { components } from 'react-select' 3 | import type { OptionType } from '../types/index.js' 4 | import styles from './SelectCustomMultiValueContainer.module.css' 5 | 6 | const MAX_DISPLAYED_BADGES = 1 7 | const SelectCustomMultiValueContainer = ( 8 | props: MultiValueGenericProps 9 | ) => { 10 | const { children, selectProps, data } = props 11 | const selectedValues = selectProps.value as OptionType[] 12 | const index = selectedValues.findIndex( 13 | (selectedOption) => selectedOption.value === data.value 14 | ) 15 | 16 | if (index < MAX_DISPLAYED_BADGES) { 17 | return ( 18 | 19 | {children} 20 | 21 | ) 22 | } 23 | 24 | if (index === MAX_DISPLAYED_BADGES) { 25 | const remainingBadgeCount = selectedValues.length - MAX_DISPLAYED_BADGES 26 | 27 | return
+{remainingBadgeCount}
28 | } 29 | 30 | return null 31 | } 32 | 33 | export default SelectCustomMultiValueContainer 34 | -------------------------------------------------------------------------------- /packages/visual-reporter/app/components/SelectHeader.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | display: grid; 3 | grid-template-columns: repeat(auto-fit, minmax(225px, 1fr)); 4 | gap: 1.5rem; 5 | margin: 0.25rem 25px 0.25rem 0.75rem; 6 | width: 100%; 7 | max-width: 1000px; 8 | } -------------------------------------------------------------------------------- /packages/visual-reporter/app/components/Test.module.css: -------------------------------------------------------------------------------- 1 | .test { 2 | margin-bottom: 2rem; 3 | } 4 | 5 | .test:last-child { 6 | margin-bottom: 0; 7 | } 8 | 9 | .testTitle { 10 | cursor: pointer; 11 | margin-bottom: 1rem; 12 | user-select: none; 13 | } 14 | 15 | .grid { 16 | display: grid; 17 | grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); 18 | gap: 1rem; 19 | width: 100%; 20 | } -------------------------------------------------------------------------------- /packages/visual-reporter/app/entry.client.tsx: -------------------------------------------------------------------------------- 1 | /** 2 | * By default, Remix will handle hydrating your app on the client for you. 3 | * You are free to delete this file if you'd like to, but if you ever want it revealed again, you can run `npx remix reveal` ✨ 4 | * For more information, see https://remix.run/file-conventions/entry.client 5 | */ 6 | 7 | import { RemixBrowser } from '@remix-run/react' 8 | import { startTransition, StrictMode } from 'react' 9 | import { hydrateRoot } from 'react-dom/client' 10 | 11 | startTransition(() => { 12 | hydrateRoot( 13 | document, 14 | 15 | 16 | 17 | ) 18 | }) 19 | -------------------------------------------------------------------------------- /packages/visual-reporter/app/hooks/useImageLoader.ts: -------------------------------------------------------------------------------- 1 | import { useEffect, useRef } from 'react' 2 | 3 | export const useImageLoader = ( 4 | imageSrc: string, 5 | onImageLoad: (image: HTMLImageElement) => void 6 | ) => { 7 | const imageRef = useRef(new Image()) 8 | 9 | useEffect(() => { 10 | const image = imageRef.current 11 | image.src = imageSrc 12 | 13 | image.onload = () => { 14 | onImageLoad(image) 15 | } 16 | 17 | return () => { 18 | image.onload = null 19 | } 20 | }, [imageSrc, onImageLoad]) 21 | 22 | return imageRef 23 | } 24 | -------------------------------------------------------------------------------- /packages/visual-reporter/app/images/logo-webdriver-io.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/app/images/logo-webdriver-io.png -------------------------------------------------------------------------------- /packages/visual-reporter/app/root.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | Links, 3 | Meta, 4 | Outlet, 5 | Scripts, 6 | ScrollRestoration, 7 | } from '@remix-run/react' 8 | import type { LinksFunction } from '@remix-run/node' 9 | import globalStylesHref from '~/styles/globals.css?url' 10 | 11 | export const links: LinksFunction = () => [ 12 | { rel: 'stylesheet', href: globalStylesHref } 13 | ] 14 | 15 | export function Layout({ children }: { children: React.ReactNode }) { 16 | return ( 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | {children} 26 | 27 | 28 | 29 | 30 | ) 31 | } 32 | 33 | export default function App() { 34 | return 35 | } 36 | -------------------------------------------------------------------------------- /packages/visual-reporter/app/styles/index.module.css: -------------------------------------------------------------------------------- 1 | .main { 2 | display: flex; 3 | flex-direction: column; 4 | min-height: 100%; 5 | padding-top: 50px; 6 | } 7 | 8 | .container { 9 | display: flex; 10 | flex-direction: column; 11 | padding: 6rem; 12 | min-height: 100vh; 13 | width: calc(100% - 100px); 14 | margin: 0 auto; 15 | } 16 | -------------------------------------------------------------------------------- /packages/visual-reporter/app/tailwind.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | html, 6 | body { 7 | @apply bg-white dark:bg-gray-950; 8 | 9 | @media (prefers-color-scheme: dark) { 10 | color-scheme: dark; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /packages/visual-reporter/app/utils/boundingBoxUtils.ts: -------------------------------------------------------------------------------- 1 | import type { BoundingBox } from '../types/index.js' 2 | 3 | export const getTransformedBoxes = ( 4 | boxes: BoundingBox[], 5 | drawWidth: number, 6 | drawHeight: number, 7 | drawX: number, 8 | drawY: number, 9 | imageWidth: number, 10 | imageHeight: number, 11 | scale: number 12 | ): BoundingBox[] => 13 | boxes.map((box) => ({ 14 | left: box.left * (drawWidth / imageWidth) * scale + drawX, 15 | top: box.top * (drawHeight / imageHeight) * scale + drawY, 16 | right: box.right * (drawWidth / imageWidth) * scale + drawX, 17 | bottom: box.bottom * (drawHeight / imageHeight) * scale + drawY, 18 | })) 19 | 20 | export const translateBox = ( 21 | box: BoundingBox, 22 | drawWidth: number, 23 | drawHeight: number, 24 | drawX: number, 25 | drawY: number, 26 | imageWidth: number, 27 | imageHeight: number, 28 | scale: number 29 | ): BoundingBox => ({ 30 | left: box.left * (drawWidth / imageWidth) * scale + drawX, 31 | top: box.top * (drawHeight / imageHeight) * scale + drawY, 32 | right: box.right * (drawWidth / imageWidth) * scale + drawX, 33 | bottom: box.bottom * (drawHeight / imageHeight) * scale + drawY, 34 | }) 35 | -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/android_googleapi_emulator/fullPage-EmulatorAndroidGoogleAPIPortraitChromeDriver13.0-384x640-VHTMLR-THUMBNAIL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/actual/android_googleapi_emulator/fullPage-EmulatorAndroidGoogleAPIPortraitChromeDriver13.0-384x640-VHTMLR-THUMBNAIL.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/android_googleapi_emulator/fullPage-EmulatorAndroidGoogleAPIPortraitChromeDriver13.0-384x640.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/actual/android_googleapi_emulator/fullPage-EmulatorAndroidGoogleAPIPortraitChromeDriver13.0-384x640.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/android_googleapi_emulator/fullPage-EmulatorAndroidGoogleAPIPortraitNativeWebScreenshot14.0-384x640-VHTMLR-THUMBNAIL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/actual/android_googleapi_emulator/fullPage-EmulatorAndroidGoogleAPIPortraitNativeWebScreenshot14.0-384x640-VHTMLR-THUMBNAIL.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/android_googleapi_emulator/fullPage-EmulatorAndroidGoogleAPIPortraitNativeWebScreenshot14.0-384x640.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/actual/android_googleapi_emulator/fullPage-EmulatorAndroidGoogleAPIPortraitNativeWebScreenshot14.0-384x640.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/android_googleapi_emulator/screenshot-EmulatorAndroidGoogleAPIPortraitChromeDriver13.0-384x640-VHTMLR-THUMBNAIL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/actual/android_googleapi_emulator/screenshot-EmulatorAndroidGoogleAPIPortraitChromeDriver13.0-384x640-VHTMLR-THUMBNAIL.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/android_googleapi_emulator/screenshot-EmulatorAndroidGoogleAPIPortraitChromeDriver13.0-384x640.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/actual/android_googleapi_emulator/screenshot-EmulatorAndroidGoogleAPIPortraitChromeDriver13.0-384x640.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/android_googleapi_emulator/screenshot-EmulatorAndroidGoogleAPIPortraitChromeDriver14.0-384x640-VHTMLR-THUMBNAIL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/actual/android_googleapi_emulator/screenshot-EmulatorAndroidGoogleAPIPortraitChromeDriver14.0-384x640-VHTMLR-THUMBNAIL.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/android_googleapi_emulator/screenshot-EmulatorAndroidGoogleAPIPortraitChromeDriver14.0-384x640.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/actual/android_googleapi_emulator/screenshot-EmulatorAndroidGoogleAPIPortraitChromeDriver14.0-384x640.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/android_googleapi_emulator/wdioLogo-EmulatorAndroidGoogleAPIPortraitChromeDriver13.0-384x640-VHTMLR-THUMBNAIL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/actual/android_googleapi_emulator/wdioLogo-EmulatorAndroidGoogleAPIPortraitChromeDriver13.0-384x640-VHTMLR-THUMBNAIL.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/android_googleapi_emulator/wdioLogo-EmulatorAndroidGoogleAPIPortraitChromeDriver13.0-384x640.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/actual/android_googleapi_emulator/wdioLogo-EmulatorAndroidGoogleAPIPortraitChromeDriver13.0-384x640.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/android_googleapi_emulator/wdioLogo-EmulatorAndroidGoogleAPIPortraitChromeDriver14.0-384x640-VHTMLR-THUMBNAIL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/actual/android_googleapi_emulator/wdioLogo-EmulatorAndroidGoogleAPIPortraitChromeDriver14.0-384x640-VHTMLR-THUMBNAIL.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/android_googleapi_emulator/wdioLogo-EmulatorAndroidGoogleAPIPortraitChromeDriver14.0-384x640.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/actual/android_googleapi_emulator/wdioLogo-EmulatorAndroidGoogleAPIPortraitChromeDriver14.0-384x640.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/android_googleapi_emulator/wdioLogo-EmulatorAndroidGoogleAPIPortraitNativeWebScreenshot14.0-384x640-VHTMLR-THUMBNAIL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/actual/android_googleapi_emulator/wdioLogo-EmulatorAndroidGoogleAPIPortraitNativeWebScreenshot14.0-384x640-VHTMLR-THUMBNAIL.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/android_googleapi_emulator/wdioLogo-EmulatorAndroidGoogleAPIPortraitNativeWebScreenshot14.0-384x640.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/actual/android_googleapi_emulator/wdioLogo-EmulatorAndroidGoogleAPIPortraitNativeWebScreenshot14.0-384x640.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/desktop_chrome/fullPage-chrome-latest-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/actual/desktop_chrome/fullPage-chrome-latest-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/desktop_chrome/viewportScreenshot-chrome-latest-1-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/actual/desktop_chrome/viewportScreenshot-chrome-latest-1-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/desktop_chrome/viewportScreenshot-chrome-latest-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/actual/desktop_chrome/viewportScreenshot-chrome-latest-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/desktop_chrome/wdioLogo-chrome-latest-1-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/actual/desktop_chrome/wdioLogo-chrome-latest-1-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/desktop_chrome/wdioLogo-chrome-latest-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/actual/desktop_chrome/wdioLogo-chrome-latest-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/desktop_firefox/tabbable-Firefox_latest-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/actual/desktop_firefox/tabbable-Firefox_latest-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/desktop_firefox/viewportScreenshot-Firefox_latest-1-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/actual/desktop_firefox/viewportScreenshot-Firefox_latest-1-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/desktop_firefox/viewportScreenshot-Firefox_latest-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/actual/desktop_firefox/viewportScreenshot-Firefox_latest-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/desktop_firefox/wdioLogo-Firefox_latest-1-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/actual/desktop_firefox/wdioLogo-Firefox_latest-1-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/desktop_firefox/wdioLogo-Firefox_latest-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/actual/desktop_firefox/wdioLogo-Firefox_latest-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/desktop_microsoftedge/viewportScreenshot-Microsoft_Edge_latest-1-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/actual/desktop_microsoftedge/viewportScreenshot-Microsoft_Edge_latest-1-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/desktop_microsoftedge/viewportScreenshot-Microsoft_Edge_latest-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/actual/desktop_microsoftedge/viewportScreenshot-Microsoft_Edge_latest-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/desktop_microsoftedge/wdioLogo-Microsoft_Edge_latest-1-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/actual/desktop_microsoftedge/wdioLogo-Microsoft_Edge_latest-1-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/desktop_microsoftedge/wdioLogo-Microsoft_Edge_latest-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/actual/desktop_microsoftedge/wdioLogo-Microsoft_Edge_latest-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/desktop_safari/viewportScreenshot-macOS12-16-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/actual/desktop_safari/viewportScreenshot-macOS12-16-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/desktop_safari/viewportScreenshot-macOS13-17-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/actual/desktop_safari/viewportScreenshot-macOS13-17-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/desktop_safari/wdioLogo-macOS12-16-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/actual/desktop_safari/wdioLogo-macOS12-16-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/desktop_safari/wdioLogo-macOS13-17-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/actual/desktop_safari/wdioLogo-macOS13-17-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/galaxy_tab_s7_plus_googleapi_emulator/screenshot-EmulatorGalaxyTabS7PlusGoogleAPIPortraitChromeDriver13.0-1002x1601.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/actual/galaxy_tab_s7_plus_googleapi_emulator/screenshot-EmulatorGalaxyTabS7PlusGoogleAPIPortraitChromeDriver13.0-1002x1601.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/galaxy_tab_s7_plus_googleapi_emulator/screenshot-EmulatorGalaxyTabS7PlusGoogleAPIPortraitNativeWebScreenshot12.0-1002x1601.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/actual/galaxy_tab_s7_plus_googleapi_emulator/screenshot-EmulatorGalaxyTabS7PlusGoogleAPIPortraitNativeWebScreenshot12.0-1002x1601.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/galaxy_tab_s7_plus_googleapi_emulator/wdioLogo-EmulatorGalaxyTabS7PlusGoogleAPIPortraitChromeDriver13.0-1002x1601.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/actual/galaxy_tab_s7_plus_googleapi_emulator/wdioLogo-EmulatorGalaxyTabS7PlusGoogleAPIPortraitChromeDriver13.0-1002x1601.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/ipad_(10th_generation)_simulator/screenshot-Ipad10thGenerationPortrait17-820x1180-report.json: -------------------------------------------------------------------------------- 1 | {"description":"@wdio/visual-service mobile web","test":"should compare a screen successful with a baseline","tag":"screenshot","instanceData":{"browser":{"name":"safari","version":"17.0"},"deviceName":"ipad (10th generation) simulator","platform":{"name":"ios","version":"17.0"}},"commandName":"checkScreen","framework":"mocha","boundingBoxes":{"diffBoundingBoxes":[],"ignoredBoxes":[{"bottom":148,"right":1640,"left":0,"top":0},{"bottom":2348,"right":1096,"left":544,"top":2330},{"bottom":0,"right":0,"left":0,"top":0}]},"fileData":{"actualFilePath":"/Users/wimselles/Git/wdio/visual-testing/.tmp/actual/ipad_(10th_generation)_simulator/screenshot-Ipad10thGenerationPortrait17-820x1180.png","baselineFilePath":"/Users/wimselles/Git/wdio/visual-testing/apps/baseline/ipad_(10th_generation)_simulator/screenshot-Ipad10thGenerationPortrait17-820x1180.png","fileName":"screenshot-Ipad10thGenerationPortrait17-820x1180.png","size":{"actual":{"height":1180,"width":820},"baseline":{"height":1180,"width":820}}},"misMatchPercentage":"0.00","rawMisMatchPercentage":0} -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/ipad_(10th_generation)_simulator/screenshot-Ipad10thGenerationPortrait17-820x1180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/actual/ipad_(10th_generation)_simulator/screenshot-Ipad10thGenerationPortrait17-820x1180.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/ipad_mini_(5th_generation)_simulator/screenshot-IpadMini5thGenerationPortrait17-768x1024-report.json: -------------------------------------------------------------------------------- 1 | {"description":"@wdio/visual-service mobile web","test":"should compare a screen successful with a baseline","tag":"screenshot","instanceData":{"browser":{"name":"safari","version":"17.0"},"deviceName":"ipad mini (5th generation) simulator","platform":{"name":"ios","version":"17.0"}},"commandName":"checkScreen","framework":"mocha","boundingBoxes":{"diffBoundingBoxes":[],"ignoredBoxes":[{"bottom":140,"right":1536,"left":0,"top":0},{"bottom":0,"right":0,"left":0,"top":0},{"bottom":0,"right":0,"left":0,"top":0}]},"fileData":{"actualFilePath":"/Users/wimselles/Git/wdio/visual-testing/.tmp/actual/ipad_mini_(5th_generation)_simulator/screenshot-IpadMini5thGenerationPortrait17-768x1024.png","baselineFilePath":"/Users/wimselles/Git/wdio/visual-testing/apps/baseline/ipad_mini_(5th_generation)_simulator/screenshot-IpadMini5thGenerationPortrait17-768x1024.png","fileName":"screenshot-IpadMini5thGenerationPortrait17-768x1024.png","size":{"actual":{"height":1024,"width":768},"baseline":{"height":1024,"width":768}}},"misMatchPercentage":"0.00","rawMisMatchPercentage":0} -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/ipad_mini_(5th_generation)_simulator/screenshot-IpadMini5thGenerationPortrait17-768x1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/actual/ipad_mini_(5th_generation)_simulator/screenshot-IpadMini5thGenerationPortrait17-768x1024.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/ipad_pro_(12.9_inch)_(5th_generation)_simulator/fullPage-IpadPro12.9Inch5thGenerationPortrait17-1024x1366.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/actual/ipad_pro_(12.9_inch)_(5th_generation)_simulator/fullPage-IpadPro12.9Inch5thGenerationPortrait17-1024x1366.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/ipad_pro_(12.9_inch)_(5th_generation)_simulator/screenshot-IpadPro12.9Inch5thGenerationPortrait17-1024x1366-report.json: -------------------------------------------------------------------------------- 1 | {"description":"@wdio/visual-service mobile web","test":"should compare a screen successful with a baseline","tag":"screenshot","instanceData":{"browser":{"name":"safari","version":"17.0"},"deviceName":"ipad pro (12.9 inch) (5th generation) simulator","platform":{"name":"ios","version":"17.0"}},"commandName":"checkScreen","framework":"mocha","boundingBoxes":{"diffBoundingBoxes":[],"ignoredBoxes":[{"bottom":148,"right":2048,"left":0,"top":0},{"bottom":2720,"right":1344,"left":704,"top":2702},{"bottom":0,"right":0,"left":0,"top":0}]},"fileData":{"actualFilePath":"/Users/wimselles/Git/wdio/visual-testing/.tmp/actual/ipad_pro_(12.9_inch)_(5th_generation)_simulator/screenshot-IpadPro12.9Inch5thGenerationPortrait17-1024x1366.png","baselineFilePath":"/Users/wimselles/Git/wdio/visual-testing/apps/baseline/ipad_pro_(12.9_inch)_(5th_generation)_simulator/screenshot-IpadPro12.9Inch5thGenerationPortrait17-1024x1366.png","fileName":"screenshot-IpadPro12.9Inch5thGenerationPortrait17-1024x1366.png","size":{"actual":{"height":1366,"width":1024},"baseline":{"height":1366,"width":1024}}},"misMatchPercentage":"0.00","rawMisMatchPercentage":0} -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/ipad_pro_(12.9_inch)_(5th_generation)_simulator/screenshot-IpadPro12.9Inch5thGenerationPortrait17-1024x1366.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/actual/ipad_pro_(12.9_inch)_(5th_generation)_simulator/screenshot-IpadPro12.9Inch5thGenerationPortrait17-1024x1366.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/iphone_14_pro_max_simulator/screenshot-Iphone14ProMaxPortrait16-430x932.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/actual/iphone_14_pro_max_simulator/screenshot-Iphone14ProMaxPortrait16-430x932.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/iphone_15_pro_max_simulator/screenshot-Iphone15ProMaxPortrait17-430x932.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/actual/iphone_15_pro_max_simulator/screenshot-Iphone15ProMaxPortrait17-430x932.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/iphone_15_simulator/fullPage-Iphone15Portrait17-393x852.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/actual/iphone_15_simulator/fullPage-Iphone15Portrait17-393x852.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/actual/iphone_15_simulator/screenshot-Iphone15Portrait17-393x852.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/actual/iphone_15_simulator/screenshot-Iphone15Portrait17-393x852.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/baseline/android_googleapi_emulator/fullPage-EmulatorAndroidGoogleAPIPortraitChromeDriver13.0-384x640.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/baseline/android_googleapi_emulator/fullPage-EmulatorAndroidGoogleAPIPortraitChromeDriver13.0-384x640.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/baseline/android_googleapi_emulator/fullPage-EmulatorAndroidGoogleAPIPortraitNativeWebScreenshot14.0-384x640.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/baseline/android_googleapi_emulator/fullPage-EmulatorAndroidGoogleAPIPortraitNativeWebScreenshot14.0-384x640.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/baseline/android_googleapi_emulator/screenshot-EmulatorAndroidGoogleAPIPortraitChromeDriver13.0-384x640.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/baseline/android_googleapi_emulator/screenshot-EmulatorAndroidGoogleAPIPortraitChromeDriver13.0-384x640.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/baseline/android_googleapi_emulator/screenshot-EmulatorAndroidGoogleAPIPortraitChromeDriver14.0-384x640.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/baseline/android_googleapi_emulator/screenshot-EmulatorAndroidGoogleAPIPortraitChromeDriver14.0-384x640.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/baseline/android_googleapi_emulator/screenshot-EmulatorAndroidGoogleAPIPortraitNativeWebScreenshot14.0-384x640.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/baseline/android_googleapi_emulator/screenshot-EmulatorAndroidGoogleAPIPortraitNativeWebScreenshot14.0-384x640.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/baseline/android_googleapi_emulator/wdioLogo-EmulatorAndroidGoogleAPIPortraitChromeDriver13.0-384x640.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/baseline/android_googleapi_emulator/wdioLogo-EmulatorAndroidGoogleAPIPortraitChromeDriver13.0-384x640.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/baseline/android_googleapi_emulator/wdioLogo-EmulatorAndroidGoogleAPIPortraitChromeDriver14.0-384x640.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/baseline/android_googleapi_emulator/wdioLogo-EmulatorAndroidGoogleAPIPortraitChromeDriver14.0-384x640.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/baseline/android_googleapi_emulator/wdioLogo-EmulatorAndroidGoogleAPIPortraitNativeWebScreenshot14.0-384x640.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/baseline/android_googleapi_emulator/wdioLogo-EmulatorAndroidGoogleAPIPortraitNativeWebScreenshot14.0-384x640.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/baseline/desktop_chrome/fullPage-chrome-latest-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/baseline/desktop_chrome/fullPage-chrome-latest-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/baseline/desktop_chrome/viewportScreenshot-chrome-latest-1-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/baseline/desktop_chrome/viewportScreenshot-chrome-latest-1-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/baseline/desktop_chrome/viewportScreenshot-chrome-latest-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/baseline/desktop_chrome/viewportScreenshot-chrome-latest-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/baseline/desktop_chrome/wdioLogo-chrome-latest-1-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/baseline/desktop_chrome/wdioLogo-chrome-latest-1-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/baseline/desktop_chrome/wdioLogo-chrome-latest-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/baseline/desktop_chrome/wdioLogo-chrome-latest-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/baseline/desktop_firefox/tabbable-Firefox_latest-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/baseline/desktop_firefox/tabbable-Firefox_latest-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/baseline/desktop_firefox/viewportScreenshot-Firefox_latest-1-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/baseline/desktop_firefox/viewportScreenshot-Firefox_latest-1-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/baseline/desktop_firefox/viewportScreenshot-Firefox_latest-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/baseline/desktop_firefox/viewportScreenshot-Firefox_latest-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/baseline/desktop_firefox/wdioLogo-Firefox_latest-1-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/baseline/desktop_firefox/wdioLogo-Firefox_latest-1-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/baseline/desktop_firefox/wdioLogo-Firefox_latest-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/baseline/desktop_firefox/wdioLogo-Firefox_latest-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/baseline/desktop_microsoftedge/viewportScreenshot-Microsoft_Edge_latest-1-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/baseline/desktop_microsoftedge/viewportScreenshot-Microsoft_Edge_latest-1-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/baseline/desktop_microsoftedge/viewportScreenshot-Microsoft_Edge_latest-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/baseline/desktop_microsoftedge/viewportScreenshot-Microsoft_Edge_latest-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/baseline/desktop_microsoftedge/wdioLogo-Microsoft_Edge_latest-1-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/baseline/desktop_microsoftedge/wdioLogo-Microsoft_Edge_latest-1-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/baseline/desktop_microsoftedge/wdioLogo-Microsoft_Edge_latest-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/baseline/desktop_microsoftedge/wdioLogo-Microsoft_Edge_latest-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/baseline/desktop_safari/viewportScreenshot-macOS12-16-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/baseline/desktop_safari/viewportScreenshot-macOS12-16-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/baseline/desktop_safari/viewportScreenshot-macOS13-17-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/baseline/desktop_safari/viewportScreenshot-macOS13-17-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/baseline/desktop_safari/wdioLogo-macOS12-16-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/baseline/desktop_safari/wdioLogo-macOS12-16-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/baseline/desktop_safari/wdioLogo-macOS13-17-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/baseline/desktop_safari/wdioLogo-macOS13-17-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/baseline/galaxy_tab_s7_plus_googleapi_emulator/screenshot-EmulatorGalaxyTabS7PlusGoogleAPIPortraitChromeDriver13.0-1002x1601.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/baseline/galaxy_tab_s7_plus_googleapi_emulator/screenshot-EmulatorGalaxyTabS7PlusGoogleAPIPortraitChromeDriver13.0-1002x1601.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/baseline/galaxy_tab_s7_plus_googleapi_emulator/screenshot-EmulatorGalaxyTabS7PlusGoogleAPIPortraitNativeWebScreenshot12.0-1002x1601.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/baseline/galaxy_tab_s7_plus_googleapi_emulator/screenshot-EmulatorGalaxyTabS7PlusGoogleAPIPortraitNativeWebScreenshot12.0-1002x1601.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/baseline/galaxy_tab_s7_plus_googleapi_emulator/wdioLogo-EmulatorGalaxyTabS7PlusGoogleAPIPortraitChromeDriver13.0-1002x1601.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/baseline/galaxy_tab_s7_plus_googleapi_emulator/wdioLogo-EmulatorGalaxyTabS7PlusGoogleAPIPortraitChromeDriver13.0-1002x1601.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/baseline/ipad_(10th_generation)_simulator/screenshot-Ipad10thGenerationPortrait17-820x1180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/baseline/ipad_(10th_generation)_simulator/screenshot-Ipad10thGenerationPortrait17-820x1180.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/baseline/ipad_mini_(5th_generation)_simulator/screenshot-IpadMini5thGenerationPortrait17-768x1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/baseline/ipad_mini_(5th_generation)_simulator/screenshot-IpadMini5thGenerationPortrait17-768x1024.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/baseline/ipad_pro_(12.9_inch)_(5th_generation)_simulator/fullPage-IpadPro12.9Inch5thGenerationPortrait17-1024x1366.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/baseline/ipad_pro_(12.9_inch)_(5th_generation)_simulator/fullPage-IpadPro12.9Inch5thGenerationPortrait17-1024x1366.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/baseline/ipad_pro_(12.9_inch)_(5th_generation)_simulator/screenshot-IpadPro12.9Inch5thGenerationPortrait17-1024x1366.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/baseline/ipad_pro_(12.9_inch)_(5th_generation)_simulator/screenshot-IpadPro12.9Inch5thGenerationPortrait17-1024x1366.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/baseline/iphone_14_pro_max_simulator/screenshot-Iphone14ProMaxPortrait16-430x932.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/baseline/iphone_14_pro_max_simulator/screenshot-Iphone14ProMaxPortrait16-430x932.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/baseline/iphone_15_pro_max_simulator/screenshot-Iphone15ProMaxPortrait17-430x932.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/baseline/iphone_15_pro_max_simulator/screenshot-Iphone15ProMaxPortrait17-430x932.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/baseline/iphone_15_simulator/fullPage-Iphone15Portrait17-393x852.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/baseline/iphone_15_simulator/fullPage-Iphone15Portrait17-393x852.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/baseline/iphone_15_simulator/screenshot-Iphone15Portrait17-393x852.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/baseline/iphone_15_simulator/screenshot-Iphone15Portrait17-393x852.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/diff/android_googleapi_emulator/fullPage-EmulatorAndroidGoogleAPIPortraitChromeDriver13.0-384x640-VHTMLR-THUMBNAIL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/diff/android_googleapi_emulator/fullPage-EmulatorAndroidGoogleAPIPortraitChromeDriver13.0-384x640-VHTMLR-THUMBNAIL.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/diff/android_googleapi_emulator/fullPage-EmulatorAndroidGoogleAPIPortraitChromeDriver13.0-384x640.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/diff/android_googleapi_emulator/fullPage-EmulatorAndroidGoogleAPIPortraitChromeDriver13.0-384x640.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/diff/android_googleapi_emulator/fullPage-EmulatorAndroidGoogleAPIPortraitNativeWebScreenshot14.0-384x640-VHTMLR-THUMBNAIL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/diff/android_googleapi_emulator/fullPage-EmulatorAndroidGoogleAPIPortraitNativeWebScreenshot14.0-384x640-VHTMLR-THUMBNAIL.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/diff/android_googleapi_emulator/fullPage-EmulatorAndroidGoogleAPIPortraitNativeWebScreenshot14.0-384x640.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/diff/android_googleapi_emulator/fullPage-EmulatorAndroidGoogleAPIPortraitNativeWebScreenshot14.0-384x640.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/diff/android_googleapi_emulator/screenshot-EmulatorAndroidGoogleAPIPortraitChromeDriver13.0-384x640-VHTMLR-THUMBNAIL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/diff/android_googleapi_emulator/screenshot-EmulatorAndroidGoogleAPIPortraitChromeDriver13.0-384x640-VHTMLR-THUMBNAIL.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/diff/android_googleapi_emulator/screenshot-EmulatorAndroidGoogleAPIPortraitChromeDriver13.0-384x640.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/diff/android_googleapi_emulator/screenshot-EmulatorAndroidGoogleAPIPortraitChromeDriver13.0-384x640.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/diff/android_googleapi_emulator/screenshot-EmulatorAndroidGoogleAPIPortraitChromeDriver14.0-384x640-VHTMLR-THUMBNAIL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/diff/android_googleapi_emulator/screenshot-EmulatorAndroidGoogleAPIPortraitChromeDriver14.0-384x640-VHTMLR-THUMBNAIL.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/diff/android_googleapi_emulator/screenshot-EmulatorAndroidGoogleAPIPortraitChromeDriver14.0-384x640.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/diff/android_googleapi_emulator/screenshot-EmulatorAndroidGoogleAPIPortraitChromeDriver14.0-384x640.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/diff/desktop_chrome/fullPage-chrome-latest-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/diff/desktop_chrome/fullPage-chrome-latest-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/diff/desktop_chrome/viewportScreenshot-chrome-latest-1-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/diff/desktop_chrome/viewportScreenshot-chrome-latest-1-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/diff/desktop_chrome/viewportScreenshot-chrome-latest-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/diff/desktop_chrome/viewportScreenshot-chrome-latest-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/diff/desktop_firefox/tabbable-Firefox_latest-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/diff/desktop_firefox/tabbable-Firefox_latest-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/diff/desktop_firefox/viewportScreenshot-Firefox_latest-1-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/diff/desktop_firefox/viewportScreenshot-Firefox_latest-1-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/diff/desktop_firefox/viewportScreenshot-Firefox_latest-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/diff/desktop_firefox/viewportScreenshot-Firefox_latest-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/diff/desktop_microsoftedge/viewportScreenshot-Microsoft_Edge_latest-1-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/diff/desktop_microsoftedge/viewportScreenshot-Microsoft_Edge_latest-1-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/diff/desktop_microsoftedge/viewportScreenshot-Microsoft_Edge_latest-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/diff/desktop_microsoftedge/viewportScreenshot-Microsoft_Edge_latest-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/diff/desktop_safari/viewportScreenshot-macOS12-16-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/diff/desktop_safari/viewportScreenshot-macOS12-16-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/diff/desktop_safari/viewportScreenshot-macOS13-17-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/diff/desktop_safari/viewportScreenshot-macOS13-17-1366x768.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/diff/galaxy_tab_s7_plus_googleapi_emulator/fullPage-EmulatorGalaxyTabS7PlusGoogleAPIPortraitChromeDriver13.0-1002x1601.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/diff/galaxy_tab_s7_plus_googleapi_emulator/fullPage-EmulatorGalaxyTabS7PlusGoogleAPIPortraitChromeDriver13.0-1002x1601.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/diff/galaxy_tab_s7_plus_googleapi_emulator/screenshot-EmulatorGalaxyTabS7PlusGoogleAPIPortraitChromeDriver13.0-1002x1601.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/diff/galaxy_tab_s7_plus_googleapi_emulator/screenshot-EmulatorGalaxyTabS7PlusGoogleAPIPortraitChromeDriver13.0-1002x1601.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/diff/ipad_pro_(12.9_inch)_(5th_generation)_simulator/fullPage-IpadPro12.9Inch5thGenerationPortrait17-1024x1366.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/diff/ipad_pro_(12.9_inch)_(5th_generation)_simulator/fullPage-IpadPro12.9Inch5thGenerationPortrait17-1024x1366.png -------------------------------------------------------------------------------- /packages/visual-reporter/demo/diff/iphone_15_simulator/fullPage-Iphone15Portrait17-393x852.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/demo/diff/iphone_15_simulator/fullPage-Iphone15Portrait17-393x852.png -------------------------------------------------------------------------------- /packages/visual-reporter/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | // tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /packages/visual-reporter/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/visual-reporter/public/favicon.ico -------------------------------------------------------------------------------- /packages/visual-reporter/scripts/utils/cliUtils.ts: -------------------------------------------------------------------------------- 1 | export function clearPreviousPromptLines(message: string) { 2 | const terminalWidth = process.stdout.columns || 80 3 | const lineCount = Math.ceil(message.length / terminalWidth) 4 | 5 | for (let i = 0; i < lineCount; i++) { 6 | process.stdout.write('\u001b[1A') 7 | process.stdout.write('\u001b[2K') 8 | } 9 | } 10 | 11 | export function cleanUpEnvironmentVariables() { 12 | delete process.env.VISUAL_REPORT_OUTPUT_JSON_PATH 13 | delete process.env.VISUAL_REPORT_DEBUG_LEVEL 14 | delete process.env.VISUAL_REPORT_LOCAL_DEV 15 | delete process.env.VISUAL_REPORT_REPORTER_FOLDER 16 | } 17 | 18 | export function getArgValue(argName: string): string { 19 | const arg = process.argv.find(arg => arg.startsWith(`${argName}=`)) 20 | 21 | return arg ? arg.split('=')[1] : '' 22 | } 23 | -------------------------------------------------------------------------------- /packages/visual-reporter/scripts/utils/constants.ts: -------------------------------------------------------------------------------- 1 | export const CONFIG_HELPER_INTRO = ` 2 | ================================= 3 | 🤖 WDIO Visual Reporter Wizard 🧙 4 | ================================= 5 | 6 | This utility will help you generate a visual report for your WebdriverIO Visual Tests. To make use of this utility, you need to have the 'output.json' file generated by the Visual Testing service. This file is only generated when you have the following in your configuration: 7 | 8 | export const config = { 9 | // ... 10 | services: [ 11 | [ 12 | // Also installed as a dependency 13 | "visual", 14 | { 15 | createJsonReportFiles: true, 16 | }, 17 | ], 18 | ], 19 | }, 20 | } 21 | 22 | For more information, please refer to the WebdriverIO Visual Testing documentation: https://webdriver.io/docs/visual-testing. 23 | 24 | The goal of this utility is to help you generate a visual report by helping you 25 | 26 | 1. find the 'output.json' file 27 | 2. provide the location where you want the visual report to be created 28 | 3. generate the visual report 29 | 4. view the visual report by starting a local server 30 | ` 31 | -------------------------------------------------------------------------------- /packages/visual-reporter/tailwind.config.ts: -------------------------------------------------------------------------------- 1 | import type { Config } from 'tailwindcss' 2 | 3 | export default { 4 | content: ['./app/**/{**,.client,.server}/**/*.{js,jsx,ts,tsx}'], 5 | theme: { 6 | extend: { 7 | fontFamily: { 8 | sans: [ 9 | '"Inter"', 10 | 'ui-sans-serif', 11 | 'system-ui', 12 | 'sans-serif', 13 | '"Apple Color Emoji"', 14 | '"Segoe UI Emoji"', 15 | '"Segoe UI Symbol"', 16 | '"Noto Color Emoji"', 17 | ], 18 | }, 19 | }, 20 | }, 21 | plugins: [], 22 | } satisfies Config 23 | -------------------------------------------------------------------------------- /packages/visual-reporter/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "include": [ 3 | "**/*.ts", 4 | "**/*.tsx", 5 | "**/.server/**/*.ts", 6 | "**/.server/**/*.tsx", 7 | "**/.client/**/*.ts", 8 | "**/.client/**/*.tsx" 9 | ], 10 | "compilerOptions": { 11 | "lib": ["DOM", "DOM.Iterable", "ES2022"], 12 | "types": ["@remix-run/node", "vite/client"], 13 | "isolatedModules": true, 14 | "esModuleInterop": true, 15 | "jsx": "react-jsx", 16 | "module": "ESNext", 17 | "moduleResolution": "Bundler", 18 | "resolveJsonModule": true, 19 | "target": "ES2022", 20 | "strict": true, 21 | "allowJs": true, 22 | "skipLibCheck": true, 23 | "forceConsistentCasingInFileNames": true, 24 | "baseUrl": ".", 25 | "paths": { 26 | "~/*": ["./app/*"] 27 | }, 28 | 29 | // Vite takes care of building everything, not tsc. 30 | "noEmit": true 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /packages/visual-reporter/tsconfig.scripts.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "noEmit": false, 5 | "outDir": "./dist", 6 | "module": "ESNext", 7 | "moduleResolution": "Node", 8 | "target": "ES6", 9 | "rootDir": "./scripts", 10 | "jsx": "preserve" 11 | }, 12 | "include": ["scripts/**/*"], 13 | "exclude": ["node_modules"] 14 | } 15 | -------------------------------------------------------------------------------- /packages/visual-reporter/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { vitePlugin as remix } from '@remix-run/dev' 2 | import { defineConfig } from 'vite' 3 | import tsconfigPaths from 'vite-tsconfig-paths' 4 | 5 | const baseName = process.env.GITHUB_PAGES || '' 6 | 7 | export default defineConfig({ 8 | plugins: [ 9 | remix({ 10 | ...(baseName && { basename: baseName }), 11 | future: { 12 | v3_fetcherPersist: true, 13 | v3_relativeSplatPath: true, 14 | v3_throwAbortReason: true, 15 | }, 16 | ssr: false, 17 | }), 18 | tsconfigPaths(), 19 | ], 20 | ...(baseName && { base: baseName }), 21 | css: { 22 | modules: { 23 | localsConvention: 'camelCaseOnly', 24 | }, 25 | }, 26 | }) 27 | -------------------------------------------------------------------------------- /packages/visual-service/.npmignore: -------------------------------------------------------------------------------- 1 | tsconfig.json 2 | src 3 | tests 4 | *.tgz 5 | -------------------------------------------------------------------------------- /packages/visual-service/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 OpenJS Foundation 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /packages/visual-service/README.md: -------------------------------------------------------------------------------- 1 | # WebdriverIO Visual Service 2 | 3 | > A WebdriverIO service for image comparison / visual regression testing. 4 | 5 | ## Installation 6 | 7 | The easiest way is to keep `@wdio/visual-service` as a dev-dependency in your `package.json`, via: 8 | 9 | ```sh 10 | npm install @wdio/visual-service --save-dev 11 | ``` 12 | 13 | Instructions on how to get started can be found in the [visual testing](https://webdriver.io/docs/visual-testing) docs on the WebdriverIO project page. 14 | -------------------------------------------------------------------------------- /packages/visual-service/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@wdio/visual-service", 3 | "author": "Wim Selles - wswebcreation", 4 | "description": "Image comparison / visual regression testing for WebdriverIO", 5 | "version": "8.0.4", 6 | "license": "MIT", 7 | "homepage": "https://webdriver.io/docs/visual-testing", 8 | "repository": { 9 | "type": "git", 10 | "url": "https://github.com/webdriverio/visual-testing.git" 11 | }, 12 | "keywords": [ 13 | "webdriverio", 14 | "visual", 15 | "regression", 16 | "image", 17 | "comparison" 18 | ], 19 | "exports": "./dist/index.js", 20 | "type": "module", 21 | "types": "./dist/index.d.ts", 22 | "scripts": { 23 | "build": "run-s clean build:*", 24 | "build:tsc": "tsc --project ./tsconfig.json", 25 | "clean": "rimraf coverage dist .tmp", 26 | "watch": "pnpm run build:tsc -w" 27 | }, 28 | "dependencies": { 29 | "@wdio/globals": "^9.13.0", 30 | "@wdio/logger": "^9.4.4", 31 | "@wdio/types": "^9.14.0", 32 | "expect-webdriverio": "^5.1.0", 33 | "webdriver-image-comparison": "workspace:*" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /packages/visual-service/src/constants.ts: -------------------------------------------------------------------------------- 1 | export const V6_CLIP_SELECTOR = '#root > :first-child:not(script):not(style)' 2 | export const CLIP_SELECTOR = '#storybook-root > :first-child:not(script):not(style)' 3 | export const NUM_SHARDS = 1 4 | export const PAGE_OPTIONS_MAP: { [key: string]: string } = { 5 | 'saveScreen': 'saveScreenOptions', 6 | 'saveFullPageScreen': 'saveFullPageOptions', 7 | 'saveTabbablePage': 'saveTabbableOptions', 8 | 'checkScreen': 'checkScreenOptions', 9 | 'checkFullPageScreen': 'checkFullPageOptions', 10 | 'checkTabbablePage': 'checkTabbableOptions' 11 | } 12 | -------------------------------------------------------------------------------- /packages/visual-service/src/wrapWithContext.ts: -------------------------------------------------------------------------------- 1 | import type { InstanceData } from 'webdriver-image-comparison' 2 | import type { WrapWithContextOptions } from './types.js' 3 | import { getInstanceData } from './utils.js' 4 | 5 | /** 6 | * Wrap the command with the context manager 7 | * This will make sure that the context manager is updated when needed 8 | * and that the command is executed in the correct context 9 | */ 10 | 11 | export function wrapWithContext any>(opts: WrapWithContextOptions): () => Promise> { 12 | const { browser, command, contextManager, getArgs } = opts 13 | 14 | return async function (this: WebdriverIO.Browser): Promise> { 15 | if (contextManager.needsUpdate) { 16 | const instanceData: InstanceData = await getInstanceData({ 17 | currentBrowser: browser, 18 | initialDeviceRectangles: contextManager.getViewportContext(), 19 | isNativeContext: contextManager.isNativeContext, 20 | }) 21 | 22 | contextManager.setViewPortContext(instanceData.deviceRectangles) 23 | } 24 | 25 | const finalArgs = getArgs() 26 | 27 | return command.apply(this, finalArgs) 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /packages/visual-service/tests/__snapshots__/service.test.ts.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[`@wdio/visual-service > before > should fail registering custom matchers 1`] = ` 4 | [MockFunction spy] { 5 | "calls": [ 6 | [ 7 | "Expect package not found. This means that the custom matchers \`toMatchScreenSnapshot|toMatchFullPageSnapshot|toMatchElementSnapshot|toMatchTabbablePageSnapshot\` are not added and can not be used. Please make sure to add it to your \`package.json\` if you want to use the Visual custom matchers.", 8 | ], 9 | ], 10 | "results": [ 11 | { 12 | "type": "return", 13 | "value": undefined, 14 | }, 15 | ], 16 | } 17 | `; 18 | -------------------------------------------------------------------------------- /packages/visual-service/tests/__snapshots__/storybook.utils.mocked.test.ts.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[`Storybook utils with mocked internals > createTestContent with Dependency Injection > calls itFunction with correct arguments for each story and accumulates results 1`] = ` 4 | "Test for example-button--primary 5 | Test for example-button--secondary 6 | Test for example-button--large 7 | " 8 | `; 9 | -------------------------------------------------------------------------------- /packages/visual-service/tests/storybook/__snapshots__/launcher.test.ts.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[`Visual Launcher for Storybook > onPrepare > should process all default data 1`] = `"Running \`@wdio/visual-service\` in Storybook mode."`; 4 | 5 | exports[`Visual Launcher for Storybook > onPrepare > should process all default data 2`] = `"Clearing the current capabilities."`; 6 | 7 | exports[`Visual Launcher for Storybook > onPrepare > should throw an error for storybook and cucumber 1`] = ` 8 | " 9 | 10 | Running Storybook in combination with the cucumber framework adapter is not supported. 11 | Only Jasmine and Mocha are supported. 12 | 13 | " 14 | `; 15 | 16 | exports[`Visual Launcher for Storybook > onPrepare > should throw an error for storybook multiremote 1`] = ` 17 | " 18 | 19 | Running Storybook in combination with Multiremote is not supported. 20 | Remove your \`capabilities\` property from your config or assign an empty array to it like \`capabilities: [],\`. 21 | 22 | " 23 | `; 24 | -------------------------------------------------------------------------------- /packages/visual-service/tests/storybook/__snapshots__/storybook.utils.mocked.test.ts.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[`Storybook utils with mocked internals > createTestContent with Dependency Injection > calls itFunction with correct arguments for each story and accumulates results 1`] = ` 4 | "Test for example-button--primary 5 | Test for example-button--secondary 6 | Test for example-button--large 7 | " 8 | `; 9 | -------------------------------------------------------------------------------- /packages/visual-service/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "rootDir": "./src", 5 | "outDir": "./dist", 6 | "baseUrl": ".", 7 | "types": ["expect-webdriverio"] 8 | }, 9 | "include": ["./src/**/*"] 10 | } 11 | -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/.npmignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .idea/ 3 | node_modules/ 4 | coverage/ 5 | .tmp/ 6 | .gitignore 7 | perfecto.config.json 8 | local.config.json 9 | localBaseline/ 10 | docs/ 11 | .eslintcache 12 | tsconfig.json 13 | src 14 | *.tgz 15 | -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 OpenJS Foundation 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/README.md: -------------------------------------------------------------------------------- 1 | WebDriver Image Comparison 2 | ========================== 3 | 4 | > an image compare module that can be used for different NodeJS Test automation frameworks that support the [WebDriver protocol](https://www.w3.org/TR/webdriver2/). 5 | 6 | ## Installation 7 | 8 | The easiest way is to keep `webdriver-image-comparison` as a dev-dependency in your `package.json`, via: 9 | 10 | ```sh 11 | npm install webdriver-image-comparison --save-dev 12 | ``` 13 | 14 | Instructions on how to get started can be found in the [visual testing](https://webdriver.io/docs/visual-testing) docs on the WebdriverIO project page. 15 | -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/assets/ios/ipadair4th.ipadair5th-bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/webdriver-image-comparison/assets/ios/ipadair4th.ipadair5th-bottom.png -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/assets/ios/ipadair4th.ipadair5th-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/webdriver-image-comparison/assets/ios/ipadair4th.ipadair5th-top.png -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/assets/ios/ipadmini6th-bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/webdriver-image-comparison/assets/ios/ipadmini6th-bottom.png -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/assets/ios/ipadmini6th-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/webdriver-image-comparison/assets/ios/ipadmini6th-top.png -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/assets/ios/ipadpro11-bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/webdriver-image-comparison/assets/ios/ipadpro11-bottom.png -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/assets/ios/ipadpro11-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/webdriver-image-comparison/assets/ios/ipadpro11-top.png -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/assets/ios/ipadpro129-bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/webdriver-image-comparison/assets/ios/ipadpro129-bottom.png -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/assets/ios/ipadpro129-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/webdriver-image-comparison/assets/ios/ipadpro129-top.png -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/assets/ios/iphone11promax-bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/webdriver-image-comparison/assets/ios/iphone11promax-bottom.png -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/assets/ios/iphone11promax-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/webdriver-image-comparison/assets/ios/iphone11promax-top.png -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/assets/ios/iphone12.iphone12pro-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/webdriver-image-comparison/assets/ios/iphone12.iphone12pro-top.png -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/assets/ios/iphone12.iphone12pro.iphone13.iphone13pro.iphone14-bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/webdriver-image-comparison/assets/ios/iphone12.iphone12pro.iphone13.iphone13pro.iphone14-bottom.png -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/assets/ios/iphone12mini-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/webdriver-image-comparison/assets/ios/iphone12mini-top.png -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/assets/ios/iphone12mini.iphone13mini-bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/webdriver-image-comparison/assets/ios/iphone12mini.iphone13mini-bottom.png -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/assets/ios/iphone12promax-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/webdriver-image-comparison/assets/ios/iphone12promax-top.png -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/assets/ios/iphone12promax.iphone13promax.iphone14plus-bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/webdriver-image-comparison/assets/ios/iphone12promax.iphone13promax.iphone14plus-bottom.png -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/assets/ios/iphone13.iphone13pro.iphone14-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/webdriver-image-comparison/assets/ios/iphone13.iphone13pro.iphone14-top.png -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/assets/ios/iphone13mini-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/webdriver-image-comparison/assets/ios/iphone13mini-top.png -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/assets/ios/iphone13promax.iphone14plus-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/webdriver-image-comparison/assets/ios/iphone13promax.iphone14plus-top.png -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/assets/ios/iphone14pro-bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/webdriver-image-comparison/assets/ios/iphone14pro-bottom.png -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/assets/ios/iphone14pro-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/webdriver-image-comparison/assets/ios/iphone14pro-top.png -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/assets/ios/iphone14promax-bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/webdriver-image-comparison/assets/ios/iphone14promax-bottom.png -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/assets/ios/iphone14promax-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/webdriver-image-comparison/assets/ios/iphone14promax-top.png -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/assets/ios/iphone15-bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/webdriver-image-comparison/assets/ios/iphone15-bottom.png -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/assets/ios/iphone15-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/webdriver-image-comparison/assets/ios/iphone15-top.png -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/assets/ios/iphonex.iphonexs.iphone11pro-bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/webdriver-image-comparison/assets/ios/iphonex.iphonexs.iphone11pro-bottom.png -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/assets/ios/iphonex.iphonexs.iphone11pro-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/webdriver-image-comparison/assets/ios/iphonex.iphonexs.iphone11pro-top.png -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/assets/ios/iphonexr.iphone11-bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/webdriver-image-comparison/assets/ios/iphonexr.iphone11-bottom.png -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/assets/ios/iphonexr.iphone11-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/webdriver-image-comparison/assets/ios/iphonexr.iphone11-top.png -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/assets/ios/iphonexsmax-bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/webdriver-image-comparison/assets/ios/iphonexsmax-bottom.png -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/assets/ios/iphonexsmax-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/packages/webdriver-image-comparison/assets/ios/iphonexsmax-top.png -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "webdriver-image-comparison", 3 | "version": "9.0.4", 4 | "author": "Wim Selles - wswebcreation", 5 | "description": "An image compare module that can be used for different NodeJS Test automation frameworks that support the webdriver protocol", 6 | "keywords": [], 7 | "license": "MIT", 8 | "main": "./dist/index.js", 9 | "types": "./dist/index.d.ts", 10 | "type": "module", 11 | "homepage": "https://webdriver.io/docs/visual-testing", 12 | "repository": { 13 | "type": "git", 14 | "url": "https://github.com/webdriverio/visual-testing.git" 15 | }, 16 | "bugs": { 17 | "url": "https://github.com/webdriverio/visual-testing/issues" 18 | }, 19 | "scripts": { 20 | "build": "run-s clean:build build:*", 21 | "build:tsc": "tsc --project ./tsconfig.json", 22 | "clean:build": "rimraf coverage dist .tmp", 23 | "clean:watch": "rimraf coverage .tmp", 24 | "watch": "run-s clean:watch watch:tsc", 25 | "watch:tsc": "pnpm run build:tsc -w" 26 | }, 27 | "dependencies": { 28 | "fs-extra": "^11.3.0", 29 | "jimp": "^1.6.0", 30 | "@wdio/logger": "^9.4.4" 31 | }, 32 | "devDependencies": { 33 | "@types/fs-extra": "^11.0.4", 34 | "webdriverio": "^9.14.0" 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/src/base.interfaces.ts: -------------------------------------------------------------------------------- 1 | export interface Folders { 2 | actualFolder: string; // The actual folder where the current screenshots need to be saved 3 | baselineFolder: string; // The baseline folder where the baseline screenshots can be found 4 | diffFolder: string; // The diff folder where the differences are saved 5 | } 6 | -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/src/clientSideScripts/__snapshots__/getElementPositionTopScreenNativeMobile.test.ts.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[`getElementPositionTopScreenNativeMobile > should get the element position to the top of the screen for a mobile browser 1`] = ` 4 | { 5 | "height": 120, 6 | "width": 120, 7 | "x": 100, 8 | "y": 104, 9 | } 10 | `; 11 | 12 | exports[`getElementPositionTopScreenNativeMobile > should get the element position to the top of the screen for an app in landscape mode 1`] = ` 13 | { 14 | "height": 120, 15 | "width": 120, 16 | "x": 144, 17 | "y": 10, 18 | } 19 | `; 20 | 21 | exports[`getElementPositionTopScreenNativeMobile > should get the element position to the top of the screen for an app in portrait mode 1`] = ` 22 | { 23 | "height": 120, 24 | "width": 120, 25 | "x": 100, 26 | "y": 10, 27 | } 28 | `; 29 | -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/src/clientSideScripts/__snapshots__/getElementPositionTopWindow.test.ts.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[`getElementPositionTopWindow > should the the element position to the top of the window 1`] = ` 4 | { 5 | "height": 120, 6 | "width": 120, 7 | "x": 100, 8 | "y": 10, 9 | } 10 | `; 11 | -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/src/clientSideScripts/__snapshots__/hideScrollbars.test.ts.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[`hideScrollBars > should be able to hide and show the scrollbars 1`] = `""`; 4 | 5 | exports[`hideScrollBars > should be able to hide and show the scrollbars 2`] = `"hidden"`; 6 | 7 | exports[`hideScrollBars > should be able to hide and show the scrollbars 3`] = `""`; 8 | -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/src/clientSideScripts/checkMetaTag.test.ts: -------------------------------------------------------------------------------- 1 | // @vitest-environment jsdom 2 | 3 | import { describe, it, expect, beforeEach } from 'vitest' 4 | import { checkMetaTag } from './checkMetaTag.js' 5 | 6 | describe('checkMetaTag', () => { 7 | beforeEach(() => { 8 | document.head.innerHTML = '' 9 | }) 10 | 11 | it('should add a viewport meta tag when not present', () => { 12 | expect(document.querySelector('meta[name="viewport"]')).toBeNull() 13 | 14 | checkMetaTag() 15 | 16 | const meta = document.querySelector('meta[name="viewport"]') as HTMLMetaElement 17 | expect(meta).not.toBeNull() 18 | expect(meta?.content).toBe('width=device-width, initial-scale=1') 19 | }) 20 | 21 | it('should not add a viewport meta tag if one already exists', () => { 22 | const existing = document.createElement('meta') 23 | existing.name = 'viewport' 24 | existing.content = 'custom' 25 | document.head.appendChild(existing) 26 | 27 | checkMetaTag() 28 | 29 | const metas = Array.from(document.querySelectorAll('meta[name="viewport"]')) as HTMLMetaElement[] 30 | expect(metas.length).toBe(1) 31 | expect(metas[0].content).toBe('custom') 32 | }) 33 | }) 34 | -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/src/clientSideScripts/checkMetaTag.ts: -------------------------------------------------------------------------------- 1 | export function checkMetaTag() { 2 | const meta = document.querySelector("meta[name='viewport']") 3 | if (!meta) { 4 | const newMeta = document.createElement('meta') 5 | newMeta.name = 'viewport' 6 | newMeta.content = 'width=device-width, initial-scale=1' 7 | document.head.appendChild(newMeta) 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/src/clientSideScripts/customCss.interfaces.ts: -------------------------------------------------------------------------------- 1 | export interface CssOptions { 2 | // The address bar padding that needs to be added 3 | addressBarPadding: number; 4 | // En/disable the animations and the input caret 5 | disableCSSAnimation: boolean; 6 | // En/disable blinking caret 7 | disableBlinkingCursor: boolean; 8 | // The id that can identify the css style 9 | id: string; 10 | // The tool bar padding that needs to be added 11 | toolBarPadding: number; 12 | } 13 | -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/src/clientSideScripts/drawTabbableOnCanvas.interfaces.ts: -------------------------------------------------------------------------------- 1 | export interface ElementCoordinate { 2 | x: number; 3 | y: number; 4 | } 5 | -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/src/clientSideScripts/elementPosition.interfaces.ts: -------------------------------------------------------------------------------- 1 | import type { RectanglesOutput } from '../methods/rectangles.interfaces.js' 2 | 3 | export type ElementPosition = RectanglesOutput; 4 | -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/src/clientSideScripts/getBoundingClientRect.test.ts: -------------------------------------------------------------------------------- 1 | // @vitest-environment jsdom 2 | 3 | import { describe, it, expect } from 'vitest' 4 | import { getBoundingClientRect } from './getBoundingClientRect.js' 5 | 6 | describe('getBoundingClientRect', () => { 7 | it('should return rounded values of the bounding client rect', () => { 8 | const element = document.createElement('div') 9 | Object.defineProperty(element, 'getBoundingClientRect', { 10 | value: () => ({ 11 | x: 10.7, 12 | y: 20.4, 13 | width: 100.9, 14 | height: 200.3, 15 | top: 20.4, 16 | left: 10.7, 17 | bottom: 220.7, 18 | right: 110.9, 19 | toJSON: () => {}, 20 | }), 21 | }) 22 | 23 | const result = getBoundingClientRect(element) 24 | 25 | expect(result).toEqual({ 26 | x: 11, 27 | y: 20, 28 | width: 101, 29 | height: 200, 30 | }) 31 | }) 32 | }) 33 | -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/src/clientSideScripts/getBoundingClientRect.ts: -------------------------------------------------------------------------------- 1 | import type { ElementPosition } from './elementPosition.interfaces.js' 2 | 3 | /** 4 | * Get the element position relative to the viewport 5 | */ 6 | export function getBoundingClientRect( 7 | element: HTMLElement, 8 | ): ElementPosition { 9 | const { height, width, x, y } = element.getBoundingClientRect() 10 | 11 | return { 12 | height: Math.round(height), 13 | width: Math.round(width), 14 | x: Math.round(x), 15 | y: Math.round(y), 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/src/clientSideScripts/getElementPositionTopDom.test.ts: -------------------------------------------------------------------------------- 1 | // @vitest-environment jsdom 2 | 3 | import { describe, it } from 'vitest' 4 | import getElementPositionTopDom from './getElementPositionTopDom.js' 5 | 6 | describe('getElementPositionTopDom', () => { 7 | it('should get the element position to the top of the Dom', () => { 8 | document.body.innerHTML = '
' + ' Hello' + '
' 9 | 10 | getElementPositionTopDom(document.querySelector('#username')!) 11 | // I can't mock the offsetHeight, offsetWidth, offsetLeft, offsetTop with Jest, so there is no verification here, sorry :( 12 | // If you know a way, please add it here ;-) 13 | }) 14 | }) 15 | -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/src/clientSideScripts/getElementPositionTopDom.ts: -------------------------------------------------------------------------------- 1 | import type { ElementPosition } from './elementPosition.interfaces.js' 2 | 3 | /** 4 | * Get the position of the element to the top of the DOM 5 | */ 6 | export default function getElementPositionTopDom(element: HTMLElement): ElementPosition { 7 | return { 8 | height: element.offsetHeight, 9 | width: element.offsetWidth, 10 | x: element.offsetLeft, 11 | y: element.offsetTop, 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/src/clientSideScripts/getMobileWebviewClickAndDimensions.ts: -------------------------------------------------------------------------------- 1 | import type { RectanglesOutput } from '../methods/rectangles.interfaces.js' 2 | 3 | /** 4 | * Get the click and dimensions of the mobile webview and remove the overlay 5 | */ 6 | export function getMobileWebviewClickAndDimensions(overlaySelector: string):RectanglesOutput { 7 | const overlay = document.querySelector(overlaySelector) as HTMLElement | null 8 | const defaultValue = { y: 0, x: 0, width: 0, height: 0 } 9 | 10 | if (!overlay || !overlay.dataset.icsWebviewData) { 11 | return defaultValue 12 | } 13 | 14 | overlay.remove() 15 | 16 | try { 17 | return JSON.parse(overlay.dataset.icsWebviewData) 18 | } catch { 19 | return defaultValue 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/src/clientSideScripts/hideScrollbars.test.ts: -------------------------------------------------------------------------------- 1 | // @vitest-environment jsdom 2 | 3 | import { describe, it, expect } from 'vitest' 4 | import hideScrollBars from './hideScrollbars.js' 5 | 6 | describe('hideScrollBars', () => { 7 | it('should be able to hide and show the scrollbars', () => { 8 | expect(document.body.style.overflow).toMatchSnapshot() 9 | 10 | hideScrollBars(true) 11 | 12 | expect(document.body.style.overflow).toMatchSnapshot() 13 | 14 | hideScrollBars(false) 15 | 16 | expect(document.body.style.overflow).toMatchSnapshot() 17 | }) 18 | }) 19 | -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/src/clientSideScripts/hideScrollbars.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Hide the scrollbars 3 | * 4 | * There is a `try/catch` for this issue 5 | * https://github.com/wswebcreation/webdriver-image-comparison/issues/30 6 | * Some browsers don't wrap XML into a body element, so this will fail 7 | */ 8 | export default function hideScrollBars(hide: boolean): void { 9 | try { 10 | document.body.style.overflow = hide ? 'hidden' : '' 11 | } catch (_e) { 12 | // Do nothing 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/src/clientSideScripts/removeElementFromDom.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Remove a DOM element from the DOM 3 | */ 4 | export default function removeElementFromDom(id: string): void { 5 | const elem = document.querySelector(`#${id}`) 6 | if (elem) { 7 | elem.parentNode!.removeChild(elem) 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/src/clientSideScripts/scrollToPosition.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Scroll to y = variable position in the screen 3 | */ 4 | /* istanbul ignore next */ 5 | export default function scrollToPosition(yPosition: number): void { 6 | const htmlNode = document.querySelector('html')! 7 | const bodyNode = document.querySelector('body')! 8 | 9 | if (htmlNode.scrollHeight > htmlNode.clientHeight) { 10 | htmlNode.scrollTop = yPosition 11 | // Did we scroll to the right position? 12 | if (htmlNode.scrollTop === yPosition) { 13 | return 14 | } 15 | } 16 | 17 | // If not then try the body 18 | if (bodyNode.scrollHeight > bodyNode.clientHeight) { 19 | bodyNode.scrollTop = yPosition 20 | // Did we scroll to the right position? 21 | if (bodyNode.scrollTop === yPosition) { 22 | return 23 | } 24 | } 25 | 26 | // If not then try the document 27 | (document.scrollingElement || document.documentElement).scrollTop = yPosition 28 | } 29 | -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/src/clientSideScripts/statusAddressToolBarOffsets.interfaces.ts: -------------------------------------------------------------------------------- 1 | import type { RectanglesOutput } from '../methods/rectangles.interfaces.js' 2 | 3 | export interface StatusAddressToolBarOffsets { 4 | leftSidePadding: RectanglesOutput; 5 | rightSidePadding: RectanglesOutput; 6 | safeArea: number; 7 | screenHeight: number; 8 | screenWidth: number; 9 | statusAddressBar: RectanglesOutput; 10 | toolBar: RectanglesOutput; 11 | } 12 | -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/src/clientSideScripts/toggleTextTransparency.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Add or remove the transparency from the text 3 | */ 4 | export default function toggleTextTransparency(enableTransparency: boolean): void { 5 | if (enableTransparency) { 6 | const elements = document.querySelectorAll('body *:not(script):not(style)') 7 | elements.forEach(el => { 8 | el.style.setProperty('color', 'transparent', 'important') 9 | }) 10 | return 11 | } 12 | 13 | const elements = document.querySelectorAll('body [color]:not(script):not(style)') 14 | elements.forEach(el => { 15 | el.style.removeProperty('color') 16 | }) 17 | } 18 | -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/src/clientSideScripts/waitForFonts.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Wait for the fonts to be loaded, do this for a max of 11 seconds 3 | * 4 | * NOTE: writing this with promises instead of async/await because it fails with 5 | * `javascript error: __awaiter is not defined` when running in the browser 6 | */ 7 | export default function waitForFonts(): Promise { 8 | return new Promise((resolve, reject) => { 9 | const timeoutPromise = new Promise((_, reject) => { 10 | setTimeout(() => { 11 | reject(new Error('Font loading timed out')) 12 | }, 11000) 13 | }) 14 | 15 | Promise.race([document.fonts.ready, timeoutPromise]) 16 | .then(() => { 17 | resolve('All fonts have loaded') 18 | }) 19 | .catch(reject) 20 | }) 21 | } 22 | -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/src/commands/checkElement.ts: -------------------------------------------------------------------------------- 1 | import type { ImageCompareResult } from '../methods/images.interfaces.js' 2 | import checkAppElement from './checkAppElement.js' 3 | import checkWebElement from './checkWebElement.js' 4 | import type { InternalCheckElementMethodOptions } from './check.interfaces.js' 5 | 6 | /** 7 | * Compare an image of the element 8 | */ 9 | export default async function checkElement( 10 | { 11 | methods, 12 | instanceData, 13 | folders, 14 | element, 15 | tag, 16 | checkElementOptions, 17 | isNativeContext, 18 | testContext, 19 | }: InternalCheckElementMethodOptions 20 | ): Promise { 21 | return isNativeContext 22 | ? checkAppElement({ methods, instanceData, folders, element, tag, checkElementOptions, isNativeContext, testContext }) 23 | : checkWebElement({ methods, instanceData, folders, element, tag, checkElementOptions, testContext }) 24 | } 25 | -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/src/commands/checkScreen.ts: -------------------------------------------------------------------------------- 1 | import type { ImageCompareResult } from '../methods/images.interfaces.js' 2 | import checkAppScreen from './checkAppScreen.js' 3 | import checkWebScreen from './checkWebScreen.js' 4 | import type { InternalCheckScreenMethodOptions } from './check.interfaces.js' 5 | 6 | /** 7 | * Compare an image of the viewport of the screen 8 | */ 9 | export default async function checkScreen( 10 | { 11 | methods, 12 | instanceData, 13 | folders, 14 | tag, 15 | checkScreenOptions, 16 | isNativeContext, 17 | testContext, 18 | }: InternalCheckScreenMethodOptions 19 | ): Promise { 20 | return isNativeContext 21 | ? checkAppScreen({ methods, instanceData, folders, tag, checkScreenOptions, isNativeContext, testContext }) 22 | : checkWebScreen({ methods, instanceData, folders, tag, checkScreenOptions, isNativeContext, testContext }) 23 | } 24 | -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/src/commands/saveElement.ts: -------------------------------------------------------------------------------- 1 | import type { ScreenshotOutput } from '../helpers/afterScreenshot.interfaces.js' 2 | import type { InternalSaveElementMethodOptions } from './save.interfaces.js' 3 | import saveAppElement from './saveAppElement.js' 4 | import saveWebElement from './saveWebElement.js' 5 | 6 | /** 7 | * Saves an image of an element 8 | */ 9 | export default async function saveElement( 10 | { 11 | methods, 12 | instanceData, 13 | folders, 14 | element, 15 | tag, 16 | saveElementOptions, 17 | isNativeContext, 18 | }: InternalSaveElementMethodOptions 19 | ): Promise { 20 | return isNativeContext 21 | ? saveAppElement({ methods, instanceData, folders, element, tag, saveElementOptions, isNativeContext }) 22 | : saveWebElement({ methods, instanceData, folders, element, tag, saveElementOptions }) 23 | } 24 | -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/src/commands/saveScreen.ts: -------------------------------------------------------------------------------- 1 | import type { ScreenshotOutput } from '../helpers/afterScreenshot.interfaces.js' 2 | import saveAppScreen from './saveAppScreen.js' 3 | import saveWebScreen from './saveWebScreen.js' 4 | import type { InternalSaveScreenMethodOptions } from './save.interfaces.js' 5 | 6 | /** 7 | * Saves an image of the viewport of the desktop browser or the screen of a mobile device 8 | */ 9 | export default async function saveScreen( 10 | { 11 | methods, 12 | instanceData, 13 | folders, 14 | tag, 15 | saveScreenOptions, 16 | isNativeContext, 17 | }: InternalSaveScreenMethodOptions 18 | ): Promise { 19 | return isNativeContext 20 | ? saveAppScreen({ methods, instanceData, folders, tag, saveScreenOptions, isNativeContext }) 21 | : saveWebScreen({ methods, instanceData, folders, tag, saveScreenOptions, isNativeContext }) 22 | } 23 | -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/src/commands/tabbable.interfaces.ts: -------------------------------------------------------------------------------- 1 | import type { DefaultOptions } from '../helpers/options.interfaces.js' 2 | import type { CheckFullPageMethodOptions, SaveFullPageMethodOptions } from './fullPage.interfaces.js' 3 | 4 | export interface SaveTabbableOptions { 5 | wic: DefaultOptions; 6 | method: SaveFullPageMethodOptions; 7 | } 8 | export interface CheckTabbableOptions { 9 | wic: DefaultOptions; 10 | method: CheckFullPageMethodOptions; 11 | } 12 | 13 | export interface TabbableOptions { 14 | circle?: CircleOptions; 15 | line?: LineOptions; 16 | } 17 | export interface CircleOptions { 18 | backgroundColor?: string; 19 | borderColor?: string; 20 | borderWidth?: number; 21 | fontColor?: string; 22 | fontFamily?: string; 23 | fontSize?: number; 24 | size?: number; 25 | showNumber?: boolean; 26 | } 27 | export interface LineOptions { 28 | color?: string; 29 | width?: number; 30 | } 31 | -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/src/helpers/beforeScreenshot.interfaces.ts: -------------------------------------------------------------------------------- 1 | import type { EnrichedInstanceData, InstanceData } from '../methods/instanceData.interfaces.js' 2 | 3 | export interface BeforeScreenshotOptions { 4 | // The instance data 5 | instanceData: InstanceData; 6 | // The padding that needs to be added to the address bar on iOS and Android to do a proper cutout of the the viewport. 7 | addressBarShadowPadding: number; 8 | // Disable the blinking cursor 9 | disableBlinkingCursor: boolean; 10 | // Disable all css animations 11 | disableCSSAnimation: boolean; 12 | // Make all text on a page transparent to only focus on the layout 13 | enableLayoutTesting: boolean; 14 | // Hide all scrollbars 15 | noScrollBars: boolean; 16 | // The padding that needs to be added to the tool bar on iOS and Android 17 | toolBarShadowPadding: number; 18 | // Elements that need to be hidden (visibility: hidden) before saving a screenshot 19 | hideElements: HTMLElement[]; 20 | // Elements that need to be removed (display: none) before saving a screenshot 21 | removeElements: HTMLElement[]; 22 | // Wait for the fonts to be loaded 23 | waitForFontsLoaded: boolean; 24 | } 25 | 26 | export type BeforeScreenshotResult = EnrichedInstanceData; 27 | -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/src/helpers/constants.interfaces.ts: -------------------------------------------------------------------------------- 1 | export interface AndroidOffsets { 2 | [key: number]: { 3 | // The height of the status bar 4 | STATUS_BAR: number; 5 | // The height of the address bar 6 | ADDRESS_BAR: number; 7 | // The height of the tool bar 8 | TOOL_BAR: number; 9 | }; 10 | } 11 | 12 | enum IosDeviceEnum { 13 | IPAD = 'IPAD', 14 | IPHONE = 'IPHONE', 15 | } 16 | 17 | enum OrientationEnum { 18 | LANDSCAPE = 'LANDSCAPE', 19 | PORTRAIT = 'PORTRAIT', 20 | } 21 | 22 | export type IosOffsets = { 23 | [key in IosDeviceEnum]: { 24 | // The portrait height of the device 25 | [key: number]: { 26 | [key in OrientationEnum]: { 27 | ADDRESS_BAR: number; 28 | HOME_BAR: { 29 | x: number; 30 | y: number; 31 | height: number; 32 | width: number; 33 | }; 34 | SAFE_AREA: number; 35 | STATUS_BAR: number; 36 | }; 37 | }; 38 | }; 39 | }; 40 | -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/src/resemble/compareImages.d.ts: -------------------------------------------------------------------------------- 1 | import type { ComparisonOptions, ComparisonResult } from './compare.interfaces.ts' 2 | 3 | /** 4 | * The API under Node is the same as on the `resemble.compare` but promise based 5 | */ 6 | declare function compareImages( 7 | image1: string | ImageData | Buffer, 8 | image2: string | ImageData | Buffer, 9 | options: ComparisonOptions, 10 | ): Promise; 11 | 12 | export default compareImages 13 | -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/src/resemble/compareImages.ts: -------------------------------------------------------------------------------- 1 | // @ts-ignore: Ignoring type checking for this module import 2 | import * as resembleJimp from './resemble.jimp.cjs' 3 | import type { CompareData, ComparisonOptions } from './compare.interfaces.js' 4 | 5 | export default async function compareImages( 6 | image1: Buffer, 7 | image2: Buffer, 8 | options: ComparisonOptions 9 | ): Promise { 10 | /** 11 | * Resemble.js implemented in the way that scales 2nd images to the size of 1st. 12 | * Experimentally proven that downscaling images produces more accurate result than upscaling 13 | */ 14 | const { imageToCompare1, imageToCompare2 } = 15 | options.scaleToSameSize && image1.length > image2.length 16 | ? { 17 | imageToCompare1: image2, 18 | imageToCompare2: image1, 19 | } 20 | : { imageToCompare1: image1, imageToCompare2: image2 } 21 | 22 | try { 23 | const data = await resembleJimp.default.compare(imageToCompare1, imageToCompare2, options) 24 | return data 25 | } catch (err) { 26 | throw err 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /packages/webdriver-image-comparison/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "allowSyntheticDefaultImports": true, 5 | "allowJs": true, 6 | "rootDir": "./src", 7 | "outDir": "./dist", 8 | "baseUrl": "." 9 | }, 10 | "include": ["./src/**/*.ts", "./src/resemble/resemble.jimp.cjs"] 11 | } 12 | -------------------------------------------------------------------------------- /pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | # pnpm-workspace.yaml 2 | packages: 3 | - "packages/webdriver-image-comparison" 4 | - "packages/visual-service" 5 | - "packages/ocr-service" 6 | - "packages/visual-reporter" 7 | - "packages/visual-remix-reporter" 8 | -------------------------------------------------------------------------------- /tests/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "plugins": ["wdio"], 3 | "env": { 4 | "mocha": true, 5 | "browser": true 6 | }, 7 | "extends": [ 8 | "eslint:recommended", 9 | "plugin:wdio/recommended", 10 | "../.eslintrc.cjs" 11 | ], 12 | "rules": { 13 | "wdio/no-pause": "off" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /tests/configs/wdio.local.init.conf.ts: -------------------------------------------------------------------------------- 1 | import { config as localDesktopConfig } from './wdio.local.desktop.conf.ts' 2 | 3 | export const config: Omit = { 4 | ...localDesktopConfig, 5 | // ===== 6 | // Specs 7 | // ===== 8 | specs: ['../specs/init.spec.ts'], 9 | } 10 | -------------------------------------------------------------------------------- /tests/configs/wdio.saucelabs.app.conf.ts: -------------------------------------------------------------------------------- 1 | import { config as sharedSauceConfig } from './wdio.saucelabs.shared.conf.ts' 2 | import { sauceIosSimApp } from './sauce.ios.sims.app.ts' 3 | import { sauceAndroidEmusApp } from './sauce.android.emus.app.js' 4 | 5 | const buildIdentifier = process.env.CI 6 | ? `App-${process.env.GITHUB_WORKFLOW} - ${process.env.GITHUB_JOB}` 7 | : `Local App-build-${new Date().getTime()}` 8 | 9 | export const config: WebdriverIO.Config = { 10 | ...sharedSauceConfig, 11 | // ============ 12 | // Capabilities 13 | // ============ 14 | capabilities: [ 15 | ...(!process.env.SAUCE_ENV || process.env.SAUCE_ENV === 'sims' 16 | ? sauceIosSimApp({ 17 | buildName: buildIdentifier, 18 | }) 19 | : []), 20 | ...(!process.env.SAUCE_ENV || process.env.SAUCE_ENV === 'emu' 21 | ? sauceAndroidEmusApp({ 22 | buildName: buildIdentifier, 23 | }) 24 | : []), 25 | ], 26 | } 27 | -------------------------------------------------------------------------------- /tests/configs/wdio.shared.conf.ts: -------------------------------------------------------------------------------- 1 | export const config: Omit = { 2 | // 3 | // ==================== 4 | // Runner Configuration 5 | // ==================== 6 | // WebdriverIO supports running e2e tests as well as unit and component tests. 7 | runner: 'local', 8 | // ============ 9 | // Capabilities 10 | // ============ 11 | maxInstances: 25, 12 | 13 | // =================== 14 | // Test Configurations 15 | // =================== 16 | logLevel: 'silent', 17 | baseUrl: 'http://guinea-pig.webdriver.io/image-compare.html', 18 | waitforTimeout: 15000, 19 | connectionRetryTimeout: 180 * 1000, 20 | connectionRetryCount: 0, 21 | framework: 'mocha', 22 | // Options to be passed to Mocha. 23 | // See the full list at http://mochajs.org/ 24 | mochaOpts: { 25 | ui: 'bdd', 26 | timeout: 10 * 60 * 1000, 27 | }, 28 | reporters: ['spec'], 29 | specFileRetriesDelay: 0, 30 | 31 | // ===== 32 | // Hooks 33 | // ===== 34 | before: async (_capabilities, _specs, browser) => { 35 | // Set the default screensize 36 | if (!browser.isMobile) { 37 | await browser.setWindowSize(1366, 768) 38 | } 39 | }, 40 | } 41 | -------------------------------------------------------------------------------- /tests/helpers/copy.ts: -------------------------------------------------------------------------------- 1 | import { copyFileSync, mkdirSync } from 'node:fs' 2 | import { dirname } from 'node:path' 3 | 4 | export default function copy(source: string, target: string) { 5 | const targetDir = dirname(target) 6 | 7 | mkdirSync(targetDir, { recursive: true }) 8 | 9 | copyFileSync(source, target) 10 | } 11 | -------------------------------------------------------------------------------- /tests/helpers/fileExists.ts: -------------------------------------------------------------------------------- 1 | import { accessSync } from 'node:fs' 2 | 3 | /** 4 | * Check if a file exists 5 | */ 6 | export function fileExists(filePath: string) { 7 | try { 8 | console.log('Checking file:', filePath) 9 | accessSync(filePath) 10 | return true 11 | } catch (err) { 12 | console.log('An error occurred while checking the file path:', err) 13 | return false 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/desktop_chrome/bidiEmulatedFullPage-chrome-latest-320x658.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/desktop_chrome/bidiEmulatedFullPage-chrome-latest-320x658.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/desktop_chrome/bidiEmulatedViewportScreenshot-chrome-latest-320x658.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/desktop_chrome/bidiEmulatedViewportScreenshot-chrome-latest-320x658.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/desktop_chrome/bidiEmulatedWdioLogo-chrome-latest-320x658.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/desktop_chrome/bidiEmulatedWdioLogo-chrome-latest-320x658.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/desktop_chrome/bidiLegacyEmulatedFullPage-chrome-latest-320x658.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/desktop_chrome/bidiLegacyEmulatedFullPage-chrome-latest-320x658.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/desktop_chrome/examplePageFail-chrome-latest-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/desktop_chrome/examplePageFail-chrome-latest-1366x768.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/desktop_chrome/fullPage-chrome-latest-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/desktop_chrome/fullPage-chrome-latest-1366x768.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/desktop_chrome/legacyEmulatedViewportScreenshot-chrome-latest-320x658.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/desktop_chrome/legacyEmulatedViewportScreenshot-chrome-latest-320x658.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/desktop_chrome/legacyEmulatedWdioLogo-chrome-latest-320x658.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/desktop_chrome/legacyEmulatedWdioLogo-chrome-latest-320x658.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/desktop_chrome/tabbable-chrome-latest-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/desktop_chrome/tabbable-chrome-latest-1366x768.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/desktop_chrome/viewportScreenshot-chrome-latest-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/desktop_chrome/viewportScreenshot-chrome-latest-1366x768.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/desktop_chrome/wdioLogo-chrome-latest-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/desktop_chrome/wdioLogo-chrome-latest-1366x768.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/desktop_firefox/fullPage-Firefox_latest-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/desktop_firefox/fullPage-Firefox_latest-1366x768.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/desktop_firefox/tabbable-Firefox_latest-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/desktop_firefox/tabbable-Firefox_latest-1366x768.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/desktop_firefox/viewportScreenshot-Firefox_latest-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/desktop_firefox/viewportScreenshot-Firefox_latest-1366x768.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/desktop_firefox/wdioLogo-Firefox_latest-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/desktop_firefox/wdioLogo-Firefox_latest-1366x768.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/desktop_microsoftedge/fullPage-Microsoft_Edge_latest-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/desktop_microsoftedge/fullPage-Microsoft_Edge_latest-1366x768.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/desktop_microsoftedge/tabbable-Microsoft_Edge_latest-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/desktop_microsoftedge/tabbable-Microsoft_Edge_latest-1366x768.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/desktop_microsoftedge/viewportScreenshot-Microsoft_Edge_latest-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/desktop_microsoftedge/viewportScreenshot-Microsoft_Edge_latest-1366x768.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/desktop_microsoftedge/wdioLogo-Microsoft_Edge_latest-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/desktop_microsoftedge/wdioLogo-Microsoft_Edge_latest-1366x768.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/desktop_safari/fullPage-SafariLatest-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/desktop_safari/fullPage-SafariLatest-1366x768.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/desktop_safari/tabbable-SafariLatest-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/desktop_safari/tabbable-SafariLatest-1366x768.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/desktop_safari/viewportScreenshot-SafariLatest-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/desktop_safari/viewportScreenshot-SafariLatest-1366x768.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/desktop_safari/wdioLogo-SafariLatest-1366x768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/desktop_safari/wdioLogo-SafariLatest-1366x768.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/galaxy_tab_s8/fullPage-EmulatorGalaxyTabS8LandscapeNativeWebScreenshot13-1707x1067.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/galaxy_tab_s8/fullPage-EmulatorGalaxyTabS8LandscapeNativeWebScreenshot13-1707x1067.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/galaxy_tab_s8/fullPage-EmulatorGalaxyTabS8LandscapeNativeWebScreenshot14-1707x1067.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/galaxy_tab_s8/fullPage-EmulatorGalaxyTabS8LandscapeNativeWebScreenshot14-1707x1067.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/galaxy_tab_s8/fullPage-EmulatorGalaxyTabS8PortraitNativeWebScreenshot13-1067x1707.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/galaxy_tab_s8/fullPage-EmulatorGalaxyTabS8PortraitNativeWebScreenshot13-1067x1707.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/galaxy_tab_s8/fullPage-EmulatorGalaxyTabS8PortraitNativeWebScreenshot14-1067x1707.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/galaxy_tab_s8/fullPage-EmulatorGalaxyTabS8PortraitNativeWebScreenshot14-1067x1707.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/galaxy_tab_s8/screenshot-EmulatorGalaxyTabS8LandscapeNativeWebScreenshot13-1707x1067.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/galaxy_tab_s8/screenshot-EmulatorGalaxyTabS8LandscapeNativeWebScreenshot13-1707x1067.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/galaxy_tab_s8/screenshot-EmulatorGalaxyTabS8LandscapeNativeWebScreenshot14-1707x1067.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/galaxy_tab_s8/screenshot-EmulatorGalaxyTabS8LandscapeNativeWebScreenshot14-1707x1067.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/galaxy_tab_s8/screenshot-EmulatorGalaxyTabS8PortraitNativeWebScreenshot13-1067x1707.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/galaxy_tab_s8/screenshot-EmulatorGalaxyTabS8PortraitNativeWebScreenshot13-1067x1707.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/galaxy_tab_s8/screenshot-EmulatorGalaxyTabS8PortraitNativeWebScreenshot14-1067x1707.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/galaxy_tab_s8/screenshot-EmulatorGalaxyTabS8PortraitNativeWebScreenshot14-1067x1707.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/galaxy_tab_s8/screenshot-landscape-EmulatorGalaxyTabS8PortraitNativeWebScreenshot13-1707x1067.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/galaxy_tab_s8/screenshot-landscape-EmulatorGalaxyTabS8PortraitNativeWebScreenshot13-1707x1067.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/galaxy_tab_s8/screenshot-landscape-EmulatorGalaxyTabS8PortraitNativeWebScreenshot14-1707x1067.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/galaxy_tab_s8/screenshot-landscape-EmulatorGalaxyTabS8PortraitNativeWebScreenshot14-1707x1067.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/galaxy_tab_s8/screenshot-portrait-EmulatorGalaxyTabS8LandscapeNativeWebScreenshot13-1067x1707.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/galaxy_tab_s8/screenshot-portrait-EmulatorGalaxyTabS8LandscapeNativeWebScreenshot13-1067x1707.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/galaxy_tab_s8/screenshot-portrait-EmulatorGalaxyTabS8LandscapeNativeWebScreenshot14-1067x1707.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/galaxy_tab_s8/screenshot-portrait-EmulatorGalaxyTabS8LandscapeNativeWebScreenshot14-1067x1707.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/galaxy_tab_s8/wdioLogo-EmulatorGalaxyTabS8LandscapeNativeWebScreenshot13-1707x1067.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/galaxy_tab_s8/wdioLogo-EmulatorGalaxyTabS8LandscapeNativeWebScreenshot13-1707x1067.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/galaxy_tab_s8/wdioLogo-EmulatorGalaxyTabS8LandscapeNativeWebScreenshot14-1707x1067.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/galaxy_tab_s8/wdioLogo-EmulatorGalaxyTabS8LandscapeNativeWebScreenshot14-1707x1067.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/galaxy_tab_s8/wdioLogo-EmulatorGalaxyTabS8PortraitNativeWebScreenshot13-1067x1707.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/galaxy_tab_s8/wdioLogo-EmulatorGalaxyTabS8PortraitNativeWebScreenshot13-1067x1707.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/galaxy_tab_s8/wdioLogo-EmulatorGalaxyTabS8PortraitNativeWebScreenshot14-1067x1707.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/galaxy_tab_s8/wdioLogo-EmulatorGalaxyTabS8PortraitNativeWebScreenshot14-1067x1707.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/iphone_13_mini/fullPage-Iphone13MiniLandscape17-375x812.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/iphone_13_mini/fullPage-Iphone13MiniLandscape17-375x812.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/iphone_13_mini/fullPage-Iphone13MiniPortrait17-375x812.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/iphone_13_mini/fullPage-Iphone13MiniPortrait17-375x812.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/iphone_13_mini/screenshot-Iphone13MiniLandscape17-375x812.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/iphone_13_mini/screenshot-Iphone13MiniLandscape17-375x812.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/iphone_13_mini/screenshot-Iphone13MiniPortrait17-375x812.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/iphone_13_mini/screenshot-Iphone13MiniPortrait17-375x812.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/iphone_13_mini/screenshot-landscape-Iphone13MiniPortrait17-375x812.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/iphone_13_mini/screenshot-landscape-Iphone13MiniPortrait17-375x812.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/iphone_13_mini/screenshot-portrait-Iphone13MiniLandscape17-375x812.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/iphone_13_mini/screenshot-portrait-Iphone13MiniLandscape17-375x812.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/iphone_13_mini/wdioLogo-Iphone13MiniLandscape17-375x812.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/iphone_13_mini/wdioLogo-Iphone13MiniLandscape17-375x812.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/iphone_13_mini/wdioLogo-Iphone13MiniPortrait17-375x812.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/iphone_13_mini/wdioLogo-Iphone13MiniPortrait17-375x812.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/iphone_13_pro/fullPage-Iphone13ProLandscape16-390x844.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/iphone_13_pro/fullPage-Iphone13ProLandscape16-390x844.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/iphone_13_pro/fullPage-Iphone13ProPortrait16-390x844.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/iphone_13_pro/fullPage-Iphone13ProPortrait16-390x844.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/iphone_13_pro/screenshot-Iphone13ProLandscape16-390x844.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/iphone_13_pro/screenshot-Iphone13ProLandscape16-390x844.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/iphone_13_pro/screenshot-Iphone13ProPortrait16-390x844.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/iphone_13_pro/screenshot-Iphone13ProPortrait16-390x844.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/iphone_13_pro/screenshot-landscape-Iphone13ProPortrait16-390x844.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/iphone_13_pro/screenshot-landscape-Iphone13ProPortrait16-390x844.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/iphone_13_pro/screenshot-portrait-Iphone13ProLandscape16-390x844.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/iphone_13_pro/screenshot-portrait-Iphone13ProLandscape16-390x844.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/iphone_13_pro/wdioLogo-Iphone13ProLandscape16-390x844.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/iphone_13_pro/wdioLogo-Iphone13ProLandscape16-390x844.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/iphone_13_pro/wdioLogo-Iphone13ProPortrait16-390x844.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/iphone_13_pro/wdioLogo-Iphone13ProPortrait16-390x844.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/iphone_14_pro/fullPage-Iphone14ProLandscape17-393x852.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/iphone_14_pro/fullPage-Iphone14ProLandscape17-393x852.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/iphone_14_pro/fullPage-Iphone14ProPortrait17-393x852.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/iphone_14_pro/fullPage-Iphone14ProPortrait17-393x852.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/iphone_14_pro/screenshot-Iphone14ProLandscape17-393x852.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/iphone_14_pro/screenshot-Iphone14ProLandscape17-393x852.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/iphone_14_pro/screenshot-Iphone14ProPortrait17-393x852.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/iphone_14_pro/screenshot-Iphone14ProPortrait17-393x852.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/iphone_14_pro/screenshot-landscape-Iphone14ProPortrait17-393x852.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/iphone_14_pro/screenshot-landscape-Iphone14ProPortrait17-393x852.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/iphone_14_pro/screenshot-portrait-Iphone14ProLandscape17-393x852.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/iphone_14_pro/screenshot-portrait-Iphone14ProLandscape17-393x852.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/iphone_14_pro/wdioLogo-Iphone14ProLandscape17-393x852.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/iphone_14_pro/wdioLogo-Iphone14ProLandscape17-393x852.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/iphone_14_pro/wdioLogo-Iphone14ProPortrait17-393x852.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/iphone_14_pro/wdioLogo-Iphone14ProPortrait17-393x852.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/iphone_15_pro_max/fullPage-Iphone15ProMaxLandscape18-430x932.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/iphone_15_pro_max/fullPage-Iphone15ProMaxLandscape18-430x932.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/iphone_15_pro_max/fullPage-Iphone15ProMaxPortrait18-430x932.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/iphone_15_pro_max/fullPage-Iphone15ProMaxPortrait18-430x932.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/iphone_15_pro_max/screenshot-Iphone15ProMaxLandscape18-430x932.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/iphone_15_pro_max/screenshot-Iphone15ProMaxLandscape18-430x932.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/iphone_15_pro_max/screenshot-Iphone15ProMaxPortrait18-430x932.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/iphone_15_pro_max/screenshot-Iphone15ProMaxPortrait18-430x932.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/iphone_15_pro_max/screenshot-landscape-Iphone15ProMaxPortrait18-430x932.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/iphone_15_pro_max/screenshot-landscape-Iphone15ProMaxPortrait18-430x932.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/iphone_15_pro_max/screenshot-portrait-Iphone15ProMaxLandscape18-430x932.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/iphone_15_pro_max/screenshot-portrait-Iphone15ProMaxLandscape18-430x932.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/iphone_15_pro_max/wdioLogo-Iphone15ProMaxLandscape18-430x932.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/iphone_15_pro_max/wdioLogo-Iphone15ProMaxLandscape18-430x932.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/iphone_15_pro_max/wdioLogo-Iphone15ProMaxPortrait18-430x932.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/iphone_15_pro_max/wdioLogo-Iphone15ProMaxPortrait18-430x932.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/pixel_4/fullPage-EmulatorPixel4LandscapeNativeWebScreenshot11-652x309.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/pixel_4/fullPage-EmulatorPixel4LandscapeNativeWebScreenshot11-652x309.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/pixel_4/fullPage-EmulatorPixel4LandscapeNativeWebScreenshot12-760x360.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/pixel_4/fullPage-EmulatorPixel4LandscapeNativeWebScreenshot12-760x360.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/pixel_4/fullPage-EmulatorPixel4LandscapeNativeWebScreenshot13-760x360.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/pixel_4/fullPage-EmulatorPixel4LandscapeNativeWebScreenshot13-760x360.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/pixel_4/fullPage-EmulatorPixel4PortraitNativeWebScreenshot11-309x652.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/pixel_4/fullPage-EmulatorPixel4PortraitNativeWebScreenshot11-309x652.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/pixel_4/fullPage-EmulatorPixel4PortraitNativeWebScreenshot12-360x760.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/pixel_4/fullPage-EmulatorPixel4PortraitNativeWebScreenshot12-360x760.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/pixel_4/fullPage-EmulatorPixel4PortraitNativeWebScreenshot13-360x760.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/pixel_4/fullPage-EmulatorPixel4PortraitNativeWebScreenshot13-360x760.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/pixel_4/screenshot-EmulatorPixel4LandscapeNativeWebScreenshot11-652x309.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/pixel_4/screenshot-EmulatorPixel4LandscapeNativeWebScreenshot11-652x309.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/pixel_4/screenshot-EmulatorPixel4LandscapeNativeWebScreenshot12-760x360.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/pixel_4/screenshot-EmulatorPixel4LandscapeNativeWebScreenshot12-760x360.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/pixel_4/screenshot-EmulatorPixel4LandscapeNativeWebScreenshot13-760x360.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/pixel_4/screenshot-EmulatorPixel4LandscapeNativeWebScreenshot13-760x360.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/pixel_4/screenshot-EmulatorPixel4PortraitNativeWebScreenshot11-309x652.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/pixel_4/screenshot-EmulatorPixel4PortraitNativeWebScreenshot11-309x652.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/pixel_4/screenshot-EmulatorPixel4PortraitNativeWebScreenshot12-360x760.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/pixel_4/screenshot-EmulatorPixel4PortraitNativeWebScreenshot12-360x760.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/pixel_4/screenshot-EmulatorPixel4PortraitNativeWebScreenshot13-360x760.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/pixel_4/screenshot-EmulatorPixel4PortraitNativeWebScreenshot13-360x760.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/pixel_4/screenshot-landscape-EmulatorPixel4PortraitNativeWebScreenshot11-652x309.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/pixel_4/screenshot-landscape-EmulatorPixel4PortraitNativeWebScreenshot11-652x309.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/pixel_4/screenshot-landscape-EmulatorPixel4PortraitNativeWebScreenshot12-760x360.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/pixel_4/screenshot-landscape-EmulatorPixel4PortraitNativeWebScreenshot12-760x360.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/pixel_4/screenshot-landscape-EmulatorPixel4PortraitNativeWebScreenshot13-760x360.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/pixel_4/screenshot-landscape-EmulatorPixel4PortraitNativeWebScreenshot13-760x360.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/pixel_4/screenshot-portrait-EmulatorPixel4LandscapeNativeWebScreenshot11-309x652.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/pixel_4/screenshot-portrait-EmulatorPixel4LandscapeNativeWebScreenshot11-309x652.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/pixel_4/screenshot-portrait-EmulatorPixel4LandscapeNativeWebScreenshot12-360x760.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/pixel_4/screenshot-portrait-EmulatorPixel4LandscapeNativeWebScreenshot12-360x760.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/pixel_4/screenshot-portrait-EmulatorPixel4LandscapeNativeWebScreenshot13-360x760.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/pixel_4/screenshot-portrait-EmulatorPixel4LandscapeNativeWebScreenshot13-360x760.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/pixel_4/wdioLogo-EmulatorPixel4LandscapeNativeWebScreenshot11-652x309.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/pixel_4/wdioLogo-EmulatorPixel4LandscapeNativeWebScreenshot11-652x309.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/pixel_4/wdioLogo-EmulatorPixel4LandscapeNativeWebScreenshot12-760x360.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/pixel_4/wdioLogo-EmulatorPixel4LandscapeNativeWebScreenshot12-760x360.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/pixel_4/wdioLogo-EmulatorPixel4LandscapeNativeWebScreenshot13-760x360.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/pixel_4/wdioLogo-EmulatorPixel4LandscapeNativeWebScreenshot13-760x360.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/pixel_4/wdioLogo-EmulatorPixel4PortraitNativeWebScreenshot11-309x652.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/pixel_4/wdioLogo-EmulatorPixel4PortraitNativeWebScreenshot11-309x652.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/pixel_4/wdioLogo-EmulatorPixel4PortraitNativeWebScreenshot12-360x760.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/pixel_4/wdioLogo-EmulatorPixel4PortraitNativeWebScreenshot12-360x760.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/pixel_4/wdioLogo-EmulatorPixel4PortraitNativeWebScreenshot13-360x760.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/pixel_4/wdioLogo-EmulatorPixel4PortraitNativeWebScreenshot13-360x760.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/pixel_9_pro/fullPage-EmulatorPixel9ProLandscapeNativeWebScreenshot14-952x427.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/pixel_9_pro/fullPage-EmulatorPixel9ProLandscapeNativeWebScreenshot14-952x427.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/pixel_9_pro/fullPage-EmulatorPixel9ProLandscapeNativeWebScreenshot15-952x427.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/pixel_9_pro/fullPage-EmulatorPixel9ProLandscapeNativeWebScreenshot15-952x427.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/pixel_9_pro/fullPage-EmulatorPixel9ProPortraitNativeWebScreenshot14-427x952.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/pixel_9_pro/fullPage-EmulatorPixel9ProPortraitNativeWebScreenshot14-427x952.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/pixel_9_pro/fullPage-EmulatorPixel9ProPortraitNativeWebScreenshot15-427x952.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/pixel_9_pro/fullPage-EmulatorPixel9ProPortraitNativeWebScreenshot15-427x952.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/pixel_9_pro/screenshot-EmulatorPixel9ProLandscapeNativeWebScreenshot14-952x427.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/pixel_9_pro/screenshot-EmulatorPixel9ProLandscapeNativeWebScreenshot14-952x427.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/pixel_9_pro/screenshot-EmulatorPixel9ProLandscapeNativeWebScreenshot15-952x427.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/pixel_9_pro/screenshot-EmulatorPixel9ProLandscapeNativeWebScreenshot15-952x427.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/pixel_9_pro/screenshot-EmulatorPixel9ProPortraitNativeWebScreenshot14-427x952.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/pixel_9_pro/screenshot-EmulatorPixel9ProPortraitNativeWebScreenshot14-427x952.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/pixel_9_pro/screenshot-EmulatorPixel9ProPortraitNativeWebScreenshot15-427x952.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/pixel_9_pro/screenshot-EmulatorPixel9ProPortraitNativeWebScreenshot15-427x952.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/pixel_9_pro/screenshot-landscape-EmulatorPixel9ProPortraitNativeWebScreenshot14-952x427.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/pixel_9_pro/screenshot-landscape-EmulatorPixel9ProPortraitNativeWebScreenshot14-952x427.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/pixel_9_pro/screenshot-landscape-EmulatorPixel9ProPortraitNativeWebScreenshot15-952x427.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/pixel_9_pro/screenshot-landscape-EmulatorPixel9ProPortraitNativeWebScreenshot15-952x427.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/pixel_9_pro/screenshot-portrait-EmulatorPixel9ProLandscapeNativeWebScreenshot14-427x952.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/pixel_9_pro/screenshot-portrait-EmulatorPixel9ProLandscapeNativeWebScreenshot14-427x952.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/pixel_9_pro/screenshot-portrait-EmulatorPixel9ProLandscapeNativeWebScreenshot15-427x952.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/pixel_9_pro/screenshot-portrait-EmulatorPixel9ProLandscapeNativeWebScreenshot15-427x952.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/pixel_9_pro/wdioLogo-EmulatorPixel9ProLandscapeNativeWebScreenshot14-952x427.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/pixel_9_pro/wdioLogo-EmulatorPixel9ProLandscapeNativeWebScreenshot14-952x427.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/pixel_9_pro/wdioLogo-EmulatorPixel9ProLandscapeNativeWebScreenshot15-952x427.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/pixel_9_pro/wdioLogo-EmulatorPixel9ProLandscapeNativeWebScreenshot15-952x427.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/pixel_9_pro/wdioLogo-EmulatorPixel9ProPortraitNativeWebScreenshot14-427x952.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/pixel_9_pro/wdioLogo-EmulatorPixel9ProPortraitNativeWebScreenshot14-427x952.png -------------------------------------------------------------------------------- /tests/lambdaTestBaseline/pixel_9_pro/wdioLogo-EmulatorPixel9ProPortraitNativeWebScreenshot15-427x952.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/lambdaTestBaseline/pixel_9_pro/wdioLogo-EmulatorPixel9ProPortraitNativeWebScreenshot15-427x952.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-forms-app-EmulatorGooglePixel4XLGoogleAPIPortrait11.0-1440x2872.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-forms-app-EmulatorGooglePixel4XLGoogleAPIPortrait11.0-1440x2872.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-forms-app-EmulatorGooglePixel4XLGoogleAPIPortrait11.0-1440x3040.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-forms-app-EmulatorGooglePixel4XLGoogleAPIPortrait11.0-1440x3040.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-forms-app-EmulatorGooglePixel4XLGoogleAPIPortrait12.0-1440x2872.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-forms-app-EmulatorGooglePixel4XLGoogleAPIPortrait12.0-1440x2872.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-forms-app-EmulatorGooglePixel4XLGoogleAPIPortrait12.0-1440x3040.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-forms-app-EmulatorGooglePixel4XLGoogleAPIPortrait12.0-1440x3040.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-forms-app-EmulatorGooglePixel4XLGoogleAPIPortrait13.0-1440x2956.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-forms-app-EmulatorGooglePixel4XLGoogleAPIPortrait13.0-1440x2956.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-forms-app-EmulatorGooglePixel4XLGoogleAPIPortrait13.0-1440x3040.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-forms-app-EmulatorGooglePixel4XLGoogleAPIPortrait13.0-1440x3040.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-forms-app-EmulatorGooglePixel4XLGoogleAPIPortrait14.0-1440x2956.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-forms-app-EmulatorGooglePixel4XLGoogleAPIPortrait14.0-1440x2956.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-forms-app-EmulatorGooglePixel4XLGoogleAPIPortrait14.0-1440x3040.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-forms-app-EmulatorGooglePixel4XLGoogleAPIPortrait14.0-1440x3040.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-forms-app-EmulatorGooglePixel4XLGoogleAPIPortrait15.0-1440x3040.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-forms-app-EmulatorGooglePixel4XLGoogleAPIPortrait15.0-1440x3040.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-login-button-app-EmulatorGooglePixel4XLGoogleAPIPortrait11.0-1440x2872.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-login-button-app-EmulatorGooglePixel4XLGoogleAPIPortrait11.0-1440x2872.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-login-button-app-EmulatorGooglePixel4XLGoogleAPIPortrait11.0-1440x3040.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-login-button-app-EmulatorGooglePixel4XLGoogleAPIPortrait11.0-1440x3040.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-login-button-app-EmulatorGooglePixel4XLGoogleAPIPortrait12.0-1440x2872.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-login-button-app-EmulatorGooglePixel4XLGoogleAPIPortrait12.0-1440x2872.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-login-button-app-EmulatorGooglePixel4XLGoogleAPIPortrait12.0-1440x3040.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-login-button-app-EmulatorGooglePixel4XLGoogleAPIPortrait12.0-1440x3040.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-login-button-app-EmulatorGooglePixel4XLGoogleAPIPortrait13.0-1440x2956.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-login-button-app-EmulatorGooglePixel4XLGoogleAPIPortrait13.0-1440x2956.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-login-button-app-EmulatorGooglePixel4XLGoogleAPIPortrait14.0-1440x2956.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-login-button-app-EmulatorGooglePixel4XLGoogleAPIPortrait14.0-1440x2956.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-login-button-app-EmulatorGooglePixel4XLGoogleAPIPortrait15.0-1440x3040.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-login-button-app-EmulatorGooglePixel4XLGoogleAPIPortrait15.0-1440x3040.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-login-button-resized-app-EmulatorGooglePixel4XLGoogleAPIPortrait11.0-1440x2872.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-login-button-resized-app-EmulatorGooglePixel4XLGoogleAPIPortrait11.0-1440x2872.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-login-button-resized-app-EmulatorGooglePixel4XLGoogleAPIPortrait11.0-1440x3040.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-login-button-resized-app-EmulatorGooglePixel4XLGoogleAPIPortrait11.0-1440x3040.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-login-button-resized-app-EmulatorGooglePixel4XLGoogleAPIPortrait12.0-1440x2872.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-login-button-resized-app-EmulatorGooglePixel4XLGoogleAPIPortrait12.0-1440x2872.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-login-button-resized-app-EmulatorGooglePixel4XLGoogleAPIPortrait12.0-1440x3040.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-login-button-resized-app-EmulatorGooglePixel4XLGoogleAPIPortrait12.0-1440x3040.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-login-button-resized-app-EmulatorGooglePixel4XLGoogleAPIPortrait13.0-1440x2956.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-login-button-resized-app-EmulatorGooglePixel4XLGoogleAPIPortrait13.0-1440x2956.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-login-button-resized-app-EmulatorGooglePixel4XLGoogleAPIPortrait14.0-1440x2956.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-login-button-resized-app-EmulatorGooglePixel4XLGoogleAPIPortrait14.0-1440x2956.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-login-button-resized-app-EmulatorGooglePixel4XLGoogleAPIPortrait15.0-1440x3040.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/app-login-button-resized-app-EmulatorGooglePixel4XLGoogleAPIPortrait15.0-1440x3040.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/web-app-app-EmulatorGooglePixel4XLGoogleAPIPortrait13.0-412x869.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/web-app-app-EmulatorGooglePixel4XLGoogleAPIPortrait13.0-412x869.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/web-app-app-EmulatorGooglePixel4XLGoogleAPIPortrait14.0-412x869.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/web-app-app-EmulatorGooglePixel4XLGoogleAPIPortrait14.0-412x869.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/web-app-app-EmulatorGooglePixel4XLGoogleAPIPortrait15.0-412x869.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/google_pixel_4_xl_googleapi_emulator/web-app-app-EmulatorGooglePixel4XLGoogleAPIPortrait15.0-412x869.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/iphone_11_simulator/app-forms-app-Iphone11Portrait15-414x896.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/iphone_11_simulator/app-forms-app-Iphone11Portrait15-414x896.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/iphone_11_simulator/app-login-button-app-Iphone11Portrait15-414x896.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/iphone_11_simulator/app-login-button-app-Iphone11Portrait15-414x896.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/iphone_11_simulator/app-login-button-resized-app-Iphone11Portrait15-414x896.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/iphone_11_simulator/app-login-button-resized-app-Iphone11Portrait15-414x896.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/iphone_11_simulator/web-app-app-Iphone11Portrait15-414x896.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/iphone_11_simulator/web-app-app-Iphone11Portrait15-414x896.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/iphone_12_pro_max_simulator/app-forms-app-Iphone12ProMaxPortrait16-428x926.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/iphone_12_pro_max_simulator/app-forms-app-Iphone12ProMaxPortrait16-428x926.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/iphone_12_pro_max_simulator/app-login-button-app-Iphone12ProMaxPortrait16-428x926.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/iphone_12_pro_max_simulator/app-login-button-app-Iphone12ProMaxPortrait16-428x926.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/iphone_12_pro_max_simulator/app-login-button-resized-app-Iphone12ProMaxPortrait16-428x926.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/iphone_12_pro_max_simulator/app-login-button-resized-app-Iphone12ProMaxPortrait16-428x926.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/iphone_12_pro_max_simulator/web-app-app-Iphone12ProMaxPortrait16-428x926.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/iphone_12_pro_max_simulator/web-app-app-Iphone12ProMaxPortrait16-428x926.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/iphone_12_simulator/app-forms-app-Iphone12Portrait16-390x844.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/iphone_12_simulator/app-forms-app-Iphone12Portrait16-390x844.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/iphone_12_simulator/app-login-button-app-Iphone12Portrait16-390x844.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/iphone_12_simulator/app-login-button-app-Iphone12Portrait16-390x844.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/iphone_12_simulator/app-login-button-resized-app-Iphone12Portrait16-390x844.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/iphone_12_simulator/app-login-button-resized-app-Iphone12Portrait16-390x844.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/iphone_12_simulator/web-app-app-Iphone12Portrait16-390x844.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/iphone_12_simulator/web-app-app-Iphone12Portrait16-390x844.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/iphone_8_plus_simulator/app-forms-app-Iphone8PlusPortrait14-414x736.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/iphone_8_plus_simulator/app-forms-app-Iphone8PlusPortrait14-414x736.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/iphone_8_plus_simulator/app-login-button-app-Iphone8PlusPortrait14-414x736.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/iphone_8_plus_simulator/app-login-button-app-Iphone8PlusPortrait14-414x736.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/iphone_8_plus_simulator/app-login-button-resized-app-Iphone8PlusPortrait14-414x736.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/iphone_8_plus_simulator/app-login-button-resized-app-Iphone8PlusPortrait14-414x736.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/iphone_8_plus_simulator/web-app-app-Iphone8PlusPortrait14-414x736.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/iphone_8_plus_simulator/web-app-app-Iphone8PlusPortrait14-414x736.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/iphone_8_simulator/app-forms-app-Iphone8Portrait14-375x667.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/iphone_8_simulator/app-forms-app-Iphone8Portrait14-375x667.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/iphone_8_simulator/app-login-button-app-Iphone8Portrait14-375x667.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/iphone_8_simulator/app-login-button-app-Iphone8Portrait14-375x667.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/iphone_8_simulator/app-login-button-resized-app-Iphone8Portrait14-375x667.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/iphone_8_simulator/app-login-button-resized-app-Iphone8Portrait14-375x667.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/iphone_8_simulator/web-app-app-Iphone8Portrait14-375x667.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/iphone_8_simulator/web-app-app-Iphone8Portrait14-375x667.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/iphone_xs_simulator/app-forms-app-IphoneXsPortrait15-375x812.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/iphone_xs_simulator/app-forms-app-IphoneXsPortrait15-375x812.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/iphone_xs_simulator/app-login-button-app-IphoneXsPortrait15-375x812.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/iphone_xs_simulator/app-login-button-app-IphoneXsPortrait15-375x812.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/iphone_xs_simulator/app-login-button-resized-app-IphoneXsPortrait15-375x812.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/iphone_xs_simulator/app-login-button-resized-app-IphoneXsPortrait15-375x812.png -------------------------------------------------------------------------------- /tests/sauceLabsBaseline/iphone_xs_simulator/web-app-app-IphoneXsPortrait15-375x812.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webdriverio/visual-testing/9e0f7888c044713e298ab23b61f7dc3af9e02d00/tests/sauceLabsBaseline/iphone_xs_simulator/web-app-app-IphoneXsPortrait15-375x812.png -------------------------------------------------------------------------------- /tests/specs/multiremote.web.app.spec.ts: -------------------------------------------------------------------------------- 1 | describe('@wdio/visual-service check that multi remote is working', () => { 2 | it('take a screenshot of each browser', async () => { 3 | // First create a screenshot of the web app 4 | await multiremotebrowser.chromeBrowserOne.url('') 5 | await multiremotebrowser.chromeBrowserOne.pause(500) 6 | await multiremotebrowser.chromeBrowserOne.checkScreen('web-before-app') 7 | 8 | // Then create a screenshot of the native app 9 | await multiremotebrowser.androidApp.checkScreen('app-after-web') 10 | 11 | // Now create a screenshot of both of them at the same time 12 | await browser.checkScreen('app-web') 13 | }) 14 | }) 15 | -------------------------------------------------------------------------------- /tests/specs/standalone.spec.js: -------------------------------------------------------------------------------- 1 | import { remote } from 'webdriverio' 2 | import VisualService from '@wdio/visual-service' 3 | 4 | const visualService = new VisualService({ 5 | autoSaveBaseline: true 6 | }) 7 | 8 | const browser = await remote({ 9 | logLevel: 'debug', 10 | capabilities: { 11 | browserName: 'chrome', 12 | } 13 | }) 14 | 15 | visualService.remoteSetup(browser) 16 | 17 | await browser.url('https://webdriver.io/') 18 | 19 | await browser.checkScreen('examplePaged', {}) 20 | 21 | await browser.deleteSession() 22 | -------------------------------------------------------------------------------- /tests/specs/storybook-interaction/example.page.logged.spec.ts: -------------------------------------------------------------------------------- 1 | import { browser, expect } from '@wdio/globals' 2 | 3 | describe('Storybook Interaction', () => { 4 | it('should create screenshots for the logged in state when it logs out', async () => { 5 | const componentId = 'example-page--logged-in' 6 | await browser.waitForStorybookComponentToBeLoaded({ id: componentId }) 7 | 8 | await expect($('header')).toMatchElementSnapshot(`${componentId}-logged-in-state`) 9 | await $('button=Log out').click() 10 | await expect($('header')).toMatchElementSnapshot(`${componentId}-logged-out-state`) 11 | 12 | }) 13 | 14 | it('should create screenshots for the logged out state when it logs in', async () => { 15 | const componentId = 'example-page--logged-out' 16 | await browser.waitForStorybookComponentToBeLoaded({ id: componentId }) 17 | 18 | await expect($('header')).toMatchElementSnapshot(`${componentId}-logged-out-state`) 19 | await $('button=Log in').click() 20 | await expect($('header')).toMatchElementSnapshot(`${componentId}-logged-in-state`) 21 | }) 22 | }) 23 | -------------------------------------------------------------------------------- /tests/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "moduleResolution": "node", 4 | "module": "ESNext", 5 | "target": "es2022", 6 | "lib": ["es2022", "dom"], 7 | "types": [ 8 | "@wdio/browserstack-service", 9 | "@wdio/globals/types", 10 | "@wdio/mocha-framework", 11 | "@wdio/sauce-service", 12 | "@wdio/shared-store-service", 13 | "@wdio/visual-service", 14 | "@wdio/ocr-service" 15 | ], 16 | "skipLibCheck": true, 17 | "noEmit": true, 18 | "allowImportingTsExtensions": true, 19 | "resolveJsonModule": true, 20 | "isolatedModules": true, 21 | "strict": true, 22 | "noUnusedLocals": true, 23 | "noUnusedParameters": true, 24 | "noFallthroughCasesInSwitch": true 25 | }, 26 | "include": ["configs/**/*", "helpers/**/*", "specs/**/*", "types/**/*"] 27 | } 28 | -------------------------------------------------------------------------------- /tests/types/types.ts: -------------------------------------------------------------------------------- 1 | type DeviceOrientation = 'landscape' | 'portrait'; 2 | type RetriesSpecs = { 3 | sessionId: string; 4 | specFileNamePath: string; 5 | }; 6 | type SauceDeviceOptions = { 7 | appiumVersion?: string; 8 | build: string; 9 | deviceOrientation: DeviceOrientation; 10 | } 11 | 12 | export type { DeviceOrientation, RetriesSpecs, SauceDeviceOptions } 13 | -------------------------------------------------------------------------------- /tests/types/wdio.d.ts: -------------------------------------------------------------------------------- 1 | declare namespace WebdriverIO { 2 | interface MultiRemoteBrowser { 3 | chromeBrowserOne: WebdriverIO.Browser; 4 | chromeBrowserTwo: WebdriverIO.Browser; 5 | } 6 | interface Capabilities { 7 | // Strange thing is that it's not allowed in the default Capabilities interface 8 | specs?: string[]; 9 | 'wdio-ics:options'?: { 10 | command?: string[]; 11 | logName?: string; 12 | }; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@tsconfig/node20/tsconfig.json", 3 | "compilerOptions": { 4 | "strict": true, 5 | "declaration": true, 6 | "declarationMap": true, 7 | "resolveJsonModule": true, 8 | "removeComments": false, 9 | "strictFunctionTypes": false, 10 | "experimentalDecorators": true, 11 | "esModuleInterop": true, 12 | "moduleResolution": "Node16", 13 | "module": "NodeNext", 14 | "lib": ["dom", "es2020"], 15 | }, 16 | 17 | "exclude": [ 18 | "node_modules", 19 | "tests", 20 | "build", 21 | "coverage", 22 | "/*.js", 23 | "/*.cjs" 24 | ] 25 | } 26 | -------------------------------------------------------------------------------- /vitest.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig, coverageConfigDefaults, defaultExclude } from 'vitest/config' 2 | 3 | export default defineConfig({ 4 | test: { 5 | include: ['./packages/**/(tests|src)/**/*.test.ts'], 6 | reporters: ['default', ['html', { outputFile: '.vitest-ui/index.html' }]], 7 | coverage: { 8 | thresholds: { 9 | lines: 50, 10 | statements: 50, 11 | functions: 50, 12 | branches: 50 13 | }, 14 | exclude: [ 15 | ...coverageConfigDefaults.exclude, 16 | // Types 17 | '**/types.ts', 18 | '**/*.interfaces.ts', 19 | // Ignored folder 20 | '**/resemble/**', 21 | '**/dist/**', 22 | // Others 23 | 'packages/visual-reporter/', // Need to improve visual reporter tests 24 | ] 25 | }, 26 | exclude: { 27 | ...defaultExclude 28 | } 29 | } 30 | }) 31 | --------------------------------------------------------------------------------