@alumnium/selenium 0.0.0-stage → 0.24.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +21 -0
- package/README.md +2 -2
- package/package.json +37 -4
- package/src/Alumni.d.ts +16 -0
- package/src/drivers/SeleniumCdpConnection.d.ts +11 -0
- package/src/drivers/SeleniumDriver.d.ts +60 -0
- package/src/index.cjs +1229 -0
- package/src/index.cjs.map +12 -0
- package/src/index.d.ts +2 -0
- package/src/index.js +1139 -0
- package/src/index.js.map +12 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../selenium/src/Alumni.ts", "../../selenium/src/drivers/SeleniumDriver.ts", "../../selenium/src/drivers/SeleniumCdpConnection.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import { WebDriver } from \"selenium-webdriver\";\nimport { Alumni as BaseAlumni } from \"@alumnium/core\";\nimport { SeleniumDriver } from \"./drivers/SeleniumDriver.ts\";\n\n/** Alumni driving a Selenium `WebDriver`. */\nexport class Alumni extends BaseAlumni<SeleniumDriver> {\n constructor(driver: WebDriver, options: Alumni.Options = {}) {\n super(new SeleniumDriver(driver), options);\n }\n\n /** Whether the given object is a native driver this Alumni accepts. */\n static accepts(driver: unknown): driver is Alumni.Driver {\n return driver instanceof WebDriver;\n }\n}\n\nexport namespace Alumni {\n export type Driver = WebDriver;\n\n export type Options = BaseAlumni.Options;\n\n export type VisionOptions = BaseAlumni.VisionOptions;\n\n export type CheckOptions = BaseAlumni.CheckOptions;\n\n export type CheckAssert = BaseAlumni.CheckAssert;\n}\n",
|
|
6
|
+
"import * as fs from \"fs/promises\";\nimport { always } from \"alwaysly\";\nimport {\n By,\n Key as SeleniumKey,\n WebDriver,\n WebElement,\n} from \"selenium-webdriver\";\nimport type { ChromiumWebDriver } from \"selenium-webdriver/chromium.js\";\nimport {\n ElementNotInteractableError,\n NoSuchSessionError,\n} from \"selenium-webdriver/lib/error.js\";\nimport type { ShadowRoot } from \"selenium-webdriver/lib/webdriver.js\";\nimport {\n AppId,\n BaseAccessibilityTree,\n BaseDriver,\n ChromiumAccessibilityTree,\n ClickTool,\n DragAndDropTool,\n Env,\n HoverTool,\n Keys,\n PressKeyTool,\n Telemetry,\n type ToolClass,\n TreeDevDrillError,\n TypeTool,\n UploadTool,\n WAITER_SNAPSHOT_SCRIPT,\n waiterScriptSource,\n type WaiterSnapshot,\n waitForPageStability,\n} from \"@alumnium/core/internal\";\nimport { SeleniumCdpConnection } from \"./SeleniumCdpConnection.ts\";\n\n// NOTE: While macros work well in Bun, it fails when using Alumnium client from\n// Node.js. A solution could be \"node:sea\" module, but current Bun version\n// doesn't support it. For now, we bundle assets with scripts/generate.ts.\n// import { readScript } from \"@alumnium/core\" with { type: \"macro\" };\n\nconst { tracer, logger } = Telemetry.get(\"packages/typescript/selenium/src/drivers/SeleniumDriver.ts\");\nconst { span } = tracer.dec();\nconst stateful = BaseDriver.stateful;\n\ninterface CDPNode {\n nodeId: string;\n parentId?: string;\n backendDOMNodeId?: number;\n _parent_iframe_backend_node_id?: number;\n _frame_chain?: number[];\n _is_shadow_dom?: boolean;\n [key: string]: unknown;\n}\n\ninterface CDPDomNode {\n nodeId: number;\n backendNodeId: number;\n parentId?: number;\n nodeName?: string;\n shadowRoots?: CDPDomNode[];\n}\n\ninterface CDPFrameInfo {\n frame: {\n id: string;\n url: string;\n };\n childFrames?: CDPFrameInfo[];\n}\n\nconst WAITER_SCRIPT = waiterScriptSource;\n\nexport class SeleniumDriver extends BaseDriver<WebElement> {\n protected driver: ChromiumWebDriver;\n kind = \"selenium\" as const;\n platform = \"chromium\" as const;\n autoswitchToNewTab = true;\n #shadowChildToHostMap: Partial<Record<number, number>> = {};\n #cdpConnection: SeleniumCdpConnection | null = null;\n #cdpReady: Promise<void>;\n public fullPageScreenshot = Env.ALUMNIUM_FULL_PAGE_SCREENSHOT;\n public supportedTools: Set<ToolClass> = new Set([\n ClickTool,\n DragAndDropTool,\n HoverTool,\n PressKeyTool,\n TypeTool,\n UploadTool,\n ]);\n\n constructor(driver: WebDriver) {\n super();\n this.driver = driver as ChromiumWebDriver;\n this.#cdpReady = this.initCdpConnection();\n }\n\n @span(\"driver.fetch_accessibility_tree\", BaseDriver.spanAttrs)\n protected async fetchAccessibilityTree(): Promise<BaseAccessibilityTree> {\n // Switch to default content to ensure we're at the top level for frame enumeration\n await this.driver.switchTo().defaultContent();\n\n // A new tab might take the foreground and leave the current one hidden.\n await this.driver.switchTo().window(await this.driver.getWindowHandle());\n\n logger.debug(\"Waiting for page to load before getting accessibility tree\");\n await this.waitForPageToLoad();\n logger.debug(\"Page loaded, retrieving accessibility tree\");\n\n // Get frame tree to enumerate all frames\n const frameTree = (await this.executeCdpCommand(\n \"Page.getFrameTree\",\n {},\n )) as {\n frameTree: CDPFrameInfo;\n };\n const frameIds = this.getAllFrameIds(frameTree.frameTree);\n const mainFrameId = frameTree.frameTree.frame.id;\n logger.debug(`Found ${frameIds.length} frames`);\n\n await this.executeCdpCommand(\"DOM.enable\", {});\n const domResponse = (await this.executeCdpCommand(\n \"DOM.getFlattenedDocument\",\n { depth: -1, pierce: true },\n )) as { nodes: CDPDomNode[] };\n const domNodes = domResponse.nodes || [];\n\n // Build mapping: frameId -> backendNodeId of the iframe element containing the frame\n const frameToIframeMap: Map<string, number> = new Map();\n // Build mapping: frameId -> parent frameId (for nested frames)\n const frameParentMap: Map<string, string> = new Map();\n await this.buildFrameHierarchy(\n frameTree.frameTree,\n mainFrameId,\n frameToIframeMap,\n frameParentMap,\n );\n\n // Aggregate accessibility nodes from all frames\n const allNodes: CDPNode[] = [];\n for (const frameId of frameIds) {\n try {\n const response = (await this.executeCdpCommand(\n \"Accessibility.getFullAXTree\",\n { frameId },\n )) as { nodes: CDPNode[] };\n const nodes = response.nodes || [];\n logger.debug(\n ` -> Frame ${frameId.slice(0, 20)}...: ${nodes.length} nodes`,\n );\n // Tag ALL nodes from child frames with their frame chain (list of iframe backendNodeIds)\n // This allows us to switch through nested frames when finding elements\n const frameChain = this.getFrameChain(\n frameId,\n frameToIframeMap,\n frameParentMap,\n );\n for (const node of nodes) {\n if (frameChain.length > 0) {\n node._frame_chain = frameChain;\n }\n }\n allNodes.push(...nodes);\n } catch (error) {\n logger.debug(\n ` -> Frame ${frameId.slice(0, 20)}...: failed (${error instanceof Error ? error.message : String(error)})`,\n );\n }\n }\n\n logger.debug(`Total accessibility nodes collected: ${allNodes.length}`);\n\n try {\n const frameChainsByBackendId: Partial<Record<number, number[]>> = {};\n for (const node of allNodes) {\n if (node.backendDOMNodeId && node._frame_chain)\n frameChainsByBackendId[node.backendDOMNodeId] = node._frame_chain;\n }\n const shadowNodes = await this.buildShadowHierarchy(\n domNodes,\n frameChainsByBackendId,\n );\n allNodes.push(...shadowNodes);\n if (shadowNodes.length > 0) {\n logger.debug(` -> Shadow DOM: ${shadowNodes.length} nodes added`);\n }\n } catch (error) {\n logger.debug(\n ` -> Shadow DOM failed (${error instanceof Error ? error.message : String(error)})`,\n );\n }\n\n return new ChromiumAccessibilityTree({ nodes: allNodes });\n }\n\n @span(\"driver.click\", BaseDriver.spanAttrs)\n @stateful\n async click(id: number): Promise<void> {\n await this.#autoswitchToNewTabAction(async () => {\n const element = await this.findElement(id);\n await this.#scrollElementIntoCenter(element);\n try {\n const actions = this.driver.actions({ async: true });\n await actions.move({ origin: element }).click().perform();\n } catch (error) {\n if (error instanceof ElementNotInteractableError) {\n // Fallback to direct click if ActionChains fails (e.g. for <option> elements)\n await element.click();\n } else {\n throw error;\n }\n }\n });\n }\n\n @span(\"driver.drag_slider\", BaseDriver.spanAttrs)\n @stateful\n async dragSlider(id: number, value: number): Promise<void> {\n const element = await this.findElement(id);\n await this.#scrollElementIntoCenter(element);\n await this.driver.executeScript(\n \"arguments[0].value = arguments[1];\" +\n \"arguments[0].dispatchEvent(new Event('input', {bubbles: true}));\" +\n \"arguments[0].dispatchEvent(new Event('change', {bubbles: true}));\",\n element,\n String(value),\n );\n }\n\n @span(\"driver.drag_and_drop\", BaseDriver.spanAttrs)\n @stateful\n async dragAndDrop(fromId: number, toId: number): Promise<void> {\n const fromElement = await this.findElement(fromId);\n const toElement = await this.findElement(toId);\n await this.#scrollElementIntoCenter(fromElement);\n const actions = this.driver.actions({ async: true });\n await actions.dragAndDrop(fromElement, toElement).perform();\n }\n\n @span(\"driver.hover\", BaseDriver.spanAttrs)\n @stateful\n async hover(id: number): Promise<void> {\n const element = await this.findElement(id);\n await this.#scrollElementIntoCenter(element);\n const actions = this.driver.actions({ async: true });\n await actions.move({ origin: element }).perform();\n }\n\n @span(\"driver.press_key\", BaseDriver.spanAttrs)\n @stateful\n pressKey(key: Keys.Key): Promise<void> {\n return this.#autoswitchToNewTabAction(async () => {\n const keyMap: Record<Keys.Key, string> = {\n Backspace: SeleniumKey.BACK_SPACE,\n Enter: SeleniumKey.ENTER,\n Escape: SeleniumKey.ESCAPE,\n Space: SeleniumKey.SPACE,\n Tab: SeleniumKey.TAB,\n ArrowDown: SeleniumKey.ARROW_DOWN,\n ArrowUp: SeleniumKey.ARROW_UP,\n ArrowLeft: SeleniumKey.ARROW_LEFT,\n ArrowRight: SeleniumKey.ARROW_RIGHT,\n };\n\n const actions = this.driver.actions({ async: true });\n await actions.sendKeys(keyMap[key]).perform();\n });\n }\n\n @span(\"driver.quit\", BaseDriver.spanAttrs)\n async quit(): Promise<void> {\n await this.#cdpReady;\n this.#cdpConnection?.close();\n try {\n await this.driver.quit();\n } catch (error) {\n if (error instanceof NoSuchSessionError) {\n logger.info(\"Selenium session already closed, ignoring quit error\");\n } else {\n throw error;\n }\n }\n }\n\n @span(\"driver.back\", BaseDriver.spanAttrs)\n @stateful\n async back(): Promise<void> {\n await this.driver.navigate().back();\n }\n\n @span(\"driver.visit\", BaseDriver.spanAttrs)\n @stateful\n async visit(url: string): Promise<void> {\n await this.checkNavigationPolicy(url);\n await this.driver.get(url);\n }\n\n @span(\"driver.scroll_to\", BaseDriver.spanAttrs)\n @stateful\n async scrollTo(id: number): Promise<void> {\n const element = await this.findElement(id);\n await this.#scrollElementIntoCenter(element);\n }\n\n @span(\"driver.screenshot\", BaseDriver.spanAttrs)\n async screenshot(): Promise<string> {\n if (this.fullPageScreenshot) {\n const result = (await this.executeCdpCommand(\"Page.captureScreenshot\", {\n format: \"png\",\n captureBeyondViewport: true,\n })) as { data: string };\n return result.data;\n } else {\n return await this.driver.takeScreenshot();\n }\n }\n\n @span(\"driver.title\", BaseDriver.spanAttrs)\n title(): Promise<string> {\n return this.driver.getTitle();\n }\n\n @span(\"driver.type\", BaseDriver.spanAttrs)\n @stateful\n async type(id: number, text: string): Promise<void> {\n const element = await this.findElement(id);\n await this.#scrollElementIntoCenter(element);\n await element.clear();\n await element.sendKeys(text);\n }\n\n @span(\"driver.upload\", BaseDriver.spanAttrs)\n @stateful\n async upload(id: number, paths: string[]): Promise<void> {\n const element = await this.findElement(id);\n await element.sendKeys(paths.join(\"\\n\"));\n }\n\n @span(\"driver.url\", BaseDriver.spanAttrs)\n url(): Promise<string> {\n return this.driver.getCurrentUrl();\n }\n\n @span(\"driver.app\", BaseDriver.spanAttrs)\n async app(): Promise<AppId> {\n const currentUrl = await this.driver.getCurrentUrl();\n return AppId.parse(currentUrl);\n }\n\n @span(\"driver.find_element\", BaseDriver.spanAttrs)\n async findElement(id: number): Promise<WebElement> {\n const tree = await this.getAccessibilityTree();\n const accessibilityElement = tree.elementById(id);\n const backendNodeId = accessibilityElement.backendNodeId!;\n const frameChain = accessibilityElement.frameChain;\n\n // Switch through the frame chain if element is inside nested iframes\n if (frameChain && frameChain.length > 0) {\n await this.switchToFrameChain(frameChain);\n }\n\n // Use CDP to find element by backend node ID\n await this.executeCdpCommand(\"DOM.enable\", {});\n await this.executeCdpCommand(\"DOM.getFlattenedDocument\", {});\n\n const { nodeIds } = (await this.executeCdpCommand(\n \"DOM.pushNodesByBackendIdsToFrontend\",\n { backendNodeIds: [backendNodeId] },\n )) as { nodeIds: number[] };\n\n const nodeId = nodeIds[0];\n\n // Set temporary attribute to locate element\n await this.executeCdpCommand(\"DOM.setAttributeValue\", {\n nodeId,\n name: \"data-alumnium-id\",\n value: String(backendNodeId),\n });\n\n const selector = `[data-alumnium-id='${backendNodeId}']`;\n const hostBackendNodeId = this.#shadowChildToHostMap[backendNodeId];\n\n const searchContext =\n hostBackendNodeId !== undefined\n ? await this.findShadowRoot(hostBackendNodeId)\n : this.driver;\n const element = await searchContext.findElement(By.css(selector));\n\n // Remove temporary attribute\n await this.executeCdpCommand(\"DOM.removeAttribute\", {\n nodeId,\n name: \"data-alumnium-id\",\n });\n\n // Note: We don't switch back to default content here because the element\n // needs to remain in its frame context for subsequent operations (click, type, etc.)\n\n return element;\n }\n\n @span(\"driver.execute_script\", BaseDriver.spanAttrs)\n @stateful\n async executeScript(script: string): Promise<void> {\n await this.driver.executeScript(script);\n }\n\n @span(\"driver.print_to_pdf\", BaseDriver.spanAttrs)\n async printToPdf(filepath: string): Promise<void> {\n const { data } = (await this.executeCdpCommand(\"Page.printToPDF\", {})) as {\n data: string;\n };\n await fs.writeFile(filepath, Buffer.from(data, \"base64\"));\n }\n\n @span(\"driver.switch_to_next_tab\", BaseDriver.spanAttrs)\n async switchToNextTab(): Promise<void> {\n const handles = await this.driver.getAllWindowHandles();\n if (handles.length <= 1) return;\n\n const current = await this.driver.getWindowHandle();\n const currentIndex = handles.indexOf(current);\n const nextIndex = (currentIndex + 1) % handles.length;\n\n await this.switchToTab(handles, nextIndex);\n // TODO: Consider making these debug values lazy, so there's less overhead\n logger.debug(\n `Switched to next tab: ${await this.driver.getTitle()} (${await this.driver.getCurrentUrl()})`,\n );\n }\n\n @span(\"driver.switch_to_previous_tab\", BaseDriver.spanAttrs)\n async switchToPreviousTab(): Promise<void> {\n const handles = await this.driver.getAllWindowHandles();\n if (handles.length <= 1) return;\n\n const current = await this.driver.getWindowHandle();\n const currentIndex = handles.indexOf(current);\n const prevIndex = (currentIndex - 1 + handles.length) % handles.length;\n\n await this.switchToTab(handles, prevIndex);\n // TODO: Consider making these debug values lazy, so there's less overhead\n logger.debug(\n `Switched to previous tab: ${await this.driver.getTitle()} (${await this.driver.getCurrentUrl()})`,\n );\n }\n\n @span(\"driver.wait\", BaseDriver.spanAttrs)\n @stateful\n async wait(seconds: number): Promise<void> {\n const clampedSeconds = Math.max(1, Math.min(30, seconds));\n await new Promise((resolve) => setTimeout(resolve, clampedSeconds * 1000));\n }\n\n @span(\"driver.wait_for_selector\", BaseDriver.spanAttrs)\n async waitForSelector(): Promise<void> {\n throw new Error(\"waitForSelector not supported for this driver\");\n }\n\n async #scrollElementIntoCenter(element: WebElement): Promise<void> {\n await this.driver.executeScript(\n \"arguments[0].scrollIntoView({block: 'center'});\",\n element,\n );\n }\n\n async checkNavigationPolicy(url?: string): Promise<void> {\n const currentUrl = url ?? (await this.url());\n this.navigationPolicy.check(currentUrl);\n }\n\n @span(\"driver.internal.cdp_command\", (cmd) => ({\n \"driver.kind\": \"selenium\",\n \"driver.platform\": \"chromium\",\n \"driver.internal.cdp_command.name\": cmd,\n }))\n private executeCdpCommand(cmd: string, params: object): Promise<unknown> {\n return this.driver.sendAndGetDevToolsCommand(cmd, params);\n }\n\n @span(\"driver.wait_for_page_to_load\", BaseDriver.spanAttrs)\n private async waitForPageToLoad(): Promise<void> {\n await this.#cdpReady;\n try {\n const result = await waitForPageStability(() => this.waiterSnapshot());\n if (!result.loaded) {\n logger.warn(\n `Timed out waiting for page to load; pending requests: ${result.pending.join(\", \")}`,\n );\n }\n } catch (error) {\n // Retry once on failure\n try {\n await waitForPageStability(() => this.waiterSnapshot());\n } catch (retryError) {\n logger.warn(\n `Failed to wait for page to load after retry (${String(error)}): ${String(retryError)}`,\n );\n }\n }\n }\n\n @stateful(\"switchToTab\")\n private async switchToTab(\n handles: string[],\n tabIndex: number,\n ): Promise<void> {\n always(handles[tabIndex]);\n await this.driver.switchTo().window(handles[tabIndex]);\n }\n\n private async initCdpConnection(): Promise<void> {\n try {\n const capabilities = await this.driver.getCapabilities();\n this.#cdpConnection = await SeleniumCdpConnection.connect(\n capabilities,\n WAITER_SCRIPT,\n );\n } catch (error) {\n logger.debug(\n `Could not connect to CDP to inject the waiter script: ${error instanceof Error ? error.message : String(error)}`,\n );\n try {\n await this.executeCdpCommand(\"Page.addScriptToEvaluateOnNewDocument\", {\n source: WAITER_SCRIPT,\n runImmediately: true,\n });\n } catch (fallbackError) {\n logger.debug(\n `Could not install waiter script through Selenium: ${fallbackError instanceof Error ? fallbackError.message : String(fallbackError)}`,\n );\n }\n }\n }\n\n private async waiterSnapshot(): Promise<WaiterSnapshot | null> {\n let snapshot = (await this.driver.executeScript(\n `return ${WAITER_SNAPSHOT_SCRIPT}`,\n )) as WaiterSnapshot | null;\n if (!snapshot) {\n await this.driver.executeScript(WAITER_SCRIPT);\n snapshot = (await this.driver.executeScript(\n `return ${WAITER_SNAPSHOT_SCRIPT}`,\n )) as typeof snapshot;\n }\n return snapshot;\n }\n\n async #autoswitchToNewTabAction<Result>(\n fn: () => Promise<Result>,\n ): Promise<Result> {\n if (!this.autoswitchToNewTab) {\n return await fn();\n }\n\n return tracer.span(\"driver.internal.switch_to_new_tab\", async () => {\n const currentHandles = await this.driver.getAllWindowHandles();\n\n const result = await fn();\n\n const newHandles = await this.driver.getAllWindowHandles();\n const newTabs = newHandles.filter((h) => !currentHandles.includes(h));\n\n if (newTabs.length) {\n const lastNewTab = newTabs[newTabs.length - 1];\n always(lastNewTab);\n\n if (lastNewTab !== (await this.driver.getWindowHandle())) {\n await this.driver.switchTo().window(lastNewTab);\n logger.debug(\n `Auto-switching to new tab: ${await this.driver.getTitle()} (${await this.driver.getCurrentUrl()})`,\n );\n }\n }\n\n return result;\n });\n }\n\n @span(\"driver.internal.switch_to_frame_chain\")\n private async switchToFrameChain(frameChain: number[]): Promise<void> {\n // First switch to default content to ensure we're at the top level\n await this.driver.switchTo().defaultContent();\n\n // Switch through each iframe in the chain\n for (const iframeBackendNodeId of frameChain) {\n await this.switchToSingleFrame(iframeBackendNodeId);\n }\n }\n\n @span(\"driver.internal.switch_to_single_frame\")\n private async switchToSingleFrame(\n iframeBackendNodeId: number,\n ): Promise<void> {\n // Use CDP to find and switch to the iframe\n await this.executeCdpCommand(\"DOM.enable\", {});\n await this.executeCdpCommand(\"DOM.getFlattenedDocument\", {});\n\n const { nodeIds } = (await this.executeCdpCommand(\n \"DOM.pushNodesByBackendIdsToFrontend\",\n { backendNodeIds: [iframeBackendNodeId] },\n )) as { nodeIds: number[] };\n\n const nodeId = nodeIds[0];\n\n let iframeElement: WebElement | undefined;\n let set = false;\n let failure: unknown;\n try {\n await this.executeCdpCommand(\"DOM.setAttributeValue\", {\n nodeId,\n name: \"data-alumnium-iframe-id\",\n value: String(iframeBackendNodeId),\n });\n set = true;\n iframeElement = await this.driver.findElement(\n By.css(`[data-alumnium-iframe-id='${iframeBackendNodeId}']`),\n );\n } catch (error) {\n failure = error;\n } finally {\n if (set) {\n try {\n await this.executeCdpCommand(\"DOM.removeAttribute\", {\n nodeId,\n name: \"data-alumnium-iframe-id\",\n });\n } catch (error) {\n failure ??= error;\n }\n }\n }\n\n if (failure) throw failure;\n always(iframeElement);\n\n await this.driver.switchTo().frame(iframeElement);\n logger.debug(\n `Switched to iframe with backendNodeId=${iframeBackendNodeId}`,\n );\n }\n\n @span(\"driver.internal.build_frame_hierarchy\")\n private async buildFrameHierarchy(\n frameInfo: CDPFrameInfo,\n mainFrameId: string,\n frameToIframeMap: Map<string, number>,\n frameParentMap: Map<string, string>,\n parentFrameId?: string,\n ): Promise<void> {\n const frameId = frameInfo.frame.id;\n\n if (frameId !== mainFrameId) {\n // Get the iframe element that owns this frame\n await this.executeCdpCommand(\"DOM.enable\", {});\n try {\n const ownerInfo = (await this.executeCdpCommand(\"DOM.getFrameOwner\", {\n frameId,\n })) as { backendNodeId: number };\n frameToIframeMap.set(frameId, ownerInfo.backendNodeId);\n logger.debug(\n `Frame ${frameId.slice(0, 20)}... owned by iframe backendNodeId=${ownerInfo.backendNodeId}`,\n );\n } catch (error) {\n logger.debug(\n `Could not get frame owner for ${frameId.slice(0, 20)}...: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n // Track parent frame\n if (parentFrameId) {\n frameParentMap.set(frameId, parentFrameId);\n }\n }\n\n // Process children\n for (const child of frameInfo.childFrames || []) {\n await this.buildFrameHierarchy(\n child,\n mainFrameId,\n frameToIframeMap,\n frameParentMap,\n frameId,\n );\n }\n }\n\n private getFrameChain(\n frameId: string,\n frameToIframeMap: Map<string, number>,\n frameParentMap: Map<string, string>,\n ): number[] {\n const chain: number[] = [];\n let currentFrameId = frameId;\n\n while (frameToIframeMap.has(currentFrameId)) {\n const iframeBackendNodeId = frameToIframeMap.get(currentFrameId)!;\n chain.unshift(iframeBackendNodeId); // Insert at beginning to build from root\n // Move to parent frame\n if (frameParentMap.has(currentFrameId)) {\n currentFrameId = frameParentMap.get(currentFrameId)!;\n } else {\n break;\n }\n }\n\n return chain;\n }\n\n private getAllFrameIds(frameInfo: CDPFrameInfo): string[] {\n const frameIds: string[] = [frameInfo.frame.id];\n for (const child of frameInfo.childFrames || []) {\n frameIds.push(...this.getAllFrameIds(child));\n }\n return frameIds;\n }\n\n private async findShadowRoot(hostBackendNodeId: number): Promise<ShadowRoot> {\n const { nodeIds: hostNodeIds } = (await this.executeCdpCommand(\n \"DOM.pushNodesByBackendIdsToFrontend\",\n { backendNodeIds: [hostBackendNodeId] },\n )) as { nodeIds: number[] };\n\n await this.executeCdpCommand(\"DOM.setAttributeValue\", {\n nodeId: hostNodeIds[0],\n name: \"data-alumnium-host\",\n value: String(hostBackendNodeId),\n });\n\n const hostElement = await this.driver.findElement(\n By.css(`[data-alumnium-host='${hostBackendNodeId}']`),\n );\n\n await this.executeCdpCommand(\"DOM.removeAttribute\", {\n nodeId: hostNodeIds[0],\n name: \"data-alumnium-host\",\n });\n\n return hostElement.getShadowRoot();\n }\n\n private async buildShadowHierarchy(\n domNodes: CDPDomNode[],\n frameChainsByBackendId: Partial<Record<number, number[]>>,\n ): Promise<CDPNode[]> {\n const shadowNodes: CDPNode[] = [];\n const processedNodes = new Set<string>();\n\n // Build maps from the DOM tree\n const nodeIdToBackendId: Record<number, number> = {};\n const parentIdMap: Record<number, number> = {};\n const shadowRootToHostBackendId: Record<number, number> = {};\n\n for (const domNode of domNodes) {\n nodeIdToBackendId[domNode.nodeId] = domNode.backendNodeId;\n if (domNode.parentId !== undefined) {\n parentIdMap[domNode.nodeId] = domNode.parentId;\n }\n // Track shadow roots and their host's backendNodeId\n if (domNode.shadowRoots) {\n for (const sr of domNode.shadowRoots) {\n shadowRootToHostBackendId[sr.nodeId] = domNode.backendNodeId;\n // Shadow root nodes may not appear in the flat list, so track their parent too\n parentIdMap[sr.nodeId] = domNode.nodeId;\n }\n }\n }\n\n // Build childBackendNodeId -> hostBackendNodeId map by walking parent chains\n this.#shadowChildToHostMap = {};\n for (const domNode of domNodes) {\n const nodeBackendId = domNode.backendNodeId;\n let currentId: number | undefined = domNode.nodeId;\n while (currentId !== undefined) {\n if (currentId in shadowRootToHostBackendId) {\n this.#shadowChildToHostMap[nodeBackendId] =\n shadowRootToHostBackendId[currentId];\n break;\n }\n currentId = parentIdMap[currentId];\n }\n }\n\n // Find shadow hosts and collect their accessibility nodes\n for (const domNode of domNodes) {\n if (domNode.shadowRoots && domNode.shadowRoots.length > 0) {\n const frameChain = frameChainsByBackendId[domNode.backendNodeId];\n try {\n const axResponse = (await this.executeCdpCommand(\n \"Accessibility.queryAXTree\",\n { nodeId: domNode.nodeId },\n )) as { nodes: CDPNode[] };\n\n if (axResponse.nodes) {\n for (const axNode of axResponse.nodes) {\n if (processedNodes.has(axNode.nodeId)) continue;\n processedNodes.add(axNode.nodeId);\n\n axNode._is_shadow_dom = true;\n if (frameChain) axNode._frame_chain = frameChain;\n if (!axNode.backendDOMNodeId) {\n const backendId =\n nodeIdToBackendId[Number.parseInt(axNode.nodeId)];\n if (backendId !== undefined) {\n axNode.backendDOMNodeId = backendId;\n }\n }\n\n shadowNodes.push(axNode);\n\n if (axNode.childIds && Array.isArray(axNode.childIds)) {\n for (const childId of axNode.childIds) {\n const childNodes = await this.getShadowChildNodes(\n String(childId),\n processedNodes,\n nodeIdToBackendId,\n frameChain,\n );\n shadowNodes.push(...childNodes);\n }\n }\n }\n }\n } catch {\n // Ignore errors for individual shadow hosts\n }\n }\n }\n\n return shadowNodes;\n }\n\n private async getShadowChildNodes(\n nodeId: string,\n processedNodes: Set<string>,\n nodeIdToBackendId: Record<number, number>,\n frameChain?: number[],\n ): Promise<CDPNode[]> {\n const nodes: CDPNode[] = [];\n\n if (processedNodes.has(nodeId)) return nodes;\n processedNodes.add(nodeId);\n\n try {\n const response = (await this.executeCdpCommand(\n \"Accessibility.queryAXTree\",\n { nodeId: Number.parseInt(nodeId) },\n )) as { nodes: CDPNode[] };\n\n if (response.nodes) {\n for (const node of response.nodes) {\n node._is_shadow_dom = true;\n if (frameChain) node._frame_chain = frameChain;\n\n if (!node.backendDOMNodeId) {\n const backendId = nodeIdToBackendId[Number.parseInt(node.nodeId)];\n if (backendId !== undefined) {\n node.backendDOMNodeId = backendId;\n }\n }\n\n nodes.push(node);\n\n if (node.childIds && Array.isArray(node.childIds)) {\n for (const childId of node.childIds) {\n const childNodes = await this.getShadowChildNodes(\n String(childId),\n processedNodes,\n nodeIdToBackendId,\n frameChain,\n );\n nodes.push(...childNodes);\n }\n }\n }\n }\n } catch {\n // Ignore errors for individual nodes\n }\n\n return nodes;\n }\n\n //#region Dev\n\n protected override async devDrillProbeTree(\n tree: BaseAccessibilityTree,\n rawId: number,\n ): Promise<number> {\n let accessibilityElement;\n try {\n accessibilityElement = tree.elementById(rawId);\n } catch (error) {\n throw new TreeDevDrillError(\"resolve\", error);\n }\n\n const backendNodeId = accessibilityElement.backendNodeId;\n if (backendNodeId === undefined) {\n throw new TreeDevDrillError(\n \"resolve\",\n new Error(`Element with raw_id=${rawId} has no backend node ID`),\n );\n }\n\n const attribute = \"data-alumnium-drill\";\n let nodeId: number | undefined;\n let set = false;\n let failure: unknown;\n try {\n const frameChain = accessibilityElement.frameChain;\n if (frameChain?.length) await this.switchToFrameChain(frameChain);\n else await this.driver.switchTo().defaultContent();\n\n await this.executeCdpCommand(\"DOM.enable\", {});\n await this.executeCdpCommand(\"DOM.getFlattenedDocument\", {});\n const response = (await this.executeCdpCommand(\n \"DOM.pushNodesByBackendIdsToFrontend\",\n { backendNodeIds: [backendNodeId] },\n )) as { nodeIds: number[] };\n nodeId = response.nodeIds[0];\n if (!nodeId) {\n throw new TreeDevDrillError(\n \"resolve\",\n new Error(`No frontend node for backend node ID ${backendNodeId}`),\n backendNodeId,\n );\n }\n\n try {\n await this.executeCdpCommand(\"DOM.setAttributeValue\", {\n nodeId,\n name: attribute,\n value: crypto.randomUUID(),\n });\n set = true;\n } catch (error) {\n throw new TreeDevDrillError(\"probe\", error, backendNodeId);\n }\n } catch (error) {\n failure =\n error instanceof TreeDevDrillError\n ? error\n : new TreeDevDrillError(\"resolve\", error, backendNodeId);\n } finally {\n if (set && nodeId) {\n try {\n await this.executeCdpCommand(\"DOM.removeAttribute\", {\n nodeId,\n name: attribute,\n });\n } catch (error) {\n failure ??= new TreeDevDrillError(\"probe\", error, backendNodeId);\n }\n }\n try {\n await this.driver.switchTo().defaultContent();\n } catch (error) {\n failure ??= new TreeDevDrillError(\"resolve\", error, backendNodeId);\n }\n }\n\n if (failure) throw failure;\n return backendNodeId;\n }\n\n //#endregion\n}\n",
|
|
7
|
+
"const AUTO_ATTACH_PARAMS = {\n autoAttach: true,\n waitForDebuggerOnStart: true,\n flatten: true,\n};\nconst TIMEOUT_MS = 5000;\n\ninterface CdpMessage {\n id?: number;\n method?: string;\n params?: Record<string, unknown>;\n result?: Record<string, unknown>;\n error?: { message?: string };\n sessionId?: string;\n}\n\ninterface PendingCommand {\n resolve: (result: Record<string, unknown>) => void;\n reject: (error: Error) => void;\n timeout: ReturnType<typeof setTimeout>;\n}\n\nexport class SeleniumCdpConnection {\n #socket: WebSocket;\n #waiterScript: string;\n #nextId = 1;\n #pending = new Map<number, PendingCommand>();\n #targetSessions = new Map<string, string>();\n #sessionConfigurations = new Map<string, Promise<void>>();\n #closed = false;\n\n private constructor(socket: WebSocket, waiterScript: string) {\n this.#socket = socket;\n this.#waiterScript = waiterScript;\n socket.addEventListener(\"message\", (event) => this.#onMessage(event.data));\n socket.addEventListener(\"close\", () => this.#failConnection());\n socket.addEventListener(\"error\", () => this.#failConnection());\n }\n\n static async connect(\n capabilities: { get(key: string): unknown },\n waiterScript: string,\n ): Promise<SeleniumCdpConnection> {\n const url = await websocketUrl(capabilities);\n const socket = new WebSocket(url);\n try {\n await new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(\n () => reject(new Error(\"Timed out connecting to Chrome CDP\")),\n TIMEOUT_MS,\n );\n socket.addEventListener(\n \"open\",\n () => {\n clearTimeout(timeout);\n resolve();\n },\n { once: true },\n );\n socket.addEventListener(\n \"error\",\n () => {\n clearTimeout(timeout);\n reject(new Error(\"Could not connect to Chrome CDP\"));\n },\n { once: true },\n );\n });\n } catch (error) {\n socket.close();\n throw error;\n }\n const connection = new SeleniumCdpConnection(socket, waiterScript);\n try {\n await connection.#send(\"Target.setAutoAttach\", AUTO_ATTACH_PARAMS);\n await connection.#send(\"Target.setDiscoverTargets\", { discover: true });\n const targets = (await connection.#send(\"Target.getTargets\")) as {\n targetInfos?: Array<{ targetId: string; type: string }>;\n };\n for (const target of targets.targetInfos ?? []) {\n if (target.type === \"page\")\n await connection.#awaitSession(target.targetId);\n }\n return connection;\n } catch (error) {\n connection.close();\n throw error;\n }\n }\n\n close(): void {\n if (this.#closed) return;\n this.#closed = true;\n this.#failPending(new Error(\"CDP connection closed\"));\n this.#socket.close();\n this.#targetSessions.clear();\n this.#sessionConfigurations.clear();\n }\n\n #send(\n method: string,\n params: object = {},\n sessionId = \"\",\n wait = true,\n ): Promise<Record<string, unknown>> {\n if (this.#closed) return Promise.reject(new Error(\"CDP connection closed\"));\n const id = this.#nextId++;\n const message = { id, method, params, ...(sessionId ? { sessionId } : {}) };\n if (!wait) {\n this.#socket.send(JSON.stringify(message));\n return Promise.resolve({});\n }\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.#pending.delete(id);\n reject(new Error(`Timed out sending CDP command ${method}`));\n }, TIMEOUT_MS);\n this.#pending.set(id, { resolve, reject, timeout });\n try {\n this.#socket.send(JSON.stringify(message));\n } catch (error) {\n clearTimeout(timeout);\n this.#pending.delete(id);\n reject(error instanceof Error ? error : new Error(String(error)));\n }\n });\n }\n\n #onMessage(data: string | ArrayBuffer | Blob): void {\n if (data instanceof Blob) {\n void data.text().then((text) => this.#onMessage(text));\n return;\n }\n const text =\n typeof data === \"string\" ? data : new TextDecoder().decode(data);\n const message = JSON.parse(text) as CdpMessage;\n if (message.id) {\n const command = this.#pending.get(message.id);\n if (!command) return;\n this.#pending.delete(message.id);\n clearTimeout(command.timeout);\n if (message.error) command.reject(new Error(message.error.message));\n else command.resolve(message.result ?? {});\n return;\n }\n\n const method = message.method ?? \"\";\n const params = message.params ?? {};\n if (method === \"Target.attachedToTarget\") {\n const targetInfo = params.targetInfo as\n | { targetId?: string; type?: string }\n | undefined;\n const sessionId = String(params.sessionId);\n let configuration = Promise.resolve();\n if (targetInfo?.type === \"page\" || targetInfo?.type === \"iframe\") {\n if (targetInfo.targetId)\n this.#targetSessions.set(targetInfo.targetId, sessionId);\n configuration = this.#configureSession(sessionId);\n }\n void configuration\n .finally(() =>\n this.#send(\"Runtime.runIfWaitingForDebugger\", {}, sessionId),\n )\n .catch(() => undefined);\n } else if (method === \"Target.detachedFromTarget\") {\n this.#detachSession(String(params.sessionId ?? \"\"));\n }\n }\n\n #configureSession(sessionId: string): Promise<void> {\n const existing = this.#sessionConfigurations.get(sessionId);\n if (existing) return existing;\n const configuration = this.#configureNewSession(sessionId);\n this.#sessionConfigurations.set(sessionId, configuration);\n return configuration;\n }\n\n async #configureNewSession(sessionId: string): Promise<void> {\n await this.#send(\"Target.setAutoAttach\", AUTO_ATTACH_PARAMS, sessionId);\n await this.#send(\"Page.enable\", {}, sessionId);\n await this.#send(\n \"Page.addScriptToEvaluateOnNewDocument\",\n { source: this.#waiterScript, runImmediately: true },\n sessionId,\n );\n }\n\n async #awaitSession(targetId: string): Promise<string> {\n const deadline = Date.now() + TIMEOUT_MS;\n while (Date.now() < deadline) {\n const sessionId = this.#targetSessions.get(targetId);\n const configuration = sessionId\n ? this.#sessionConfigurations.get(sessionId)\n : undefined;\n if (sessionId && configuration) {\n await configuration;\n return sessionId;\n }\n await new Promise((resolve) => setTimeout(resolve, 10));\n }\n return \"\";\n }\n\n #detachSession(sessionId: string): void {\n if (!sessionId) return;\n this.#sessionConfigurations.delete(sessionId);\n for (const [targetId, attachedSession] of this.#targetSessions) {\n if (attachedSession === sessionId) this.#targetSessions.delete(targetId);\n }\n }\n\n #failConnection(): void {\n this.#closed = true;\n this.#failPending(new Error(\"CDP connection closed\"));\n }\n\n #failPending(error: Error): void {\n for (const command of this.#pending.values()) {\n clearTimeout(command.timeout);\n command.reject(error);\n }\n this.#pending.clear();\n }\n}\n\nasync function websocketUrl(capabilities: {\n get(key: string): unknown;\n}): Promise<string> {\n const cdpUrl = capabilities.get(\"se:cdp\");\n if (typeof cdpUrl === \"string\") return cdpUrl;\n\n const options = (capabilities.get(\"goog:chromeOptions\") ??\n capabilities.get(\"ms:edgeOptions\")) as\n | { debuggerAddress?: string }\n | undefined;\n if (!options?.debuggerAddress) {\n throw new Error(\"Chromium did not expose a CDP debugger address\");\n }\n const response = await fetch(\n `http://${options.debuggerAddress}/json/version`,\n {\n signal: AbortSignal.timeout(TIMEOUT_MS),\n },\n );\n if (!response.ok) throw new Error(`CDP discovery failed: ${response.status}`);\n const version = (await response.json()) as { webSocketDebuggerUrl: string };\n return version.webSocketDebuggerUrl;\n}\n"
|
|
8
|
+
],
|
|
9
|
+
"mappings": "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",
|
|
10
|
+
"debugId": "556752DC5E7931C764756E2164756E21",
|
|
11
|
+
"names": []
|
|
12
|
+
}
|
package/src/index.d.ts
ADDED