image.spec.js 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527
  1. describe('image', () => {
  2. it('basic image', () => {
  3. // 1. Image 基础功能测试,点击图片,打开预览,点击预览区域,关闭预览
  4. cy.visit('http://127.0.0.1:6006/iframe.html?id=image--basic-image&args=&viewMode=story');
  5. cy.wait(2000);
  6. // 测试图片宽高是否和设置一致, width, height API
  7. cy.get('.semi-image-img-preview').should('have.css', 'width').and('eq', '360px');
  8. cy.get('.semi-image-img-preview').should('have.css', 'height').and('eq', '200px');
  9. // 点击图片区域触发预览
  10. cy.get('.semi-image-img-preview').click();
  11. cy.get('.semi-image-preview').should('exist');
  12. // 点击预览非操作区域触发预览关闭
  13. cy.get('.semi-image-preview').click();
  14. cy.get('.semi-image-preview').should('not.exist');
  15. // 2. Image 设置 preview = {false}, 不可预览
  16. cy.get('#preview').children('.semi-switch').click();
  17. cy.get('.semi-image-img').click();
  18. cy.get('.semi-image-preview').should('not.exist');
  19. });
  20. it('load error Image', () => {
  21. // 图片加载失败显示加载失败样式
  22. cy.visit('http://127.0.0.1:6006/iframe.html?id=image--load-error-image&args=&viewMode=story');
  23. cy.wait(2000);
  24. cy.get('.semi-image-status').eq(0).children('.semi-icon-upload_error').should('exist');
  25. // 测试自定义加载失败占位图 fallback API
  26. cy.get('.semi-image-status').eq(1).children('span').should('have.attr', 'style').should('contain', 'font-size: 50px;');
  27. });
  28. it('controlled Preview single', () => {
  29. // 测试单独使用 ImagePreview 的 visible 受控显示功能
  30. cy.visit('http://127.0.0.1:6006/iframe.html?id=image--controlled-preview-single&args=&viewMode=story');
  31. cy.wait(2000);
  32. cy.get('.semi-button').click();
  33. cy.get('.semi-image-preview').should('exist');
  34. cy.get('.semi-image-preview').click();
  35. cy.get('.semi-image-preview').should('not.exist');
  36. });
  37. it('image show controlled', () => {
  38. // 测试 Image 的 visible 受控显示功能
  39. cy.visit('http://127.0.0.1:6006/iframe.html?id=image--image-show-controlled&args=&viewMode=story');
  40. cy.wait(2000);
  41. cy.get('.semi-image-img-preview').click();
  42. cy.get('.semi-image-preview').should('exist');
  43. cy.get('.semi-image-preview').click();
  44. cy.get('.semi-image-preview').should('not.exist');
  45. });
  46. it('controlled preview multiple', () => {
  47. // 测试 多个 Image 的 visbile 受控显示功能
  48. cy.visit('http://127.0.0.1:6006/iframe.html?id=image--controlled-preview-multiple&args=&viewMode=story');
  49. cy.wait(2000);
  50. cy.get('.semi-button').click();
  51. cy.get('.semi-image-preview').should('exist');
  52. // 切换到下一张图片
  53. cy.get('.semi-image-preview-next').should('be.visible');
  54. cy.get('.semi-image-preview-next').click();
  55. cy.get('.semi-image-preview-footer-page').children('span').eq(0).contains('2');
  56. cy.get('.semi-image-preview').should('exist');
  57. // 切换到上一张图片
  58. cy.get('.semi-image-preview-prev').should('be.visible');
  59. cy.get('.semi-image-preview-prev').click();
  60. cy.get('.semi-image-preview-footer-page').children('span').eq(0).contains('1');
  61. });
  62. // 测试鼠标拖拽图片
  63. it('mouse drag', () => {
  64. cy.viewport(1440, 800);
  65. // 设置的视宽1440px, 高800px,根据 ImagePreview 的计算规则(以宽高中最大 padding 为80px(平均分到左右,上下)为准),
  66. // 图片的原始尺寸为1440px, 高800px
  67. // 对于当前图片而言,会以高为基准,则缩放比例 zoom = (800 - 80)/ 800 = 0.9开始
  68. cy.visit('http://127.0.0.1:6006/iframe.html?id=image--basic-image&args=&viewMode=story');
  69. cy.wait(2000);
  70. cy.get('.semi-image-img-preview').click();
  71. cy.get('.semi-image-preview').should('exist');
  72. cy.wait(200);
  73. // 验证打开预览时候的 zoom 为0.9, 即宽1296px,高为720px
  74. cy.get('.semi-image-preview-image-img').should('have.css', 'width').and('eq', '1296px');
  75. cy.get('.semi-image-preview-image-img').should('have.css', 'height').and('eq', '720px');
  76. // 点击放大按钮
  77. cy.get('.semi-image-preview-footer').children('.semi-icon-plus').click();
  78. cy.wait(200);
  79. // 默认的单次点击步长是0.1,预期单次点击之后的 zoom 为 1, 即宽度为和原来的尺寸一致,宽1440px, 高800px
  80. cy.get('.semi-image-preview-image-img').should('have.css', 'width').and('eq', '1440px');
  81. cy.get('.semi-image-preview-image-img').should('have.css', 'height').and('eq', '800px');
  82. cy.get('.semi-image-preview-footer').children('.semi-icon-plus').click();
  83. cy.get('.semi-image-preview-footer').children('.semi-icon-plus').click();
  84. cy.wait(200);
  85. // 再经过两次点击放大后,预期 zoom = 1.2, 宽1728px, 高960px, top-80px, left-144px
  86. cy.get('.semi-image-preview-image-img').should('have.css', 'width').and('eq', '1728px');
  87. cy.get('.semi-image-preview-image-img').should('have.css', 'height').and('eq', '960px');
  88. // cy.get('.semi-image-preview-image-img').should('have.css', 'top').and('eq', '-80px');
  89. // cy.get('.semi-image-preview-image-img').should('have.css', 'left').and('eq', '-144px');
  90. // // 测试拖拽,拖拽长度为分别向右,向下拖拽20px
  91. // cy.get('.semi-image-preview-image-img').trigger('mousedown', { clientX: 720, clientY: 400 });
  92. // cy.wait(200);
  93. // cy.get('.semi-image-preview-image-img').trigger('mousemove', { clientX: 740, clientY: 420 }).trigger('mouseup');
  94. // // 预期经过拖拽后,宽高保持不变(宽1728px, 高960px), top和left定位增加20px(top-60px, left-124px)
  95. // cy.get('.semi-image-preview-image-img').should('have.css', 'width').and('eq', '1728px');
  96. // cy.get('.semi-image-preview-image-img').should('have.css', 'height').and('eq', '960px');
  97. // cy.get('.semi-image-preview-image-img').should('have.css', 'top').and('eq', '-60px');
  98. // cy.get('.semi-image-preview-image-img').should('have.css', 'left').and('eq', '-124px');
  99. // // 测试拖拽边界: 内部逻辑是拖拽过程中,拖拽极限是图片边和容器边重合
  100. // // 测试往右下方拖动极限
  101. // cy.get('.semi-image-preview-image-img').trigger('mousedown', { clientX: 720, clientY: 400 });
  102. // cy.wait(200);
  103. // cy.get('.semi-image-preview-image-img').trigger('mousemove', { clientX: 844, clientY: 460 }).trigger('mouseup');
  104. // // 鼠标移动距离为向右60px,向下130px,则此刻的top,left应该都是0
  105. // cy.get('.semi-image-preview-image-img').should('have.css', 'top').and('eq', '0px');
  106. // cy.get('.semi-image-preview-image-img').should('have.css', 'left').and('eq', '0px');
  107. // // 当上下都在图片边缘时候,再次向右下方拖动,因为已经到拖动极限,此时无法再次拖动,top,left值不会再变化
  108. // cy.get('.semi-image-preview-image-img').trigger('mousedown', { clientX: 720, clientY: 400 });
  109. // cy.wait(200);
  110. // cy.get('.semi-image-preview-image-img').trigger('mousemove', { clientX: 730, clientY: 430 }).trigger('mouseup');
  111. // cy.get('.semi-image-preview-image-img').should('have.css', 'top').and('eq', '0px');
  112. // cy.get('.semi-image-preview-image-img').should('have.css', 'left').and('eq', '0px');
  113. // zoom = 1.2, 宽1728px, 高960px, top-80px, left-144px, 鼠标移动 x * y = 200 * 100,
  114. // 图片拖动策略是图片只能够拖动到图片边缘和容器边缘重合,因此预期top和left都为 0px
  115. cy.get('.semi-image-preview-image-img').trigger('mousedown', { clientX: 0, clientY: 0 });
  116. cy.wait(200);
  117. cy.get('.semi-image-preview-image-img').trigger('mousemove', { clientX: 200, clientY: 100 }).trigger('mouseup');
  118. cy.wait(200);
  119. cy.get('.semi-image-preview-image-img').should('have.css', 'top').and('eq', '0px');
  120. cy.get('.semi-image-preview-image-img').should('have.css', 'left').and('eq', '0px');
  121. });
  122. // 测试鼠标滚动滚轮放大,缩小图片
  123. it('mouse wheel', () => {
  124. cy.viewport(1440, 800);
  125. cy.visit('http://127.0.0.1:6006/iframe.html?id=image--basic-image&args=&viewMode=story');
  126. cy.wait(2000);
  127. cy.get('.semi-image-img-preview').click();
  128. // zoom = 0.9, width = '1296px',height = '720px'
  129. cy.get('.semi-image-preview').should('exist');
  130. cy.wait(200);
  131. // 验证滚轮向上滚动放大图片
  132. cy.get('.semi-image-preview-image-img').trigger('mouseover', { clientX: 720, clientY: 400 });
  133. // 触发 wheel 事件, 参数 deltaY 表示纵向滚动量,
  134. cy.get('.semi-image-preview-image-img').trigger('wheel', { deltaY: -10, bubbles: true });
  135. // 单次滚动向上滚动滚轮,zoom = zoom + zoomStep = 1, width = '1440px', height = '800px'
  136. cy.get('.semi-image-preview-image-img').should('have.css', 'width').and('eq', '1440px');
  137. cy.get('.semi-image-preview-image-img').should('have.css', 'height').and('eq', '800px');
  138. // 验证滚轮向下滚动缩小图片
  139. cy.get('.semi-image-preview-image-img').trigger('mouseover', { clientX: 720, clientY: 400 });
  140. // 触发 wheel 事件, 参数 deltaY 表示纵向滚动量, 验证放大
  141. cy.get('.semi-image-preview-image-img').trigger('wheel', { deltaY: 10, bubbles: true });
  142. // 单次滚动向下滚动滚轮,zoom = zoom - zoomStep = 0.9, width = '1296px',height = '720px'
  143. cy.get('.semi-image-preview-image-img').should('have.css', 'width').and('eq', '1296px');
  144. cy.get('.semi-image-preview-image-img').should('have.css', 'height').and('eq', '720px');
  145. });
  146. // 测试自定义预览图片功能: 预览图片和 Image 中的图片 src 不同
  147. it('custom preview Image', () => {
  148. cy.visit('http://127.0.0.1:6006/iframe.html?id=image--custom-preview-image&args=&viewMode=story');
  149. cy.wait(2000);
  150. cy.get('.semi-image-img').should('have.attr', 'src', 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/root-web-sites/abstract-small.jpeg');
  151. cy.get('.semi-image-img-preview').click();
  152. cy.get('.semi-image-preview-image-img').should('have.attr', 'src', 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/root-web-sites/abstract-big.png');
  153. });
  154. // 通过回调函数 API
  155. it('test callback func', () => {
  156. cy.viewport(1200, 800);
  157. cy.visit('http://127.0.0.1:6006/iframe.html?id=image--test-call-back-func&args=&viewMode=story', {
  158. onBeforeLoad(win) {
  159. cy.stub(win.console, 'log').as('consoleLog');
  160. },
  161. });
  162. cy.wait(3000);
  163. cy.get('.semi-image-img-preview').eq(1).click();
  164. cy.wait(100);
  165. // 测试点击 footer 上一张按钮回调
  166. cy.get('.semi-image-preview-footer').children('.semi-icon-chevron_left').click();
  167. cy.get('@consoleLog').should('be.calledWith', 'prev');
  168. // 测试点击 footer 操作区域下一张按钮回调
  169. cy.get('.semi-image-preview-footer').children('.semi-icon-chevron_right').click();
  170. cy.get('@consoleLog').should('be.calledWith', 'next');
  171. // 测试点击 middle 下一张按钮回调
  172. cy.get('.semi-icon-arrow_right').click();
  173. cy.get('@consoleLog').should('be.calledWith', 'next');
  174. // 测试点击 middle 上一张按钮回调
  175. cy.get('.semi-icon-arrow_left').click();
  176. cy.get('@consoleLog').should('be.calledWith', 'prev');
  177. // 测试预览 footer 操作区域的放大,缩小回调
  178. cy.get('.semi-image-preview-footer').children('.semi-icon-plus').click();
  179. cy.get('.semi-image-preview-footer').children('.semi-icon-minus').click();
  180. cy.get('@consoleLog').should('be.calledWith', 'zoom out');
  181. cy.get('.semi-image-preview-footer').children('.semi-icon-plus').click();
  182. cy.get('@consoleLog').should('be.calledWith', 'zoom in');
  183. // 测试拖拽按钮是否触发回调
  184. const sliderHandleSelector ='.semi-slider-handle';
  185. // test knob slide
  186. cy.get(sliderHandleSelector)
  187. .trigger('mousedown')
  188. .trigger('mousemove', { pageX: 1200, pageY: 0 })
  189. .trigger('mouseup', { force: true });
  190. cy.get('@consoleLog').should('be.calledWith', 'zoom in');
  191. cy.get(sliderHandleSelector)
  192. .trigger('mousedown')
  193. .trigger('mousemove', { pageX: 0, pageY: 0 })
  194. .trigger('mouseup', { force: true });
  195. cy.get('@consoleLog').should('be.calledWith', 'zoom out');
  196. // 测试 footer 下载回调
  197. cy.get('.semi-image-preview-footer').children('.semi-icon-download').click();
  198. cy.get('@consoleLog').should('be.calledWith', 'download');
  199. // 测试 footer 旋转回调
  200. cy.get('.semi-image-preview-footer').children('.semi-icon-rotate').click();
  201. cy.get('@consoleLog').should('be.calledWith', 'rotate change');
  202. });
  203. // 测试 infinite API
  204. it('infinite load', () => {
  205. // 设置 infinite = true
  206. cy.visit('http://127.0.0.1:6006/iframe.html?id=image--basic-preview&args=&viewMode=story');
  207. cy.wait(3000);
  208. cy.get('#infinite').children('.semi-switch').click();
  209. cy.get('.semi-image-img-preview').eq(1).click();
  210. cy.wait(100);
  211. cy.get('.semi-image-preview-prev').click();
  212. cy.wait(100);
  213. // 到第一张图片时候,可以通过 prev 按钮 切换到最后一张
  214. cy.get('.semi-image-preview-prev').should('exist').click();
  215. cy.wait(100);
  216. cy.get('.semi-image-preview-image-img').should('have.attr', 'src', 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/root-web-sites/beach.jpeg');
  217. // 从最后一张图片,可以切换到前一张图片
  218. cy.get('.semi-image-preview-next').should('exist').click();
  219. cy.wait(100);
  220. cy.get('.semi-image-preview-image-img').should('have.attr', 'src', 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/root-web-sites/lion.jpeg');
  221. });
  222. // 测试 closeOnEsc API
  223. it('basic image', () => {
  224. // 1. Image 基础功能测试,点击图片,打开预览,点击预览区域,关闭预览
  225. cy.visit('http://127.0.0.1:6006/iframe.html?id=image--basic-image&args=&viewMode=story');
  226. cy.wait(2000);
  227. // 测试 esc 退出预览功能
  228. cy.get('.semi-image-img-preview').click();
  229. cy.get('.semi-image-preview').should('exist');
  230. cy.get('body').type('{esc}', { force: true });
  231. cy.get('.semi-image-preview').should('not.exist');
  232. // closeOnEsc = false, 关闭点击 esc 退出预览功能
  233. cy.get('#escOut').children('.semi-switch').click();
  234. cy.get('.semi-image-img-preview').click();
  235. cy.get('.semi-image-preview').should('exist');
  236. cy.get('body').type('{esc}', { force: true });
  237. cy.get('.semi-image-preview').should('exist');
  238. cy.get('.semi-image-preview').click();
  239. });
  240. // 测试 disableDownload API
  241. it('disable download', () => {
  242. // 设置 disableDownload,无法下载
  243. cy.visit('http://127.0.0.1:6006/iframe.html?id=image--basic-image&args=&viewMode=story');
  244. cy.wait(2000);
  245. cy.get('#disableDownload').children('.semi-switch').click();
  246. cy.get('.semi-image-img-preview').click();
  247. cy.get('.semi-image-preview-footer').children('.semi-icon-download').should('have.class', 'semi-image-preview-footer-disabled');
  248. });
  249. // 测试 maskClosable API
  250. it('maskClosable', () => {
  251. // 设置 disableDownload,无法下载
  252. cy.visit('http://127.0.0.1:6006/iframe.html?id=image--basic-image&args=&viewMode=story');
  253. cy.wait(2000);
  254. cy.get('#maskClosable').children('.semi-switch').click();
  255. cy.get('.semi-image-img-preview').click();
  256. cy.get('.semi-image-preview').should('exist');
  257. cy.get('.semi-image-preview').click();
  258. cy.get('.semi-image-preview').should('exist');
  259. cy.get('.semi-icon-close').click();
  260. cy.get('.semi-image-preview').should('not.exist');
  261. });
  262. // 测试 getPopupContainer API
  263. it('custom container', () => {
  264. cy.visit('http://127.0.0.1:6006/iframe.html?id=image--custom-container&args=&viewMode=story');
  265. cy.wait(3000);
  266. cy.get('.semi-image-img-preview').eq(0).click();
  267. cy.get('.semi-image-preview').parent('.semi-portal').parent().should('have.attr', 'id', 'container');
  268. });
  269. // 测试自定义预览顶部信息 renderHeader API
  270. it('custom render top', () => {
  271. cy.visit('http://127.0.0.1:6006/iframe.html?id=image--custom-render-title&args=&viewMode=story');
  272. cy.wait(3000);
  273. cy.get('.semi-image-img-preview').eq(0).click();
  274. cy.get('.semi-image-preview').should('exist');
  275. // 点击预览后,title 部分的信息为自定义信息
  276. cy.get('.semi-image-preview-header-title').children('div').contains('lamp1');
  277. cy.get('.semi-image-preview-next').should('be.visible');
  278. cy.get('.semi-image-preview-next').click();
  279. // 切换图片后,title 部分会切换为对应的自定义信息
  280. cy.get('.semi-image-preview-header-title').children('div').contains('lamp2');
  281. });
  282. // 测试自定义预览操作区 renderPreviewMenu API
  283. it('custom render footer', () => {
  284. cy.viewport(1200, 800);
  285. cy.visit('http://127.0.0.1:6006/iframe.html?id=image--custom-render-footer-menu&args=&viewMode=story', {
  286. onBeforeLoad(win) {
  287. cy.stub(win.console, 'log').as('consoleLog');
  288. },
  289. });
  290. cy.wait(3000);
  291. cy.get('.semi-image-img-preview').eq(0).click();
  292. cy.get('.semi-image-preview').should('exist');
  293. // 点击预览后,footer操作区域信息为自定义页脚信息
  294. cy.get('.semi-icon-chevron_right').click();
  295. cy.wait(500);
  296. cy.get('.semi-image-preview-image-img').should('have.attr', 'src', 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/root-web-sites/seaside.jpeg');
  297. cy.get('.semi-icon-chevron_left').click();
  298. cy.wait(500);
  299. cy.get('.semi-image-preview-image-img').should('have.attr', 'src', 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/root-web-sites/lion.jpeg');
  300. // 对于 lion.jpeg(原尺寸1080 * 720), 因为container(1200 * 800),初始 zoom 为 1 (1080 * 720)
  301. cy.get('.semi-icon-minus').click();
  302. cy.wait(500);
  303. // zoom = 0.9, width * height = 972 * 648
  304. cy.get('.semi-image-preview-image-img').should('have.css', 'width').and('eq', '972px');
  305. cy.get('.semi-image-preview-image-img').should('have.css', 'height').and('eq', '648px');
  306. cy.get('.semi-icon-plus').click();
  307. cy.wait(500);
  308. // zoom = 1, width * height = 1080 * 720
  309. cy.get('.semi-image-preview-image-img').should('have.css', 'width').and('eq', '1080px');
  310. cy.get('.semi-image-preview-image-img').should('have.css', 'height').and('eq', '720px');
  311. cy.get('.semi-icon-plus').click();
  312. cy.get('.semi-icon-plus').click();
  313. cy.wait(500);
  314. // zoom = 1.2,
  315. cy.get('.semi-image-preview-image-img').should('have.css', 'width').and('eq', '1296px');
  316. cy.get('.semi-image-preview-image-img').should('have.css', 'height').and('eq', '864px');
  317. // 点击原始尺寸按钮,zoom = 1, width * height = 1080 * 720
  318. cy.get('.semi-icon-real_size_stroked').click();
  319. cy.wait(500);
  320. cy.get('.semi-image-preview-image-img').should('have.css', 'width').and('eq', '1080px');
  321. cy.get('.semi-image-preview-image-img').should('have.css', 'height').and('eq', '720px');
  322. cy.get('.semi-icon-minus').click();
  323. cy.get('.semi-icon-minus').click();
  324. cy.wait(500);
  325. // zoom = 0.8, width * height = 864 * 576
  326. cy.get('.semi-image-preview-image-img').should('have.css', 'width').and('eq', '864px');
  327. cy.get('.semi-image-preview-image-img').should('have.css', 'height').and('eq', '576px');
  328. // 在 container 1200 * 800时, 适应页面尺寸为 zoom 为 1, width * height = 1080 * 720
  329. cy.get('.semi-icon-window_adaption_stroked').click();
  330. cy.wait(500);
  331. cy.get('.semi-image-preview-image-img').should('have.css', 'width').and('eq', '1080px');
  332. cy.get('.semi-image-preview-image-img').should('have.css', 'height').and('eq', '720px');
  333. // 测试点击向右旋转,向左旋转按键
  334. cy.get('.semi-icon-rotate').eq(0).click();
  335. cy.wait(500);
  336. cy.get('.semi-image-preview-image-img').should('have.attr', 'style').should('contain', 'transform: rotate(90deg)');
  337. cy.get('.semi-icon-rotate').eq(1).click();
  338. cy.get('.semi-image-preview-image-img').should('have.attr', 'style').should('contain', 'transform: rotate(0deg)');
  339. // 测试下载按键
  340. cy.get('.semi-icon-download').click();
  341. cy.get('@consoleLog').should('be.calledWith', 'download');
  342. });
  343. // 测试 showTooltip API
  344. it('show operation tooltip', () => {
  345. // 测试 Image 的 预览 footer 操作区域 hover 到相关图标是否 tooltip 提示
  346. cy.visit('http://127.0.0.1:6006/iframe.html?id=image--basic-preview&args=&viewMode=story');
  347. cy.wait(2000);
  348. cy.get('#showTooltip').children('.semi-switch').click();
  349. cy.wait(1000);
  350. cy.get('.semi-image-img-preview').eq(1).click();
  351. cy.get('.semi-image-preview').should('exist');
  352. cy.get('.semi-image-preview-footer').children('.semi-icon-chevron_left').trigger('mouseover');
  353. cy.wait(1000);
  354. cy.get('.semi-tooltip-wrapper').contains('上一张');
  355. cy.get('.semi-image-preview-footer').children('.semi-icon-chevron_left').trigger('mouseout');
  356. cy.wait(1000);
  357. cy.get('.semi-image-preview-footer').children('.semi-icon-chevron_right').trigger('mouseover');
  358. cy.wait(1000);
  359. cy.get('.semi-tooltip-wrapper').contains('下一张');
  360. cy.get('.semi-image-preview-footer').children('.semi-icon-chevron_right').trigger('mouseout');
  361. cy.wait(1000);
  362. cy.get('.semi-image-preview-footer').children('.semi-icon-minus').trigger('mouseover');
  363. cy.wait(1000);
  364. cy.get('.semi-tooltip-wrapper').contains('缩小');
  365. cy.get('.semi-image-preview-footer').children('.semi-icon-minus').trigger('mouseout');
  366. cy.wait(1000);
  367. cy.get('.semi-image-preview-footer').children('.semi-icon-plus').trigger('mouseover');
  368. cy.wait(1000);
  369. cy.get('.semi-tooltip-wrapper').contains('放大');
  370. cy.get('.semi-image-preview-footer').children('.semi-icon-plus').trigger('mouseout');
  371. cy.wait(1000);
  372. cy.get('.semi-image-preview-footer').children('.semi-icon-real_size_stroked').trigger('mouseover');
  373. cy.wait(1000);
  374. cy.get('.semi-tooltip-wrapper').contains('原始尺寸');
  375. cy.get('.semi-image-preview-footer').children('.semi-icon-real_size_stroked').trigger('mouseout');
  376. cy.wait(1000);
  377. cy.get('.semi-image-preview-footer').children('.semi-icon-real_size_stroked').click();
  378. cy.get('.semi-image-preview-footer').children('.semi-icon-window_adaption_stroked').trigger('mouseover');
  379. cy.wait(1000);
  380. cy.get('.semi-tooltip-wrapper').contains('适应页面');
  381. cy.get('.semi-image-preview-footer').children('.semi-icon-window_adaption_stroked').trigger('mouseout');
  382. cy.wait(1000);
  383. cy.get('.semi-image-preview-footer').children('.semi-icon-rotate').trigger('mouseover');
  384. cy.wait(1000);
  385. cy.get('.semi-tooltip-wrapper').contains('旋转');
  386. cy.get('.semi-image-preview-footer').children('.semi-icon-rotate').trigger('mouseout');
  387. cy.wait(1000);
  388. cy.get('.semi-image-preview-footer').children('.semi-icon-download').trigger('mouseover');
  389. cy.wait(1000);
  390. cy.get('.semi-tooltip-wrapper').contains('下载');
  391. cy.get('.semi-image-preview-footer').children('.semi-icon-download').trigger('mouseout');
  392. });
  393. // 测试 xxxTooltip API
  394. it('custom operation tooltip', () => {
  395. // 测试 Image 的 预览 footer 操作区域 hover 到相关图标是否 自定义 tooltip 提示
  396. cy.visit('http://127.0.0.1:6006/iframe.html?id=image--basic-preview&args=&viewMode=story');
  397. cy.wait(2000);
  398. cy.get('#showTooltip').children('.semi-switch').click();
  399. cy.get('#customTooltip').children('.semi-switch').click();
  400. cy.wait(1000);
  401. cy.get('.semi-image-img-preview').eq(1).click();
  402. cy.get('.semi-image-preview').should('exist');
  403. cy.get('.semi-image-preview-footer').children('.semi-icon-chevron_left').trigger('mouseover');
  404. cy.wait(1000);
  405. cy.get('.semi-tooltip-wrapper').contains('Prev');
  406. cy.get('.semi-image-preview-footer').children('.semi-icon-chevron_left').trigger('mouseout');
  407. cy.wait(1000);
  408. cy.get('.semi-image-preview-footer').children('.semi-icon-chevron_right').trigger('mouseover');
  409. cy.wait(1000);
  410. cy.get('.semi-tooltip-wrapper').contains('Next');
  411. cy.get('.semi-image-preview-footer').children('.semi-icon-chevron_right').trigger('mouseout');
  412. cy.wait(1000);
  413. cy.get('.semi-image-preview-footer').children('.semi-icon-minus').trigger('mouseover');
  414. cy.wait(1000);
  415. cy.get('.semi-tooltip-wrapper').contains('ZoomOut');
  416. cy.get('.semi-image-preview-footer').children('.semi-icon-minus').trigger('mouseout');
  417. cy.wait(1000);
  418. cy.get('.semi-image-preview-footer').children('.semi-icon-plus').trigger('mouseover');
  419. cy.wait(1000);
  420. cy.get('.semi-tooltip-wrapper').contains('ZoomIn');
  421. cy.get('.semi-image-preview-footer').children('.semi-icon-plus').trigger('mouseout');
  422. cy.wait(1000);
  423. cy.get('.semi-image-preview-footer').children('.semi-icon-real_size_stroked').trigger('mouseover');
  424. cy.wait(1000);
  425. cy.get('.semi-tooltip-wrapper').contains('Original size');
  426. cy.get('.semi-image-preview-footer').children('.semi-icon-real_size_stroked').trigger('mouseout');
  427. cy.wait(1000);
  428. cy.get('.semi-image-preview-footer').children('.semi-icon-real_size_stroked').click();
  429. cy.get('.semi-image-preview-footer').children('.semi-icon-window_adaption_stroked').trigger('mouseover');
  430. cy.wait(1000);
  431. cy.get('.semi-tooltip-wrapper').contains('Adaption');
  432. cy.get('.semi-image-preview-footer').children('.semi-icon-window_adaption_stroked').trigger('mouseout');
  433. cy.wait(1000);
  434. cy.get('.semi-image-preview-footer').children('.semi-icon-rotate').trigger('mouseover');
  435. cy.wait(1000);
  436. cy.get('.semi-tooltip-wrapper').contains('Rotate');
  437. cy.get('.semi-image-preview-footer').children('.semi-icon-rotate').trigger('mouseout');
  438. cy.wait(1000);
  439. cy.get('.semi-image-preview-footer').children('.semi-icon-download').trigger('mouseover');
  440. cy.wait(1000);
  441. cy.get('.semi-tooltip-wrapper').contains('Download');
  442. cy.get('.semi-image-preview-footer').children('.semi-icon-download').trigger('mouseout');
  443. });
  444. // 测试在预览状态下,图片改变 ratio 状态后,切换图片,ratio 状态是否正确
  445. //(在未受控 ratio ,无默认 ratio 情况下,切换后的图片ratio 应该为适应页面)
  446. it('ratio status after change pic', () => {
  447. cy.visit('http://127.0.0.1:6006/iframe.html?id=image--basic-preview&args=&viewMode=story');
  448. cy.wait(2000);
  449. // 进入预览状态
  450. cy.get('.semi-image-img-preview').eq(0).click();
  451. cy.get('.semi-image-preview').should('exist');
  452. // 图片默认 ratio 为适应页面,调整为 1:1
  453. cy.get('.semi-image-preview-footer').children('.semi-icon-real_size_stroked').click();
  454. // 切换图片到下一张
  455. cy.get('.semi-image-preview-footer').children('.semi-icon-chevron_right').click();
  456. cy.wait(1000);
  457. // 当前 ratio 状态应该为适应页面
  458. cy.get('.semi-icon-real_size_stroked').should('exist');
  459. });
  460. // 测试懒加载状态下 src 变化时候图片是否正常加载
  461. it('src change', () => {
  462. cy.visit('http://127.0.0.1:6006/iframe.html?id=image--issue-1526&args=&viewMode=story');
  463. // 等待 5000 ms, 确保当前src 已经完全改变上
  464. cy.wait(5000);
  465. // 进入预览状态
  466. cy.get('.semi-image-img').eq(0).should('have.attr', 'src', 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/root-web-sites/lion.jpeg');
  467. });
  468. });