From b541c5991b8689b721274c6d0a4d809fddfeebef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Emarianfoo=E2=80=9C?= <13335743+marianfoo@users.noreply.github.com> Date: Wed, 7 Jan 2026 21:35:52 +0100 Subject: [PATCH] fix(wdi5): handle browser context loss during FE initialization Detect and recover from lost wdi5 bridge (e.g., after redirects) by re-injecting before loading FE libraries. Use defensive assignment for fe_bridge to prevent overwrites. Closes #694 --- src/client-side-js/injectUI5.ts | 3 ++- src/client-side-js/testLibrary.ts | 2 ++ src/lib/wdi5-fe.ts | 20 ++++++++++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/client-side-js/injectUI5.ts b/src/client-side-js/injectUI5.ts index b650fd28..e7f7eff2 100644 --- a/src/client-side-js/injectUI5.ts +++ b/src/client-side-js/injectUI5.ts @@ -121,7 +121,8 @@ async function clientSide_injectUI5(waitForUI5Timeout: number, browserInstance: // attach new bridge window.bridge = RecordReplayUi5LocalRef - window.fe_bridge = {} // empty init for fiori elements test api + // Use conditional assignment to avoid overwriting existing fe_bridge (e.g., if re-injecting) + window.fe_bridge = window.fe_bridge || {} window.wdi5.Log.info("[browser wdi5] APIs injected!") window.wdi5.isInitialized = true diff --git a/src/client-side-js/testLibrary.ts b/src/client-side-js/testLibrary.ts index 65f85a88..8a9cf1c3 100644 --- a/src/client-side-js/testLibrary.ts +++ b/src/client-side-js/testLibrary.ts @@ -150,6 +150,8 @@ async function loadFELibraries(browserInstance: WebdriverIO.Browser) { ) } ) + // Ensure fe_bridge exists (defensive check in case browser context was lost) + window.fe_bridge = window.fe_bridge || {} window.fe_bridge.ListReport = ListReport window.fe_bridge.ObjectPage = ObjectPage window.fe_bridge.Shell = Shell diff --git a/src/lib/wdi5-fe.ts b/src/lib/wdi5-fe.ts index d615bf3e..ce5e4ef2 100644 --- a/src/lib/wdi5-fe.ts +++ b/src/lib/wdi5-fe.ts @@ -1,5 +1,7 @@ import { initOPA, addToQueue, emptyQueue, loadFELibraries } from "../client-side-js/testLibrary.js" +import { checkForUI5Page, injectUI5 } from "./wdi5-bridge.js" import { Logger as _Logger } from "./Logger.js" +import type { wdi5Config } from "../types/wdi5.types.js" const Logger = _Logger.getInstance() const commonFunctions = ["and", "when", "then"] @@ -56,6 +58,24 @@ export class WDI5FE { } static async initialize(appConfig, browserInstance = browser) { + // Ensure wdi5 bridge is injected before loading FE libraries + // This handles cases where browser context was lost (e.g., due to redirects) + const isUI5Page = await checkForUI5Page(browserInstance) + if (!isUI5Page) { + throw new Error( + "[wdi5] No UI5 page detected. Cannot initialize FE test library. " + + "Make sure you have navigated to a UI5 application before calling browser.fe.initialize()." + ) + } + + // Check if wdi5 bridge is present, re-inject if needed + const bridgePresent = await browserInstance.execute(() => !!window.bridge && !!window.fe_bridge) + if (!bridgePresent) { + Logger.warn("[wdi5] Browser context lost (possibly due to a redirect). Re-injecting wdi5 bridge...") + const config: wdi5Config = global.__wdi5Config || (browserInstance.options as wdi5Config) + await injectUI5(config, browserInstance) + } + // first magic wand wave -> app context await loadFELibraries(browserInstance) await initOPA(appConfig, browserInstance)