Commit fe96b3cb49 for woocommerce

commit fe96b3cb49b9e6afc4c497040b853eea315a8a4a
Author: theAverageDev (Luca Tumedei) <luca@theaveragedev.com>
Date:   Tue Feb 10 11:42:09 2026 +0100

    Convert e2e-pw test specs to TypeScript (batch 3) (#63212)

diff --git a/plugins/woocommerce/changelog/e2e-pw-ts-conversion-04 b/plugins/woocommerce/changelog/e2e-pw-ts-conversion-04
new file mode 100644
index 0000000000..d9374a0cbc
--- /dev/null
+++ b/plugins/woocommerce/changelog/e2e-pw-ts-conversion-04
@@ -0,0 +1,4 @@
+Significance: patch
+Type: dev
+
+Convert third set of e2e-pw tests to TypeScript.
diff --git a/plugins/woocommerce/tests/e2e-pw/tests/analytics/analytics-access.spec.js b/plugins/woocommerce/tests/e2e-pw/tests/analytics/analytics-access.spec.ts
similarity index 91%
rename from plugins/woocommerce/tests/e2e-pw/tests/analytics/analytics-access.spec.js
rename to plugins/woocommerce/tests/e2e-pw/tests/analytics/analytics-access.spec.ts
index 35c31a2c38..2121bd6efd 100644
--- a/plugins/woocommerce/tests/e2e-pw/tests/analytics/analytics-access.spec.js
+++ b/plugins/woocommerce/tests/e2e-pw/tests/analytics/analytics-access.spec.ts
@@ -1,6 +1,13 @@
-const { test, expect } = require( '@playwright/test' );
-const { tags } = require( '../../fixtures/fixtures' );
-const { ADMIN_STATE_PATH } = require( '../../playwright.config' );
+/**
+ * External dependencies
+ */
+import { test, expect } from '@playwright/test';
+
+/**
+ * Internal dependencies
+ */
+import { tags } from '../../fixtures/fixtures';
+import { ADMIN_STATE_PATH } from '../../playwright.config';

 test.describe( 'WooCommerce Home', () => {
 	test.use( { storageState: ADMIN_STATE_PATH } );
diff --git a/plugins/woocommerce/tests/e2e-pw/tests/analytics/analytics-data.spec.js b/plugins/woocommerce/tests/e2e-pw/tests/analytics/analytics-data.spec.ts
similarity index 99%
rename from plugins/woocommerce/tests/e2e-pw/tests/analytics/analytics-data.spec.js
rename to plugins/woocommerce/tests/e2e-pw/tests/analytics/analytics-data.spec.ts
index 591b59cde4..143132f2f3 100644
--- a/plugins/woocommerce/tests/e2e-pw/tests/analytics/analytics-data.spec.js
+++ b/plugins/woocommerce/tests/e2e-pw/tests/analytics/analytics-data.spec.ts
@@ -35,7 +35,7 @@ const test = baseTest.extend( {
 	},
 } );

-let categoryIds, productIds, orderIds, setupPage;
+let categoryIds: number[], productIds: number[], orderIds: number[], setupPage;

 test.beforeAll( async ( { browser, restApi } ) => {
 	// create a couple of product categories
diff --git a/plugins/woocommerce/tests/e2e-pw/tests/analytics/analytics-overview.spec.js b/plugins/woocommerce/tests/e2e-pw/tests/analytics/analytics-overview.spec.ts
similarity index 94%
rename from plugins/woocommerce/tests/e2e-pw/tests/analytics/analytics-overview.spec.js
rename to plugins/woocommerce/tests/e2e-pw/tests/analytics/analytics-overview.spec.ts
index 91e20bd5c1..d3ec35c9b2 100644
--- a/plugins/woocommerce/tests/e2e-pw/tests/analytics/analytics-overview.spec.js
+++ b/plugins/woocommerce/tests/e2e-pw/tests/analytics/analytics-overview.spec.ts
@@ -1,39 +1,26 @@
-const { test, expect, request, Page, Locator } = require( '@playwright/test' );
-const { admin } = require( '../../test-data/data' );
-const { tags } = require( '../../fixtures/fixtures' );
-const { ADMIN_STATE_PATH } = require( '../../playwright.config' );
-const { setOption } = require( '../../utils/options' );
-
-const EXPECTED_SECTION_HEADERS = [ 'Performance', 'Charts', 'Leaderboards' ];
-
-/**
- * @type {number}
- */
-let userId;
-/**
- * @type {Locator}
- */
-let headings_sections;
-/**
- * @type {Locator}
- */
-let heading_performance;
 /**
- * @type {Locator}
+ * External dependencies
  */
-let buttons_ellipsis;
-/**
- * @type {Locator}
- */
-let menuitem_moveUp;
-/**
- * @type {Locator}
- */
-let menuitem_moveDown;
+import { test, expect, request } from '@playwright/test';
+import type { Page, Locator } from '@playwright/test';
+
 /**
- * @type {Page}
+ * Internal dependencies
  */
-let page;
+import { admin } from '../../test-data/data';
+import { tags } from '../../fixtures/fixtures';
+import { ADMIN_STATE_PATH } from '../../playwright.config';
+import { setOption } from '../../utils/options';
+
+const EXPECTED_SECTION_HEADERS = [ 'Performance', 'Charts', 'Leaderboards' ];
+
+let userId: number;
+let headings_sections: Locator;
+let heading_performance: Locator;
+let buttons_ellipsis: Locator;
+let menuitem_moveUp: Locator;
+let menuitem_moveDown: Locator;
+let page: Page;

 const base64String = Buffer.from(
 	`${ admin.username }:${ admin.password }`
diff --git a/plugins/woocommerce/tests/e2e-pw/tests/analytics/analytics-settings.spec.js b/plugins/woocommerce/tests/e2e-pw/tests/analytics/analytics-settings.spec.ts
similarity index 92%
rename from plugins/woocommerce/tests/e2e-pw/tests/analytics/analytics-settings.spec.js
rename to plugins/woocommerce/tests/e2e-pw/tests/analytics/analytics-settings.spec.ts
index de30bb98ed..a0b6cc00bf 100644
--- a/plugins/woocommerce/tests/e2e-pw/tests/analytics/analytics-settings.spec.js
+++ b/plugins/woocommerce/tests/e2e-pw/tests/analytics/analytics-settings.spec.ts
@@ -1,12 +1,17 @@
-const { test, expect, request, Page } = require( '@playwright/test' );
-const { tags } = require( '../../fixtures/fixtures' );
-const { setOption, deleteOption } = require( '../../utils/options' );
-const { ADMIN_STATE_PATH } = require( '../../playwright.config' );
+/**
+ * External dependencies
+ */
+import { test, expect, request } from '@playwright/test';
+import type { Page } from '@playwright/test';

 /**
- * @type {Page}
+ * Internal dependencies
  */
-let page;
+import { tags } from '../../fixtures/fixtures';
+import { setOption, deleteOption } from '../../utils/options';
+import { ADMIN_STATE_PATH } from '../../playwright.config';
+
+let page: Page;

 test.describe(
 	'Analytics Settings - Scheduled Import',
diff --git a/plugins/woocommerce/tests/e2e-pw/tests/product/create-product-attributes.spec.js b/plugins/woocommerce/tests/e2e-pw/tests/product/create-product-attributes.spec.ts
similarity index 96%
rename from plugins/woocommerce/tests/e2e-pw/tests/product/create-product-attributes.spec.js
rename to plugins/woocommerce/tests/e2e-pw/tests/product/create-product-attributes.spec.ts
index 2cef6d9622..111998011a 100644
--- a/plugins/woocommerce/tests/e2e-pw/tests/product/create-product-attributes.spec.js
+++ b/plugins/woocommerce/tests/e2e-pw/tests/product/create-product-attributes.spec.ts
@@ -5,6 +5,7 @@ import {
 	WC_API_PATH,
 	WC_ADMIN_API_PATH,
 } from '@woocommerce/e2e-utils-playwright';
+import type { Page } from '@playwright/test';

 /**
  * Internal dependencies
@@ -61,11 +62,7 @@ const test = baseTest.extend( {
 	},
 } );

-/**
- *
- * @param {import('@playwright/test').Page} page
- */
-async function goToAttributesTab( page ) {
+async function goToAttributesTab( page: Page ) {
 	// There is the chance we might click on the 'Attributes' tab too early. To
 	// prevent that, we wait until the 'Variations' tab is hidden, which means
 	// the tabs have been updated.
@@ -85,10 +82,10 @@ async function goToAttributesTab( page ) {
 	} );
 }
 async function addAttribute(
-	page,
-	attributeName,
-	attributeValues,
-	firstAttribute
+	page: Page,
+	attributeName: string,
+	attributeValues: string,
+	firstAttribute: boolean
 ) {
 	if ( ! firstAttribute ) {
 		await test.step( "Click 'Add new'.", async () => {
diff --git a/plugins/woocommerce/tests/e2e-pw/tests/product/create-variable-product.spec.js b/plugins/woocommerce/tests/e2e-pw/tests/product/create-variable-product.spec.ts
similarity index 87%
rename from plugins/woocommerce/tests/e2e-pw/tests/product/create-variable-product.spec.js
rename to plugins/woocommerce/tests/e2e-pw/tests/product/create-variable-product.spec.ts
index 46014f9095..8ac91b2794 100644
--- a/plugins/woocommerce/tests/e2e-pw/tests/product/create-variable-product.spec.js
+++ b/plugins/woocommerce/tests/e2e-pw/tests/product/create-variable-product.spec.ts
@@ -1,12 +1,20 @@
-const { test, expect } = require( '@playwright/test' );
-const { variableProducts: utils, api } = require( '../../utils' );
-const { tags } = require( '../../fixtures/fixtures' );
-const { ADMIN_STATE_PATH } = require( '../../playwright.config' );
+/**
+ * External dependencies
+ */
+import { test, expect } from '@playwright/test';
+
+/**
+ * Internal dependencies
+ */
+import { variableProducts as utils, api } from '../../utils';
+import { tags } from '../../fixtures/fixtures';
+import { ADMIN_STATE_PATH } from '../../playwright.config';
+
 const { showVariableProductTour } = utils;
 const productPageURL = 'wp-admin/post-new.php?post_type=product';
 const variableProductName = 'Variable Product with Three Variations';

-let productId;
+let productId: number;

 test.describe( 'Add variable product', { tag: tags.GUTENBERG }, () => {
 	test.use( { storageState: ADMIN_STATE_PATH } );
@@ -99,7 +107,9 @@ test.describe( 'Add variable product', { tag: tags.GUTENBERG }, () => {
 		} );

 		await test.step( 'Save product ID for clean up.', async () => {
-			productId = page.url().match( /(?<=post=)\d+/ );
+			const match = page.url().match( /(?<=post=)\d+/ );
+			expect( match ).not.toBeNull();
+			productId = Number( match![ 0 ] );
 		} );
 	} );
 } );
diff --git a/plugins/woocommerce/tests/e2e-pw/tests/product/create-variations.spec.js b/plugins/woocommerce/tests/e2e-pw/tests/product/create-variations.spec.ts
similarity index 92%
rename from plugins/woocommerce/tests/e2e-pw/tests/product/create-variations.spec.js
rename to plugins/woocommerce/tests/e2e-pw/tests/product/create-variations.spec.ts
index adb93b779f..0ff52a36d8 100644
--- a/plugins/woocommerce/tests/e2e-pw/tests/product/create-variations.spec.js
+++ b/plugins/woocommerce/tests/e2e-pw/tests/product/create-variations.spec.ts
@@ -1,7 +1,14 @@
-const { test, expect } = require( '@playwright/test' );
-const { tags } = require( '../../fixtures/fixtures' );
-const { variableProducts: utils } = require( '../../utils' );
-const { ADMIN_STATE_PATH } = require( '../../playwright.config' );
+/**
+ * External dependencies
+ */
+import { test, expect } from '@playwright/test';
+
+/**
+ * Internal dependencies
+ */
+import { tags } from '../../fixtures/fixtures';
+import { variableProducts as utils } from '../../utils';
+import { ADMIN_STATE_PATH } from '../../playwright.config';
 const {
 	createVariableProduct,
 	showVariableProductTour,
@@ -10,10 +17,10 @@ const {
 	productAttributes,
 } = utils;

-let expectedGeneratedVariations,
-	productId_addManually,
-	productId_generateVariations,
-	variationsToManuallyCreate;
+let expectedGeneratedVariations: string[][],
+	productId_addManually: number,
+	productId_generateVariations: number,
+	variationsToManuallyCreate: string[][];

 test.describe( 'Add variations', { tag: tags.GUTENBERG }, () => {
 	test.use( { storageState: ADMIN_STATE_PATH } );
diff --git a/plugins/woocommerce/tests/e2e-pw/tests/product/product-create-simple.spec.js b/plugins/woocommerce/tests/e2e-pw/tests/product/product-create-simple.spec.ts
similarity index 99%
rename from plugins/woocommerce/tests/e2e-pw/tests/product/product-create-simple.spec.js
rename to plugins/woocommerce/tests/e2e-pw/tests/product/product-create-simple.spec.ts
index b25f17067e..4201ebc477 100644
--- a/plugins/woocommerce/tests/e2e-pw/tests/product/product-create-simple.spec.js
+++ b/plugins/woocommerce/tests/e2e-pw/tests/product/product-create-simple.spec.ts
@@ -45,7 +45,7 @@ const productData = {
 	},
 };

-function removeHtmlTags( str ) {
+function removeHtmlTags( str: string ) {
 	return str.replace( /<\/?[^>]+(>|$)/g, '' );
 }

diff --git a/plugins/woocommerce/tests/e2e-pw/tests/product/product-delete.spec.js b/plugins/woocommerce/tests/e2e-pw/tests/product/product-delete.spec.ts
similarity index 100%
rename from plugins/woocommerce/tests/e2e-pw/tests/product/product-delete.spec.js
rename to plugins/woocommerce/tests/e2e-pw/tests/product/product-delete.spec.ts
diff --git a/plugins/woocommerce/tests/e2e-pw/tests/product/product-edit.spec.js b/plugins/woocommerce/tests/e2e-pw/tests/product/product-edit.spec.ts
similarity index 97%
rename from plugins/woocommerce/tests/e2e-pw/tests/product/product-edit.spec.js
rename to plugins/woocommerce/tests/e2e-pw/tests/product/product-edit.spec.ts
index 3c71c279ad..2e6723da10 100644
--- a/plugins/woocommerce/tests/e2e-pw/tests/product/product-edit.spec.js
+++ b/plugins/woocommerce/tests/e2e-pw/tests/product/product-edit.spec.ts
@@ -4,6 +4,8 @@
 import { faker } from '@faker-js/faker';
 import { WC_API_PATH } from '@woocommerce/e2e-utils-playwright';

+import type { Page } from '@playwright/test';
+
 /**
  * Internal dependencies
  */
@@ -11,7 +13,7 @@ import { test as baseTest, expect, tags } from '../../fixtures/fixtures';
 import { ADMIN_STATE_PATH } from '../../playwright.config';
 import { getFakeProduct } from '../../utils/data';

-async function saveProductChanges( page ) {
+async function saveProductChanges( page: Page ) {
 	await page
 		.locator( '#publishing-action' )
 		.getByRole( 'button', { name: 'Update' } )
@@ -23,7 +25,7 @@ async function saveProductChanges( page ) {
 	).toBeVisible();
 }

-async function saveBulkProductChanges( page ) {
+async function saveBulkProductChanges( page: Page ) {
 	await page.getByRole( 'button', { name: 'Update' } ).click();
 	await expect(
 		page
@@ -32,7 +34,7 @@ async function saveBulkProductChanges( page ) {
 	).toBeVisible();
 }

-async function selectProduct( page, product ) {
+async function selectProduct( page: Page, product ) {
 	await page
 		.getByLabel( `Select ${ product.name }` )
 		.and(
@@ -41,7 +43,7 @@ async function selectProduct( page, product ) {
 		.click();
 }

-async function selectAllProducts( page, products ) {
+async function selectAllProducts( page: Page, products ) {
 	for ( const product of products ) {
 		await selectProduct( page, product );
 	}
diff --git a/plugins/woocommerce/tests/e2e-pw/tests/product/product-export.spec.js b/plugins/woocommerce/tests/e2e-pw/tests/product/product-export.spec.ts
similarity index 100%
rename from plugins/woocommerce/tests/e2e-pw/tests/product/product-export.spec.js
rename to plugins/woocommerce/tests/e2e-pw/tests/product/product-export.spec.ts
diff --git a/plugins/woocommerce/tests/e2e-pw/tests/product/product-grouped.spec.js b/plugins/woocommerce/tests/e2e-pw/tests/product/product-grouped.spec.ts
similarity index 97%
rename from plugins/woocommerce/tests/e2e-pw/tests/product/product-grouped.spec.js
rename to plugins/woocommerce/tests/e2e-pw/tests/product/product-grouped.spec.ts
index 7a1d9998e6..221f955b18 100644
--- a/plugins/woocommerce/tests/e2e-pw/tests/product/product-grouped.spec.js
+++ b/plugins/woocommerce/tests/e2e-pw/tests/product/product-grouped.spec.ts
@@ -13,7 +13,7 @@ const productPrice = '18.16';
 const simpleProductName = 'Simple single product';
 const groupedProductName = 'Grouped single product';

-let simpleProductId, simpleProduct2Id, groupedProductId;
+let simpleProductId: number, simpleProduct2Id: number, groupedProductId: number;

 test.describe(
 	'Grouped Product Page',
diff --git a/plugins/woocommerce/tests/e2e-pw/tests/product/product-images.spec.js b/plugins/woocommerce/tests/e2e-pw/tests/product/product-images.spec.ts
similarity index 98%
rename from plugins/woocommerce/tests/e2e-pw/tests/product/product-images.spec.js
rename to plugins/woocommerce/tests/e2e-pw/tests/product/product-images.spec.ts
index f41643ec5e..b399cf4e52 100644
--- a/plugins/woocommerce/tests/e2e-pw/tests/product/product-images.spec.js
+++ b/plugins/woocommerce/tests/e2e-pw/tests/product/product-images.spec.ts
@@ -2,6 +2,7 @@
  * External dependencies
  */
 import { WC_API_PATH } from '@woocommerce/e2e-utils-playwright';
+import type { Page } from '@playwright/test';

 /**
  * Internal dependencies
@@ -9,7 +10,11 @@ import { WC_API_PATH } from '@woocommerce/e2e-utils-playwright';
 import { test as baseTest, expect } from '../../fixtures/fixtures';
 import { ADMIN_STATE_PATH } from '../../playwright.config';

-async function addImageFromLibrary( page, imageName, actionButtonName ) {
+async function addImageFromLibrary(
+	page: Page,
+	imageName: string,
+	actionButtonName: string
+) {
 	await page.getByRole( 'tab', { name: 'Media Library' } ).click();
 	await page.getByRole( 'searchbox', { name: 'Search' } ).fill( imageName );
 	const imageLocator = page.getByLabel( imageName ).nth( 0 );
diff --git a/plugins/woocommerce/tests/e2e-pw/tests/product/product-import-csv.spec.js b/plugins/woocommerce/tests/e2e-pw/tests/product/product-import-csv.spec.ts
similarity index 98%
rename from plugins/woocommerce/tests/e2e-pw/tests/product/product-import-csv.spec.js
rename to plugins/woocommerce/tests/e2e-pw/tests/product/product-import-csv.spec.ts
index b7d533bfb0..364a58ca89 100644
--- a/plugins/woocommerce/tests/e2e-pw/tests/product/product-import-csv.spec.js
+++ b/plugins/woocommerce/tests/e2e-pw/tests/product/product-import-csv.spec.ts
@@ -15,9 +15,9 @@ const filePathOverride = path.resolve(
 	'tests/e2e-pw/test-data/sample_products_override.csv'
 );

-const productIds = [];
-const categoryIds = [];
-const attributeIds = [];
+const productIds: number[] = [];
+const categoryIds: number[] = [];
+const attributeIds: number[] = [];

 const productNames = [
 	'Imported V-Neck T-Shirt',
diff --git a/plugins/woocommerce/tests/e2e-pw/tests/product/product-linked-products.spec.js b/plugins/woocommerce/tests/e2e-pw/tests/product/product-linked-products.spec.ts
similarity index 98%
rename from plugins/woocommerce/tests/e2e-pw/tests/product/product-linked-products.spec.js
rename to plugins/woocommerce/tests/e2e-pw/tests/product/product-linked-products.spec.ts
index 9187879aa2..df3d698dc5 100644
--- a/plugins/woocommerce/tests/e2e-pw/tests/product/product-linked-products.spec.js
+++ b/plugins/woocommerce/tests/e2e-pw/tests/product/product-linked-products.spec.ts
@@ -2,6 +2,7 @@
  * External dependencies
  */
 import { WC_API_PATH } from '@woocommerce/e2e-utils-playwright';
+import type { Page } from '@playwright/test';

 /**
  * Internal dependencies
@@ -42,7 +43,7 @@ test.describe(
 	'Products > Related products',
 	{ tag: [ tags.GUTENBERG ] },
 	() => {
-		async function navigate( page, productId ) {
+		async function navigate( page: Page, productId: number ) {
 			await test.step( 'Navigate to product edit page', async () => {
 				await page.goto(
 					`wp-admin/post.php?post=${ productId }&action=edit`
@@ -67,7 +68,7 @@ test.describe(
 			} );
 		}

-		async function updateProduct( page ) {
+		async function updateProduct( page: Page ) {
 			await test.step( 'update the product', async () => {
 				// extra click somewhere in the page as a workaround for update button click not always working
 				await page
diff --git a/plugins/woocommerce/tests/e2e-pw/tests/product/product-reviews.spec.js b/plugins/woocommerce/tests/e2e-pw/tests/product/product-reviews.spec.ts
similarity index 100%
rename from plugins/woocommerce/tests/e2e-pw/tests/product/product-reviews.spec.js
rename to plugins/woocommerce/tests/e2e-pw/tests/product/product-reviews.spec.ts
diff --git a/plugins/woocommerce/tests/e2e-pw/tests/product/product-search.spec.js b/plugins/woocommerce/tests/e2e-pw/tests/product/product-search.spec.ts
similarity index 96%
rename from plugins/woocommerce/tests/e2e-pw/tests/product/product-search.spec.js
rename to plugins/woocommerce/tests/e2e-pw/tests/product/product-search.spec.ts
index 03b50d9964..2db4d9a14f 100644
--- a/plugins/woocommerce/tests/e2e-pw/tests/product/product-search.spec.js
+++ b/plugins/woocommerce/tests/e2e-pw/tests/product/product-search.spec.ts
@@ -6,10 +6,10 @@ import { WC_API_PATH } from '@woocommerce/e2e-utils-playwright';
 /**
  * Internal dependencies
  */
-import { test, expect } from '../../fixtures/fixtures.js';
+import { test, expect } from '../../fixtures/fixtures';
 import { ADMIN_STATE_PATH } from '../../playwright.config';

-let productId;
+let productId: number;
 const productName = `Unique thing that we sell ${ new Date()
 	.getTime()
 	.toString() }`;
diff --git a/plugins/woocommerce/tests/e2e-pw/tests/product/product-settings.spec.js b/plugins/woocommerce/tests/e2e-pw/tests/product/product-settings.spec.ts
similarity index 98%
rename from plugins/woocommerce/tests/e2e-pw/tests/product/product-settings.spec.js
rename to plugins/woocommerce/tests/e2e-pw/tests/product/product-settings.spec.ts
index 46660e590c..0cafcb9d24 100644
--- a/plugins/woocommerce/tests/e2e-pw/tests/product/product-settings.spec.js
+++ b/plugins/woocommerce/tests/e2e-pw/tests/product/product-settings.spec.ts
@@ -1,7 +1,7 @@
 /**
  * Internal dependencies
  */
-import { test, expect } from '../../fixtures/fixtures.js';
+import { test, expect } from '../../fixtures/fixtures';
 import { ADMIN_STATE_PATH } from '../../playwright.config';

 // Suppress unused variable warnings
diff --git a/plugins/woocommerce/tests/e2e-pw/tests/product/product-tags-attributes.spec.js b/plugins/woocommerce/tests/e2e-pw/tests/product/product-tags-attributes.spec.ts
similarity index 98%
rename from plugins/woocommerce/tests/e2e-pw/tests/product/product-tags-attributes.spec.js
rename to plugins/woocommerce/tests/e2e-pw/tests/product/product-tags-attributes.spec.ts
index db2b7ebfe2..d926c97144 100644
--- a/plugins/woocommerce/tests/e2e-pw/tests/product/product-tags-attributes.spec.js
+++ b/plugins/woocommerce/tests/e2e-pw/tests/product/product-tags-attributes.spec.ts
@@ -31,13 +31,13 @@ const productAttributeTerm = 'red';

 const simpleProductName = 'Single Product With Tags';

-let product1Id,
-	product2Id,
-	product3Id,
-	productTag1Id,
-	productTag2Id,
-	productTag3Id,
-	attributeId;
+let product1Id: number,
+	product2Id: number,
+	product3Id: number,
+	productTag1Id: number,
+	productTag2Id: number,
+	productTag3Id: number,
+	attributeId: number;

 test.describe(
 	'Browse product tags and attributes from the product page',
diff --git a/plugins/woocommerce/tests/e2e-pw/tests/product/product-variable.spec.js b/plugins/woocommerce/tests/e2e-pw/tests/product/product-variable.spec.ts
similarity index 97%
rename from plugins/woocommerce/tests/e2e-pw/tests/product/product-variable.spec.js
rename to plugins/woocommerce/tests/e2e-pw/tests/product/product-variable.spec.ts
index d53976f481..340e210540 100644
--- a/plugins/woocommerce/tests/e2e-pw/tests/product/product-variable.spec.js
+++ b/plugins/woocommerce/tests/e2e-pw/tests/product/product-variable.spec.ts
@@ -1,6 +1,7 @@
 /**
  * External dependencies
  */
+import type { Page } from '@playwright/test';
 import { WC_API_PATH } from '@woocommerce/e2e-utils-playwright';

 /**
@@ -139,10 +140,10 @@ const variations2 = [
 ];

 async function selectVariation(
-	page,
-	variations,
-	price,
-	productName,
+	page: Page,
+	variations: { locatorId: string; value: string }[],
+	price: number | string,
+	productName: string,
 	addToCart = true
 ) {
 	for ( const v of variations ) {
@@ -154,7 +155,7 @@ async function selectVariation(
 	}

 	await expect(
-		page.getByRole( 'alert' ).filter( { hasText: price } )
+		page.getByRole( 'alert' ).filter( { hasText: String( price ) } )
 	).toBeVisible();

 	if ( addToCart ) {
@@ -173,7 +174,7 @@ test.describe(
 	() => {
 		const variableProductName = `Variable single product ${ Date.now() }`;
 		const slug = variableProductName.replace( / /gi, '-' ).toLowerCase();
-		let variableProductId;
+		let variableProductId: number;
 		let calcTaxesState;

 		test.beforeAll( async ( { restApi } ) => {
@@ -308,7 +309,7 @@ test.describe(
 	() => {
 		const variableProductName = `Variable single product ${ Date.now() }`;
 		const slug = variableProductName.replace( / /gi, '-' ).toLowerCase();
-		let variableProductId;
+		let variableProductId: number;
 		let calcTaxesState;

 		test.beforeAll( async ( { restApi } ) => {
diff --git a/plugins/woocommerce/tests/e2e-pw/tests/product/update-variations.spec.js b/plugins/woocommerce/tests/e2e-pw/tests/product/update-variations.spec.ts
similarity index 97%
rename from plugins/woocommerce/tests/e2e-pw/tests/product/update-variations.spec.js
rename to plugins/woocommerce/tests/e2e-pw/tests/product/update-variations.spec.ts
index 309ba8190a..4be9621ae1 100644
--- a/plugins/woocommerce/tests/e2e-pw/tests/product/update-variations.spec.js
+++ b/plugins/woocommerce/tests/e2e-pw/tests/product/update-variations.spec.ts
@@ -1,3 +1,8 @@
+/**
+ * External dependencies
+ */
+import type { Page } from '@playwright/test';
+
 /**
  * Internal dependencies
  */
@@ -23,14 +28,14 @@ const productHeight = '15';
 const stockAmount = '100';
 const lowStockAmount = '10';

-let productId_indivEdit,
-	productId_bulkEdit,
-	productId_deleteAll,
-	productId_manageStock,
-	productId_variationDefaults,
-	productId_removeVariation,
+let productId_indivEdit: number,
+	productId_bulkEdit: number,
+	productId_deleteAll: number,
+	productId_manageStock: number,
+	productId_variationDefaults: number,
+	productId_removeVariation: number,
 	defaultVariation,
-	variationIds_indivEdit;
+	variationIds_indivEdit: number[];

 test.describe( 'Update variations', { tag: tags.GUTENBERG }, () => {
 	test.use( { storageState: ADMIN_STATE_PATH } );
@@ -106,7 +111,7 @@ test.describe( 'Update variations', { tag: tags.GUTENBERG }, () => {
 		await deleteProductsAddedByTests();
 	} );

-	async function gotToVariationsTab( page ) {
+	async function gotToVariationsTab( page: Page ) {
 		await test.step( 'Click on the "Variations" tab.', async () => {
 			await expect( async () => {
 				await page