Skip to content

Comments

fix(tooling): remove wdio & upgrade meeting widget to playwright#628

Open
Riteshfyi wants to merge 18 commits intowebex:nextfrom
Riteshfyi:pw
Open

fix(tooling): remove wdio & upgrade meeting widget to playwright#628
Riteshfyi wants to merge 18 commits intowebex:nextfrom
Riteshfyi:pw

Conversation

@Riteshfyi
Copy link
Contributor

@Riteshfyi Riteshfyi commented Feb 19, 2026

COMPLETES #https://jira-eng-gpk2.cisco.com/jira/browse/SPARK-772628

This pull request addresses

Removes Wdio E2E Tests & moves to playwright for meetings widget.

by making the following changes

converting previous tests to typescrip & updating them for palywright

VIDCAST

https://app.vidcast.io/share/efc89d9a-211e-4130-a602-e326ac9f3b43

Change Type

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update
  • Tooling change
  • Internal code refactor

The following scenarios were tested

  • verified locally, will run e2e test as well

The GAI Coding Policy And Copyright Annotation Best Practices

  • GAI was not used (or, no additional notation is required)
  • Code was generated entirely by GAI
  • GAI was used to create a draft that was subsequently customized or modified
  • Coder created a draft manually that was non-substantively modified by GAI (e.g., refactoring was performed by GAI on manually written code)
  • Tool used for AI assistance (GitHub Copilot / Other - specify)
    • Github Copilot
    • Cursor
  • This PR is related to
    • Feature
    • Defect fix
    • Tech Debt
    • Automation
    • Tooling

Checklist before merging

  • I have not skipped any automated checks
  • All existing and new tests passed
  • I have updated the testing document
  • I have tested the functionality with amplify link

Make sure to have followed the contributing guidelines before submitting.

@aws-amplify-us-east-2
Copy link

This pull request is automatically being deployed by Amplify Hosting (learn more).

Access this pull request here: https://pr-628.d1b38q61t1z947.amplifyapp.com

@Riteshfyi Riteshfyi changed the title fix(tooling) : Remove Wdio & Upgrade to Meeting Widget to Playwright fix(tooling) : Remove Wdio & Upgrade Meeting Widget to Playwright Feb 19, 2026
@akulakum akulakum added validated Indicates that the PR is ready for actions run_e2e Add this label to run E2E test for meeting and CC widgets and removed validated Indicates that the PR is ready for actions labels Feb 19, 2026
@Riteshfyi Riteshfyi changed the title fix(tooling) : Remove Wdio & Upgrade Meeting Widget to Playwright fix(tooling): Remove Wdio & Upgrade Meeting Widget to Playwright Feb 19, 2026
@Shreyas281299
Copy link
Contributor

@codex review

Copy link

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 52c36927e5

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

"release:dry-run": "semantic-release --dry-run",
"start": "npm run demo:serve",
"test:e2e": "npm run demo:build && wdio wdio.conf.js",
"test:e2e": "npm run demo:build && yarn playwright test --project='Meetings Setup' --project='Meetings Widget Test'",

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Use the configured setup project name in test:e2e

test:e2e invokes Playwright with --project='Meetings Setup', but the setup project defined in playwright.config.ts is named OAuth: Get Meeting Access Token (line 76). Since Playwright resolves --project by exact project name, this command fails before tests run, which means the e2e_test_meetings workflow path (.github/workflows/pull-request.yml, Test E2E) cannot execute the migrated meetings suite.

Useful? React with 👍 / 👎.

this.unmuteAudioBtn = this.controls.getByRole('button', {name: 'Unmute'});
this.muteVideoBtn = this.controls.getByRole('button', {name: 'Stop video'});
this.unmuteVideoBtn = this.controls.getByRole('button', {name: 'Start video'});
this.joinMeetingBtn = this.controls.getByRole('button', {name: /^(Muted, video off|Unmuted, video on)$/});

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Match the join button’s actual accessible name

The new locator only matches a button named /^(Muted, video off|Unmuted, video on)$/, but the meeting widget code still identifies the pre-join control as button[aria-label="Join meeting"] (packages/@webex/widgets/src/widgets/WebexMeetings/WebexMeetings.jsx), and the prior E2E test also targeted “Join meeting”; in that pre-join state joinMeetingBtn.click() in both suites cannot resolve an element, so the tests fail before joining.

Useful? React with 👍 / 👎.

@rarajes2 rarajes2 changed the title fix(tooling): Remove Wdio & Upgrade Meeting Widget to Playwright fix(tooling): remove wdio & upgrade meeting widget to playwright Feb 20, 2026
Copy link
Contributor

@Shreyas281299 Shreyas281299 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for this upgrade. Changes look good. Lets just ensure that the checks are passing.
And what about the credentials?

@Riteshfyi
Copy link
Contributor Author

Will Move these Changes to a feature branch, before we migrate the meeting widgets to latest version of our Webex

Copy link
Contributor

@rarajes2 rarajes2 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add a vidcast

"release:dry-run": "semantic-release --dry-run",
"start": "npm run demo:serve",
"test:e2e": "npm run demo:build && wdio wdio.conf.js",
"test:e2e": "npm run demo:build && yarn playwright test --config=../../../playwright.config.ts --project='Meetings Widget Test'",
Copy link
Contributor

@rarajes2 rarajes2 Feb 23, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. Why are we using both npm and yarn ? Let's use a single package manager
  2. Do we have to provide the config path ? Is there a way we can use the default path and keep the command to minimum ?
  3. Can we also rename the folder from widgets to meetings-widgets or just meetings? NOT IN THE SCOPE OF THIS PR

@@ -0,0 +1,31 @@
import {Page, Locator, expect} from '@playwright/test';

const TEST_URL = 'https://localhost:9000/';
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. Should we move this to a constant or config file ?
  2. Will it work in the pipeline ? Maybe this value can come from env variable

Comment on lines +1 to +6
import { test, expect } from '@playwright/test';
import fs from 'fs';
import path from 'path';
import { SamplesPage } from './pages/SamplesPage';
import { MeetingWidgetPage } from './pages/MeetingWidgetPage';
import dotenv from 'dotenv';
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nitpick: Let's re-arrange the imports. Please check other files for reference

Comment on lines +17 to +22
// Re-read .env fresh so we pick up the token written by Meetings Setup
const envPath = path.resolve(__dirname, '../../.env');
const envConfig = dotenv.parse(fs.readFileSync(envPath));
for (const key in envConfig) {
process.env[key] = envConfig[key];
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do we need to do this? We are calling the dotenv.config() at the top. Please verify if it's require

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Playwright test files were reading older environment variable values. For example, after OAuth, the tests were reading an empty string instead of the newly written access token. To address this issue, this change has been made.

test.describe('Meeting Widget', () => {
let samplesPage: SamplesPage;
let meetingPage: MeetingWidgetPage;
let accessToken: string;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are we changing the value of accessToken anywhere? If not, this can be const and value can be assigned here itself from the env variable

Comment on lines +28 to +30



Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nitpick: remove unnecessary newlines.

Applicable everywhere in this file

Comment on lines +43 to +60
const envPath = path.resolve(__dirname, '../.env');
let envContent = '';
if (fs.existsSync(envPath)) {
envContent = fs.readFileSync(envPath, 'utf8');
}


const tokenPattern = /^PW_MEETING_ACCESS_TOKEN=.*$/m;
if (tokenPattern.test(envContent)) {
envContent = envContent.replace(tokenPattern, `PW_MEETING_ACCESS_TOKEN=${accessToken}`);
} else {
if (!envContent.endsWith('\n') && envContent.length > 0) envContent += '\n';
envContent += `PW_MEETING_ACCESS_TOKEN=${accessToken}\n`;
}

fs.writeFileSync(envPath, envContent, 'utf8');
console.log('Access token written to .env');
});
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do we have to do all this if we are using dotenv package ?

Comment on lines +10 to +22
const e2eConfig = [
`--disable-site-isolation-trials`,
`--disable-web-security`,
`--no-sandbox`,
`--disable-features=WebRtcHideLocalIpsWithMdns`,
`--allow-file-access-from-files`,
`--use-fake-ui-for-media-stream`,
`--use-fake-device-for-media-stream`,
`--use-file-for-fake-audio-capture=${dummyAudioPath}`,
`--disable-extensions`,
`--disable-plugins`,
`--window-size=1280,720`,
];
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's add a comment at the end of each config for what they are being used

webServer: [
{
command: 'yarn workspace samples-cc-react-app serve',
url: 'http://localhost:3000',
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This can come from constant or cofing file.

Applicable everywhere in this file

},
webServer: [
{
command: 'yarn workspace samples-cc-react-app serve',
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's ensure we are using either npm or yarn throughout the codebase

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

run_e2e Add this label to run E2E test for meeting and CC widgets validated Indicates that the PR is ready for actions

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants