123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328 |
- jest.setTimeout(60000);
- const platformInfo = process.env.uniTestPlatformInfo.toLocaleLowerCase()
- const isAndroid = platformInfo.startsWith('android')
- const isHarmony = platformInfo.startsWith('harmony')
- const isIOS = platformInfo.startsWith('ios')
- const isMP = platformInfo.startsWith('mp')
- const isWeb = platformInfo.startsWith('web')
- const isAppWebView = process.env.UNI_AUTOMATOR_APP_WEBVIEW == 'true'
- describe('component-native-video', () => {
- if (isWeb || isAppWebView) {
- // TODO: web 端暂不支持测试
- it('web', async () => {
- expect(1).toBe(1)
- })
- return
- }
- let page;
- let start = 0;
- beforeAll(async () => {
- page = await program.reLaunch('/pages/component/video/video');
- if (isWeb) {
- await page.setData({
- muted: true
- });
- }
- await page.$('.video');
- });
- it('screenshot', async () => {
- // 等待视频封面图加载完成
- await page.waitFor(2000);
- const image = await program.screenshot({ fullPage: true });
- expect(image).toSaveImageSnapshot();
- });
- it('test play pause', async () => {
- expect(await page.data('isError')).toBe(false);
- // play
- await page.callMethod('play');
- await page.waitFor(3000);
- expect(await page.data('isPlaying')).toBe(true);
- // pause
- await page.callMethod('pause');
- await page.waitFor(3000);
- expect(await page.data('isPause')).toBe(true);
- });
- if (!isMP) {
- it('test download source', async () => {
- await page.setData({
- autoTest: true,
- isError: false
- });
- const oldSrc = await page.data('src');
- await page.callMethod('downloadSource');
- await page.waitFor(5000);
- expect(await page.data('isError')).toBe(false);
- await page.setData({
- src: oldSrc
- });
- // 在性能差一些的 harmony 机器上,设置 src 后再次播放可能需要等待一段时间
- await page.waitFor(2000);
- });
- it('test video local mp4', async () => {
- await page.setData({
- autoTest: true,
- isError: false
- });
- const oldSrc = await page.data('src');
- await page.setData({
- src: '/static/test-video/10second-demo.mp4'
- });
- await page.waitFor(1000);
- expect(await page.data('isError')).toBe(false);
- await page.setData({
- src: oldSrc
- });
- // 在性能差一些的 harmony 机器上,设置 src 后再次播放可能需要等待一段时间
- await page.waitFor(2000);
- })
- // 鸿蒙不播放本地 m3u8
- if (!isHarmony) {
- it('test video local m3u8', async () => {
- await page.setData({
- autoTest: true,
- isError: false
- });
- const oldSrc = await page.data('src');
- await page.setData({
- src: '/static/test-video/2minute-demo.m3u8'
- });
- await page.waitFor(100);
- expect(await page.data('isError')).toBe(false);
- await page.setData({
- src: oldSrc
- });
- })
- }
- if (isAndroid) {
- it('android test assets path', async () => {
- const oldSrc = await page.data('src');
- await page.setData({
- isError: false,
- src: 'file:///android_asset/uni-autoTest/demo10s.mp4'
- });
- await page.waitFor(500);
- expect(await page.data('isError')).toBe(false);
- await page.setData({
- src: oldSrc
- });
- });
- }
- }
- it('test event play pause controls toggle', async () => {
- await page.setData({
- isPause: false,
- isPlaying: false,
- autoTest: true,
- });
- await page.callMethod('play');
- start = Date.now();
- await page.waitFor(async () => {
- return (await page.data('isPlaying')) || (Date.now() - start > 3000);
- });
- start = Date.now();
- await page.waitFor(async () => {
- return (await page.data('eventPlay')) || (Date.now() - start > 500);
- });
- if (!isIOS) {
- expect(await page.data('eventPlay')).toEqual({
- tagName: 'VIDEO',
- type: 'play'
- });
- }
- await page.callMethod('pause');
- start = Date.now();
- await page.waitFor(async () => {
- return (await page.data('isPause')) || (Date.now() - start > 3000);
- });
- start = Date.now();
- await page.waitFor(async () => {
- return (await page.data('eventPause')) || (Date.now() - start > 1000);
- });
- if (!isIOS) {
- expect(await page.data('eventPause')).toEqual({
- tagName: 'VIDEO',
- type: 'pause'
- });
- }
- if (isAndroid || isIOS) {
- /**
- * app端video组件controlstoggle事件会在controls显示和隐藏触发(播放、暂停等操作都会触发)。
- * 微信小程序、web、鸿蒙播放暂停或者一些其他的操作也会影响controls的显隐,但是不会触发controlstoggle, 只有controls属性变化的时候才会触发
- */
- await page.callMethod('play');
- start = Date.now();
- await page.waitFor(async () => {
- return (await page.data('eventControlstoggle')) || (Date.now() - start > 1000);
- });
- if (process.env.uniTestPlatformInfo.toLowerCase().startsWith('ios')) {
- // expect(await page.data('eventControlstoggle')).toEqual({
- // tagName: 'VIDEO',
- // type: 'controlstoggle',
- // show: true
- // });
- } else {
- expect(await page.data('eventControlstoggle')).toEqual({
- tagName: 'VIDEO',
- type: 'controlstoggle',
- show: true
- });
- }
- }
- });
- if (isAndroid || isHarmony) {
- if (isAndroid) {
- it('test event waiting progress', async () => {
- await page.callMethod('seek', 10);
- start = Date.now();
- await page.waitFor(async () => {
- return ((await page.data('eventWaiting')) && (await page.data('eventProgress'))) || (Date.now() - start > 1000);
- });
- expect(await page.data('eventWaiting')).toEqual({
- tagName: 'VIDEO',
- type: 'waiting'
- });
- expect(await page.data('eventProgress')).toEqual({
- tagName: 'VIDEO',
- type: 'progress',
- isBufferedValid: true
- });
- });
- }
- it('test event fullscreenchange fullscreenclick', async () => {
- await page.callMethod('requestFullScreen');
- start = Date.now();
- await page.waitFor(async () => {
- return (await page.data('eventFullscreenchange')) || (Date.now() - start > 1000);
- });
- expect(await page.data('eventFullscreenchange')).toEqual({
- tagName: 'VIDEO',
- type: 'fullscreenchange',
- fullScreen: true,
- direction: 'horizontal'
- });
- const infos = process.env.uniTestPlatformInfo.split(' ');
- const version = parseInt(infos[infos.length - 1]);
- if (isAndroid && version >5) { // android5.1模拟器全屏时会弹出系统提示框,无法响应adb tap命令
- await page.waitFor(5000);
- await program.adbCommand('input tap 10 10');
- start = Date.now();
- await page.waitFor(async () => {
- return (await page.data('eventFullscreenclick')) || (Date.now() - start > 1000);
- });
- const res = await program.adbCommand('wm size');
- const width = res.data.split(' ').at(-1).split('x')[0];
- const height = res.data.split(' ').at(-1).split('x')[1];
- const res2 = await program.adbCommand('wm density');
- const scale = res2.data.split(' ').at(-1) / 160;
- expect(await page.data('eventFullscreenclick')).toEqual({
- tagName: 'VIDEO',
- type: 'fullscreenclick',
- screenX: parseInt(10 / scale),
- screenY: parseInt(10 / scale),
- screenWidth: parseInt(height / scale),
- screenHeight: parseInt(width / scale)
- });
- }
- await page.callMethod('exitFullScreen');
- });
- it('test event ended timeupdate', async () => {
- await page.callMethod('seek', 120);
- if (isAndroid) {
- start = Date.now();
- await page.waitFor(async () => {
- return (await page.data('eventEnded')) || (Date.now() - start > 30000);
- });
- expect(await page.data('eventEnded')).toEqual({
- tagName: 'VIDEO',
- type: 'ended'
- });
- }
- await page.waitFor(3000);
- const infos = process.env.uniTestPlatformInfo.split(' ');
- const version = parseInt(infos[infos.length - 1]);
- if ((isAndroid && version > 5) || isHarmony) {
- let currentTime = 121
- if (isHarmony) currentTime = 120
- start = Date.now();
- await page.waitFor(async () => {
- return (await page.data('eventTimeupdate')) || (Date.now() - start > 500);
- });
- expect(await page.data('eventTimeupdate')).toEqual({
- tagName: 'VIDEO',
- type: 'timeupdate',
- currentTime,
- duration: 121
- });
- }
- });
- it('test event error', async () => {
- const oldSrc = await page.data('src');
- await page.setData({
- src: 'invalid url'
- });
- start = Date.now();
- await page.waitFor(async () => {
- return (await page.data('eventError')) || (Date.now() - start > 1000);
- });
- const eventError = await page.data('eventError')
- expect(eventError.tagName).toEqual('VIDEO')
- expect(eventError.type).toEqual('error')
- if (!isHarmony) {
- expect(eventError.errCode).toEqual(300001)
- } else {
- // 鸿蒙 video onError 没有错误信息,恒为 200001 内部错误
- expect(eventError.errCode).toEqual(200001)
- }
- await page.setData({
- autoTest: false,
- src: oldSrc
- });
- });
- if (isAndroid) {
- it('test sub component', async () => {
- await page.setData({
- subCompEnable: true,
- subCompShow: true
- });
- await page.waitFor(100);
- expect(await page.callMethod('hasSubComponent')).toBe(true);
- });
- }
- it('test enable-danmu', async () => {
- await page.callMethod('play');
- await page.waitFor(5000);
- await page.setData({
- enableDanmu: false
- });
- const windowInfo = await program.callUniMethod('getWindowInfo');
- const image = await program.screenshot({
- deviceShot: true,
- area: {
- x: 0,
- y: windowInfo.statusBarHeight + 44
- }
- });
- expect(image).toSaveImageSnapshot();
- });
- }
- it('test format', async () => {
- page = await program.navigateTo('/pages/component/video/video-format');
- await page.waitFor(1000);
- expect((await page.data('isError')).value).toBe(false);
- });
- });
|