image.spec.js 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519
  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').contains('2/3');
  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').contains('1/3');
  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, translate.x = 0 translate.y = 0
  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. // zoom = 1.2, 宽1728px, 高960px, translate.x = 0 translate.y = 0, 鼠标移动 x * y = 200 * 100,
  89. // (1728 - 1440) / 2 = 144 | (960 - 800) / 2 = 80
  90. // 图片拖动策略是图片只能够拖动到图片边缘和容器边缘重合,因此预期 translate.y 为 144,translate.x 为 80
  91. cy.get('.semi-image-preview-image-img').trigger('mousedown', { clientX: 0, clientY: 0 });
  92. cy.wait(200);
  93. cy.get('.semi-image-preview-image-img').trigger('mousemove', { clientX: 200, clientY: 100, buttons: 1 });
  94. cy.wait(200);
  95. cy.get('.semi-image-preview-image-img').should('have.attr', 'style').should('contain', 'translate(144px, 80px)');
  96. });
  97. // 测试鼠标滚动滚轮放大,缩小图片
  98. it('mouse wheel', () => {
  99. cy.viewport(1440, 800);
  100. cy.visit('http://127.0.0.1:6006/iframe.html?id=image--basic-image&args=&viewMode=story');
  101. cy.wait(2000);
  102. cy.get('.semi-image-img-preview').click();
  103. // zoom = 0.9, width = '1296px',height = '720px'
  104. cy.get('.semi-image-preview').should('exist');
  105. cy.wait(200);
  106. // 验证滚轮向上滚动放大图片
  107. cy.get('.semi-image-preview-image-img').trigger('mouseover', { clientX: 720, clientY: 400 });
  108. // 触发 wheel 事件, 参数 deltaY 表示纵向滚动量,
  109. cy.get('.semi-image-preview-image-img').trigger('wheel', { deltaY: -10, bubbles: true });
  110. // 单次滚动向上滚动滚轮,zoom = zoom + zoomStep = 1, width = '1440px', height = '800px'
  111. cy.get('.semi-image-preview-image-img').should('have.css', 'width').and('eq', '1440px');
  112. cy.get('.semi-image-preview-image-img').should('have.css', 'height').and('eq', '800px');
  113. // 验证滚轮向下滚动缩小图片
  114. cy.get('.semi-image-preview-image-img').trigger('mouseover', { clientX: 720, clientY: 400 });
  115. // 触发 wheel 事件, 参数 deltaY 表示纵向滚动量, 验证缩小
  116. cy.get('.semi-image-preview-image-img').trigger('wheel', { deltaY: 10, bubbles: true });
  117. // 单次滚动向下滚动滚轮,zoom = zoom - zoomStep = 0.9, width = '1296px',height = '720px'
  118. cy.get('.semi-image-preview-image-img').should('have.css', 'width').and('eq', '1296px');
  119. cy.get('.semi-image-preview-image-img').should('have.css', 'height').and('eq', '720px');
  120. });
  121. // 测试自定义预览图片功能: 预览图片和 Image 中的图片 src 不同
  122. it('custom preview Image', () => {
  123. cy.visit('http://127.0.0.1:6006/iframe.html?id=image--custom-preview-image&args=&viewMode=story');
  124. cy.wait(2000);
  125. 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');
  126. cy.get('.semi-image-img-preview').click();
  127. 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');
  128. });
  129. // 通过回调函数 API
  130. it('test callback func', () => {
  131. cy.viewport(1200, 800);
  132. cy.visit('http://127.0.0.1:6006/iframe.html?id=image--test-call-back-func&args=&viewMode=story', {
  133. onBeforeLoad(win) {
  134. cy.stub(win.console, 'log').as('consoleLog');
  135. },
  136. });
  137. cy.wait(3000);
  138. cy.get('.semi-image-img-preview').eq(1).click();
  139. cy.wait(100);
  140. // 测试点击 footer 上一张按钮回调
  141. cy.get('.semi-image-preview-footer').children('.semi-icon-chevron_left').click();
  142. cy.get('@consoleLog').should('be.calledWith', 'prev');
  143. // 测试点击 footer 操作区域下一张按钮回调
  144. cy.get('.semi-image-preview-footer').children('.semi-icon-chevron_right').click();
  145. cy.get('@consoleLog').should('be.calledWith', 'next');
  146. // 测试点击 middle 下一张按钮回调
  147. cy.get('.semi-icon-arrow_right').click();
  148. cy.get('@consoleLog').should('be.calledWith', 'next');
  149. // 测试点击 middle 上一张按钮回调
  150. cy.get('.semi-icon-arrow_left').click();
  151. cy.get('@consoleLog').should('be.calledWith', 'prev');
  152. // 测试预览 footer 操作区域的放大,缩小回调
  153. cy.get('.semi-image-preview-footer').children('.semi-icon-plus').click();
  154. cy.get('.semi-image-preview-footer').children('.semi-icon-minus').click();
  155. cy.get('@consoleLog').should('be.calledWith', 'zoom out');
  156. cy.get('.semi-image-preview-footer').children('.semi-icon-plus').click();
  157. cy.get('@consoleLog').should('be.calledWith', 'zoom in');
  158. // 测试拖拽按钮是否触发回调
  159. const sliderHandleSelector ='.semi-slider-handle';
  160. // test knob slide
  161. cy.get(sliderHandleSelector)
  162. .trigger('mousedown')
  163. .trigger('mousemove', { pageX: 1200, pageY: 0 })
  164. .trigger('mouseup', { force: true });
  165. cy.get('@consoleLog').should('be.calledWith', 'zoom in');
  166. cy.get(sliderHandleSelector)
  167. .trigger('mousedown')
  168. .trigger('mousemove', { pageX: 0, pageY: 0 })
  169. .trigger('mouseup', { force: true });
  170. cy.get('@consoleLog').should('be.calledWith', 'zoom out');
  171. // 测试 footer 下载回调
  172. cy.get('.semi-image-preview-footer').children('.semi-icon-download').click();
  173. cy.get('@consoleLog').should('be.calledWith', 'download');
  174. // 测试 footer 旋转回调
  175. cy.get('.semi-image-preview-footer').children('.semi-icon-rotate').click();
  176. cy.get('@consoleLog').should('be.calledWith', 'rotate change');
  177. });
  178. // 测试 infinite API
  179. it('infinite load', () => {
  180. // 设置 infinite = true
  181. cy.visit('http://127.0.0.1:6006/iframe.html?id=image--basic-preview&args=&viewMode=story');
  182. cy.wait(3000);
  183. cy.get('#infinite').children('.semi-switch').click();
  184. cy.get('.semi-image-img-preview').eq(1).click();
  185. cy.wait(100);
  186. cy.get('.semi-image-preview-prev').click();
  187. cy.wait(100);
  188. // 到第一张图片时候,可以通过 prev 按钮 切换到最后一张
  189. cy.get('.semi-image-preview-prev').should('exist').click();
  190. cy.wait(100);
  191. 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');
  192. // 从最后一张图片,可以切换到前一张图片
  193. cy.get('.semi-image-preview-next').should('exist').click();
  194. cy.wait(100);
  195. 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');
  196. });
  197. // 测试 closeOnEsc API
  198. it('basic image', () => {
  199. // 1. Image 基础功能测试,点击图片,打开预览,点击预览区域,关闭预览
  200. cy.visit('http://127.0.0.1:6006/iframe.html?id=image--basic-image&args=&viewMode=story');
  201. cy.wait(2000);
  202. // 测试 esc 退出预览功能
  203. cy.get('.semi-image-img-preview').click();
  204. cy.get('.semi-image-preview').should('exist');
  205. cy.get('body').type('{esc}', { force: true });
  206. cy.get('.semi-image-preview').should('not.exist');
  207. // closeOnEsc = false, 关闭点击 esc 退出预览功能
  208. cy.get('#escOut').children('.semi-switch').click();
  209. cy.get('.semi-image-img-preview').click();
  210. cy.get('.semi-image-preview').should('exist');
  211. cy.get('body').type('{esc}', { force: true });
  212. cy.get('.semi-image-preview').should('exist');
  213. cy.get('.semi-image-preview').click();
  214. });
  215. // 测试 disableDownload API
  216. it('disable download', () => {
  217. // 设置 disableDownload,无法下载
  218. cy.visit('http://127.0.0.1:6006/iframe.html?id=image--basic-image&args=&viewMode=story');
  219. cy.wait(2000);
  220. cy.get('#disableDownload').children('.semi-switch').click();
  221. cy.get('.semi-image-img-preview').click();
  222. cy.get('.semi-image-preview-footer').children('.semi-icon-download').should('have.class', 'semi-image-preview-footer-disabled');
  223. });
  224. // 测试 maskClosable API
  225. it('maskClosable', () => {
  226. // 设置 disableDownload,无法下载
  227. cy.visit('http://127.0.0.1:6006/iframe.html?id=image--basic-image&args=&viewMode=story');
  228. cy.wait(2000);
  229. cy.get('#maskClosable').children('.semi-switch').click();
  230. cy.get('.semi-image-img-preview').click();
  231. cy.get('.semi-image-preview').should('exist');
  232. cy.get('.semi-image-preview').click();
  233. cy.get('.semi-image-preview').should('exist');
  234. cy.get('.semi-icon-close').click();
  235. cy.get('.semi-image-preview').should('not.exist');
  236. });
  237. // 测试 getPopupContainer API
  238. it('custom container', () => {
  239. cy.visit('http://127.0.0.1:6006/iframe.html?id=image--custom-container&args=&viewMode=story');
  240. cy.wait(3000);
  241. cy.get('.semi-image-img-preview').eq(0).click();
  242. cy.get('.semi-image-preview').parent('.semi-portal').parent().should('have.attr', 'id', 'container');
  243. });
  244. // 测试自定义预览顶部信息 renderHeader API
  245. it('custom render top', () => {
  246. cy.visit('http://127.0.0.1:6006/iframe.html?id=image--custom-render-title&args=&viewMode=story');
  247. cy.wait(3000);
  248. cy.get('.semi-image-img-preview').eq(0).click();
  249. cy.get('.semi-image-preview').should('exist');
  250. // 点击预览后,title 部分的信息为自定义信息
  251. cy.get('.semi-image-preview-header-title').children('div').contains('lamp1');
  252. cy.get('.semi-image-preview-next').should('be.visible');
  253. cy.get('.semi-image-preview-next').click();
  254. // 切换图片后,title 部分会切换为对应的自定义信息
  255. cy.get('.semi-image-preview-header-title').children('div').contains('lamp2');
  256. });
  257. // 测试自定义预览操作区 renderPreviewMenu API
  258. it('custom render footer', () => {
  259. cy.viewport(1200, 800);
  260. cy.visit('http://127.0.0.1:6006/iframe.html?id=image--custom-render-footer-menu&args=&viewMode=story', {
  261. onBeforeLoad(win) {
  262. cy.stub(win.console, 'log').as('consoleLog');
  263. },
  264. });
  265. cy.wait(3000);
  266. cy.get('.semi-image-img-preview').eq(0).click();
  267. cy.get('.semi-image-preview').should('exist');
  268. // 点击预览后,footer操作区域信息为自定义页脚信息
  269. cy.get('.semi-icon-chevron_right').click();
  270. cy.wait(500);
  271. 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');
  272. cy.get('.semi-icon-chevron_left').click();
  273. cy.wait(500);
  274. 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');
  275. // 对于 lion.jpeg(原尺寸1080 * 720), 因为container(1200 * 800),初始 zoom 为 1 (1080 * 720)
  276. cy.get('.semi-icon-minus').click();
  277. cy.wait(500);
  278. // zoom = 0.9, width * height = 972 * 648
  279. cy.get('.semi-image-preview-image-img').should('have.css', 'width').and('eq', '972px');
  280. cy.get('.semi-image-preview-image-img').should('have.css', 'height').and('eq', '648px');
  281. cy.get('.semi-icon-plus').click();
  282. cy.wait(500);
  283. // zoom = 1, width * height = 1080 * 720
  284. cy.get('.semi-image-preview-image-img').should('have.css', 'width').and('eq', '1080px');
  285. cy.get('.semi-image-preview-image-img').should('have.css', 'height').and('eq', '720px');
  286. cy.get('.semi-icon-plus').click();
  287. cy.get('.semi-icon-plus').click();
  288. cy.wait(500);
  289. // zoom = 1.2,
  290. cy.get('.semi-image-preview-image-img').should('have.css', 'width').and('eq', '1296px');
  291. cy.get('.semi-image-preview-image-img').should('have.css', 'height').and('eq', '864px');
  292. // 点击原始尺寸按钮,zoom = 1, width * height = 1080 * 720
  293. cy.get('.semi-icon-real_size_stroked').click();
  294. cy.wait(500);
  295. cy.get('.semi-image-preview-image-img').should('have.css', 'width').and('eq', '1080px');
  296. cy.get('.semi-image-preview-image-img').should('have.css', 'height').and('eq', '720px');
  297. cy.get('.semi-icon-minus').click();
  298. cy.get('.semi-icon-minus').click();
  299. cy.wait(500);
  300. // zoom = 0.8, width * height = 864 * 576
  301. cy.get('.semi-image-preview-image-img').should('have.css', 'width').and('eq', '864px');
  302. cy.get('.semi-image-preview-image-img').should('have.css', 'height').and('eq', '576px');
  303. // 在 container 1200 * 800时, 适应页面尺寸为 zoom 为 1, width * height = 1080 * 720
  304. cy.get('.semi-icon-window_adaption_stroked').click();
  305. cy.wait(500);
  306. cy.get('.semi-image-preview-image-img').should('have.css', 'width').and('eq', '1080px');
  307. cy.get('.semi-image-preview-image-img').should('have.css', 'height').and('eq', '720px');
  308. // 测试点击向右旋转,向左旋转按键
  309. cy.get('.semi-icon-rotate').eq(0).click();
  310. cy.wait(500);
  311. cy.get('.semi-image-preview-image-img').should('have.attr', 'style').should('contain', 'rotate(90deg)');
  312. cy.get('.semi-icon-rotate').eq(1).click();
  313. cy.get('.semi-image-preview-image-img').should('have.attr', 'style').should('contain', 'rotate(0deg)');
  314. // 测试下载按键
  315. cy.get('.semi-icon-download').click();
  316. cy.get('@consoleLog').should('be.calledWith', 'download');
  317. });
  318. // 测试 showTooltip API
  319. it('show operation tooltip', () => {
  320. // 测试 Image 的 预览 footer 操作区域 hover 到相关图标是否 tooltip 提示
  321. cy.visit('http://127.0.0.1:6006/iframe.html?id=image--basic-preview&args=&viewMode=story');
  322. cy.wait(2000);
  323. cy.get('#showTooltip').children('.semi-switch').click();
  324. cy.wait(1000);
  325. cy.get('.semi-image-img-preview').eq(1).click();
  326. cy.get('.semi-image-preview').should('exist');
  327. cy.get('.semi-image-preview-footer').children('.semi-icon-chevron_left').trigger('mouseover');
  328. cy.get('.semi-tooltip-wrapper').contains('上一张');
  329. cy.get('.semi-image-preview-footer').children('.semi-icon-chevron_left').trigger('mouseout');
  330. cy.get('.semi-image-preview-footer').children('.semi-icon-chevron_right').trigger('mouseover');
  331. cy.get('.semi-tooltip-wrapper').contains('下一张');
  332. cy.get('.semi-image-preview-footer').children('.semi-icon-chevron_right').trigger('mouseout');
  333. cy.get('.semi-image-preview-footer').children('.semi-icon-minus').trigger('mouseover');
  334. cy.get('.semi-tooltip-wrapper').contains('缩小');
  335. cy.get('.semi-image-preview-footer').children('.semi-icon-minus').trigger('mouseout');
  336. cy.get('.semi-image-preview-footer').children('.semi-icon-plus').trigger('mouseover');
  337. cy.get('.semi-tooltip-wrapper').contains('放大');
  338. cy.get('.semi-image-preview-footer').children('.semi-icon-plus').trigger('mouseout');
  339. cy.get('.semi-image-preview-footer').children('.semi-icon-real_size_stroked').trigger('mouseover');
  340. cy.get('.semi-tooltip-wrapper').contains('原始尺寸');
  341. cy.get('.semi-image-preview-footer').children('.semi-icon-real_size_stroked').trigger('mouseout');
  342. cy.get('.semi-image-preview-footer').children('.semi-icon-real_size_stroked').click();
  343. cy.get('.semi-image-preview-footer').children('.semi-icon-window_adaption_stroked').trigger('mouseover');
  344. cy.get('.semi-tooltip-wrapper').contains('适应页面');
  345. cy.get('.semi-image-preview-footer').children('.semi-icon-window_adaption_stroked').trigger('mouseout');
  346. cy.get('.semi-image-preview-footer').children('.semi-icon-rotate').trigger('mouseover');
  347. cy.get('.semi-tooltip-wrapper').contains('旋转');
  348. cy.get('.semi-image-preview-footer').children('.semi-icon-rotate').trigger('mouseout');
  349. cy.get('.semi-image-preview-footer').children('.semi-icon-download').trigger('mouseover');
  350. cy.get('.semi-tooltip-wrapper').contains('下载');
  351. cy.get('.semi-image-preview-footer').children('.semi-icon-download').trigger('mouseout');
  352. });
  353. // 测试 xxxTooltip API
  354. it('custom operation tooltip', () => {
  355. // 测试 Image 的 预览 footer 操作区域 hover 到相关图标是否 自定义 tooltip 提示
  356. cy.visit('http://127.0.0.1:6006/iframe.html?id=image--basic-preview&args=&viewMode=story');
  357. cy.wait(2000);
  358. cy.get('#showTooltip').children('.semi-switch').click();
  359. cy.get('#customTooltip').children('.semi-switch').click();
  360. cy.wait(1000);
  361. cy.get('.semi-image-img-preview').eq(1).click();
  362. cy.get('.semi-image-preview').should('exist');
  363. cy.get('.semi-image-preview-footer').children('.semi-icon-chevron_left').trigger('mouseover');
  364. cy.get('.semi-tooltip-wrapper').contains('Prev');
  365. cy.get('.semi-image-preview-footer').children('.semi-icon-chevron_left').trigger('mouseout');
  366. cy.get('.semi-image-preview-footer').children('.semi-icon-chevron_right').trigger('mouseover');
  367. cy.get('.semi-tooltip-wrapper').contains('Next');
  368. cy.get('.semi-image-preview-footer').children('.semi-icon-chevron_right').trigger('mouseout');
  369. cy.get('.semi-image-preview-footer').children('.semi-icon-minus').trigger('mouseover');
  370. cy.get('.semi-tooltip-wrapper').contains('ZoomOut');
  371. cy.get('.semi-image-preview-footer').children('.semi-icon-minus').trigger('mouseout');
  372. cy.get('.semi-image-preview-footer').children('.semi-icon-plus').trigger('mouseover');
  373. cy.get('.semi-tooltip-wrapper').contains('ZoomIn');
  374. cy.get('.semi-image-preview-footer').children('.semi-icon-plus').trigger('mouseout');
  375. cy.get('.semi-image-preview-footer').children('.semi-icon-real_size_stroked').trigger('mouseover');
  376. cy.get('.semi-tooltip-wrapper').contains('Original size');
  377. cy.get('.semi-image-preview-footer').children('.semi-icon-real_size_stroked').trigger('mouseout');
  378. cy.get('.semi-image-preview-footer').children('.semi-icon-real_size_stroked').click();
  379. cy.get('.semi-image-preview-footer').children('.semi-icon-window_adaption_stroked').trigger('mouseover');
  380. cy.get('.semi-tooltip-wrapper').contains('Adaption');
  381. cy.get('.semi-image-preview-footer').children('.semi-icon-window_adaption_stroked').trigger('mouseout');
  382. cy.get('.semi-image-preview-footer').children('.semi-icon-rotate').trigger('mouseover');
  383. cy.get('.semi-tooltip-wrapper').contains('Rotate');
  384. cy.get('.semi-image-preview-footer').children('.semi-icon-rotate').trigger('mouseout');
  385. cy.get('.semi-image-preview-footer').children('.semi-icon-download').trigger('mouseover');
  386. cy.get('.semi-tooltip-wrapper').contains('Download');
  387. cy.get('.semi-image-preview-footer').children('.semi-icon-download').trigger('mouseout');
  388. });
  389. // 测试在预览状态下,图片改变 ratio 状态后,切换图片,ratio 状态是否正确
  390. //(在未受控 ratio ,无默认 ratio 情况下,切换后的图片ratio 应该为适应页面)
  391. it('ratio status after change pic', () => {
  392. cy.visit('http://127.0.0.1:6006/iframe.html?id=image--basic-preview&args=&viewMode=story');
  393. cy.wait(2000);
  394. // 进入预览状态
  395. cy.get('.semi-image-img-preview').eq(0).click();
  396. cy.get('.semi-image-preview').should('exist');
  397. // 图片默认 ratio 为适应页面,调整为 1:1
  398. cy.get('.semi-image-preview-footer').children('.semi-icon-real_size_stroked').click();
  399. // 切换图片到下一张
  400. cy.get('.semi-image-preview-footer').children('.semi-icon-chevron_right').click();
  401. cy.wait(1000);
  402. // 当前 ratio 状态应该为适应页面
  403. cy.get('.semi-icon-real_size_stroked').should('exist');
  404. });
  405. // 测试懒加载状态下 src 变化时候图片是否正常加载
  406. it('src change', () => {
  407. cy.visit('http://127.0.0.1:6006/iframe.html?id=image--issue-1526&args=&viewMode=story');
  408. // 等待 5000 ms, 确保当前src 已经完全改变上
  409. cy.wait(5000);
  410. // 进入预览状态
  411. 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');
  412. });
  413. // defaultCurrentIndex
  414. it('defaultCurrentIndex', () => {
  415. cy.visit('http://127.0.0.1:6006/iframe.html?id=image--default-current-index&args=&viewMode=storyi');
  416. cy.get('.semi-button').eq(0).click();
  417. // 等待 2000 ms, 确保当前src 已经完全改变上
  418. cy.wait(2000);
  419. cy.get('.semi-image-preview-image-img').eq(0).should('have.attr', 'src', 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/root-web-sites/seaside.jpeg');
  420. });
  421. // 测试懒加载
  422. it.skip('lazyLoad + lazyLoadMargin', () => {
  423. cy.visit('http://127.0.0.1:6006/iframe.html?id=image--lazy-load-image&args=&viewMode=storyi');
  424. cy.get('.semi-image-img').eq(4).should('have.attr', 'data-src', 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/root-web-sites/imag5.png');
  425. cy.get('.semi-image-img').eq(4).should('not.have.attr', 'src');
  426. cy.get('.semi-image-preview-group').eq(0).scrollTo('bottom');
  427. cy.get('.semi-image-img').eq(4).should('have.attr', 'src', 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/root-web-sites/imag5.png');
  428. cy.get('.semi-image-img').eq(4).should('not.have.attr', 'data-src');
  429. });
  430. // 测试在图片高度非常小时候,图片显示是否正常
  431. // 关联 issue: https://github.com/DouyinFE/semi-design/issues/1838
  432. it('small height Image', () => {
  433. cy.visit('http://127.0.0.1:6006/iframe.html?id=image--small-height-image&args=&viewMode=storyi');
  434. cy.get('.semi-image').eq(0) // 获取 div 元素
  435. .then((divElement) => {
  436. const divTop = divElement[0].getBoundingClientRect().top; // 获取 div 元素顶部相对于视口顶部的距离
  437. cy.get('.semi-image-img').eq(0) // 获取 img 元素
  438. .then((imgElement) => {
  439. const imgTop = imgElement[0].getBoundingClientRect().top; // 获取 img 元素顶部相对于视口顶部的距离
  440. expect(imgTop).to.equal(divTop);
  441. });
  442. });
  443. });
  444. // API:previewCls, previewStyle,测试 preview 的 className 和 style 是否生效
  445. it("previewCls & previewStyle", () => {
  446. cy.visit('http://127.0.0.1:6006/iframe.html?id=image--preview-cls-and-preview-style&args=&viewMode=storyi');
  447. cy.wait(4000);
  448. cy.get('.semi-image-img-preview').eq(0).click();
  449. cy.get('.semi-image-preview').eq(0).should('have.class', 'test-preview');
  450. cy.get('.semi-image-preview').eq(0).should('have.attr', 'style').should('contain', 'background: lightblue;');
  451. cy.get('.semi-image-preview').click();
  452. cy.get('.semi-image-img-preview').eq(1).click();
  453. cy.get('.semi-image-preview').eq(0).should('have.class', 'test-imagePreview');
  454. cy.get('.semi-image-preview').eq(0).should('have.attr', 'style').should('contain', 'background: lightgreen;');
  455. });
  456. });