diff --git a/bigbluebutton-html5/imports/ui/components/audio/audio-controls/input-stream-live-selector/component.jsx b/bigbluebutton-html5/imports/ui/components/audio/audio-controls/input-stream-live-selector/component.jsx index 94c2186c4e8f7f98ebae4fdbcf50446ef77d3524..f384f1f5a7d02d47ee18553c9d407b28aa04c11d 100644 --- a/bigbluebutton-html5/imports/ui/components/audio/audio-controls/input-stream-live-selector/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/audio/audio-controls/input-stream-live-selector/component.jsx @@ -298,6 +298,7 @@ class InputStreamLiveSelector extends Component { <DropdownListItem key="leaveAudioButtonKey" className={styles.stopButton} + data-test="disconnectAudio" label={intl.formatMessage(intlMessages.leaveAudio)} onClick={() => handleLeaveAudio()} accessKey={shortcuts.leaveaudio} diff --git a/bigbluebutton-html5/imports/ui/components/panel-manager/component.jsx b/bigbluebutton-html5/imports/ui/components/panel-manager/component.jsx index 4fdb2321b4b7492cde35b4158528afd3351c6048..662bcf55c8852e98b3123b07ccfdf5129515b05d 100755 --- a/bigbluebutton-html5/imports/ui/components/panel-manager/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/panel-manager/component.jsx @@ -316,6 +316,7 @@ class PanelManager extends Component { return ( <div + data-test="userListPanel" className={styles.userList} aria-label={intl.formatMessage(intlMessages.userListLabel)} key={enableResize ? null : this.userlistKey} @@ -364,6 +365,7 @@ class PanelManager extends Component { return ( <section id="chatPanel" + data-test="chatPanel" className={styles.chat} aria-label={intl.formatMessage(intlMessages.chatLabel)} key={enableResize ? null : this.chatKey} diff --git a/bigbluebutton-html5/tests/puppeteer/audio.obj.js b/bigbluebutton-html5/tests/puppeteer/audio.obj.js index fcb5989fdd45128147263bf4a6ff124ad1ee6785..7afe84b0fb6f9b66f38693b9c450dc69d7a2e550 100644 --- a/bigbluebutton-html5/tests/puppeteer/audio.obj.js +++ b/bigbluebutton-html5/tests/puppeteer/audio.obj.js @@ -17,7 +17,7 @@ const audioTest = () => { try { const testName = 'joinWithListenOnly'; await test.logger('begin of ', testName); - await test.init(Page.getArgsWithAudio(), undefined, undefined, undefined, testName); + await test.init(Page.getArgs(), undefined, undefined, undefined, testName); await test.startRecording(testName); response = await test.test(); await test.stopRecording(); @@ -44,7 +44,7 @@ const audioTest = () => { try { const testName = 'joinWithMicrophone'; await test.logger('begin of ', testName); - await test.init(Page.getArgsWithAudio(), undefined, undefined, undefined, testName); + await test.init(Page.getArgs(), undefined, undefined, undefined, testName); await test.startRecording(testName); response = await test.microphone(); await test.stopRecording(); diff --git a/bigbluebutton-html5/tests/puppeteer/audio/elements.js b/bigbluebutton-html5/tests/puppeteer/audio/elements.js index 5604689e63e3b2c7fb78128c9febcfa16ccc86f8..6e2d6e21362c23587e1602161f849d0ef5b081dd 100644 --- a/bigbluebutton-html5/tests/puppeteer/audio/elements.js +++ b/bigbluebutton-html5/tests/puppeteer/audio/elements.js @@ -1,10 +1,11 @@ exports.joinAudio = 'button[aria-label="Join audio"]'; +exports.leaveAudio = 'button[aria-label="Change/Leave audio"]'; +exports.disconnectAudio = 'li[data-test="disconnectAudio"]'; exports.listen = 'button[aria-label="Listen only"]'; exports.connectingStatus = 'div[class^="connecting-"]'; exports.connecting = 'span[data-test="connecting"]'; exports.connectingToEchoTest = 'span[data-test="connectingToEchoTest"]'; exports.audioAudible = 'button[aria-label="Echo is audible"]'; -exports.leaveAudio = 'button[aria-label="Leave audio"]'; exports.microphone = 'button[aria-label="Microphone"]'; exports.muteMicrophoneBtn = 'button[aria-label="Mute"]'; exports.whiteboard = 'svg[data-test="whiteboard"]'; diff --git a/bigbluebutton-html5/tests/puppeteer/breakout/create.js b/bigbluebutton-html5/tests/puppeteer/breakout/create.js index 83da8ab0cccf4b1dcb6a194811d480f0c4b4ccf0..2f7f16d7db6ec09f432869ce3c33aa5b153e3b90 100644 --- a/bigbluebutton-html5/tests/puppeteer/breakout/create.js +++ b/bigbluebutton-html5/tests/puppeteer/breakout/create.js @@ -172,7 +172,7 @@ class Create { // Initialize a Moderator session async joinWithUser3(testName) { if (testName === 'joinBreakoutroomsWithAudio') { - await this.page3.init(Page.getArgsWithAudio(), this.page1.meetingId, { ...params, fullName: 'Moderator3' }, undefined, testName); + await this.page3.init(Page.getArgs(), this.page1.meetingId, { ...params, fullName: 'Moderator3' }, undefined, testName); await this.page3.closeAudioModal(); await this.page3.waitForSelector(be.breakoutRoomsButton, ELEMENT_WAIT_TIME); await this.page3.click(be.breakoutRoomsButton, true); @@ -205,7 +205,7 @@ class Create { await page3[2].screenshot({ path: path.join(__dirname, `../${process.env.TEST_FOLDER}/test-${today}-${testName}/screenshots/00-breakout-page03-user-joined-with-mic-before-check-${testName}.png`) }); } } else if (testName === 'joinBreakoutroomsWithVideo') { - await this.page3.init(Page.getArgsWithVideo(), this.page1.meetingId, { ...params, fullName: 'Moderator3' }, undefined, testName); + await this.page3.init(Page.getArgs(), this.page1.meetingId, { ...params, fullName: 'Moderator3' }, undefined, testName); await this.page3.closeAudioModal(); await this.page3.waitForSelector(be.breakoutRoomsButton, ELEMENT_WAIT_TIME); await this.page3.click(be.breakoutRoomsButton, true); diff --git a/bigbluebutton-html5/tests/puppeteer/core/devices.js b/bigbluebutton-html5/tests/puppeteer/core/devices.js new file mode 100644 index 0000000000000000000000000000000000000000..1aa8480e32a072c91fe8cf54c8d4f7cb030cdbee --- /dev/null +++ b/bigbluebutton-html5/tests/puppeteer/core/devices.js @@ -0,0 +1,59 @@ +const devices = [ + { + name: 'iPhone X', + userAgent: + 'Mozilla/5.0 (iPhone; CPU iPhone OS 14_4_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.1', + viewport: { + width: 375, + height: 812, + deviceScaleFactor: 3, + isMobile: true, + hasTouch: true, + isLandscape: false, + }, + }, + { + name: 'iPad Pro', + userAgent: + 'Mozilla/5.0 (iPad; CPU OS 14_4_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.1', + viewport: { + width: 1024, + height: 720, + deviceScaleFactor: 2, + isMobile: true, + hasTouch: true, + isLandscape: false, + }, + }, + { + name: 'Galaxy Note 3', + userAgent: + 'Mozilla/5.0 (Linux; Android 10; SAMSUNG SM-N900V 4G Build/LRX21V) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4408.2 Mobile Safari/537.36', + viewport: { + width: 360, + height: 640, + deviceScaleFactor: 3, + isMobile: true, + hasTouch: true, + isLandscape: false, + }, + }, + { + name: 'Linux Desktop', + userAgent: + 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36', + viewport: { + width: 1024, + height: 720, + deviceScaleFactor: 1, + isMobile: false, + hasTouch: false, + isLandscape: true, + }, + }, +] + +const devicesMap = {}; +for (const device of devices) + devicesMap[device.name] = device; +module.exports = devicesMap; diff --git a/bigbluebutton-html5/tests/puppeteer/core/elements.js b/bigbluebutton-html5/tests/puppeteer/core/elements.js index d752fe9b24a0dad0a9c3e89c89a745decd316dd2..7ff20a8b511516e643aa4a22189aae20f469f64a 100644 --- a/bigbluebutton-html5/tests/puppeteer/core/elements.js +++ b/bigbluebutton-html5/tests/puppeteer/core/elements.js @@ -9,14 +9,14 @@ exports.alerts = '.toastify-content'; exports.isTalking = '[data-test="isTalking"]'; exports.wasTalking = '[data-test="wasTalking"]'; exports.joinAudio = 'button[data-test="joinAudio"]'; -exports.leaveAudio = 'button[data-test="leaveAudio"]'; +exports.leaveAudio = 'button[aria-label="Change/Leave audio"]'; +exports.disconnectAudio = 'li[data-test="disconnectAudio"]'; exports.actions = 'button[aria-label="Actions"]'; exports.options = 'button[aria-label="Options"]'; exports.userList = 'button[aria-label="Users and Messages Toggle"]'; exports.joinAudio = 'button[aria-label="Join Audio"]'; exports.connectingStatus = 'div[class^="connecting--"]'; -exports.leaveAudio = 'button[aria-label="Leave Audio"]'; exports.videoMenu = 'button[aria-label="Open video menu dropdown"]'; exports.screenShare = 'button[aria-label="Share your screen"]'; exports.screenshareConnecting = 'div[data-test="screenshareConnecting"]'; diff --git a/bigbluebutton-html5/tests/puppeteer/core/page.js b/bigbluebutton-html5/tests/puppeteer/core/page.js index 72a55d7832667d1478e2baeb121144f71c0fd549..fcfaeea282145c4db3076cdb4a13368b56fee2e3 100644 --- a/bigbluebutton-html5/tests/puppeteer/core/page.js +++ b/bigbluebutton-html5/tests/puppeteer/core/page.js @@ -11,7 +11,11 @@ const params = require('../params'); const { ELEMENT_WAIT_TIME } = require('./constants'); const e = require('./elements'); const ue = require('../user/elements'); -const { NETWORK_PRESETS, USER_AGENTS, MOBILE_DEVICES } = require('./profiles'); +const { NETWORK_PRESETS } = require('./profiles'); +const audioCapture = `--use-file-for-fake-audio-capture=${path.join(__dirname, '../media/audio.wav')}`; +const videoCapture = `--use-file-for-fake-video-capture=${path.join(__dirname, '../media/video_rgb.y4m')}`; +const devices = require('./devices'); +const linuxDesktop = devices['Linux Desktop']; class Page { constructor(name) { @@ -38,7 +42,7 @@ class Page { } // Join BigBlueButton meeting - async init(args, meetingId, newParams, customParameter, testFolderName, connectionPreset) { + async init(args, meetingId, newParams, customParameter, testFolderName, connectionPreset, deviceX) { try { this.effectiveParams = newParams || params; const isModerator = this.effectiveParams.moderatorPW; @@ -50,6 +54,8 @@ class Page { this.browser = await puppeteer.launch(args); } this.page = await this.browser.newPage(); + this.page.emulate(deviceX || linuxDesktop); + await this.getUserAgent(this); // Connect to Chrome DevTools const client = await this.page.target().createCDPSession(); @@ -57,9 +63,9 @@ class Page { // Set throttling property await client.send('Network.emulateNetworkConditions', connectionPreset || NETWORK_PRESETS.WiFi); - if (process.env.DEVICE_NAME === 'Desktop') { - await this.page.setViewport({ width: 1280, height: 720 }); - } + // if (process.env.DEVICE_NAME === 'Desktop') { + // await this.page.setViewport({ width: 1024, height: 720 }); + // } this.page.setDefaultTimeout(3600000); @@ -67,6 +73,7 @@ class Page { // this.page.on('console', async msg => console[msg._type]( // ...await Promise.all(msg.args().map(arg => arg.jsonValue())) // )); + await this.page.setExtraHTTPHeaders({ 'Accept-Language': 'en-US', }); @@ -76,7 +83,6 @@ class Page { const joinURL = helper.getJoinURL(this.meetingId, this.effectiveParams, isModerator, customParameter); await this.page.goto(joinURL, { waitUntil: 'networkidle2' }); - await this.getUserAgent(); if (process.env.BBB_COLLECT_METRICS === 'true' && process.env.IS_MOBILE !== 'true') { await this.waitForSelector(ue.anyUser, ELEMENT_WAIT_TIME); @@ -107,12 +113,17 @@ class Page { const parsedSettings = await this.getSettingsYaml(); const listenOnlyCallTimeout = parseInt(parsedSettings.public.media.listenOnlyCallTimeout); await this.waitForSelector(e.leaveAudio, listenOnlyCallTimeout); + await this.click(e.leaveAudio, ELEMENT_WAIT_TIME); + await this.waitForSelector(e.disconnectAudio, ELEMENT_WAIT_TIME); + await this.click(e.disconnectAudio, true); } // Leave audio async leaveAudio() { await this.waitForSelector(e.leaveAudio, ELEMENT_WAIT_TIME); await this.click(e.leaveAudio, true); + await this.waitForSelector(e.disconnectAudio, ELEMENT_WAIT_TIME); + await this.click(e.disconnectAudio, true); await this.waitForSelector(e.joinAudio, ELEMENT_WAIT_TIME); } @@ -163,42 +174,20 @@ class Page { return await document.querySelectorAll(element)[0]; } - async getUserAgent() { - const useragent = await this.page.evaluate('navigator.userAgent'); + async getUserAgent(test) { + const useragent = await test.page.evaluate('navigator.userAgent'); console.log({ useragent }); return useragent; } // Get the default arguments for creating a page static getArgs() { - const args = [ - '--no-sandbox', - '--use-fake-ui-for-media-stream', - '--use-fake-device-for-media-stream', - '--no-default-browser-check', - '--window-size=1280,1000', - '--lang=en-US', - ]; - return { - headless: false, - args, - defaultViewport: { - width: 1280, - height: 805, - }, - ignoreDefaultArgs: [ - '--enable-automation', - ], - }; - } - - static getArgsWithAudio() { if (process.env.BROWSERLESS_ENABLED === 'true') { const args = [ '--no-sandbox', '--use-fake-ui-for-media-stream', '--use-fake-device-for-media-stream', - '--window-size=1280,720', + '--window-size=1024,720', '--lang=en-US', ]; return { @@ -211,8 +200,9 @@ class Page { '--use-fake-ui-for-media-stream', '--use-fake-device-for-media-stream', '--no-default-browser-check', - '--window-size=1280,1000', - `--use-file-for-fake-audio-capture=${path.join(__dirname, '../media/audio.wav')}`, + '--window-size=1150,980', + audioCapture, + videoCapture, '--allow-file-access', '--lang=en-US', ]; @@ -220,8 +210,8 @@ class Page { headless: false, args, defaultViewport: { - width: 1280, - height: 805, + width: 1250, + height: 850, }, ignoreDefaultArgs: [ '--enable-automation', @@ -229,139 +219,23 @@ class Page { }; } - static getArgsWithVideo() { - if (process.env.BROWSERLESS_ENABLED === 'true') { - const args = [ - '--no-sandbox', - '--use-fake-ui-for-media-stream', - '--use-fake-device-for-media-stream', - '--window-size=1280,720', - '--lang=en-US', - ]; - return { - headless: true, - args, - }; - } - const args = [ - '--no-sandbox', - '--use-fake-ui-for-media-stream', - '--use-fake-device-for-media-stream', - '--no-default-browser-check', - '--window-size=1280,1000', - `--use-file-for-fake-video-capture=${path.join(__dirname, '../media/video_rgb.y4m')}`, - '--allow-file-access', - '--lang=en-US', - ]; - return { - headless: false, - args, - defaultViewport: { - width: 1280, - height: 805, - }, - ignoreDefaultArgs: [ - '--enable-automation', - ], - }; + static checkRegression(numb) { + if (process.env.REGRESSION_TESTING === 'true') { + expect(screenshot).toMatchImageSnapshot({ + failureThreshold: numb, + failureThresholdType: 'percent', + }); + } } - static getArgsWithAudioAndVideo() { - if (process.env.BROWSERLESS_ENABLED === 'true') { - const args = [ - '--no-sandbox', - '--use-fake-ui-for-media-stream', - '--use-fake-device-for-media-stream', - '--window-size=1280,720', - '--lang=en-US', - ]; - return { - headless: true, - args, - }; + async isNotVisible(el, timeout) { + try { + await this.page.waitForSelector(el, {visible: false, timeout: timeout}); + return true; + } catch(e) { + console.log(e); + return false; } - const args = [ - '--no-sandbox', - '--use-fake-ui-for-media-stream', - '--use-fake-device-for-media-stream', - '--no-default-browser-check', - '--window-size=1280,1000', - `--use-file-for-fake-audio-capture=${path.join(__dirname, '../media/audio.wav')}`, - `--use-file-for-fake-video-capture=${path.join(__dirname, '../media/video_rgb.y4m')}`, - '--allow-file-access', - '--lang=en-US', - ]; - return { - headless: false, - args, - defaultViewport: { - width: 1280, - height: 805, - }, - ignoreDefaultArgs: [ - '--enable-automation', - ], - }; - } - - static iPhoneXArgs() { - const args = [ - '--no-sandbox', - '--use-fake-ui-for-media-stream', - '--use-fake-device-for-media-stream', - `--user-agent=${USER_AGENTS.iPhoneX}`, - `--window-size=${MOBILE_DEVICES.iPhoneX.defaultViewport.width + 250},${MOBILE_DEVICES.iPhoneX.defaultViewport.height}`, - `--use-file-for-fake-audio-capture=${path.join(__dirname, '../media/audio.wav')}`, - `--use-file-for-fake-video-capture=${path.join(__dirname, '../media/video_rgb.y4m')}`, - '--allow-file-access', - '--lang=en-US', - ]; - const mobileArgs = MOBILE_DEVICES.iPhoneX; - return { - headless: false, - args, - ...mobileArgs, - }; - } - - static iPadArgs() { - const args = [ - '--no-sandbox', - '--use-fake-ui-for-media-stream', - '--use-fake-device-for-media-stream', - `--user-agent=${USER_AGENTS.iPad}`, - `--window-size=${MOBILE_DEVICES.iPad.defaultViewport.width},${MOBILE_DEVICES.iPad.defaultViewport.height}`, - `--use-file-for-fake-audio-capture=${path.join(__dirname, '../media/audio.wav')}`, - `--use-file-for-fake-video-capture=${path.join(__dirname, '../media/video_rgb.y4m')}`, - '--allow-file-access', - '--lang=en-US', - ]; - const mobileArgs = MOBILE_DEVICES.iPad; - return { - headless: false, - args, - ...mobileArgs, - }; - } - - static galaxyNote3Args() { - const args = [ - '--no-sandbox', - '--use-fake-ui-for-media-stream', - '--use-fake-device-for-media-stream', - `--user-agent=${USER_AGENTS.GalaxyNote3}`, - `--window-size=${MOBILE_DEVICES.GalaxyNote3.defaultViewport.width + 250},${MOBILE_DEVICES.GalaxyNote3.defaultViewport.height}`, - `--use-file-for-fake-audio-capture=${path.join(__dirname, '../media/audio.wav')}`, - `--use-file-for-fake-video-capture=${path.join(__dirname, '../media/video_rgb.y4m')}`, - '--allow-file-access', - '--lang=en-US', - ]; - const mobileArgs = MOBILE_DEVICES.GalaxyNote3; - return { - headless: false, - args, - ...mobileArgs, - }; } // async emulateMobile(userAgent) { diff --git a/bigbluebutton-html5/tests/puppeteer/core/profiles.js b/bigbluebutton-html5/tests/puppeteer/core/profiles.js index 8013322ac8e9769041822780ec398fcfb158161a..7d817e7e7ec8ad759ade5391602e59f1fd1f3146 100644 --- a/bigbluebutton-html5/tests/puppeteer/core/profiles.js +++ b/bigbluebutton-html5/tests/puppeteer/core/profiles.js @@ -49,46 +49,3 @@ exports.NETWORK_PRESETS = { latency: 2, }, }; - -// Mobile Devices (iPhoneX, GalaxyA31, iPad) -exports.MOBILE_DEVICES = { - iPhoneX: { - devtools: true, - ignoreHTTPSErrors: true, - defaultViewport: { - width: 375, - height: 812, - isMobile: true, - }, - }, - GalaxyNote3: { - devtools: true, - ignoreHTTPSErrors: true, - defaultViewport: { - width: 360, - height: 640, - isMobile: true, - }, - }, - iPad: { - devtools: true, - ignoreHTTPSErrors: true, - defaultViewport: { - width: 765, - height: 850, - isMobile: true, - }, - }, -}; - -// User Agents (iPhoneX, GalaxyNote3, iPad, Desktop) -exports.USER_AGENTS = { - iPhoneX: - 'Mozilla/5.0 (iPhone; CPU iPhone OS 14_4_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.1', - GalaxyNote3: - 'Mozilla/5.0 (Linux; Android 10; SAMSUNG SM-N900V 4G Build/LRX21V) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4408.2 Mobile Safari/537.36', - iPad: - 'Mozilla/5.0 (iPad; CPU OS 14_4_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.1', - Desktop: - 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36', -}; diff --git a/bigbluebutton-html5/tests/puppeteer/customparameters.obj.js b/bigbluebutton-html5/tests/puppeteer/customparameters.obj.js index f1f264d2fc8bf61581bcf51feae2585718d5e313..15396b15992777081b29df2d1222572f5f4a8892 100644 --- a/bigbluebutton-html5/tests/puppeteer/customparameters.obj.js +++ b/bigbluebutton-html5/tests/puppeteer/customparameters.obj.js @@ -50,7 +50,7 @@ const customParametersTest = () => { try { const testName = 'listenOnlyMode'; page.logger('before ', testName); - response = await test.listenOnlyMode(testName, Page.getArgsWithAudio(), undefined, c.listenOnlyMode); + response = await test.listenOnlyMode(testName, Page.getArgs(), undefined, c.listenOnlyMode); await test.page1.stopRecording(); screenshot = await test.page1.page.screenshot(); page.logger('after ', testName); @@ -78,7 +78,7 @@ const customParametersTest = () => { try { const testName = 'forceListenOnly'; page.logger('before ', testName); - response = await test.forceListenOnly(testName, Page.getArgsWithAudio(), undefined, c.forceListenOnly); + response = await test.forceListenOnly(testName, Page.getArgs(), undefined, c.forceListenOnly); await test.page2.stopRecording(); screenshot = await test.page2.page.screenshot(); page.logger('after ', testName); @@ -106,7 +106,7 @@ const customParametersTest = () => { try { const testName = 'skipCheck'; page.logger('before ', testName); - response = await test.skipCheck(testName, Page.getArgsWithAudio(), undefined, c.skipCheck); + response = await test.skipCheck(testName, Page.getArgs(), undefined, c.skipCheck); await test.page1.stopRecording(); screenshot = await test.page1.page.screenshot(); page.logger('after ', testName); @@ -134,7 +134,7 @@ const customParametersTest = () => { try { const testName = 'skipCheckOnFirstJoin'; page.logger('before ', testName); - response = await test.skipCheckOnFirstJoin(testName, Page.getArgsWithAudio(), undefined, c.skipCheckOnFirstJoin); + response = await test.skipCheckOnFirstJoin(testName, Page.getArgs(), undefined, c.skipCheckOnFirstJoin); await test.page1.stopRecording(); screenshot = await test.page1.page.screenshot(); page.logger('after ', testName); @@ -303,7 +303,7 @@ const customParametersTest = () => { try { const testName = 'enableVideo'; page.logger('before ', testName); - response = await test.enableVideo(testName, Page.getArgsWithVideo(), undefined, c.enableVideo); + response = await test.enableVideo(testName, Page.getArgs(), undefined, c.enableVideo); await test.page1.stopRecording(); screenshot = await test.page1.page.screenshot(); page.logger('after ', testName); @@ -331,7 +331,7 @@ const customParametersTest = () => { try { const testName = 'autoShareWebcam'; page.logger('before ', testName); - response = await test.autoShareWebcam(testName, Page.getArgsWithVideo(), undefined, c.autoShareWebcam); + response = await test.autoShareWebcam(testName, Page.getArgs(), undefined, c.autoShareWebcam); await test.page1.stopRecording(); screenshot = await test.page1.page.screenshot(); page.logger('after ', testName); @@ -692,7 +692,7 @@ const customParametersTest = () => { try { const testName = 'skipVideoPreview'; page.logger('before ', testName); - response = await test.skipVideoPreview(testName, Page.getArgsWithVideo(), undefined, `${c.skipVideoPreview}`); + response = await test.skipVideoPreview(testName, Page.getArgs(), undefined, `${c.skipVideoPreview}`); await test.page1.stopRecording(); page.logger('after ', testName); } catch (e) { @@ -712,7 +712,7 @@ const customParametersTest = () => { try { const testName = 'skipVideoPreviewOnFirstJoin'; page.logger('before ', testName); - response = await test.skipVideoPreviewOnFirstJoin(testName, Page.getArgsWithVideo(), undefined, `${c.skipVideoPreviewOnFirstJoin}`); + response = await test.skipVideoPreviewOnFirstJoin(testName, Page.getArgs(), undefined, `${c.skipVideoPreviewOnFirstJoin}`); await test.page1.stopRecording(); page.logger('after ', testName); } catch (e) { @@ -733,7 +733,7 @@ const customParametersTest = () => { try { const testName = 'mirrorOwnWebcam'; page.logger('before ', testName); - response = await test.mirrorOwnWebcam(testName, Page.getArgsWithVideo(), undefined, `${c.mirrorOwnWebcam}`); + response = await test.mirrorOwnWebcam(testName, Page.getArgs(), undefined, `${c.mirrorOwnWebcam}`); await test.page1.stopRecording(); page.logger('after ', testName); } catch (e) { @@ -753,7 +753,7 @@ const customParametersTest = () => { try { const testName = 'showParticipantsOnLogin'; page.logger('before ', testName); - response = await test.showParticipantsOnLogin(testName, Page.getArgsWithVideo(), undefined, `${c.showParticipantsOnLogin}`); + response = await test.showParticipantsOnLogin(testName, Page.getArgs(), undefined, `${c.showParticipantsOnLogin}`); await test.page1.stopRecording(); page.logger('after ', testName); } catch (e) { diff --git a/bigbluebutton-html5/tests/puppeteer/notifications/notifications.js b/bigbluebutton-html5/tests/puppeteer/notifications/notifications.js index a6bc43e94d02afdbbfbc36e79ce4abccc5fd89ea..c72e5aba209610539f975ba37a1070a7d33ecfb0 100644 --- a/bigbluebutton-html5/tests/puppeteer/notifications/notifications.js +++ b/bigbluebutton-html5/tests/puppeteer/notifications/notifications.js @@ -168,7 +168,7 @@ class Notifications extends MultiUsers { } async audioNotification(testName) { - await this.initUser3(Page.getArgsWithAudio(), undefined, testName); + await this.initUser3(Page.getArgs(), undefined, testName); await this.page3.startRecording(testName); await this.page3.screenshot(`${testName}`, `01-page03-initialized-${testName}`); await this.page3.joinMicrophone(); diff --git a/bigbluebutton-html5/tests/puppeteer/screenshare.obj.js b/bigbluebutton-html5/tests/puppeteer/screenshare.obj.js index 33676d44722ddcfbe6796c522a41e4ae09d550b0..5e453fa4c229c6e33dace13c7a4a2a5ce33be175 100644 --- a/bigbluebutton-html5/tests/puppeteer/screenshare.obj.js +++ b/bigbluebutton-html5/tests/puppeteer/screenshare.obj.js @@ -1,8 +1,11 @@ +const { toMatchImageSnapshot } = require('jest-image-snapshot'); const ShareScreen = require('./screenshare/screenshare'); const Page = require('./core/page'); -const { toMatchImageSnapshot } = require('jest-image-snapshot'); const { MAX_SCREENSHARE_TEST_TIMEOUT } = require('./core/constants'); // core constants (Timeouts vars imported) - +const devices = require('./core/devices'); +const iPhonex = devices['iPhone X']; +const galaxyNote3 = devices['Galaxy Note 3']; +const ipadPro = devices['iPad Pro']; expect.extend({ toMatchImageSnapshot }); const screenShareTest = () => { @@ -17,7 +20,7 @@ const screenShareTest = () => { try { const testName = 'shareScreen'; await test.logger('begin of ', testName); - await test.init(Page.getArgsWithVideo(), undefined, undefined, undefined, testName); + await test.init(Page.getArgs(), undefined, undefined, undefined, testName); await test.startRecording(testName); await test.closeAudioModal(); response = await test.test(); @@ -37,5 +40,83 @@ const screenShareTest = () => { }); } }); + + test('Share screen unvailable on Mobile Android', async () => { + process.env.IS_MOBILE = true; + const test = new ShareScreen(); + let response; + let screenshot; + try { + const testName = 'shareScreenAndroidMobile'; + await test.logger('begin of ', testName); + response = await test.testMobileDevice(Page.getArgs(), testName, galaxyNote3); + await test.logger('end of ', testName); + await test.stopRecording(); + screenshot = await test.page.screenshot(); + } catch (e) { + await test.logger(e); + } finally { + await test.close(); + } + expect(response).toBe(true); + if (process.env.REGRESSION_TESTING === 'true') { + expect(screenshot).toMatchImageSnapshot({ + failureThreshold: 1.37, + failureThresholdType: 'percent', + }); + } + }); + + test('Share screen unvailable on Mobile iPhone', async () => { + process.env.IS_MOBILE = true; + const test = new ShareScreen(); + let response; + let screenshot; + try { + const testName = 'shareScreenIphoneMobile'; + await test.logger('begin of ', testName); + response = await test.testMobileDevice(Page.getArgs(), testName, iPhonex); + await test.logger('end of ', testName); + await test.stopRecording(); + screenshot = await test.page.screenshot(); + } catch (e) { + await test.logger(e); + } finally { + await test.close(); + } + expect(response).toBe(true); + if (process.env.REGRESSION_TESTING === 'true') { + expect(screenshot).toMatchImageSnapshot({ + failureThreshold: 1.37, + failureThresholdType: 'percent', + }); + } + }); + + test('Share screen unvailable on Tablet iPad', async () => { + process.env.IS_MOBILE = true; + const test = new ShareScreen(); + let response; + let screenshot; + try { + const testName = 'shareScreenTabletIpad'; + await test.logger('begin of ', testName); + response = await test.testMobileDevice(Page.getArgs(), testName, ipadPro); + await test.logger('end of ', testName); + await test.stopRecording(); + screenshot = await test.page.screenshot(); + } catch (e) { + await test.logger(e); + } finally { + await test.close(); + } + expect(response).toBe(true); + if (process.env.REGRESSION_TESTING === 'true') { + expect(screenshot).toMatchImageSnapshot({ + failureThreshold: 1.37, + failureThresholdType: 'percent', + }); + } + }); }; module.exports = exports = screenShareTest; diff --git a/bigbluebutton-html5/tests/puppeteer/screenshare/screenshare.js b/bigbluebutton-html5/tests/puppeteer/screenshare/screenshare.js index 7a43dcd764e9cacc0eaff76d9d8be6e1f5df8382..d96f7abc743428e96e6e0eadbcefe31e82339bb3 100644 --- a/bigbluebutton-html5/tests/puppeteer/screenshare/screenshare.js +++ b/bigbluebutton-html5/tests/puppeteer/screenshare/screenshare.js @@ -10,13 +10,30 @@ class ShareScreen extends Page { } async test() { - await util.startScreenshare(this.page); + try { + await util.startScreenshare(this); + await this.page.waitForSelector(e.screenshareConnecting, ELEMENT_WAIT_TIME); + await this.page.waitForSelector(e.screenShareVideo, VIDEO_LOADING_WAIT_TIME); + await sleep(5000); + const response = await util.getScreenShareContainer(this); + return response; + } catch (e) { + console.log(e); + return false; + } + } - await this.page.waitForSelector(e.screenshareConnecting, ELEMENT_WAIT_TIME); - await this.page.waitForSelector(e.screenShareVideo, VIDEO_LOADING_WAIT_TIME); - await sleep(5000); - const response = await util.getScreenShareContainer(this.page); - return response; + async testMobileDevice(args, testName, deviceX) { + await this.init(args, undefined, undefined, undefined, testName, undefined, deviceX); + await this.startRecording(testName); + await this.closeAudioModal(); + try { + const screenshareBtn = await this.page.evaluate(() => document.querySelectorAll('button[aria-label="Share your screen"]').length === 0) === true; + return screenshareBtn; + } catch (e) { + console.log(e); + return false; + } } } diff --git a/bigbluebutton-html5/tests/puppeteer/screenshare/util.js b/bigbluebutton-html5/tests/puppeteer/screenshare/util.js index 802c722afd1b5719808dae3fcf1c2453ff2e9b6c..cc86e391c1cb97327ecbe806c2fbc73a4bab69e8 100644 --- a/bigbluebutton-html5/tests/puppeteer/screenshare/util.js +++ b/bigbluebutton-html5/tests/puppeteer/screenshare/util.js @@ -21,6 +21,7 @@ async function getScreenShareContainer(test) { const response = screenShareContainer !== null; return response; } + async function getScreenShareBreakoutContainer(test) { await test.waitForSelector(e.screenshareConnecting, { timeout: VIDEO_LOADING_WAIT_TIME }); await test.waitForSelector(e.screenShareVideo, { timeout: VIDEO_LOADING_WAIT_TIME }); diff --git a/bigbluebutton-html5/tests/puppeteer/user.obj.js b/bigbluebutton-html5/tests/puppeteer/user.obj.js index c3758ef6cd634a2a66983fa5f91670e18df6bcfd..b2b96fb8b8d543a68288da70b2a93bd75ac77472 100644 --- a/bigbluebutton-html5/tests/puppeteer/user.obj.js +++ b/bigbluebutton-html5/tests/puppeteer/user.obj.js @@ -5,6 +5,9 @@ const Create = require('./breakout/create'); const MultiUsers = require('./user/multiusers'); const { MAX_MULTIUSERS_TEST_TIMEOUT, TEST_DURATION_TIME } = require('./core/constants'); // core constants (Timeouts vars imported) const { NETWORK_PRESETS } = require('./core/profiles'); +const devices = require('./core/devices'); +const iPhonex = devices['iPhone X']; +const galaxyNote3 = devices['Galaxy Note 3']; expect.extend({ toMatchImageSnapshot }); @@ -21,7 +24,7 @@ const userTest = () => { try { const testName = 'mobileTagName'; await test.logger('begin of ', testName); - await test.init(Page.iPhoneXArgs(), undefined, undefined, undefined, testName); + await test.init(Page.getArgs(), undefined, undefined, undefined, testName, undefined, iPhonex); await test.startRecording(testName); await test.closeAudioModal(); response = await test.mobileTagName(); @@ -34,12 +37,7 @@ const userTest = () => { await test.close(); } expect(response).toBe(true); - if (process.env.REGRESSION_TESTING === 'true') { - expect(screenshot).toMatchImageSnapshot({ - failureThreshold: 2.0, - failureThresholdType: 'percent', - }); - } + await Page.checkRegression(2.0); }); // Change user status icon and check if it has changed @@ -63,12 +61,7 @@ const userTest = () => { await test.close(); } expect(response).toBe(true); - if (process.env.REGRESSION_TESTING === 'true') { - expect(screenshot).toMatchImageSnapshot({ - failureThreshold: 2.0, - failureThresholdType: 'percent', - }); - } + await Page.checkRegression(2.0); }); // Connect with 2 users and check if User1 sees User2 @@ -95,12 +88,7 @@ const userTest = () => { await test.close(test.page1, test.page2); } expect(response).toBe(true); - if (process.env.REGRESSION_TESTING === 'true') { - expect(screenshot).toMatchImageSnapshot({ - failureThreshold: 2.0, - failureThresholdType: 'percent', - }); - } + await Page.checkRegression(2.0); }); // Open Connection Status Modal and check if appears @@ -124,12 +112,7 @@ const userTest = () => { await test.close(); } expect(response).toBe(true); - if (process.env.REGRESSION_TESTING === 'true') { - expect(screenshot).toMatchImageSnapshot({ - failureThreshold: 2.0, - failureThresholdType: 'percent', - }); - } + await Page.checkRegression(2.0); }); // Open Connection Status Modal, start Webcam Share, disable Webcams in @@ -141,7 +124,7 @@ const userTest = () => { try { const testName = 'disableWebcamsFromConnectionStatus'; await test.logger('begin of ', testName); - await test.init(Page.getArgsWithVideo(), undefined, undefined, undefined, testName); + await test.init(Page.getArgs(), undefined, undefined, undefined, testName); await test.startRecording(testName); response = await test.disableWebcamsFromConnectionStatus(); await test.stopRecording(); @@ -153,12 +136,7 @@ const userTest = () => { await test.close(); } expect(response).toBe(true); - if (process.env.REGRESSION_TESTING === 'true') { - expect(screenshot).toMatchImageSnapshot({ - failureThreshold: 2.0, - failureThresholdType: 'percent', - }); - } + await Page.checkRegression(2.0); }); // Open Connection Status Modal, start Screenshare, disable Screenshare in @@ -182,12 +160,7 @@ const userTest = () => { await test.close(); } expect(response).toBe(true); - if (process.env.REGRESSION_TESTING === 'true') { - expect(screenshot).toMatchImageSnapshot({ - failureThreshold: 2.0, - failureThresholdType: 'percent', - }); - } + await Page.checkRegression(2.0); }); // Connect with a Good3G NETWORK_PRESET profil, Open Connection Status Modal @@ -199,7 +172,7 @@ const userTest = () => { try { const testName = 'reportUserInConnectionIssues'; await test.logger('begin of ', testName); - await test.init(Page.getArgsWithAudioAndVideo(), undefined, undefined, undefined, testName, NETWORK_PRESETS.Regular4G); + await test.init(Page.getArgs(), undefined, undefined, undefined, testName, NETWORK_PRESETS.Regular4G); await test.startRecording(testName); response = await test.reportUserInConnectionIssues(); await test.stopRecording(); @@ -211,12 +184,7 @@ const userTest = () => { await test.close(); } expect(response).toBe(true); - if (process.env.REGRESSION_TESTING === 'true') { - expect(screenshot).toMatchImageSnapshot({ - failureThreshold: 2.0, - failureThresholdType: 'percent', - }); - } + await Page.checkRegression(2.0); }, TEST_DURATION_TIME); // Force bad connection profile, force disconnection @@ -240,12 +208,7 @@ const userTest = () => { await test.closePage(test.page1); } expect(response).toBe(true); - if (process.env.REGRESSION_TESTING === 'true') { - expect(screenshot).toMatchImageSnapshot({ - failureThreshold: 2.0, - failureThresholdType: 'percent', - }); - } + await Page.checkRegression(2.0); }, TEST_DURATION_TIME); // Raise and Lower Hand and make sure that the User2 Avatar color @@ -274,12 +237,7 @@ const userTest = () => { await test.close(test.page1, test.page2); } expect(response).toBe(true); - if (process.env.REGRESSION_TESTING === 'true') { - expect(screenshot).toMatchImageSnapshot({ - failureThreshold: 2.0, - failureThresholdType: 'percent', - }); - } + await Page.checkRegression(2.0); }); // Set Guest policy to ASK_MODERATOR @@ -306,12 +264,7 @@ const userTest = () => { await test.closePage(test.page3); } expect(response).toBe(true); - if (process.env.REGRESSION_TESTING === 'true') { - expect(screenshot).toMatchImageSnapshot({ - failureThreshold: 2.0, - failureThresholdType: 'percent', - }); - } + await Page.checkRegression(2.0); }); // Set Guest policy to ALWAYS_ACCEPT @@ -338,12 +291,7 @@ const userTest = () => { await test.closePage(test.page3); } expect(response).toBe(true); - if (process.env.REGRESSION_TESTING === 'true') { - expect(screenshot).toMatchImageSnapshot({ - failureThreshold: 2.0, - failureThresholdType: 'percent', - }); - } + await Page.checkRegression(2.0); }); // Set Guest policy to ALWAYS_DENY @@ -370,12 +318,115 @@ const userTest = () => { await test.closePage(test.page3); } expect(response).toBe(true); - if (process.env.REGRESSION_TESTING === 'true') { - expect(screenshot).toMatchImageSnapshot({ - failureThreshold: 2.0, - failureThresholdType: 'percent', - }); + await Page.checkRegression(2.0); + }); + + // Whiteboard shouldn't be accessible when + // chat panel or userlist are active + test('Whiteboard should not be accessible when chat panel or userlist are active on mobile devices', async () => { + const test = new MultiUsers(); + let response; + let screenshot; + try { + const testName = 'whiteboardNotAppearOnMobile'; + await test.page1.logger('begin of ', testName); + await test.page1.init(Page.getArgs(), undefined, undefined, undefined, testName, undefined, iPhonex); + await test.page2.init(Page.getArgs(), undefined, undefined, undefined, testName, undefined, galaxyNote3); + await test.page1.startRecording(testName); + await test.page2.startRecording(testName); + response = await test.whiteboardNotAppearOnMobile(testName); + await test.page1.stopRecording(); + await test.page2.stopRecording(); + screenshot = await test.page1.page.screenshot(); + await test.page1.logger('end of ', testName); + } catch (err) { + await test.page1.logger(err); + } finally { + await test.close(test.page1, test.page2); } + expect(response).toBe(true); + await Page.checkRegression(2.0); + }); + + // Userlist and chat panel should not appear at page + // load in iPhone and Android Mobile devices + test('Userlist does not appear at page load on iPhone and Android', async () => { + const test = new MultiUsers(); + let response; + let screenshot; + try { + const testName = 'userlistNotAppearOnMobile'; + await test.page1.logger('begin of ', testName); + await test.page1.init(Page.getArgs(), undefined, undefined, undefined, testName, undefined, iPhonex); + await test.page2.init(Page.getArgs(), undefined, undefined, undefined, testName, undefined, galaxyNote3); + await test.page1.startRecording(testName); + await test.page2.startRecording(testName); + response = await test.userlistNotAppearOnMobile(testName); + await test.page1.stopRecording(); + await test.page2.stopRecording(); + screenshot = await test.page1.page.screenshot(); + await test.page1.logger('end of ', testName); + } catch (err) { + await test.page1.logger(err); + } finally { + await test.close(test.page1, test.page2); + } + expect(response).toBe(true); + await Page.checkRegression(2.0); + }); + + // Userslist shouldn't appear when Chat Panel or Whiteboard + // are active on small mobile devices + test('Userslist should not appear when Chat Panel or Whiteboard are active on small mobile devices', async () => { + const test = new MultiUsers(); + let response; + let screenshot; + try { + const testName = 'userlistNotAppearOnMobile'; + await test.page1.logger('begin of ', testName); + await test.page1.init(Page.getArgs(), undefined, undefined, undefined, testName, undefined, iPhonex); + await test.page2.init(Page.getArgs(), undefined, undefined, undefined, testName, undefined, galaxyNote3); + await test.page1.startRecording(testName); + await test.page2.startRecording(testName); + response = await test.userlistNotAppearOnMobile(); + await test.page1.stopRecording(); + await test.page2.stopRecording(); + screenshot = await test.page1.page.screenshot(); + await test.page1.logger('end of ', testName); + } catch (err) { + await test.page1.logger(err); + } finally { + await test.close(test.page1, test.page2); + } + expect(response).toBe(true); + await Page.checkRegression(2.0); + }); + + // Chat Panel shouldn't appear when Userlist or Whiteboard + // are active on small mobile devices + test('Chat Panel should not appear when Userlist or Whiteboard are active on small mobile devices', async () => { + const test = new MultiUsers(); + let response; + let screenshot; + try { + const testName = 'chatPanelNotAppearOnMobile'; + await test.page1.logger('begin of ', testName); + await test.page1.init(Page.getArgs(), undefined, undefined, undefined, testName, undefined, iPhonex); + await test.page2.init(Page.getArgs(), undefined, undefined, undefined, testName, undefined, galaxyNote3); + await test.page1.startRecording(testName); + await test.page2.startRecording(testName); + response = await test.chatPanelNotAppearOnMobile(); + await test.page1.stopRecording(); + await test.page2.stopRecording(); + screenshot = await test.page1.page.screenshot(); + await test.page1.logger('end of ', testName); + } catch (err) { + await test.page1.logger(err); + } finally { + await test.close(test.page1, test.page2); + } + expect(response).toBe(true); + await Page.checkRegression(2.0); }); }; module.exports = exports = userTest; diff --git a/bigbluebutton-html5/tests/puppeteer/user/elements.js b/bigbluebutton-html5/tests/puppeteer/user/elements.js index 2f9743e57a108f72c1ec43e6930c403d5d0c17ae..6323052b400fb5829ccef20be523c3ac7c2664e2 100644 --- a/bigbluebutton-html5/tests/puppeteer/user/elements.js +++ b/bigbluebutton-html5/tests/puppeteer/user/elements.js @@ -28,3 +28,7 @@ exports.alwaysAccept = 'button[data-test="alwaysAccept"]'; exports.alwaysDeny = 'button[data-test="alwaysDeny"]'; exports.waitingUsersBtn = 'div[data-test="waitingUsersBtn"]'; exports.joinMeetingDemoPage = 'div[class^="join-meeting"]'; +exports.chatButton = '[accesskey="P"]'; +exports.chatPanel = 'section[data-test="chatPanel"]'; +exports.userListButton = '[accesskey="U"]'; +exports.userListPanel = 'div[data-test="userListPanel"]'; diff --git a/bigbluebutton-html5/tests/puppeteer/user/multiusers.js b/bigbluebutton-html5/tests/puppeteer/user/multiusers.js index eb5151c5f29e6e8c8d24808ab7e0ee6a7cd95189..66b5cecdadc098d21d88fe526be75603cc451d47 100644 --- a/bigbluebutton-html5/tests/puppeteer/user/multiusers.js +++ b/bigbluebutton-html5/tests/puppeteer/user/multiusers.js @@ -1,13 +1,15 @@ const Page = require('../core/page'); const params = require('../params'); const util = require('../chat/util'); -const utilUser = require('../user/util'); +const utilUser = require('./util'); const utilCustomParams = require('../customparameters/util'); const pe = require('../core/elements'); const ne = require('../notifications/elements'); const ple = require('../polling/elemens'); const we = require('../whiteboard/elements'); -const ue = require('../user/elements'); +const ue = require('./elements'); +const cu = require('../customparameters/elements'); +const pre = require('../presentation/elements'); const { ELEMENT_WAIT_TIME, ELEMENT_WAIT_LONGER_TIME } = require('../core/constants'); const { sleep } = require('../core/helper'); @@ -190,17 +192,17 @@ class MultiUsers { // Get Avatars Colors from Userlist and Notification toast async getAvatarColorAndCompareWithUserListItem() { - const avatarInToastElementColor = await this.page1.page.$eval(we.avatarsWrapperAvatar, elem => getComputedStyle(elem).backgroundColor); - const avatarInUserListColor = await this.page1.page.$eval('[data-test="userListItem"] > div [data-test="userAvatar"]', elem => getComputedStyle(elem).backgroundColor); + const avatarInToastElementColor = await this.page1.page.$eval(we.avatarsWrapperAvatar, (elem) => getComputedStyle(elem).backgroundColor); + const avatarInUserListColor = await this.page1.page.$eval('[data-test="userListItem"] > div [data-test="userAvatar"]', (elem) => getComputedStyle(elem).backgroundColor); return avatarInToastElementColor === avatarInUserListColor; } - async userOfflineWithInternetProblem() { try { await this.page1.closeAudioModal(); await this.page2.closeAudioModal(); await this.page2.page.evaluate(() => window.dispatchEvent(new CustomEvent('socketstats', { detail: { rtt: 2000 } }))); + await this.page2.page.setOfflineMode(true); await sleep(3000); await this.page2.close(); await sleep(5000); @@ -215,6 +217,54 @@ class MultiUsers { } } + async userlistNotAppearOnMobile() { + try { + await this.page1.closeAudioModal(); + await this.page2.closeAudioModal(); + const userlistPanel = await this.page1.page.evaluate(utilUser.countTestElements, ue.chatButton) === false; + const chatPanel = await this.page2.page.evaluate(utilUser.countTestElements, ue.chatButton) === false; + return userlistPanel && chatPanel; + } catch (e) { + console.log(e); + return false; + } + } + + async whiteboardNotAppearOnMobile() { + try { + await this.page1.closeAudioModal(); + await this.page2.closeAudioModal(); + await this.page1.click(ue.userListButton, true); + await this.page2.click(ue.userListButton, true); + await this.page2.click(ue.chatButton, true); + const onUserListPanel = await this.page1.isNotVisible(cu.hidePresentation, ELEMENT_WAIT_TIME) === true; + const onChatPanel = await this.page2.page.evaluate(utilUser.countTestElements, cu.hidePresentation) === false; + console.log({onUserListPanel, onChatPanel}); + await sleep(2000); + return onUserListPanel && onChatPanel; + } catch (e) { + console.log(e); + return false; + } + } + + async chatPanelNotAppearOnMobile() { + try { + await this.page1.closeAudioModal(); + await this.page2.closeAudioModal(); + await this.page2.click(ue.userListButton, true); + await this.page2.click(ue.chatButton, true); + const whiteboard = await this.page1.page.evaluate(utilUser.countTestElements, ue.chatButton) === false; + const onChatPanel = await this.page2.isNotVisible(ue.chatButton, ELEMENT_WAIT_TIME) === true; + console.log({whiteboard, onChatPanel}); + await sleep(2000); + return whiteboard && onChatPanel; + } catch (e) { + console.log(e); + return false; + } + } + // Close all Pages async close(page1, page2) { await page1.close(); diff --git a/bigbluebutton-html5/tests/puppeteer/webcam.obj.js b/bigbluebutton-html5/tests/puppeteer/webcam.obj.js index a085cd7ede719f9557ecfaa424eb645ef98fb909..fd767cdeb9c600cdd9817a0ceb4bfd9d93cf5dce 100644 --- a/bigbluebutton-html5/tests/puppeteer/webcam.obj.js +++ b/bigbluebutton-html5/tests/puppeteer/webcam.obj.js @@ -18,7 +18,7 @@ const webcamTest = () => { try { const testName = 'shareWebcam'; await test.logger('begin of ', testName); - await test.init(Page.getArgsWithVideo(), undefined, undefined, undefined, testName); + await test.init(Page.getArgs(), undefined, undefined, undefined, testName); await test.startRecording(testName); response = await test.test(); await test.stopRecording(); @@ -45,7 +45,7 @@ const webcamTest = () => { try { const testName = 'checkWebcamContent'; await test.logger('begin of ', testName); - await test.init(Page.getArgsWithVideo(), undefined, undefined, undefined, testName); + await test.init(Page.getArgs(), undefined, undefined, undefined, testName); await test.startRecording(testName); response = await test.test(); await test.stopRecording(); diff --git a/bigbluebutton-html5/tests/puppeteer/webcamlayout.obj.js b/bigbluebutton-html5/tests/puppeteer/webcamlayout.obj.js index 2041f10d015197f9e521e0f76cda81e937137885..7bf443d5a27bab671867dacb47dd89012cb6a170 100644 --- a/bigbluebutton-html5/tests/puppeteer/webcamlayout.obj.js +++ b/bigbluebutton-html5/tests/puppeteer/webcamlayout.obj.js @@ -17,7 +17,7 @@ const webcamLayoutTest = () => { try { const testName = 'joinWebcamAndMicrophone'; await test.logger('begin of ', testName); - await test.init(Page.getArgsWithAudioAndVideo(), undefined, undefined, undefined, testName); + await test.init(Page.getArgs(), undefined, undefined, undefined, testName); await test.startRecording(testName); await test.webcamLayoutStart(); response = await test.webcamLayoutTest(testName);