pages.test.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  1. const platformInfo = process.env.uniTestPlatformInfo.toLocaleLowerCase()
  2. const isAndroid = platformInfo.startsWith('android')
  3. const isIos = platformInfo.startsWith('ios')
  4. const isHarmony = platformInfo.startsWith('harmony')
  5. const isApp = isAndroid || isIos || isHarmony
  6. const isWeb = platformInfo.startsWith('web')
  7. const isMP = platformInfo.startsWith('mp')
  8. const isAppWebView = process.env.UNI_AUTOMATOR_APP_WEBVIEW == 'true'
  9. let pageIndex = 0
  10. const pages = [
  11. // tabBar //改动频繁,不再测试
  12. // '/pages/tabBar/component',
  13. // '/pages/tabBar/API',
  14. // '/pages/tabBar/CSS',
  15. // '/pages/tabBar/template',
  16. // component
  17. '/pages/component/view/view',
  18. // 单独测试例截图
  19. // 'pages/component/scroll-view/scroll-view',
  20. // 单独测试例截图
  21. // '/pages/component/scroll-view/scroll-view-refresher',
  22. // 单独测试例截图
  23. // '/pages/component/scroll-view/scroll-view-props',
  24. // 单独测试例截图
  25. // '/pages/component/scroll-view/scroll-view-refresher-props',
  26. // 单独测试例截图
  27. // '/pages/component/scroll-view/scroll-view-custom-refresher-props',
  28. '/pages/component/swiper/swiper',
  29. // '/pages/component/list-view/list-view',
  30. // 单独测试例截图
  31. // '/pages/component/list-view/list-view-refresh',
  32. // 单独测试例截图
  33. // '/pages/component/list-view/list-view-multiplex',
  34. // '/pages/component/list-view/list-view-multiplex-input',
  35. // '/pages/component/list-view/list-view-multiplex-video',
  36. // '/pages/component/list-view/list-view-children-in-slot',
  37. // 单独测试例截图
  38. // '/pages/component/sticky-section/sticky-section',
  39. // 单独测试例截图
  40. // '/pages/component/sticky-header/sticky-header',
  41. '/pages/component/text/text',
  42. // 单独测试例截图
  43. // '/pages/component/text/text-props',
  44. '/pages/component/rich-text/rich-text',
  45. '/pages/component/rich-text/rich-text-complex',
  46. '/pages/component/progress/progress',
  47. '/pages/component/form/form',
  48. '/pages/component/button/button',
  49. '/pages/component/button/buttonstatus',
  50. '/pages/component/radio/radio',
  51. '/pages/component/checkbox/checkbox',
  52. // 自动获取焦点,单独测试例截图
  53. // '/pages/component/input/input',
  54. '/pages/component/textarea/textarea',
  55. '/pages/component/slider/slider',
  56. '/pages/component/slider/slider-in-swiper',
  57. //动态内容
  58. // '/pages/component/picker-view/picker-view',
  59. '/pages/component/switch/switch',
  60. '/pages/component/image/image',
  61. '/pages/component/image/image-format',
  62. // 判断CPU类型,单独测试例截图
  63. // '/pages/component/image/image-mode',
  64. // 网络资源加载,单独测试例截图
  65. // '/pages/component/image/image-path',
  66. // 截图过大
  67. // '/pages/component/image/image-large',
  68. // 动态内容(视频封面)
  69. // '/pages/component/video/video',
  70. // 单独测试例截图
  71. // '/pages/component/video/video-format',
  72. '/pages/component/navigator/navigator',
  73. '/pages/component/navigator/navigate',
  74. '/pages/component/navigator/redirect',
  75. // 动态内容
  76. // '/pages/component/web-view/web-view',
  77. // 依赖加载完成回调,单独测试例截图
  78. // '/pages/component/web-view/web-view/web-view-local',
  79. // 动态内容
  80. // '/pages/component/unicloud-db/unicloud-db',
  81. '/pages/component/unicloud-db/unicloud-db/contacts/add',
  82. // 动态内容
  83. // '/pages/component/unicloud-db/unicloud-db/contacts/edit',
  84. // 动态内容
  85. // '/pages/component/unicloud-db/unicloud-db/contacts/detail',
  86. // 动态内容
  87. // '/pages/component/unicloud-db/unicloud-db/mixin-datacom/mixin-datacom',
  88. // 单独测试例截图
  89. // '/pages/component/global-properties/global-properties',
  90. '/pages/component/global-events/global-events',
  91. '/pages/component/global-events/transition-events',
  92. '/pages/component/global-events/touch-events',
  93. '/pages/component/global-events/global-events-transform',
  94. // 单独测试例截图
  95. // '/pages/component/nested-scroll-header/nested-scroll-header',
  96. // 单独测试例截图
  97. // '/pages/component/nested-scroll-body/nested-scroll-body',
  98. // 单独测试例截图
  99. // '/pages/component/swiper/swiper-list-view',
  100. // 单独测试例截图
  101. // '/pages/component/list-view/issue-2199',
  102. // API
  103. '/pages/API/get-app/get-app',
  104. // 单独测试例截图
  105. // '/pages/API/get-current-pages/get-current-pages',
  106. // 单独测试例截图
  107. // '/pages/API/get-current-pages/set-page-style-disable-pull-down-refresh',
  108. '/pages/API/get-launch-options-sync/get-launch-options-sync',
  109. // 动态时间戳
  110. // '/pages/API/navigator/navigator',
  111. // 单独测试例截图
  112. // '/pages/API/set-navigation-bar-color/set-navigation-bar-color',
  113. // 单独测试例截图
  114. // '/pages/API/set-navigation-bar-title/set-navigation-bar-title',
  115. // 单独测试例截图
  116. // '/pages/API/set-page-backgroundColorContent/set-page-backgroundColorContent',
  117. // 单独测试例截图
  118. // '/pages/API/navigator/new-page/new-page-1',
  119. '/pages/API/navigator/new-page/new-page-3',
  120. '/pages/API/navigator/new-page/onLoad',
  121. // 单独测试例截图
  122. // '/pages/API/pull-down-refresh/pull-down-refresh',
  123. // 单独测试例截图
  124. // '/pages/API/get-element-by-id/get-element-by-id',
  125. // 单独测试例截图
  126. // '/pages/API/get-element-by-id/get-element-by-id-multiple-root-node',
  127. // 单独测试例截图
  128. // '/pages/API/create-selector-query/create-selector-query',
  129. '/pages/API/storage/storage',
  130. // 单独测试例截图
  131. // '/pages/API/show-action-sheet/show-action-sheet',
  132. // 单独测试例截图
  133. // '/pages/API/show-modal/show-modal',
  134. // 单独测试例截图
  135. // '/pages/API/show-loading/show-loading',
  136. // 单独测试例截图
  137. // '/pages/API/show-toast/show-toast',
  138. // 单独测试例截图
  139. // '/pages/API/load-font-face/load-font-face',
  140. // 单独测试例截图
  141. // '/pages/API/load-font-face/load-font-face-child',
  142. '/pages/API/get-location/get-location',
  143. '/pages/API/interceptor/interceptor',
  144. '/pages/API/interceptor/page1',
  145. '/pages/API/interceptor/page2',
  146. '/pages/API/request/request',
  147. '/pages/API/upload-file/upload-file',
  148. '/pages/API/download-file/download-file',
  149. '/pages/API/websocket/socketTask',
  150. // 页面销毁时会关闭socket连接,所以规避
  151. // '/pages/API/websocket/websocket',
  152. '/pages/API/unicloud/unicloud/cloud-function',
  153. '/pages/API/unicloud/unicloud/cloud-object',
  154. '/pages/API/unicloud/unicloud/database',
  155. '/pages/API/unicloud/unicloud/cloud-storage',
  156. '/pages/API/get-system-info/get-system-info',
  157. '/pages/API/get-device-info/get-device-info',
  158. '/pages/API/get-app-base-info/get-app-base-info',
  159. '/pages/API/preview-image/preview-image',
  160. '/pages/API/choose-image/choose-image',
  161. // 单独测试例截图
  162. // '/pages/API/choose-video/choose-video',
  163. '/pages/API/get-network-type/get-network-type',
  164. '/pages/API/page-scroll-to/page-scroll-to',
  165. '/pages/API/event-bus/event-bus',
  166. // '/pages/API/get-battery-info/get-battery-info',
  167. '/pages/API/get-window-info/get-window-info',
  168. '/pages/API/rpx2px/rpx2px',
  169. '/pages/API/request-payment/request-payment/order-detail',
  170. // 单独测试例截图
  171. // '/pages/API/resize-observer/resize-observer',
  172. // 单独测试例截图
  173. // '/pages/API/map/map',
  174. // CSS
  175. '/pages/CSS/background/background-color',
  176. // 单独测试例中截图
  177. // '/pages/CSS/background/background-image',
  178. // '/pages/CSS/border/border',
  179. '/pages/CSS/border/border-color',
  180. '/pages/CSS/border/border-top',
  181. '/pages/CSS/border/border-bottom',
  182. '/pages/CSS/border/border-left',
  183. '/pages/CSS/border/border-right',
  184. '/pages/CSS/border/border-radius',
  185. '/pages/CSS/border/border-style',
  186. '/pages/CSS/border/border-width',
  187. '/pages/CSS/border/complex-border/complex-border',
  188. // 单独测试例中截图
  189. // '/pages/CSS/border/dynamic-border',
  190. '/pages/CSS/box-shadow/box-shadow',
  191. '/pages/CSS/display/flex',
  192. '/pages/CSS/display/none',
  193. '/pages/CSS/flex/flex',
  194. '/pages/CSS/flex/align-content',
  195. '/pages/CSS/flex/align-items',
  196. '/pages/CSS/flex/flex-basis',
  197. '/pages/CSS/flex/flex-direction',
  198. '/pages/CSS/flex/flex-flow',
  199. '/pages/CSS/flex/flex-grow',
  200. '/pages/CSS/flex/flex-shrink',
  201. '/pages/CSS/flex/justify-content',
  202. '/pages/CSS/layout/height',
  203. '/pages/CSS/layout/min-height',
  204. '/pages/CSS/layout/max-height',
  205. '/pages/CSS/layout/min-width',
  206. '/pages/CSS/layout/max-width',
  207. '/pages/CSS/layout/position',
  208. '/pages/CSS/layout/width',
  209. // 单独测试例中截图
  210. // '/pages/CSS/layout/z-index',
  211. '/pages/CSS/layout/visibility',
  212. '/pages/CSS/margin/margin',
  213. '/pages/CSS/margin/margin-top',
  214. '/pages/CSS/margin/margin-bottom',
  215. '/pages/CSS/margin/margin-left',
  216. '/pages/CSS/margin/margin-right',
  217. '/pages/CSS/padding/padding',
  218. '/pages/CSS/padding/padding-top',
  219. '/pages/CSS/padding/padding-bottom',
  220. '/pages/CSS/padding/padding-left',
  221. '/pages/CSS/padding/padding-right',
  222. // 单独测试例中截图
  223. // '/pages/CSS/overflow/overflow',
  224. '/pages/CSS/text/color',
  225. // 网络资源加载,单独测试例截图
  226. // '/pages/CSS/text/font-family',
  227. // 单独测试例截图
  228. // '/pages/CSS/text/font-size',
  229. '/pages/CSS/text/font-style',
  230. '/pages/CSS/text/font-weight',
  231. '/pages/CSS/text/letter-spacing',
  232. '/pages/CSS/text/line-height',
  233. '/pages/CSS/text/text-align',
  234. '/pages/CSS/text/text-overflow',
  235. '/pages/CSS/text/text-decoration-line',
  236. '/pages/CSS/text/text-shadow',
  237. // 单独测试例截图
  238. // '/pages/CSS/transition/transition',
  239. '/pages/CSS/pointer-events/pointer-events',
  240. // 单独测试例截图
  241. // '/pages/CSS/transform/translate',
  242. // 单独测试例截图
  243. // '/pages/CSS/transform/scale',
  244. // 单独测试例截图
  245. // '/pages/CSS/transform/rotate',
  246. // 单独测试例截图
  247. // '/pages/CSS/variable/variable',
  248. '/pages/CSS/overflow/overflow-visible-event',
  249. // template
  250. // 网络资源加载,单独测试例截图
  251. // '/pages/template/list-news/list-news',
  252. // 依赖网络资源加载
  253. // '/pages/template/list-news/detail/detail',
  254. '/pages/template/drop-card/drop-card',
  255. '/pages/template/swiper-list/swiper-list',
  256. '/pages/template/swiper-list2/swiper-list2',
  257. '/pages/template/swiper-vertical-video/swiper-vertical-video',
  258. '/pages/template/scroll-fold-nav/scroll-fold-nav',
  259. '/pages/template/half-screen/half-screen',
  260. // 动态内容
  261. // '/pages/template/long-list/long-list',
  262. // 动态内容
  263. // '/pages/template/long-list2/long-list2',
  264. // harmony 整体测试时截图异常,单独测试例截图
  265. // '/pages/template/pull-zoom-image/pull-zoom-image',
  266. '/pages/template/navbar-lite/navbar-lite',
  267. '/pages/template/custom-tab-bar/custom-tab-bar',
  268. // 动态内容
  269. // '/pages/template/calendar/calendar',
  270. // 不同平台存在差异,且页面简单
  271. // '/pages/template/schema/schema',
  272. // '/uni_modules/uni-pay-x/pages/success/success',
  273. // 依赖 onload 参数获取 web-view src
  274. // '/uni_modules/uni-pay-x/pages/ad-interactive-webview/ad-interactive-webview',
  275. // '/uni_modules/uni-pay-x/pages/pay-desk/pay-desk',
  276. '/pages/template/custom-long-list/custom-long-list',
  277. '/pages/template/test-background-color-content/test-background-color-content',
  278. '/pages/template/slider-100/slider-100',
  279. // 动态内容
  280. // '/pages/template/long-list-nested/long-list-nested',
  281. ]
  282. if (isAndroid && isWeb) {
  283. pages.push(
  284. '/pages/API/get-battery-info/get-battery-info',
  285. )
  286. }
  287. if(!isMP) {
  288. pages.push(
  289. '/pages/component/list-view/list-view',
  290. '/pages/component/list-view/list-view-children-in-slot',
  291. '/uni_modules/uni-pay-x/pages/success/success',
  292. '/uni_modules/uni-pay-x/pages/pay-desk/pay-desk'
  293. )
  294. }
  295. if (!isAppWebView) {
  296. if (isApp) {
  297. pages.push(
  298. '/pages/template/custom-refresher/custom-refresher',
  299. '/pages/API/get-file-system-manager/get-file-system-manager',
  300. '/pages/API/get-system-setting/get-system-setting',
  301. '/pages/API/element-takesnapshot/element-takesnapshot',
  302. '/pages/API/get-app-authorize-setting/get-app-authorize-setting',
  303. // 进入页面崩溃,暂时规避
  304. // '/pages/API/get-univerify-manager/get-univerify-manager',
  305. '/pages/API/request-payment/request-payment',
  306. '/pages/template/scroll-sticky/scroll-sticky',
  307. )
  308. }
  309. if(isIos || isAndroid){
  310. pages.push(
  311. '/pages/API/theme-change/theme-change',
  312. '/pages/API/facial-recognition-meta-info/facial-recognition-meta-info',
  313. '/pages/API/env/env',
  314. '/pages/API/element-draw/element-draw',
  315. // 单独测试例截图
  316. // '/pages/component/waterflow/waterflow-fit-height',
  317. '/pages/API/share-with-system/share-with-system',
  318. '/pages/template/test-uts-button/test-uts-button'
  319. )
  320. }
  321. pages.push('/pages/API/request-payment/request-payment/request-payment-uni-pay')
  322. }
  323. if (isAndroid && !isAppWebView) {
  324. pages.push(
  325. '/pages/API/exit/exit',
  326. '/pages/API/install-apk/install-apk',
  327. '/pages/API/get-image-info/get-image-info',
  328. '/pages/API/get-video-info/get-video-info',
  329. '/pages/API/create-rewarded-video-ad/create-rewarded-video-ad',
  330. '/pages/API/create-request-permission-listener/create-request-permission-listener',
  331. '/pages/API/compress-image/compress-image',
  332. '/pages/API/compress-video/compress-video',
  333. )
  334. }
  335. if (isWeb) {
  336. pages.push(
  337. '/pages/component/movable-view/movable-view',
  338. '/pages/component/label/label',
  339. '/pages/component/picker/picker',
  340. '/pages/API/get-image-info/get-image-info',
  341. '/pages/API/get-video-info/get-video-info',
  342. '/pages/API/make-phone-call/make-phone-call',
  343. '/pages/API/create-inner-audio-context/create-inner-audio-context',
  344. '/pages/API/create-inner-audio-context/inner-audio-format',
  345. '/pages/API/create-inner-audio-context/inner-audio-path',
  346. '/pages/API/clipboard/clipboard',
  347. '/pages/API/compass/compass',
  348. '/pages/component/canvas/canvas',
  349. '/pages/component/canvas/canvas/ball',
  350. '/pages/template/browser-element/browser-element',
  351. )
  352. }
  353. let page;
  354. let windowInfo
  355. function getWaitForTagName(pagePath) {
  356. if (pagePath === '/pages/component/list-view/list-view-multiplex-input') {
  357. return 'input'
  358. }
  359. if (pagePath === '/pages/component/list-view/list-view-multiplex-video') {
  360. return 'video'
  361. }
  362. if (
  363. pagePath === '/pages/component/global-events/transition-events' ||
  364. pagePath === '/pages/API/env/env'
  365. ) {
  366. return 'text'
  367. }
  368. if (
  369. pagePath === '/pages/component/unicloud-db/unicloud-db/contacts/edit' ||
  370. pagePath === '/pages/component/unicloud-db/unicloud-db/contacts/detail'
  371. ) {
  372. return 'scroll-view'
  373. }
  374. if (pagePath === '/pages/API/get-file-system-manager/get-file-system-manager') {
  375. return 'button'
  376. }
  377. if (pagePath === '/pages/template/custom-refresher/custom-refresher') {
  378. return 'list-view'
  379. }
  380. return 'view'
  381. }
  382. describe("page screenshot test", () => {
  383. // TODO: 暂时屏蔽 harmony 截图测试,规避应用崩溃
  384. if (platformInfo.indexOf('safari') !== -1) {
  385. it('暂时规避 safari 截图测试', () => {
  386. expect(1).toBe(1)
  387. })
  388. return
  389. }
  390. beforeAll(async () => {
  391. console.log("page screenshot test start");
  392. windowInfo = await program.callUniMethod('getWindowInfo');
  393. });
  394. beforeEach(async () => {
  395. const currentPagePath = pages[pageIndex]
  396. page = await program.reLaunch(currentPagePath);
  397. await page.waitFor(getWaitForTagName(currentPagePath));
  398. });
  399. afterEach(() => {
  400. pageIndex++;
  401. });
  402. afterAll(() => {
  403. console.log("page screenshot test finish");
  404. });
  405. test.each(pages)("%s", async () => {
  406. const currentPagePath = pages[pageIndex]
  407. console.log("Taking screenshot: ", pageIndex, currentPagePath);
  408. let fullPage = true;
  409. const screenshotParams = {
  410. fullPage
  411. }
  412. if (!fullPage && !isAppWebView) {
  413. screenshotParams.offsetY = isApp ? `${windowInfo.safeAreaInsets.top + 44}` : '0'
  414. }
  415. const image = await program.screenshot(screenshotParams);
  416. expect(image).toSaveImageSnapshot({
  417. customSnapshotIdentifier() {
  418. return `__pages_test__/${currentPagePath.replace(/\//g, "-").substring(1)}`
  419. }
  420. })
  421. await page.waitFor(800);
  422. });
  423. });