jest.setTimeout(50000); const platformInfo = process.env.uniTestPlatformInfo.toLocaleLowerCase() const isAndroid = platformInfo.startsWith('android') const isIos = platformInfo.startsWith('ios') const isHarmony = platformInfo.startsWith('harmony') const isApp = isAndroid || isIos || isHarmony const isWeb = platformInfo.startsWith('web') const isMP = platformInfo.startsWith('mp') const isAppWebView = process.env.UNI_AUTOMATOR_APP_WEBVIEW == 'true' const isDom2 = process.env.UNI_APP_X_DOM2 === "true" // 【勿动】此项目,某些设备,在自动化测试系统中,不需要运行pages.test.js。其值由自动化测试系统动态控制。 const skipPagesTestJs = process.env.UNI_ACTION_SKIP_PAGES_TEST_JS; // 【勿动】pages 由 const 改为 let,因为在其它任务会修改 pages 的值 let pageIndex = 0 const component = [ '/pages/component/swiper/swiper', '/pages/component/progress/progress', '/pages/component/radio/radio', '/pages/component/checkbox/checkbox', // 单独测试例截图 // 'pages/component/scroll-view/scroll-view', // 单独测试例截图 // '/pages/component/scroll-view/scroll-view-refresher', // 单独测试例截图 // '/pages/component/scroll-view/scroll-view-props', // 单独测试例截图 // '/pages/component/scroll-view/scroll-view-refresher-props', // 单独测试例截图 // '/pages/component/scroll-view/scroll-view-custom-refresher-props', // '/pages/component/list-view/list-view', // 单独测试例截图 // '/pages/component/list-view/list-view-refresh', // 单独测试例截图 // '/pages/component/list-view/list-view-multiplex', // '/pages/component/list-view/list-view-multiplex-input', // '/pages/component/list-view/list-view-multiplex-video', // '/pages/component/list-view/list-view-children-in-slot', // 单独测试例截图 // '/pages/component/sticky-section/sticky-section', // 单独测试例截图 // '/pages/component/sticky-header/sticky-header', // 单独测试例截图 // '/pages/component/text/text-props', // 单独测试例截图 // '/pages/component/rich-text/rich-text-complex', // 单独测试例截图 // '/pages/component/form/form', // 单独测试例截图 // '/pages/component/button/buttonstatus', // 自动获取焦点,单独测试例截图 // '/pages/component/input/input', //动态内容 // '/pages/component/picker-view/picker-view', // 单独测试例截图 // '/pages/component/image/image', // 单独测试例截图 // '/pages/component/image/image-format', // 判断CPU类型,单独测试例截图 // '/pages/component/image/image-mode', // 网络资源加载,单独测试例截图 // '/pages/component/image/image-path', // 截图过大 // '/pages/component/image/image-large', // 动态内容(视频封面) // '/pages/component/video/video', // 单独测试例截图 // '/pages/component/video/video-format', // 动态内容 // '/pages/component/web-view/web-view', // 依赖加载完成回调,单独测试例截图 // '/pages/component/web-view/web-view/web-view-local', // 动态内容 // '/pages/component/unicloud-db/unicloud-db', // 动态内容 // '/pages/component/unicloud-db/unicloud-db/contacts/edit', // 动态内容 // '/pages/component/unicloud-db/unicloud-db/contacts/detail', // 动态内容 // '/pages/component/unicloud-db/unicloud-db/mixin-datacom/mixin-datacom', // 单独测试例截图 // '/pages/component/global-properties/global-properties', // 单独测试例截图 // '/pages/component/global-events/touch-events', // 单独测试例截图 // '/pages/component/nested-scroll-header/nested-scroll-header', // 单独测试例截图 // '/pages/component/nested-scroll-body/nested-scroll-body', // 单独测试例截图 // '/pages/component/swiper/swiper-list-view', // 动态内容 // '/pages/component/waterflow/waterflow-fit-height', // 动态内容 // '/pages/component/canvas/canvas/ball', ] const API = [ '/pages/API/navigator/new-page/onLoad', '/pages/API/storage/storage', // 非 UI 相关不截图 // '/pages/API/get-app/get-app', // 单独测试例截图 // '/pages/API/get-current-pages/get-current-pages', // 单独测试例截图 // '/pages/API/get-current-pages/set-page-style-disable-pull-down-refresh', // 非 UI 相关不截图 // '/pages/API/get-launch-options-sync/get-launch-options-sync', // 动态时间戳 // '/pages/API/navigator/navigator', // 单独测试例截图 // '/pages/API/set-navigation-bar-color/set-navigation-bar-color', // 单独测试例截图 // '/pages/API/set-navigation-bar-title/set-navigation-bar-title', // 单独测试例截图 // '/pages/API/set-page-backgroundColorContent/set-page-backgroundColorContent', // 单独测试例截图 // '/pages/API/navigator/new-page/new-page-1', // 非 UI 相关不截图 // '/pages/API/navigator/new-page/new-page-3', // 单独测试例截图 // '/pages/API/pull-down-refresh/pull-down-refresh', // 单独测试例截图 // '/pages/API/get-element-by-id/get-element-by-id', // 单独测试例截图 // '/pages/API/get-element-by-id/get-element-by-id-multiple-root-node', // 单独测试例截图 // '/pages/API/create-selector-query/create-selector-query', // 单独测试例截图 // '/pages/API/action-sheet/action-sheet', // 单独测试例截图 // '/pages/API/show-modal/show-modal', // 单独测试例截图 // '/pages/API/show-loading/show-loading', // 单独测试例截图 // '/pages/API/show-toast/show-toast', // 单独测试例截图 // '/pages/API/load-font-face/load-font-face', // 单独测试例截图 // '/pages/API/load-font-face/load-font-face-child', // 非 UI 相关不截图 // '/pages/API/interceptor/interceptor', // 非 UI 相关不截图 // '/pages/API/interceptor/page1', // 非 UI 相关不截图 // '/pages/API/interceptor/page2', // 非 UI 相关不截图 // '/pages/API/request/request', // 非 UI 相关不截图 // '/pages/API/upload-file/upload-file', // 非 UI 相关不截图 // '/pages/API/download-file/download-file', // 非 UI 相关不截图 // '/pages/API/websocket/socketTask', // 页面销毁时会关闭socket连接,所以规避 // '/pages/API/websocket/websocket', // 页面只是按钮,且平台间存在差异 // '/pages/API/unicloud/unicloud/cloud-function', // 非 UI 相关不截图 // '/pages/API/unicloud/unicloud/cloud-object', // 非 UI 相关不截图 // '/pages/API/unicloud/unicloud/database', // 非 UI 相关不截图 // '/pages/API/unicloud/unicloud/cloud-storage', // 非 UI 相关不截图 // '/pages/API/get-system-info/get-system-info', // 非 UI 相关不截图 // '/pages/API/get-device-info/get-device-info', // 非 UI 相关不截图 // '/pages/API/get-app-base-info/get-app-base-info', // 单独测试例截图 // '/pages/API/preview-image/preview-image', // 单独测试例截图 // '/pages/API/choose-image/choose-image', // 单独测试例截图 // '/pages/API/choose-video/choose-video', // 非 UI 相关不截图 // '/pages/API/get-network-type/get-network-type', // 非 UI 相关不截图 // '/pages/API/page-scroll-to/page-scroll-to', // 非 UI 相关不截图 // '/pages/API/event-bus/event-bus', // '/pages/API/get-battery-info/get-battery-info', // 非 UI 相关不截图 // '/pages/API/get-window-info/get-window-info', // 非 UI 相关不截图 // '/pages/API/rpx2px/rpx2px', // 非 UI 相关不截图 // '/pages/API/request-payment/request-payment/order-detail', // 单独测试例截图 // '/pages/API/resize-observer/resize-observer', // 单独测试例截图 // '/pages/API/map/map', // 非 UI 相关不截图 // '/pages/API/get-file-system-manager/get-file-system-manager', // 非 UI 相关不截图 // '/pages/API/get-system-setting/get-system-setting', // 非 UI 相关不截图 // '/pages/API/element-takesnapshot/element-takesnapshot', // 非 UI 相关不截图 // '/pages/API/get-app-authorize-setting/get-app-authorize-setting', // 非 UI 相关不截图 // '/pages/API/get-uni-verify-manager/get-uni-verify-manager', // 非 UI 相关不截图 // '/pages/API/request-payment/request-payment', // 非 UI 相关不截图 // '/pages/API/theme-change/theme-change', // 非 UI 相关不截图 // '/pages/API/facial-recognition-meta-info/facial-recognition-meta-info', // 非 UI 相关不截图 // '/pages/API/env/env', // 非 UI 相关不截图 // '/pages/API/element-draw/element-draw', // 非 UI 相关不截图 // '/pages/API/share-with-system/share-with-system', // 非 UI 相关不截图 // '/pages/API/request-payment/request-payment/request-payment-uni-pay', // 非 UI 相关不截图 // '/pages/API/get-location/get-location', // 非 UI 相关不截图 // '/pages/API/exit/exit', // 非 UI 相关不截图 // '/pages/API/install-apk/install-apk', // 动态内容,单独测试例截图 // '/pages/API/get-image-info/get-image-info', // 动态内容,不需要截图 // '/pages/API/create-rewarded-video-ad/create-rewarded-video-ad', // 非 UI 相关不截图 // '/pages/API/create-request-permission-listener/create-request-permission-listener', // 非 UI 相关不截图 // '/pages/API/compress-image/compress-image', // 单独测试例截图 // '/pages/API/compress-video/compress-video', // 单独测试例截图 // '/pages/API/get-image-info/get-image-info', // 非 UI 相关不截图 // '/pages/API/make-phone-call/make-phone-call', // 单独测试例截图 // '/pages/API/create-inner-audio-context/create-inner-audio-context', // 单独测试例截图 // '/pages/API/create-inner-audio-context/inner-audio-format', // 单独测试例截图 // '/pages/API/create-inner-audio-context/inner-audio-path', // 单独测试例截图 // '/pages/API/clipboard/clipboard', // 单独测试例截图 // '/pages/API/compass/compass', ] const CSS = [ '/pages/CSS/border/border-color', '/pages/CSS/border/border-top', '/pages/CSS/border/border-bottom', '/pages/CSS/border/border-left', '/pages/CSS/border/border-right', '/pages/CSS/border/border-radius', '/pages/CSS/border/border-style', '/pages/CSS/border/border-width', '/pages/CSS/border/complex-border/complex-border', '/pages/CSS/box-sizing/box-sizing', '/pages/CSS/display/flex', '/pages/CSS/display/none', '/pages/CSS/flex/flex', '/pages/CSS/flex/align-content', '/pages/CSS/flex/align-items', '/pages/CSS/flex/align-self', '/pages/CSS/flex/flex-basis', '/pages/CSS/flex/flex-direction', '/pages/CSS/flex/flex-flow', '/pages/CSS/flex/flex-grow', '/pages/CSS/flex/flex-shrink', '/pages/CSS/flex/flex-wrap', '/pages/CSS/flex/justify-content', '/pages/CSS/layout/height', '/pages/CSS/layout/min-height', '/pages/CSS/layout/max-height', '/pages/CSS/layout/min-width', '/pages/CSS/layout/max-width', '/pages/CSS/layout/position', '/pages/CSS/layout/width', '/pages/CSS/layout/opacity', '/pages/CSS/layout/visibility', '/pages/CSS/margin/margin', '/pages/CSS/margin/margin-top', '/pages/CSS/margin/margin-bottom', '/pages/CSS/margin/margin-left', '/pages/CSS/margin/margin-right', '/pages/CSS/padding/padding', '/pages/CSS/padding/padding-top', '/pages/CSS/padding/padding-bottom', '/pages/CSS/padding/padding-left', '/pages/CSS/padding/padding-right', // 单独测试例中截图 // '/pages/CSS/background/background-image', // '/pages/CSS/border/border', // 单独测试例中截图 // '/pages/CSS/border/dynamic-border', // 单独测试例中截图 // '/pages/CSS/layout/z-index', // 单独测试例中截图 // '/pages/CSS/overflow/overflow', // 网络资源加载,单独测试例截图 // '/pages/CSS/text/font-family', // 单独测试例截图 // '/pages/CSS/text/font-size', // 单独测试例截图 // '/pages/CSS/transition/transition', // 单独测试例截图 // '/pages/CSS/transform/translate', // 单独测试例截图 // '/pages/CSS/transform/scale', // 单独测试例截图 // '/pages/CSS/transform/rotate', // 单独测试例截图 // '/pages/CSS/variable/variable', ] const template = [ '/pages/template/swipe-tabs-underline/swipe-tabs-underline', '/pages/template/swipe-tabs-scale-highlight/swipe-tabs-scale-highlight', // 单独测试例截图 // '/pages/template/keyboard-adjust/keyboard-adjust', // 网络资源加载,单独测试例截图 // '/pages/template/news-feed-list/news-feed-list', // 依赖网络资源加载 // '/pages/template/news-feed-list/detail/detail', // 动画页面 // '/pages/template/swipe-card-stack/swipe-card-stack', // 单独测试例截图 // '/pages/template/vertical-video-feed/vertical-video-feed', // 单独测试例截图 // '/pages/template/scroll-collapse-navbar/scroll-collapse-navbar', // 单独测试例截图 // '/pages/template/draggable-half-modal/draggable-half-modal', // 动态内容 // '/pages/template/search-header-long-list/search-header-long-list', // 动态内容 // '/pages/template/banner-tabs-feed-nested-scroll/banner-tabs-feed-nested-scroll', // harmony 整体测试时截图异常,单独测试例截图 // '/pages/template/pull-zoom-profile-page/pull-zoom-profile-page', // 动态内容 // '/pages/template/calendar/calendar', // 不同平台存在差异,且页面简单 // '/pages/template/external-link-launch/external-link-launch', // '/uni_modules/uni-pay-x/pages/success/success', // 依赖 onload 参数获取 web-view src // '/uni_modules/uni-pay-x/pages/ad-interactive-webview/ad-interactive-webview', // '/uni_modules/uni-pay-x/pages/pay-desk/pay-desk', // 页面内容不稳定 // '/pages/template/recycle-long-list/recycle-long-list', // 单独测试例截图 // '/pages/template/slider-100/slider-100', // 动态内容 // '/pages/template/banner-tabs-long-list-nested-scroll/banner-tabs-long-list-nested-scroll', // 非 UI 相关不截图 // '/pages/template/native-button-bridge/native-button-bridge' ] if (!isMP) { component.push( '/pages/component/view/view', '/pages/component/text/text', '/pages/component/rich-text/rich-text', '/pages/component/button/button', '/pages/component/textarea/textarea', '/pages/component/slider/slider', '/pages/component/slider/slider-in-swiper', '/pages/component/switch/switch', '/pages/component/image/image-orientation', '/pages/component/navigator/navigator', '/pages/component/navigator/navigate', '/pages/component/navigator/redirect', '/pages/component/unicloud-db/unicloud-db/contacts/add', '/pages/component/global-events/global-events', '/pages/component/global-events/transition-events', '/pages/component/global-events/global-events-transform', ) CSS.push( '/pages/CSS/text/color', '/pages/CSS/text/font-style', '/pages/CSS/text/font-weight', '/pages/CSS/text/letter-spacing', '/pages/CSS/text/line-height', '/pages/CSS/text/text-align', '/pages/CSS/text/text-overflow', '/pages/CSS/text/text-decoration-line', '/pages/CSS/text/text-shadow', '/pages/CSS/text/white-space', '/pages/CSS/pointer-events/pointer-events', '/pages/CSS/background/background-color', '/pages/CSS/box-shadow/box-shadow', '/pages/CSS/overflow/overflow-visible-event', ) } const pages = [ // tabBar //改动频繁,不再测试 // '/pages/tabBar/component', // '/pages/tabBar/API', // '/pages/tabBar/CSS', // '/pages/tabBar/template', ...component, ...API, ...CSS, ...template, ] if(!isMP && !isAppWebView) { pages.push( '/pages/component/list-view/list-view', ) } if (!isAppWebView) { if (isApp) { pages.push( '/pages/template/scroll-view-sticky-section/scroll-view-sticky-section', ) } } if (isWeb) { pages.push( '/pages/component/movable-view/movable-view', '/pages/component/label/label', '/pages/component/picker/picker', '/pages/component/canvas/canvas', '/pages/template/browser-built-in-elements/browser-built-in-elements', ) } let page; let windowInfo function getWaitForTagName(pagePath) { if (pagePath === '/pages/component/list-view/list-view-multiplex-input') { return 'input' } if (pagePath === '/pages/component/list-view/list-view-multiplex-video') { return 'video' } if ( pagePath === '/pages/component/global-events/transition-events' || pagePath === '/pages/API/env/env' ) { return 'text' } if ( pagePath === '/pages/component/unicloud-db/unicloud-db/contacts/edit' || pagePath === '/pages/component/unicloud-db/unicloud-db/contacts/detail' ) { return 'scroll-view' } return 'view' } async function preparePageForScreenshot(pagePath, page) { if (pagePath === '/pages/component/picker/picker') { await page.setData({ data: { dayDate: '2026-08-05', monthDate: '2026-08', yearDate: '2026', startDate: '1936-08-05', endDate: '2036-08-05', } }) await page.waitFor(100) } } // 将页面数组分组 const BATCH_SIZE = 20; const pageBatches = []; for (let i = 0; i < pages.length; i += BATCH_SIZE) { pageBatches.push(pages.slice(i, i + BATCH_SIZE)); } // 为每个批次创建独立的测试套件 pageBatches.forEach((batch, batchIndex) => { describe(`Page Screenshot Batch ${batchIndex + 1}`, () => { if (skipPagesTestJs == "Y") { it('skip-current-device', async () => { expect(1).toBe(1); }); return; }; let localPageIndex = 0; beforeAll(async () => { console.log(`Starting batch ${batchIndex + 1} with ${batch.length} pages`); windowInfo = await program.callUniMethod('getWindowInfo'); }); afterAll(async () => { console.log(`Finished batch ${batchIndex + 1}`); }); test.each(batch)("%s", async () => { const currentPagePath = batch[localPageIndex]; page = await program.reLaunch(currentPagePath); await page.waitFor(getWaitForTagName(currentPagePath)); await page.waitFor(500) await preparePageForScreenshot(currentPagePath, page) console.log("Taking screenshot: ", pageIndex, currentPagePath); let fullPage = true; const screenshotParams = { fullPage } if (!fullPage && !isAppWebView) { screenshotParams.offsetY = isApp ? `${windowInfo.safeAreaInsets.top + 44}` : '0' } const image = await program.screenshot(screenshotParams); expect(image).toSaveImageSnapshot({ customSnapshotIdentifier() { return `__pages_test__/${currentPagePath.replace(/\//g, "-").substring(1)}` } }) await page.waitFor(800); localPageIndex++; }); }); });