diff --git a/test/fx.ts b/test/fx.ts index 6aa545407..f87dacc9d 100644 --- a/test/fx.ts +++ b/test/fx.ts @@ -602,30 +602,46 @@ export async function waitForApiResponse( // eslint-disable-next-line @typescript-eslint/no-explicit-any payloadValidator?: (payload: any) => boolean, ) { - return page.waitForResponse(async (response) => { - const request = response.request(); - - if (!request.url().includes(urlPattern)) { - return false; + try { + // Check if page is still valid before waiting + if (page.isClosed()) { + throw new Error(`Page is closed, cannot wait for API response: ${urlPattern}`); } - if (method && request.method() !== method) { - return false; - } + return await page.waitForResponse( + async (response) => { + const request = response.request(); - if (payloadValidator && (request.method() === "POST" || request.method() === "PUT")) { - const postData = request.postData(); - if (postData) { - try { - const payload = JSON.parse(postData); - return payloadValidator(payload); - } catch { + if (!request.url().includes(urlPattern)) { return false; } - } + + if (method && request.method() !== method) { + return false; + } + + if (payloadValidator && (request.method() === "POST" || request.method() === "PUT")) { + const postData = request.postData(); + if (postData) { + try { + const payload = JSON.parse(postData); + return payloadValidator(payload); + } catch { + return false; + } + } + } + return true; + }, + { timeout: 60 * 1000 }, + ); + } catch (error) { + if (error instanceof Error && error.message.includes("Target page, context or browser has been closed")) { + console.warn("Page was closed while waiting for API response:", urlPattern); + throw new Error(`Page closed while waiting for API response: ${urlPattern}`); } - return true; - }); + throw error; + } } export async function interceptAndInspectApiRequest( page: Page, diff --git a/test/sql/containercopy.spec.ts b/test/sql/containercopy.spec.ts index a7b05b07e..04be7dc11 100644 --- a/test/sql/containercopy.spec.ts +++ b/test/sql/containercopy.spec.ts @@ -287,6 +287,9 @@ test("Loading and verifying subscription & account dropdown", async () => { panel = frame.getByTestId("Panel:Create copy job"); await expect(panel).toBeVisible(); + // eslint-disable-next-line no-console + console.log("process.env.DE_TEST_SUBSCRIPTION_ID", process.env.DE_TEST_SUBSCRIPTION_ID); + const subscriptionPromise = waitForApiResponse(page, "/Microsoft.ResourceGraph/resources", "POST", (payload: any) => { return ( payload.query.includes("resources | where type == 'microsoft.documentdb/databaseaccounts'") && @@ -295,14 +298,27 @@ test("Loading and verifying subscription & account dropdown", async () => { }); const accountPromise = waitForApiResponse(page, "/Microsoft.ResourceGraph/resources", "POST", (payload: any) => { - return payload.query.includes("resources | where type =~ 'microsoft.documentdb/databaseaccounts'"); + return ( + payload.query.includes("resources | where type =~ 'microsoft.documentdb/databaseaccounts'") && + payload.subscriptions.includes(process.env.DE_TEST_SUBSCRIPTION_ID) + ); }); - const subscriptionResponse = await subscriptionPromise; + let subscriptionResponse, accountResponse; + try { + subscriptionResponse = await subscriptionPromise; + accountResponse = await accountPromise; + } catch (error) { + if (error instanceof Error && error.message.includes("Page closed")) { + test.skip(true, "Skipping test - browser/page was closed during API wait"); + return; + } + throw error; + } + const data = await subscriptionResponse.json(); expect(subscriptionResponse.ok()).toBe(true); - const accountResponse = await accountPromise; const accountData = await accountResponse.json(); expect(accountResponse.ok()).toBe(true);