@probolabs/playwright 0.4.10 → 0.4.11
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/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const highlighterCode = "(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n typeof define === 'function' && define.amd ? define(['exports'], factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.ProboLabs = {}));\n})(this, (function (exports) { 'use strict';\n\n const ElementTag = {\n CLICKABLE: \"CLICKABLE\", // button, link, toggle switch, checkbox, radio, dropdowns, clickable divs\n FILLABLE: \"FILLABLE\", // input, textarea content_editable, date picker??\n SELECTABLE: \"SELECTABLE\", // select\n NON_INTERACTIVE_ELEMENT: 'NON_INTERACTIVE_ELEMENT',\n };\n\n class ElementInfo {\n constructor(element, index, {tag, type, text, html, xpath, css_selector, bounding_box, iframe_selector}) {\n this.index = index.toString();\n this.tag = tag;\n this.type = type;\n this.text = text;\n this.html = html;\n this.xpath = xpath;\n this.css_selector = css_selector;\n this.bounding_box = bounding_box;\n this.iframe_selector = iframe_selector;\n this.element = element;\n this.depth = -1;\n }\n\n getSelector() {\n return this.xpath ? this.xpath : this.css_selector;\n }\n\n getDepth() {\n if (this.depth >= 0) {\n return this.depth;\n }\n \n this.depth = 0;\n let currentElement = this.element;\n \n while (currentElement.nodeType === Node.ELEMENT_NODE) { \n this.depth++;\n if (currentElement.assignedSlot) {\n currentElement = currentElement.assignedSlot;\n }\n else {\n currentElement = currentElement.parentNode;\n // Check if we're at a shadow root\n if (currentElement && currentElement.nodeType !== Node.ELEMENT_NODE && currentElement.getRootNode() instanceof ShadowRoot) {\n // Get the shadow root's host element\n currentElement = currentElement.getRootNode().host; \n }\n }\n }\n \n return this.depth;\n }\n }\n\n // import { realpath } from \"fs\";\n\n function getAllDocumentElementsIncludingShadow(selectors, root = document) {\n const elements = Array.from(root.querySelectorAll(selectors));\n\n root.querySelectorAll('*').forEach(el => {\n if (el.shadowRoot) {\n elements.push(...getAllDocumentElementsIncludingShadow(selectors, el.shadowRoot));\n }\n });\n return elements;\n }\n\n function getAllFrames(root = document) {\n const result = [root];\n const frames = getAllDocumentElementsIncludingShadow('frame, iframe', root); \n frames.forEach(frame => {\n try {\n const frameDocument = frame.contentDocument || frame.contentWindow.document;\n if (frameDocument) {\n result.push(frameDocument);\n }\n } catch (e) {\n // Skip cross-origin frames\n console.warn('Could not access frame content:', e.message);\n }\n });\n\n return result;\n }\n\n function getAllElementsIncludingShadow(selectors, root = document) {\n const elements = [];\n\n getAllFrames(root).forEach(doc => {\n elements.push(...getAllDocumentElementsIncludingShadow(selectors, doc));\n });\n\n return elements;\n }\n\n /**\n * Deeply searches through DOM trees including Shadow DOM and frames/iframes\n * @param {string} selector - CSS selector to search for\n * @param {Document|Element} [root=document] - Starting point for the search\n * @param {Object} [options] - Search options\n * @param {boolean} [options.searchShadow=true] - Whether to search Shadow DOM\n * @param {boolean} [options.searchFrames=true] - Whether to search frames/iframes\n * @returns {Element[]} Array of found elements\n \n function getAllElementsIncludingShadow(selector, root = document, options = {}) {\n const {\n searchShadow = true,\n searchFrames = true\n } = options;\n\n const results = new Set();\n \n // Helper to check if an element is valid and not yet found\n const addIfValid = (element) => {\n if (element && !results.has(element)) {\n results.add(element);\n }\n };\n\n // Helper to process a single document or element\n function processNode(node) {\n // Search regular DOM\n node.querySelectorAll(selector).forEach(addIfValid);\n\n if (searchShadow) {\n // Search all shadow roots\n const treeWalker = document.createTreeWalker(\n node,\n NodeFilter.SHOW_ELEMENT,\n {\n acceptNode: (element) => {\n return element.shadowRoot ? \n NodeFilter.FILTER_ACCEPT : \n NodeFilter.FILTER_SKIP;\n }\n }\n );\n\n while (treeWalker.nextNode()) {\n const element = treeWalker.currentNode;\n if (element.shadowRoot) {\n // Search within shadow root\n element.shadowRoot.querySelectorAll(selector).forEach(addIfValid);\n // Recursively process the shadow root for nested shadow DOMs\n processNode(element.shadowRoot);\n }\n }\n }\n\n if (searchFrames) {\n // Search frames and iframes\n const frames = node.querySelectorAll('frame, iframe');\n frames.forEach(frame => {\n try {\n const frameDocument = frame.contentDocument;\n if (frameDocument) {\n processNode(frameDocument);\n }\n } catch (e) {\n // Skip cross-origin frames\n console.warn('Could not access frame content:', e.message);\n }\n });\n }\n }\n\n // Start processing from the root\n processNode(root);\n\n return Array.from(results);\n }\n */\n // <div x=1 y=2 role='combobox'> </div>\n function findDropdowns() {\n const dropdowns = [];\n \n // Native select elements\n dropdowns.push(...getAllElementsIncludingShadow('select'));\n \n // Elements with dropdown roles that don't have <input>..</input>\n const roleElements = getAllElementsIncludingShadow('[role=\"combobox\"], [role=\"listbox\"], [role=\"dropdown\"], [role=\"option\"], [role=\"menu\"], [role=\"menuitem\"]').filter(el => {\n return el.tagName.toLowerCase() !== 'input' || ![\"button\", \"checkbox\", \"radio\"].includes(el.getAttribute(\"type\"));\n });\n dropdowns.push(...roleElements);\n \n // Common dropdown class patterns\n const dropdownPattern = /.*(dropdown|select|combobox|menu).*/i;\n const elements = getAllElementsIncludingShadow('*');\n const dropdownClasses = Array.from(elements).filter(el => {\n const hasDropdownClass = dropdownPattern.test(el.className);\n const validTag = ['li', 'ul', 'span', 'div', 'p', 'a', 'button'].includes(el.tagName.toLowerCase());\n const style = window.getComputedStyle(el); \n const result = hasDropdownClass && validTag && (style.cursor === 'pointer' || el.tagName.toLowerCase() === 'a' || el.tagName.toLowerCase() === 'button');\n return result;\n });\n \n dropdowns.push(...dropdownClasses);\n \n // Elements with aria-haspopup attribute\n dropdowns.push(...getAllElementsIncludingShadow('[aria-haspopup=\"true\"], [aria-haspopup=\"listbox\"], [aria-haspopup=\"menu\"]'));\n\n // Improve navigation element detection\n // Semantic nav elements with list items\n dropdowns.push(...getAllElementsIncludingShadow('nav ul li, nav ol li'));\n \n // Navigation elements in common design patterns\n dropdowns.push(...getAllElementsIncludingShadow('header a, .header a, .nav a, .navigation a, .menu a, .sidebar a, aside a'));\n \n // Elements in primary navigation areas with common attributes\n dropdowns.push(...getAllElementsIncludingShadow('[role=\"navigation\"] a, [aria-label*=\"navigation\"] a, [aria-label*=\"menu\"] a'));\n\n return dropdowns;\n }\n\n function findClickables() {\n const clickables = [];\n \n const checkboxPattern = /checkbox/i;\n // Collect all clickable elements first\n const nativeLinks = [...getAllElementsIncludingShadow('a[href]')];\n const nativeButtons = [...getAllElementsIncludingShadow('button')];\n const inputButtons = [...getAllElementsIncludingShadow('input[type=\"button\"], input[type=\"submit\"], input[type=\"reset\"]')];\n const roleButtons = [...getAllElementsIncludingShadow('[role=\"button\"]')];\n // const tabbable = [...getAllElementsIncludingShadow('[tabindex=\"0\"]')];\n const clickHandlers = [...getAllElementsIncludingShadow('[onclick]')];\n const dropdowns = findDropdowns();\n const nativeCheckboxes = [...getAllElementsIncludingShadow('input[type=\"checkbox\"]')]; \n const fauxCheckboxes = getAllElementsIncludingShadow('*').filter(el => {\n if (checkboxPattern.test(el.className)) {\n const realCheckboxes = getAllElementsIncludingShadow('input[type=\"checkbox\"]', el);\n if (realCheckboxes.length === 1) {\n const boundingRect = realCheckboxes[0].getBoundingClientRect();\n return boundingRect.width <= 1 && boundingRect.height <= 1 \n }\n }\n return false;\n });\n const nativeRadios = [...getAllElementsIncludingShadow('input[type=\"radio\"]')];\n const toggles = findToggles();\n const pointerElements = findElementsWithPointer();\n // Add all elements at once\n clickables.push(\n ...nativeLinks,\n ...nativeButtons,\n ...inputButtons,\n ...roleButtons,\n // ...tabbable,\n ...clickHandlers,\n ...dropdowns,\n ...nativeCheckboxes,\n ...fauxCheckboxes,\n ...nativeRadios,\n ...toggles,\n ...pointerElements\n );\n\n // Only uniquify once at the end\n return clickables; // Let findElements handle the uniquification\n }\n\n function findToggles() {\n const toggles = [];\n const checkboxes = getAllElementsIncludingShadow('input[type=\"checkbox\"]');\n const togglePattern = /switch|toggle|slider/i;\n\n checkboxes.forEach(checkbox => {\n let isToggle = false;\n\n // Check the checkbox itself\n if (togglePattern.test(checkbox.className) || togglePattern.test(checkbox.getAttribute('role') || '')) {\n isToggle = true;\n }\n\n // Check parent elements (up to 3 levels)\n if (!isToggle) {\n let element = checkbox;\n for (let i = 0; i < 3; i++) {\n const parent = element.parentElement;\n if (!parent) break;\n\n const className = parent.className || '';\n const role = parent.getAttribute('role') || '';\n\n if (togglePattern.test(className) || togglePattern.test(role)) {\n isToggle = true;\n break;\n }\n element = parent;\n }\n }\n\n // Check next sibling\n if (!isToggle) {\n const nextSibling = checkbox.nextElementSibling;\n if (nextSibling) {\n const className = nextSibling.className || '';\n const role = nextSibling.getAttribute('role') || '';\n if (togglePattern.test(className) || togglePattern.test(role)) {\n isToggle = true;\n }\n }\n }\n\n if (isToggle) {\n toggles.push(checkbox);\n }\n });\n\n return toggles;\n }\n\n function findNonInteractiveElements() {\n // Get all elements in the document\n const all = Array.from(getAllElementsIncludingShadow('*'));\n \n // Filter elements based on Python implementation rules\n return all.filter(element => {\n if (!element.firstElementChild) {\n const tag = element.tagName.toLowerCase(); \n if (!['select', 'button', 'a'].includes(tag)) {\n const validTags = ['p', 'span', 'div', 'input', 'textarea'].includes(tag) || /^h\\d$/.test(tag) || /text/.test(tag);\n const boundingRect = element.getBoundingClientRect();\n return validTags && boundingRect.height > 1 && boundingRect.width > 1;\n }\n }\n return false;\n });\n }\n\n\n\n // export function findNonInteractiveElements() {\n // const all = [];\n // try {\n // const elements = getAllElementsIncludingShadow('*');\n // all.push(...elements);\n // } catch (e) {\n // console.warn('Error getting elements:', e);\n // }\n \n // console.debug('Total elements found:', all.length);\n \n // return all.filter(element => {\n // try {\n // const tag = element.tagName.toLowerCase(); \n\n // // Special handling for input elements\n // if (tag === 'input' || tag === 'textarea') {\n // const boundingRect = element.getBoundingClientRect();\n // const value = element.value || '';\n // const placeholder = element.placeholder || '';\n // return boundingRect.height > 1 && \n // boundingRect.width > 1 && \n // (value.trim() !== '' || placeholder.trim() !== '');\n // }\n\n \n // // Check if it's a valid tag for text content\n // const validTags = ['p', 'span', 'div', 'label', 'th', 'td', 'li', 'button', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'a', 'select'].includes(tag) || \n // /^h\\d$/.test(tag) || \n // /text/.test(tag);\n\n // const boundingRect = element.getBoundingClientRect();\n\n // // Get direct text content, excluding child element text\n // let directText = '';\n // for (const node of element.childNodes) {\n // // Only include text nodes (nodeType 3)\n // if (node.nodeType === 3) {\n // directText += node.textContent || '';\n // }\n // }\n \n // // If no direct text and it's a table cell or heading, check label content\n // if (!directText.trim() && (tag === 'th' || tag === 'td' || tag === 'h1')) {\n // const labels = element.getElementsByTagName('label');\n // for (const label of labels) {\n // directText += label.textContent || '';\n // }\n // }\n\n // // If still no text and it's a heading, get all text content\n // if (!directText.trim() && tag === 'h1') {\n // directText = element.textContent || '';\n // }\n\n // directText = directText.trim();\n\n // // Debug logging\n // if (directText) {\n // console.debugg('Text element found:', {\n // tag,\n // text: directText,\n // dimensions: boundingRect,\n // element\n // });\n // }\n\n // return validTags && \n // boundingRect.height > 1 && \n // boundingRect.width > 1 && \n // directText !== '';\n \n // } catch (e) {\n // console.warn('Error processing element:', e);\n // return false;\n // }\n // });\n // }\n\n\n\n\n\n function findElementsWithPointer() {\n const elements = [];\n const allElements = getAllElementsIncludingShadow('*');\n \n console.log('Checking elements with pointer style...');\n \n allElements.forEach(element => {\n // Skip SVG elements for now\n if (element instanceof SVGElement || element.tagName.toLowerCase() === 'svg') {\n return;\n }\n \n const style = window.getComputedStyle(element);\n if (style.cursor === 'pointer') {\n elements.push(element);\n }\n });\n \n console.log(`Found ${elements.length} elements with pointer cursor`);\n return elements;\n }\n\n function findCheckables() {\n const elements = [];\n\n elements.push(...getAllElementsIncludingShadow('input[type=\"checkbox\"]'));\n elements.push(...getAllElementsIncludingShadow('input[type=\"radio\"]'));\n const all_elements = getAllElementsIncludingShadow('label');\n const radioClasses = Array.from(all_elements).filter(el => {\n return /.*radio.*/i.test(el.className); \n });\n elements.push(...radioClasses);\n return elements;\n }\n\n function findFillables() {\n const elements = [];\n\n const inputs = [...getAllElementsIncludingShadow('input:not([type=\"radio\"]):not([type=\"checkbox\"])')];\n console.log('Found inputs:', inputs.length, inputs);\n elements.push(...inputs);\n \n const textareas = [...getAllElementsIncludingShadow('textarea')];\n console.log('Found textareas:', textareas.length);\n elements.push(...textareas);\n \n const editables = [...getAllElementsIncludingShadow('[contenteditable=\"true\"]')];\n console.log('Found editables:', editables.length);\n elements.push(...editables);\n\n return elements;\n }\n\n // Helper function to check if element is a form control\n function isFormControl(elementInfo) {\n return /^(input|select|textarea|button|label)$/i.test(elementInfo.tag);\n }\n\n const isDropdownItem = (elementInfo) => {\n const dropdownPatterns = [\n /dropdown[-_]?item/i, // matches: dropdown-item, dropdownitem, dropdown_item\n /menu[-_]?item/i, // matches: menu-item, menuitem, menu_item\n /dropdown[-_]?link/i, // matches: dropdown-link, dropdownlink, dropdown_link\n /list[-_]?item/i, // matches: list-item, listitem, list_item\n /select[-_]?item/i, // matches: select-item, selectitem, select_item \n ];\n\n const rolePatterns = [\n /menu[-_]?item/i, // matches: menuitem, menu-item\n /option/i, // matches: option\n /list[-_]?item/i, // matches: listitem, list-item\n /tree[-_]?item/i // matches: treeitem, tree-item\n ];\n\n const hasMatchingClass = elementInfo.element.className && \n dropdownPatterns.some(pattern => \n pattern.test(elementInfo.element.className)\n );\n\n const hasMatchingRole = elementInfo.element.getAttribute('role') && \n rolePatterns.some(pattern => \n pattern.test(elementInfo.element.getAttribute('role'))\n );\n\n return hasMatchingClass || hasMatchingRole;\n };\n\n /**\n * Finds the first element matching a CSS selector, traversing Shadow DOM if necessary\n * @param {string} selector - CSS selector to search for\n * @param {Element} [root=document] - Root element to start searching from\n * @returns {Element|null} - The first matching element or null if not found\n */\n function querySelectorShadow(selector, root = document) {\n // First try to find in light DOM\n let element = root.querySelector(selector);\n if (element) return element;\n \n // Get all elements with shadow root\n const shadowElements = Array.from(root.querySelectorAll('*'))\n .filter(el => el.shadowRoot);\n \n // Search through each shadow root until we find a match\n for (const el of shadowElements) {\n element = querySelectorShadow(selector, el.shadowRoot);\n if (element) return element;\n }\n \n return null;\n }\n\n const getElementByXPathOrCssSelector = (element_info) => {\n let element;\n\n console.log('getElementByXPathOrCssSelector:', element_info);\n // if (element_info.xpath) { //try xpath if exists\n // element = document.evaluate(\n // element_info.xpath, \n // document, \n // null, \n // XPathResult.FIRST_ORDERED_NODE_TYPE, \n // null\n // ).singleNodeValue;\n \n // if (!element) {\n // console.warn('Failed to find element with xpath:', element_info.xpath);\n // }\n // }\n // else { //try CSS selector\n if (element_info.iframe_selector) {\n console.log('elementInfo with iframe: ', element_info);\n const frames = getAllDocumentElementsIncludingShadow('iframe');\n \n // Iterate over all frames and compare their CSS selectors\n for (const frame of frames) {\n const cssSelector = generateCssPath(frame);\n if (cssSelector === element_info.iframe_selector) {\n const frameDocument = frame.contentDocument || frame.contentWindow.document;\n element = querySelectorShadow(element_info.css_selector, frameDocument);\n console.log('found element ', element);\n break;\n } \n } }\n else\n element = querySelectorShadow(element_info.css_selector);\n // console.log('found element by CSS elector: ', element);\n if (!element) {\n console.warn('Failed to find element with CSS selector:', element_info.css_selector);\n }\n // }\n\n return element;\n };\n\n function generateXPath(element) {\n if (!element || element.getRootNode() instanceof ShadowRoot) return '';\n \n // If element has an id, use that (it's unique and shorter)\n if (element.id) {\n return `//*[@id=\"${element.id}\"]`;\n }\n \n const parts = [];\n let current = element;\n \n while (current && current.nodeType === Node.ELEMENT_NODE) {\n let index = 1;\n let sibling = current.previousSibling;\n \n while (sibling) {\n if (sibling.nodeType === Node.ELEMENT_NODE && sibling.tagName === current.tagName) {\n index++;\n }\n sibling = sibling.previousSibling;\n }\n \n const tagName = current.tagName.toLowerCase();\n parts.unshift(`${tagName}[${index}]`);\n current = current.parentNode;\n }\n \n return '/' + parts.join('/');\n }\n\n function isDecendent(parent, child) {\n let element = child;\n while (element.nodeType === Node.ELEMENT_NODE) { \n \n if (element.assignedSlot) {\n element = element.assignedSlot;\n }\n else {\n element = element.parentNode;\n // Check if we're at a shadow root\n if (element && element.nodeType !== Node.ELEMENT_NODE && element.getRootNode() instanceof ShadowRoot) {\n // Get the shadow root's host element\n element = element.getRootNode().host; \n }\n }\n if (element === parent)\n return true;\n }\n return false;\n }\n\n function generateCssPath(element) {\n if (!element) {\n console.error('ERROR: No element provided to generateCssPath returning empty string');\n return '';\n }\n const path = [];\n // console.group('Generating CSS path for:', element);\n while (element && element.nodeType === Node.ELEMENT_NODE) { \n let selector = element.nodeName.toLowerCase();\n // console.log('Element:', selector, element);\n \n // if (element.id) {\n // //escape special characters\n // const normalized_id = element.id.replace(/[:;.#()[\\]!@$%^&*]/g, '\\\\$&');\n // selector = `#${normalized_id}`;\n // path.unshift(selector);\n // break;\n // } \n \n let sibling = element;\n let nth = 1;\n while (sibling = sibling.previousElementSibling) {\n if (sibling.nodeName.toLowerCase() === selector) nth++;\n }\n sibling = element;\n while (sibling = sibling.nextElementSibling) {\n if (sibling.nodeName.toLowerCase() === selector) {\n break;\n }\n }\n selector += `:nth-of-type(${nth})`;\n \n \n path.unshift(selector);\n //console.log(` Current path: ${path.join(' > ')}`);\n\n if (element.assignedSlot) {\n element = element.assignedSlot;\n // console.log(' Moving to assigned slot');\n }\n else {\n element = element.parentNode;\n // console.log(' Moving to parent:', element);\n\n // Check if we're at a shadow root\n if (element && element.nodeType !== Node.ELEMENT_NODE && element.getRootNode() instanceof ShadowRoot) {\n console.log(' Found shadow root, moving to host');\n // Get the shadow root's host element\n element = element.getRootNode().host; \n }\n }\n }\n \n // console.log('Final selector:', path.join(' > '));\n // console.groupEnd();\n return path.join(' > ');\n }\n\n\n function cleanHTML(rawHTML) {\n const parser = new DOMParser();\n const doc = parser.parseFromString(rawHTML, \"text/html\");\n\n function cleanElement(element) {\n const allowedAttributes = new Set([\n \"role\",\n \"type\",\n \"class\",\n \"href\",\n \"alt\",\n \"title\",\n \"readonly\",\n \"checked\",\n \"enabled\",\n \"disabled\",\n ]);\n\n [...element.attributes].forEach(attr => {\n const name = attr.name.toLowerCase();\n const value = attr.value;\n\n const isTestAttribute = /^(testid|test-id|data-test-id)$/.test(name);\n const isDataAttribute = name.startsWith(\"data-\") && value;\n const isBooleanAttribute = [\"readonly\", \"checked\", \"enabled\", \"disabled\"].includes(name);\n\n if (!allowedAttributes.has(name) && !isDataAttribute && !isTestAttribute && !isBooleanAttribute) {\n element.removeAttribute(name);\n }\n });\n\n // Handle SVG content - more aggressive replacement\n if (element.tagName.toLowerCase() === \"svg\") {\n // Remove all attributes except class and role\n [...element.attributes].forEach(attr => {\n const name = attr.name.toLowerCase();\n if (name !== \"class\" && name !== \"role\") {\n element.removeAttribute(name);\n }\n });\n element.innerHTML = \"CONTENT REMOVED\";\n } else {\n // Recursively clean child elements\n Array.from(element.children).forEach(cleanElement);\n }\n\n // Only remove empty elements that aren't semantic or icon elements\n const keepEmptyElements = ['i', 'span', 'svg', 'button', 'input'];\n if (!keepEmptyElements.includes(element.tagName.toLowerCase()) && \n !element.children.length && \n !element.textContent.trim()) {\n element.remove();\n }\n }\n\n // Process all elements in the document body\n Array.from(doc.body.children).forEach(cleanElement);\n return doc.body.innerHTML;\n }\n\n function getContainingIframe(element) {\n // If not in an iframe, return null\n if (element.ownerDocument.defaultView === window.top) {\n return null;\n }\n \n // Try to find the iframe in the parent document that contains our element\n try {\n const parentDocument = element.ownerDocument.defaultView.parent.document;\n const iframes = parentDocument.querySelectorAll('iframe');\n \n for (const iframe of iframes) {\n if (iframe.contentWindow === element.ownerDocument.defaultView) {\n return iframe;\n }\n }\n } catch (e) {\n // Cross-origin restriction\n return \"Cross-origin iframe - cannot access details\";\n }\n \n return null;\n }\n\n function getElementInfo(element, index) {\n\n const xpath = generateXPath(element);\n const css_selector = generateCssPath(element);\n\n const iframe = getContainingIframe(element);\n const iframe_selector = iframe ? generateCssPath(iframe) : \"\";\n\n // Return element info with pre-calculated values\n return new ElementInfo(element, index, {\n tag: element.tagName.toLowerCase(),\n type: element.type || '',\n text: element.innerText || '', //getTextContent(element),\n html: cleanHTML(element.outerHTML),\n xpath: xpath,\n css_selector: css_selector,\n bounding_box: element.getBoundingClientRect(),\n iframe_selector: iframe_selector\n });\n }\n\n\n\n\n const filterZeroDimensions = (elementInfo) => {\n const rect = elementInfo.bounding_box;\n //single pixel elements are typically faux controls and should be filtered too\n const hasSize = rect.width > 1 && rect.height > 1;\n const style = window.getComputedStyle(elementInfo.element);\n const isVisible = style.display !== 'none' && style.visibility !== 'hidden';\n \n if (!hasSize || !isVisible) {\n // if (elementInfo.element.isConnected) {\n // console.log('Filtered out invisible/zero-size element:', {\n // tag: elementInfo.tag,\n // xpath: elementInfo.xpath,\n // element: elementInfo.element,\n // hasSize,\n // isVisible,\n // dimensions: rect\n // });\n // }\n return false;\n }\n return true;\n };\n\n\n\n function uniquifyElements(elements) {\n const seen = new Set();\n\n console.log(`Starting uniquification with ${elements.length} elements`);\n\n // Filter out testing infrastructure elements first\n const filteredInfrastructure = elements.filter(element_info => {\n // Skip the highlight-overlay element completely - it's part of the testing infrastructure\n if (element_info.element.id === 'highlight-overlay' || \n (element_info.css_selector && element_info.css_selector.includes('#highlight-overlay'))) {\n console.log('Filtered out testing infrastructure element:', element_info.css_selector);\n return false;\n }\n \n // Filter out UI framework container/manager elements\n const el = element_info.element;\n // UI framework container checks - generic detection for any framework\n if ((el.getAttribute('data-rendered-by') || \n el.getAttribute('data-reactroot') || \n el.getAttribute('ng-version') || \n el.getAttribute('data-component-id') ||\n el.getAttribute('data-root') ||\n el.getAttribute('data-framework')) && \n (el.className && \n typeof el.className === 'string' && \n (el.className.includes('Container') || \n el.className.includes('container') || \n el.className.includes('Manager') || \n el.className.includes('manager')))) {\n console.log('Filtered out UI framework container element:', element_info.css_selector);\n return false;\n }\n \n // Direct filter for framework container elements that shouldn't be interactive\n // Consolidating multiple container detection patterns into one efficient check\n const isFullViewport = element_info.bounding_box && \n element_info.bounding_box.x <= 5 && \n element_info.bounding_box.y <= 5 && \n element_info.bounding_box.width >= (window.innerWidth * 0.95) && \n element_info.bounding_box.height >= (window.innerHeight * 0.95);\n \n // Empty content check\n const isEmpty = !el.innerText || el.innerText.trim() === '';\n \n // Check if it's a framework container element\n if (element_info.element.tagName === 'DIV' && \n isFullViewport && \n isEmpty && \n (\n // Pattern matching for root containers\n (element_info.xpath && \n (element_info.xpath.match(/^\\/html\\[\\d+\\]\\/body\\[\\d+\\]\\/div\\[\\d+\\]\\/div\\[\\d+\\]$/) || \n element_info.xpath.match(/^\\/\\/\\*\\[@id='[^']+'\\]\\/div\\[\\d+\\]$/))) ||\n \n // Simple DOM structure\n (element_info.css_selector.split(' > ').length <= 4 && element_info.depth <= 5) ||\n \n // Empty or container-like classes\n (!el.className || el.className === '' || \n (typeof el.className === 'string' && \n (el.className.includes('overlay') || \n el.className.includes('container') || \n el.className.includes('wrapper'))))\n )) {\n console.log('Filtered out framework container element:', element_info.css_selector);\n return false;\n }\n \n return true;\n });\n\n // First filter out elements with zero dimensions\n const nonZeroElements = filteredInfrastructure.filter(filterZeroDimensions);\n // sort by CSS selector depth so parents are processed first\n nonZeroElements.sort((a, b) => a.getDepth() - b.getDepth());\n console.log(`After dimension filtering: ${nonZeroElements.length} elements remain (${elements.length - nonZeroElements.length} removed)`);\n \n const filteredByParent = nonZeroElements.filter(element_info => {\n\n const parent = findClosestParent(seen, element_info);\n const keep = parent == null || shouldKeepNestedElement(element_info, parent);\n // console.log(\"node \", element_info.index, \": keep=\", keep, \" parent=\", parent);\n // if (!keep && !element_info.xpath) {\n // console.log(\"Filtered out element \", element_info,\" because it's a nested element of \", parent);\n // }\n if (keep)\n seen.add(element_info.css_selector);\n\n return keep;\n });\n\n console.log(`After parent/child filtering: ${filteredByParent.length} elements remain (${nonZeroElements.length - filteredByParent.length} removed)`);\n\n // Final overlap filtering\n const filteredResults = filteredByParent.filter(element => {\n\n // Look for any element that came BEFORE this one in the array\n const hasEarlierOverlap = filteredByParent.some(other => {\n // Only check elements that came before (lower index)\n if (filteredByParent.indexOf(other) >= filteredByParent.indexOf(element)) {\n return false;\n }\n \n const isOverlapping = areElementsOverlapping(element, other); \n return isOverlapping;\n }); \n\n // Keep element if it has no earlier overlapping elements\n return !hasEarlierOverlap;\n });\n \n \n \n // Check for overlay removal\n console.log(`After filtering: ${filteredResults.length} (${filteredByParent.length - filteredResults.length} removed by overlap)`);\n \n const nonOverlaidElements = filteredResults.filter(element => {\n return !isOverlaid(element);\n });\n\n console.log(`Final elements after overlay removal: ${nonOverlaidElements.length} (${filteredResults.length - nonOverlaidElements.length} removed)`);\n \n return nonOverlaidElements;\n\n }\n\n\n\n const areElementsOverlapping = (element1, element2) => {\n if (element1.css_selector === element2.css_selector) {\n return true;\n }\n \n const box1 = element1.bounding_box;\n const box2 = element2.bounding_box;\n \n return box1.x === box2.x &&\n box1.y === box2.y &&\n box1.width === box2.width &&\n box1.height === box2.height;\n // element1.text === element2.text &&\n // element2.tag === 'a';\n };\n\n function findClosestParent(seen, element_info) { \n // //Use element child/parent queries\n // let parent = element_info.element.parentNode;\n // if (parent.getRootNode() instanceof ShadowRoot) {\n // // Get the shadow root's host element\n // parent = parent.getRootNode().host; \n // }\n\n // while (parent.nodeType === Node.ELEMENT_NODE) { \n // const css_selector = generateCssPath(parent);\n // if (seen.has(css_selector)) {\n // console.log(\"element \", element_info, \" closest parent is \", parent)\n // return parent; \n // }\n // parent = parent.parentNode;\n // if (parent.getRootNode() instanceof ShadowRoot) {\n // // Get the shadow root's host element\n // parent = parent.getRootNode().host; \n // }\n // }\n\n // Split the xpath into segments\n const segments = element_info.css_selector.split(' > ');\n \n // Try increasingly shorter paths until we find one in the seen set\n for (let i = segments.length - 1; i > 0; i--) {\n const parentPath = segments.slice(0, i).join(' > ');\n if (seen.has(parentPath)) {\n return parentPath;\n }\n }\n\n return null;\n }\n\n function shouldKeepNestedElement(elementInfo, parentPath) {\n let result = false;\n const parentSegments = parentPath.split(' > ');\n\n const isParentLink = /^a(:nth-of-type\\(\\d+\\))?$/.test(parentSegments[parentSegments.length - 1]);\n if (isParentLink) {\n return false; \n }\n // If this is a checkbox/radio input\n if (elementInfo.tag === 'input' && \n (elementInfo.type === 'checkbox' || elementInfo.type === 'radio')) {\n \n // Check if parent is a label by looking at the parent xpath's last segment\n \n const isParentLabel = /^label(:nth-of-type\\(\\d+\\))?$/.test(parentSegments[parentSegments.length - 1]);\n \n // If parent is a label, don't keep the input (we'll keep the label instead)\n if (isParentLabel) {\n return false;\n }\n }\n \n // Keep all other form controls and dropdown items\n if (isFormControl(elementInfo) || isDropdownItem(elementInfo)) {\n result = true;\n }\n\n if(isTableCell(elementInfo)) {\n result = true;\n }\n \n \n // console.log(`shouldKeepNestedElement: ${elementInfo.tag} ${elementInfo.text} ${elementInfo.xpath} -> ${parentXPath} -> ${result}`);\n return result;\n }\n\n\n function isTableCell(elementInfo) {\n const element = elementInfo.element;\n if(!element || !(element instanceof HTMLElement)) {\n return false;\n }\n const validTags = new Set(['td', 'th']);\n const validRoles = new Set(['cell', 'gridcell', 'columnheader', 'rowheader']);\n \n const tag = element.tagName.toLowerCase();\n const role = element.getAttribute('role')?.toLowerCase();\n\n if (validTags.has(tag) || (role && validRoles.has(role))) {\n return true;\n }\n return false;\n \n }\n\n function isOverlaid(elementInfo) {\n const element = elementInfo.element;\n const boundingRect = elementInfo.bounding_box;\n \n\n \n \n // Create a diagnostic logging function that only logs when needed\n const diagnosticLog = (...args) => {\n { // set to true for debugging\n console.log('[OVERLAY-DEBUG]', ...args);\n }\n };\n\n // Special handling for tooltips\n if (elementInfo.element.className && typeof elementInfo.element.className === 'string' && \n elementInfo.element.className.includes('tooltip')) {\n diagnosticLog('Element is a tooltip, not considering it overlaid');\n return false;\n }\n \n \n \n // Get element at the center point to check if it's covered by a popup/modal\n const middleX = boundingRect.x + boundingRect.width/2;\n const middleY = boundingRect.y + boundingRect.height/2;\n const elementAtMiddle = element.ownerDocument.elementFromPoint(middleX, middleY);\n \n if (elementAtMiddle && \n elementAtMiddle !== element && \n !isDecendent(element, elementAtMiddle) && \n !isDecendent(elementAtMiddle, element)) {\n\n // Add detailed logging for overlaid elements with formatted output\n console.log('[OVERLAY-DEBUG]', JSON.stringify({\n originalElement: {\n selector: elementInfo.css_selector,\n rect: {\n x: boundingRect.x,\n y: boundingRect.y,\n width: boundingRect.width,\n height: boundingRect.height,\n top: boundingRect.top,\n right: boundingRect.right,\n bottom: boundingRect.bottom,\n left: boundingRect.left\n }\n },\n overlayingElement: {\n selector: generateCssPath(elementAtMiddle),\n rect: {\n x: elementAtMiddle.getBoundingClientRect().x,\n y: elementAtMiddle.getBoundingClientRect().y,\n width: elementAtMiddle.getBoundingClientRect().width,\n height: elementAtMiddle.getBoundingClientRect().height,\n top: elementAtMiddle.getBoundingClientRect().top,\n right: elementAtMiddle.getBoundingClientRect().right,\n bottom: elementAtMiddle.getBoundingClientRect().bottom,\n left: elementAtMiddle.getBoundingClientRect().left\n }\n },\n middlePoint: { x: middleX, y: middleY }\n }, null, 2));\n\n console.log('[OVERLAY-REMOVED]', elementInfo.css_selector, elementInfo.bounding_box, 'elementAtMiddle:', elementAtMiddle, 'elementAtMiddle selector:', generateCssPath(elementAtMiddle));\n return true;\n }\n \n // Check specifically if the element at middle is a popup/modal\n // if (elementAtMiddle && isElementOrAncestorPopup(elementAtMiddle)) {\n // diagnosticLog('Element at middle is a popup/modal, element IS overlaid');\n // return true; // It's under a popup, so it is overlaid\n // }\n return false;\n // }\n // return false;\n }\n\n const highlight = {\n execute: async function(elementTypes, handleScroll=false) {\n const elements = await findElements(elementTypes);\n highlightElements(elements, handleScroll);\n return elements;\n },\n\n unexecute: function(handleScroll=false) {\n unhighlightElements(handleScroll);\n },\n\n generateJSON: async function() {\n const json = {};\n\n // Capture viewport dimensions\n const viewportData = {\n width: window.innerWidth,\n height: window.innerHeight,\n documentWidth: document.documentElement.clientWidth,\n documentHeight: document.documentElement.clientHeight,\n timestamp: new Date().toISOString()\n };\n\n // Add viewport data to the JSON output\n json.viewport = viewportData;\n\n\n await Promise.all(Object.values(ElementTag).map(async elementType => {\n const elements = await findElements(elementType);\n json[elementType] = elements;\n }));\n\n // Serialize the JSON object\n const jsonString = JSON.stringify(json, null, 4); // Pretty print with 4 spaces\n\n console.log(`JSON: ${jsonString}`);\n return jsonString;\n },\n\n getElementInfo\n };\n\n\n function unhighlightElements(handleScroll=false) {\n const documents = getAllFrames();\n documents.forEach(doc => {\n const overlay = doc.getElementById('highlight-overlay');\n if (overlay) {\n if (handleScroll) {\n // Remove event listeners\n doc.removeEventListener('scroll', overlay.scrollHandler, true);\n doc.removeEventListener('resize', overlay.resizeHandler);\n }\n overlay.remove();\n }\n });\n }\n\n\n\n\n async function findElements(elementTypes, verbose=true) {\n const typesArray = Array.isArray(elementTypes) ? elementTypes : [elementTypes];\n console.log('Starting element search for types:', typesArray);\n\n const elements = [];\n typesArray.forEach(elementType => {\n if (elementType === ElementTag.FILLABLE) {\n elements.push(...findFillables());\n }\n if (elementType === ElementTag.SELECTABLE) {\n elements.push(...findDropdowns());\n }\n if (elementType === ElementTag.CLICKABLE) {\n elements.push(...findClickables());\n elements.push(...findToggles());\n elements.push(...findCheckables());\n }\n if (elementType === ElementTag.NON_INTERACTIVE_ELEMENT) {\n elements.push(...findNonInteractiveElements());\n }\n });\n\n // console.log('Before uniquify:', elements.length);\n const elementsWithInfo = elements.map((element, index) => \n getElementInfo(element, index)\n );\n \n const uniqueElements = uniquifyElements(elementsWithInfo);\n console.log(`Found ${uniqueElements.length} elements:`);\n \n // More comprehensive visibility check\n const visibleElements = uniqueElements.filter(elementInfo => {\n const el = elementInfo.element;\n const style = getComputedStyle(el);\n \n // Check various style properties that affect visibility\n if (style.display === 'none' || \n style.visibility === 'hidden' || \n parseFloat(style.opacity) === 0) {\n return false;\n }\n \n // Check if element has non-zero dimensions\n const rect = el.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) {\n return false;\n }\n \n // Check if element is within viewport\n if (rect.bottom < 0 || \n rect.top > window.innerHeight || \n rect.right < 0 || \n rect.left > window.innerWidth) {\n // Element is outside viewport, but still might be valid \n // if user scrolls to it, so we'll include it\n return true;\n }\n \n return true;\n });\n \n console.log(`Out of which ${visibleElements.length} elements are visible:`);\n if (verbose) {\n visibleElements.forEach(info => {\n console.log(`Element ${info.index}:`, info);\n });\n }\n \n return visibleElements;\n }\n\n // elements is an array of objects with index, xpath\n function highlightElements(elements, handleScroll=false) {\n // console.log('Starting highlight for elements:', elements);\n \n // Create overlay if it doesn't exist and store it in a dictionary\n const documents = getAllFrames(); \n let overlays = {};\n documents.forEach(doc => {\n let overlay = doc.getElementById('highlight-overlay');\n if (!overlay) {\n overlay = doc.createElement('div');\n overlay.id = 'highlight-overlay';\n overlay.style.cssText = `\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n z-index: 2147483647;\n `;\n doc.body.appendChild(overlay);\n }\n overlays[doc.documentURI] = overlay;\n });\n \n\n const updateHighlights = (doc = null) => {\n if (doc) {\n overlays[doc.documentURI].innerHTML = '';\n } else {\n Object.values(overlays).forEach(overlay => { overlay.innerHTML = ''; });\n } \n elements.forEach(elementInfo => {\n // console.log('updateHighlights-Processing elementInfo:', elementInfo);\n let element = elementInfo.element; //getElementByXPathOrCssSelector(elementInfo);\n if (!element) {\n element = getElementByXPathOrCssSelector(elementInfo);\n if (!element)\n return;\n }\n \n //if highlights requested for a specific doc, skip unrelated elements\n if (doc && element.ownerDocument !== doc) {\n console.log(\"skipped element \", element, \" since it doesn't belong to document \", doc);\n return;\n }\n\n const rect = element.getBoundingClientRect();\n // console.log('Element rect:', elementInfo.tag, rect);\n \n if (rect.width === 0 || rect.height === 0) {\n console.warn('Element has zero dimensions:', elementInfo);\n return;\n }\n \n // Create border highlight (red rectangle)\n // use ownerDocument to support iframes/frames\n const highlight = element.ownerDocument.createElement('div');\n highlight.style.cssText = `\n position: fixed;\n left: ${rect.x}px;\n top: ${rect.y}px;\n width: ${rect.width}px;\n height: ${rect.height}px;\n border: 1px solid rgb(255, 0, 0);\n transition: all 0.2s ease-in-out;\n `;\n\n // Create index label container - now positioned to the right and slightly up\n const labelContainer = element.ownerDocument.createElement('div');\n labelContainer.style.cssText = `\n position: absolute;\n right: -10px; /* Offset to the right */\n top: -10px; /* Offset upwards */\n padding: 4px;\n background-color: rgba(255, 255, 0, 0.6);\n display: flex;\n align-items: center;\n justify-content: center;\n `;\n\n const text = element.ownerDocument.createElement('span');\n text.style.cssText = `\n color: rgb(0, 0, 0, 0.8);\n font-family: 'Courier New', Courier, monospace;\n font-size: 12px;\n font-weight: bold;\n line-height: 1;\n `;\n text.textContent = elementInfo.index;\n \n labelContainer.appendChild(text);\n highlight.appendChild(labelContainer); \n overlays[element.ownerDocument.documentURI].appendChild(highlight);\n });\n };\n\n // Initial highlight\n updateHighlights();\n\n if (handleScroll) {\n documents.forEach(doc => {\n // Update highlights on scroll and resize\n console.log('registering scroll and resize handlers for document: ', doc);\n const scrollHandler = () => {\n requestAnimationFrame(() => updateHighlights(doc));\n };\n const resizeHandler = () => {\n updateHighlights(doc);\n };\n doc.addEventListener('scroll', scrollHandler, true);\n doc.addEventListener('resize', resizeHandler);\n // Store event handlers for cleanup\n overlays[doc.documentURI].scrollHandler = scrollHandler;\n overlays[doc.documentURI].resizeHandler = resizeHandler;\n }); \n }\n }\n\n // function unexecute() {\n // unhighlightElements();\n // }\n\n // Make it available globally for both Extension and Playwright\n if (typeof window !== 'undefined') {\n window.ProboLabs = {\n ElementTag,\n highlight,\n unhighlightElements,\n findElements,\n highlightElements,\n getElementInfo\n };\n }\n\n exports.findElements = findElements;\n exports.getElementInfo = getElementInfo;\n exports.highlight = highlight;\n exports.highlightElements = highlightElements;\n exports.unhighlightElements = unhighlightElements;\n\n Object.defineProperty(exports, '__esModule', { value: true });\n\n}));\n//# sourceMappingURL=probolabs.umd.js.map\n";
|
|
1
|
+
const highlighterCode = "(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n typeof define === 'function' && define.amd ? define(['exports'], factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.ProboLabs = {}));\n})(this, (function (exports) { 'use strict';\n\n const ElementTag = {\n CLICKABLE: \"CLICKABLE\", // button, link, toggle switch, checkbox, radio, dropdowns, clickable divs\n FILLABLE: \"FILLABLE\", // input, textarea content_editable, date picker??\n SELECTABLE: \"SELECTABLE\", // select\n NON_INTERACTIVE_ELEMENT: 'NON_INTERACTIVE_ELEMENT',\n };\n\n class ElementInfo {\n constructor(element, index, {tag, type, text, html, xpath, css_selector, bounding_box, iframe_selector}) {\n this.index = index.toString();\n this.tag = tag;\n this.type = type;\n this.text = text;\n this.html = html;\n this.xpath = xpath;\n this.css_selector = css_selector;\n this.bounding_box = bounding_box;\n this.iframe_selector = iframe_selector;\n this.element = element;\n this.depth = -1;\n }\n\n getSelector() {\n return this.xpath ? this.xpath : this.css_selector;\n }\n\n getDepth() {\n if (this.depth >= 0) {\n return this.depth;\n }\n \n this.depth = 0;\n let currentElement = this.element;\n \n while (currentElement.nodeType === Node.ELEMENT_NODE) { \n this.depth++;\n if (currentElement.assignedSlot) {\n currentElement = currentElement.assignedSlot;\n }\n else {\n currentElement = currentElement.parentNode;\n // Check if we're at a shadow root\n if (currentElement && currentElement.nodeType !== Node.ELEMENT_NODE && currentElement.getRootNode() instanceof ShadowRoot) {\n // Get the shadow root's host element\n currentElement = currentElement.getRootNode().host; \n }\n }\n }\n \n return this.depth;\n }\n }\n\n // import { realpath } from \"fs\";\n\n function getAllDocumentElementsIncludingShadow(selectors, root = document) {\n const elements = Array.from(root.querySelectorAll(selectors));\n\n root.querySelectorAll('*').forEach(el => {\n if (el.shadowRoot) {\n elements.push(...getAllDocumentElementsIncludingShadow(selectors, el.shadowRoot));\n }\n });\n return elements;\n }\n\n function getAllFrames(root = document) {\n const result = [root];\n const frames = getAllDocumentElementsIncludingShadow('frame, iframe', root); \n frames.forEach(frame => {\n try {\n const frameDocument = frame.contentDocument || frame.contentWindow.document;\n if (frameDocument) {\n result.push(frameDocument);\n }\n } catch (e) {\n // Skip cross-origin frames\n console.warn('Could not access frame content:', e.message);\n }\n });\n\n return result;\n }\n\n function getAllElementsIncludingShadow(selectors, root = document) {\n const elements = [];\n\n getAllFrames(root).forEach(doc => {\n elements.push(...getAllDocumentElementsIncludingShadow(selectors, doc));\n });\n\n return elements;\n }\n\n /**\n * Deeply searches through DOM trees including Shadow DOM and frames/iframes\n * @param {string} selector - CSS selector to search for\n * @param {Document|Element} [root=document] - Starting point for the search\n * @param {Object} [options] - Search options\n * @param {boolean} [options.searchShadow=true] - Whether to search Shadow DOM\n * @param {boolean} [options.searchFrames=true] - Whether to search frames/iframes\n * @returns {Element[]} Array of found elements\n \n function getAllElementsIncludingShadow(selector, root = document, options = {}) {\n const {\n searchShadow = true,\n searchFrames = true\n } = options;\n\n const results = new Set();\n \n // Helper to check if an element is valid and not yet found\n const addIfValid = (element) => {\n if (element && !results.has(element)) {\n results.add(element);\n }\n };\n\n // Helper to process a single document or element\n function processNode(node) {\n // Search regular DOM\n node.querySelectorAll(selector).forEach(addIfValid);\n\n if (searchShadow) {\n // Search all shadow roots\n const treeWalker = document.createTreeWalker(\n node,\n NodeFilter.SHOW_ELEMENT,\n {\n acceptNode: (element) => {\n return element.shadowRoot ? \n NodeFilter.FILTER_ACCEPT : \n NodeFilter.FILTER_SKIP;\n }\n }\n );\n\n while (treeWalker.nextNode()) {\n const element = treeWalker.currentNode;\n if (element.shadowRoot) {\n // Search within shadow root\n element.shadowRoot.querySelectorAll(selector).forEach(addIfValid);\n // Recursively process the shadow root for nested shadow DOMs\n processNode(element.shadowRoot);\n }\n }\n }\n\n if (searchFrames) {\n // Search frames and iframes\n const frames = node.querySelectorAll('frame, iframe');\n frames.forEach(frame => {\n try {\n const frameDocument = frame.contentDocument;\n if (frameDocument) {\n processNode(frameDocument);\n }\n } catch (e) {\n // Skip cross-origin frames\n console.warn('Could not access frame content:', e.message);\n }\n });\n }\n }\n\n // Start processing from the root\n processNode(root);\n\n return Array.from(results);\n }\n */\n // <div x=1 y=2 role='combobox'> </div>\n function findDropdowns() {\n const dropdowns = [];\n \n // Native select elements\n dropdowns.push(...getAllElementsIncludingShadow('select'));\n \n // Elements with dropdown roles that don't have <input>..</input>\n const roleElements = getAllElementsIncludingShadow('[role=\"combobox\"], [role=\"listbox\"], [role=\"dropdown\"], [role=\"option\"], [role=\"menu\"], [role=\"menuitem\"]').filter(el => {\n return el.tagName.toLowerCase() !== 'input' || ![\"button\", \"checkbox\", \"radio\"].includes(el.getAttribute(\"type\"));\n });\n dropdowns.push(...roleElements);\n \n // Common dropdown class patterns\n const dropdownPattern = /.*(dropdown|select|combobox|menu).*/i;\n const elements = getAllElementsIncludingShadow('*');\n const dropdownClasses = Array.from(elements).filter(el => {\n const hasDropdownClass = dropdownPattern.test(el.className);\n const validTag = ['li', 'ul', 'span', 'div', 'p', 'a', 'button'].includes(el.tagName.toLowerCase());\n const style = window.getComputedStyle(el); \n const result = hasDropdownClass && validTag && (style.cursor === 'pointer' || el.tagName.toLowerCase() === 'a' || el.tagName.toLowerCase() === 'button');\n return result;\n });\n \n dropdowns.push(...dropdownClasses);\n \n // Elements with aria-haspopup attribute\n dropdowns.push(...getAllElementsIncludingShadow('[aria-haspopup=\"true\"], [aria-haspopup=\"listbox\"], [aria-haspopup=\"menu\"]'));\n\n // Improve navigation element detection\n // Semantic nav elements with list items\n dropdowns.push(...getAllElementsIncludingShadow('nav ul li, nav ol li'));\n \n // Navigation elements in common design patterns\n dropdowns.push(...getAllElementsIncludingShadow('header a, .header a, .nav a, .navigation a, .menu a, .sidebar a, aside a'));\n \n // Elements in primary navigation areas with common attributes\n dropdowns.push(...getAllElementsIncludingShadow('[role=\"navigation\"] a, [aria-label*=\"navigation\"] a, [aria-label*=\"menu\"] a'));\n\n return dropdowns;\n }\n\n function findClickables() {\n const clickables = [];\n \n const checkboxPattern = /checkbox/i;\n // Collect all clickable elements first\n const nativeLinks = [...getAllElementsIncludingShadow('a[href]')];\n const nativeButtons = [...getAllElementsIncludingShadow('button')];\n const inputButtons = [...getAllElementsIncludingShadow('input[type=\"button\"], input[type=\"submit\"], input[type=\"reset\"]')];\n const roleButtons = [...getAllElementsIncludingShadow('[role=\"button\"]')];\n // const tabbable = [...getAllElementsIncludingShadow('[tabindex=\"0\"]')];\n const clickHandlers = [...getAllElementsIncludingShadow('[onclick]')];\n const dropdowns = findDropdowns();\n const nativeCheckboxes = [...getAllElementsIncludingShadow('input[type=\"checkbox\"]')]; \n const fauxCheckboxes = getAllElementsIncludingShadow('*').filter(el => {\n if (checkboxPattern.test(el.className)) {\n const realCheckboxes = getAllElementsIncludingShadow('input[type=\"checkbox\"]', el);\n if (realCheckboxes.length === 1) {\n const boundingRect = realCheckboxes[0].getBoundingClientRect();\n return boundingRect.width <= 1 && boundingRect.height <= 1 \n }\n }\n return false;\n });\n const nativeRadios = [...getAllElementsIncludingShadow('input[type=\"radio\"]')];\n const toggles = findToggles();\n const pointerElements = findElementsWithPointer();\n // Add all elements at once\n clickables.push(\n ...nativeLinks,\n ...nativeButtons,\n ...inputButtons,\n ...roleButtons,\n // ...tabbable,\n ...clickHandlers,\n ...dropdowns,\n ...nativeCheckboxes,\n ...fauxCheckboxes,\n ...nativeRadios,\n ...toggles,\n ...pointerElements\n );\n\n // Only uniquify once at the end\n return clickables; // Let findElements handle the uniquification\n }\n\n function findToggles() {\n const toggles = [];\n const checkboxes = getAllElementsIncludingShadow('input[type=\"checkbox\"]');\n const togglePattern = /switch|toggle|slider/i;\n\n checkboxes.forEach(checkbox => {\n let isToggle = false;\n\n // Check the checkbox itself\n if (togglePattern.test(checkbox.className) || togglePattern.test(checkbox.getAttribute('role') || '')) {\n isToggle = true;\n }\n\n // Check parent elements (up to 3 levels)\n if (!isToggle) {\n let element = checkbox;\n for (let i = 0; i < 3; i++) {\n const parent = element.parentElement;\n if (!parent) break;\n\n const className = parent.className || '';\n const role = parent.getAttribute('role') || '';\n\n if (togglePattern.test(className) || togglePattern.test(role)) {\n isToggle = true;\n break;\n }\n element = parent;\n }\n }\n\n // Check next sibling\n if (!isToggle) {\n const nextSibling = checkbox.nextElementSibling;\n if (nextSibling) {\n const className = nextSibling.className || '';\n const role = nextSibling.getAttribute('role') || '';\n if (togglePattern.test(className) || togglePattern.test(role)) {\n isToggle = true;\n }\n }\n }\n\n if (isToggle) {\n toggles.push(checkbox);\n }\n });\n\n return toggles;\n }\n\n function findNonInteractiveElements() {\n // Get all elements in the document\n const all = Array.from(getAllElementsIncludingShadow('*'));\n \n // Filter elements based on Python implementation rules\n return all.filter(element => {\n if (!element.firstElementChild) {\n const tag = element.tagName.toLowerCase(); \n if (!['select', 'button', 'a'].includes(tag)) {\n const validTags = ['p', 'span', 'div', 'input', 'textarea'].includes(tag) || /^h\\d$/.test(tag) || /text/.test(tag);\n const boundingRect = element.getBoundingClientRect();\n return validTags && boundingRect.height > 1 && boundingRect.width > 1;\n }\n }\n return false;\n });\n }\n\n\n\n // export function findNonInteractiveElements() {\n // const all = [];\n // try {\n // const elements = getAllElementsIncludingShadow('*');\n // all.push(...elements);\n // } catch (e) {\n // console.warn('Error getting elements:', e);\n // }\n \n // console.debug('Total elements found:', all.length);\n \n // return all.filter(element => {\n // try {\n // const tag = element.tagName.toLowerCase(); \n\n // // Special handling for input elements\n // if (tag === 'input' || tag === 'textarea') {\n // const boundingRect = element.getBoundingClientRect();\n // const value = element.value || '';\n // const placeholder = element.placeholder || '';\n // return boundingRect.height > 1 && \n // boundingRect.width > 1 && \n // (value.trim() !== '' || placeholder.trim() !== '');\n // }\n\n \n // // Check if it's a valid tag for text content\n // const validTags = ['p', 'span', 'div', 'label', 'th', 'td', 'li', 'button', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'a', 'select'].includes(tag) || \n // /^h\\d$/.test(tag) || \n // /text/.test(tag);\n\n // const boundingRect = element.getBoundingClientRect();\n\n // // Get direct text content, excluding child element text\n // let directText = '';\n // for (const node of element.childNodes) {\n // // Only include text nodes (nodeType 3)\n // if (node.nodeType === 3) {\n // directText += node.textContent || '';\n // }\n // }\n \n // // If no direct text and it's a table cell or heading, check label content\n // if (!directText.trim() && (tag === 'th' || tag === 'td' || tag === 'h1')) {\n // const labels = element.getElementsByTagName('label');\n // for (const label of labels) {\n // directText += label.textContent || '';\n // }\n // }\n\n // // If still no text and it's a heading, get all text content\n // if (!directText.trim() && tag === 'h1') {\n // directText = element.textContent || '';\n // }\n\n // directText = directText.trim();\n\n // // Debug logging\n // if (directText) {\n // console.debugg('Text element found:', {\n // tag,\n // text: directText,\n // dimensions: boundingRect,\n // element\n // });\n // }\n\n // return validTags && \n // boundingRect.height > 1 && \n // boundingRect.width > 1 && \n // directText !== '';\n \n // } catch (e) {\n // console.warn('Error processing element:', e);\n // return false;\n // }\n // });\n // }\n\n\n\n\n\n function findElementsWithPointer() {\n const elements = [];\n const allElements = getAllElementsIncludingShadow('*');\n \n console.log('Checking elements with pointer style...');\n \n allElements.forEach(element => {\n // Skip SVG elements for now\n if (element instanceof SVGElement || element.tagName.toLowerCase() === 'svg') {\n return;\n }\n \n const style = window.getComputedStyle(element);\n if (style.cursor === 'pointer') {\n elements.push(element);\n }\n });\n \n console.log(`Found ${elements.length} elements with pointer cursor`);\n return elements;\n }\n\n function findCheckables() {\n const elements = [];\n\n elements.push(...getAllElementsIncludingShadow('input[type=\"checkbox\"]'));\n elements.push(...getAllElementsIncludingShadow('input[type=\"radio\"]'));\n const all_elements = getAllElementsIncludingShadow('label');\n const radioClasses = Array.from(all_elements).filter(el => {\n return /.*radio.*/i.test(el.className); \n });\n elements.push(...radioClasses);\n return elements;\n }\n\n function findFillables() {\n const elements = [];\n\n const inputs = [...getAllElementsIncludingShadow('input:not([type=\"radio\"]):not([type=\"checkbox\"])')];\n console.log('Found inputs:', inputs.length, inputs);\n elements.push(...inputs);\n \n const textareas = [...getAllElementsIncludingShadow('textarea')];\n console.log('Found textareas:', textareas.length);\n elements.push(...textareas);\n \n const editables = [...getAllElementsIncludingShadow('[contenteditable=\"true\"]')];\n console.log('Found editables:', editables.length);\n elements.push(...editables);\n\n return elements;\n }\n\n // Helper function to check if element is a form control\n function isFormControl(elementInfo) {\n return /^(input|select|textarea|button|label)$/i.test(elementInfo.tag);\n }\n\n const isDropdownItem = (elementInfo) => {\n const dropdownPatterns = [\n /dropdown[-_]?item/i, // matches: dropdown-item, dropdownitem, dropdown_item\n /menu[-_]?item/i, // matches: menu-item, menuitem, menu_item\n /dropdown[-_]?link/i, // matches: dropdown-link, dropdownlink, dropdown_link\n /list[-_]?item/i, // matches: list-item, listitem, list_item\n /select[-_]?item/i, // matches: select-item, selectitem, select_item \n ];\n\n const rolePatterns = [\n /menu[-_]?item/i, // matches: menuitem, menu-item\n /option/i, // matches: option\n /list[-_]?item/i, // matches: listitem, list-item\n /tree[-_]?item/i // matches: treeitem, tree-item\n ];\n\n const hasMatchingClass = elementInfo.element.className && \n dropdownPatterns.some(pattern => \n pattern.test(elementInfo.element.className)\n );\n\n const hasMatchingRole = elementInfo.element.getAttribute('role') && \n rolePatterns.some(pattern => \n pattern.test(elementInfo.element.getAttribute('role'))\n );\n\n return hasMatchingClass || hasMatchingRole;\n };\n\n /**\n * Finds the first element matching a CSS selector, traversing Shadow DOM if necessary\n * @param {string} selector - CSS selector to search for\n * @param {Element} [root=document] - Root element to start searching from\n * @returns {Element|null} - The first matching element or null if not found\n */\n function querySelectorShadow(selector, root = document) {\n // First try to find in light DOM\n let element = root.querySelector(selector);\n if (element) return element;\n \n // Get all elements with shadow root\n const shadowElements = Array.from(root.querySelectorAll('*'))\n .filter(el => el.shadowRoot);\n \n // Search through each shadow root until we find a match\n for (const el of shadowElements) {\n element = querySelectorShadow(selector, el.shadowRoot);\n if (element) return element;\n }\n \n return null;\n }\n\n const getElementByXPathOrCssSelector = (element_info) => {\n let element;\n\n console.log('getElementByXPathOrCssSelector:', element_info);\n // if (element_info.xpath) { //try xpath if exists\n // element = document.evaluate(\n // element_info.xpath, \n // document, \n // null, \n // XPathResult.FIRST_ORDERED_NODE_TYPE, \n // null\n // ).singleNodeValue;\n \n // if (!element) {\n // console.warn('Failed to find element with xpath:', element_info.xpath);\n // }\n // }\n // else { //try CSS selector\n if (element_info.iframe_selector) {\n console.log('elementInfo with iframe: ', element_info);\n const frames = getAllDocumentElementsIncludingShadow('iframe');\n \n // Iterate over all frames and compare their CSS selectors\n for (const frame of frames) {\n const cssSelector = generateCssPath(frame);\n if (cssSelector === element_info.iframe_selector) {\n const frameDocument = frame.contentDocument || frame.contentWindow.document;\n element = querySelectorShadow(element_info.css_selector, frameDocument);\n console.log('found element ', element);\n break;\n } \n } }\n else\n element = querySelectorShadow(element_info.css_selector);\n // console.log('found element by CSS elector: ', element);\n if (!element) {\n console.warn('Failed to find element with CSS selector:', element_info.css_selector);\n }\n // }\n\n return element;\n };\n\n function generateXPath(element) {\n if (!element || element.getRootNode() instanceof ShadowRoot) return '';\n \n // If element has an id, use that (it's unique and shorter)\n if (element.id) {\n return `//*[@id=\"${element.id}\"]`;\n }\n \n const parts = [];\n let current = element;\n \n while (current && current.nodeType === Node.ELEMENT_NODE) {\n let index = 1;\n let sibling = current.previousSibling;\n \n while (sibling) {\n if (sibling.nodeType === Node.ELEMENT_NODE && sibling.tagName === current.tagName) {\n index++;\n }\n sibling = sibling.previousSibling;\n }\n \n const tagName = current.tagName.toLowerCase();\n parts.unshift(`${tagName}[${index}]`);\n current = current.parentNode;\n }\n \n return '/' + parts.join('/');\n }\n\n function isDecendent(parent, child) {\n let element = child;\n while (element.nodeType === Node.ELEMENT_NODE) { \n \n if (element.assignedSlot) {\n element = element.assignedSlot;\n }\n else {\n element = element.parentNode;\n // Check if we're at a shadow root\n if (element && element.nodeType !== Node.ELEMENT_NODE && element.getRootNode() instanceof ShadowRoot) {\n // Get the shadow root's host element\n element = element.getRootNode().host; \n }\n }\n if (element === parent)\n return true;\n }\n return false;\n }\n\n function generateCssPath(element) {\n if (!element) {\n console.error('ERROR: No element provided to generateCssPath returning empty string');\n return '';\n }\n const path = [];\n // console.group('Generating CSS path for:', element);\n while (element && element.nodeType === Node.ELEMENT_NODE) { \n let selector = element.nodeName.toLowerCase();\n // console.log('Element:', selector, element);\n \n // if (element.id) {\n // //escape special characters\n // const normalized_id = element.id.replace(/[:;.#()[\\]!@$%^&*]/g, '\\\\$&');\n // selector = `#${normalized_id}`;\n // path.unshift(selector);\n // break;\n // } \n \n let sibling = element;\n let nth = 1;\n while (sibling = sibling.previousElementSibling) {\n if (sibling.nodeName.toLowerCase() === selector) nth++;\n }\n sibling = element;\n while (sibling = sibling.nextElementSibling) {\n if (sibling.nodeName.toLowerCase() === selector) {\n break;\n }\n }\n selector += `:nth-of-type(${nth})`;\n \n \n path.unshift(selector);\n //console.log(` Current path: ${path.join(' > ')}`);\n\n if (element.assignedSlot) {\n element = element.assignedSlot;\n // console.log(' Moving to assigned slot');\n }\n else {\n element = element.parentNode;\n // console.log(' Moving to parent:', element);\n\n // Check if we're at a shadow root\n if (element && element.nodeType !== Node.ELEMENT_NODE && element.getRootNode() instanceof ShadowRoot) {\n console.log(' Found shadow root, moving to host');\n // Get the shadow root's host element\n element = element.getRootNode().host; \n }\n }\n }\n \n // console.log('Final selector:', path.join(' > '));\n // console.groupEnd();\n return path.join(' > ');\n }\n\n\n function cleanHTML(rawHTML) {\n const parser = new DOMParser();\n const doc = parser.parseFromString(rawHTML, \"text/html\");\n\n function cleanElement(element) {\n const allowedAttributes = new Set([\n \"role\",\n \"type\",\n \"class\",\n \"href\",\n \"alt\",\n \"title\",\n \"readonly\",\n \"checked\",\n \"enabled\",\n \"disabled\",\n ]);\n\n [...element.attributes].forEach(attr => {\n const name = attr.name.toLowerCase();\n const value = attr.value;\n\n const isTestAttribute = /^(testid|test-id|data-test-id)$/.test(name);\n const isDataAttribute = name.startsWith(\"data-\") && value;\n const isBooleanAttribute = [\"readonly\", \"checked\", \"enabled\", \"disabled\"].includes(name);\n\n if (!allowedAttributes.has(name) && !isDataAttribute && !isTestAttribute && !isBooleanAttribute) {\n element.removeAttribute(name);\n }\n });\n\n // Handle SVG content - more aggressive replacement\n if (element.tagName.toLowerCase() === \"svg\") {\n // Remove all attributes except class and role\n [...element.attributes].forEach(attr => {\n const name = attr.name.toLowerCase();\n if (name !== \"class\" && name !== \"role\") {\n element.removeAttribute(name);\n }\n });\n element.innerHTML = \"CONTENT REMOVED\";\n } else {\n // Recursively clean child elements\n Array.from(element.children).forEach(cleanElement);\n }\n\n // Only remove empty elements that aren't semantic or icon elements\n const keepEmptyElements = ['i', 'span', 'svg', 'button', 'input'];\n if (!keepEmptyElements.includes(element.tagName.toLowerCase()) && \n !element.children.length && \n !element.textContent.trim()) {\n element.remove();\n }\n }\n\n // Process all elements in the document body\n Array.from(doc.body.children).forEach(cleanElement);\n return doc.body.innerHTML;\n }\n\n function getContainingIframe(element) {\n // If not in an iframe, return null\n if (element.ownerDocument.defaultView === window.top) {\n return null;\n }\n \n // Try to find the iframe in the parent document that contains our element\n try {\n const parentDocument = element.ownerDocument.defaultView.parent.document;\n const iframes = parentDocument.querySelectorAll('iframe');\n \n for (const iframe of iframes) {\n if (iframe.contentWindow === element.ownerDocument.defaultView) {\n return iframe;\n }\n }\n } catch (e) {\n // Cross-origin restriction\n return \"Cross-origin iframe - cannot access details\";\n }\n \n return null;\n }\n\n function getElementInfo(element, index) {\n\n const xpath = generateXPath(element);\n const css_selector = generateCssPath(element);\n\n const iframe = getContainingIframe(element);\n const iframe_selector = iframe ? generateCssPath(iframe) : \"\";\n\n // Return element info with pre-calculated values\n return new ElementInfo(element, index, {\n tag: element.tagName.toLowerCase(),\n type: element.type || '',\n text: element.innerText || element.placeholder || '', //getTextContent(element),\n html: cleanHTML(element.outerHTML),\n xpath: xpath,\n css_selector: css_selector,\n bounding_box: element.getBoundingClientRect(),\n iframe_selector: iframe_selector\n });\n }\n\n\n\n\n const filterZeroDimensions = (elementInfo) => {\n const rect = elementInfo.bounding_box;\n //single pixel elements are typically faux controls and should be filtered too\n const hasSize = rect.width > 1 && rect.height > 1;\n const style = window.getComputedStyle(elementInfo.element);\n const isVisible = style.display !== 'none' && style.visibility !== 'hidden';\n \n if (!hasSize || !isVisible) {\n // if (elementInfo.element.isConnected) {\n // console.log('Filtered out invisible/zero-size element:', {\n // tag: elementInfo.tag,\n // xpath: elementInfo.xpath,\n // element: elementInfo.element,\n // hasSize,\n // isVisible,\n // dimensions: rect\n // });\n // }\n return false;\n }\n return true;\n };\n\n\n\n function uniquifyElements(elements) {\n const seen = new Set();\n\n console.log(`Starting uniquification with ${elements.length} elements`);\n\n // Filter out testing infrastructure elements first\n const filteredInfrastructure = elements.filter(element_info => {\n // Skip the highlight-overlay element completely - it's part of the testing infrastructure\n if (element_info.element.id === 'highlight-overlay' || \n (element_info.css_selector && element_info.css_selector.includes('#highlight-overlay'))) {\n console.log('Filtered out testing infrastructure element:', element_info.css_selector);\n return false;\n }\n \n // Filter out UI framework container/manager elements\n const el = element_info.element;\n // UI framework container checks - generic detection for any framework\n if ((el.getAttribute('data-rendered-by') || \n el.getAttribute('data-reactroot') || \n el.getAttribute('ng-version') || \n el.getAttribute('data-component-id') ||\n el.getAttribute('data-root') ||\n el.getAttribute('data-framework')) && \n (el.className && \n typeof el.className === 'string' && \n (el.className.includes('Container') || \n el.className.includes('container') || \n el.className.includes('Manager') || \n el.className.includes('manager')))) {\n console.log('Filtered out UI framework container element:', element_info.css_selector);\n return false;\n }\n \n // Direct filter for framework container elements that shouldn't be interactive\n // Consolidating multiple container detection patterns into one efficient check\n const isFullViewport = element_info.bounding_box && \n element_info.bounding_box.x <= 5 && \n element_info.bounding_box.y <= 5 && \n element_info.bounding_box.width >= (window.innerWidth * 0.95) && \n element_info.bounding_box.height >= (window.innerHeight * 0.95);\n \n // Empty content check\n const isEmpty = !el.innerText || el.innerText.trim() === '';\n \n // Check if it's a framework container element\n if (element_info.element.tagName === 'DIV' && \n isFullViewport && \n isEmpty && \n (\n // Pattern matching for root containers\n (element_info.xpath && \n (element_info.xpath.match(/^\\/html\\[\\d+\\]\\/body\\[\\d+\\]\\/div\\[\\d+\\]\\/div\\[\\d+\\]$/) || \n element_info.xpath.match(/^\\/\\/\\*\\[@id='[^']+'\\]\\/div\\[\\d+\\]$/))) ||\n \n // Simple DOM structure\n (element_info.css_selector.split(' > ').length <= 4 && element_info.depth <= 5) ||\n \n // Empty or container-like classes\n (!el.className || el.className === '' || \n (typeof el.className === 'string' && \n (el.className.includes('overlay') || \n el.className.includes('container') || \n el.className.includes('wrapper'))))\n )) {\n console.log('Filtered out framework container element:', element_info.css_selector);\n return false;\n }\n \n return true;\n });\n\n // First filter out elements with zero dimensions\n const nonZeroElements = filteredInfrastructure.filter(filterZeroDimensions);\n // sort by CSS selector depth so parents are processed first\n nonZeroElements.sort((a, b) => a.getDepth() - b.getDepth());\n console.log(`After dimension filtering: ${nonZeroElements.length} elements remain (${elements.length - nonZeroElements.length} removed)`);\n \n const filteredByParent = nonZeroElements.filter(element_info => {\n\n const parent = findClosestParent(seen, element_info);\n const keep = parent == null || shouldKeepNestedElement(element_info, parent);\n // console.log(\"node \", element_info.index, \": keep=\", keep, \" parent=\", parent);\n // if (!keep && !element_info.xpath) {\n // console.log(\"Filtered out element \", element_info,\" because it's a nested element of \", parent);\n // }\n if (keep)\n seen.add(element_info.css_selector);\n\n return keep;\n });\n\n console.log(`After parent/child filtering: ${filteredByParent.length} elements remain (${nonZeroElements.length - filteredByParent.length} removed)`);\n\n // Final overlap filtering\n const filteredResults = filteredByParent.filter(element => {\n\n // Look for any element that came BEFORE this one in the array\n const hasEarlierOverlap = filteredByParent.some(other => {\n // Only check elements that came before (lower index)\n if (filteredByParent.indexOf(other) >= filteredByParent.indexOf(element)) {\n return false;\n }\n \n const isOverlapping = areElementsOverlapping(element, other); \n return isOverlapping;\n }); \n\n // Keep element if it has no earlier overlapping elements\n return !hasEarlierOverlap;\n });\n \n \n \n // Check for overlay removal\n console.log(`After filtering: ${filteredResults.length} (${filteredByParent.length - filteredResults.length} removed by overlap)`);\n \n const nonOverlaidElements = filteredResults.filter(element => {\n return !isOverlaid(element);\n });\n\n console.log(`Final elements after overlay removal: ${nonOverlaidElements.length} (${filteredResults.length - nonOverlaidElements.length} removed)`);\n \n return nonOverlaidElements;\n\n }\n\n\n\n const areElementsOverlapping = (element1, element2) => {\n if (element1.css_selector === element2.css_selector) {\n return true;\n }\n \n const box1 = element1.bounding_box;\n const box2 = element2.bounding_box;\n \n return box1.x === box2.x &&\n box1.y === box2.y &&\n box1.width === box2.width &&\n box1.height === box2.height;\n // element1.text === element2.text &&\n // element2.tag === 'a';\n };\n\n function findClosestParent(seen, element_info) { \n // //Use element child/parent queries\n // let parent = element_info.element.parentNode;\n // if (parent.getRootNode() instanceof ShadowRoot) {\n // // Get the shadow root's host element\n // parent = parent.getRootNode().host; \n // }\n\n // while (parent.nodeType === Node.ELEMENT_NODE) { \n // const css_selector = generateCssPath(parent);\n // if (seen.has(css_selector)) {\n // console.log(\"element \", element_info, \" closest parent is \", parent)\n // return parent; \n // }\n // parent = parent.parentNode;\n // if (parent.getRootNode() instanceof ShadowRoot) {\n // // Get the shadow root's host element\n // parent = parent.getRootNode().host; \n // }\n // }\n\n // Split the xpath into segments\n const segments = element_info.css_selector.split(' > ');\n \n // Try increasingly shorter paths until we find one in the seen set\n for (let i = segments.length - 1; i > 0; i--) {\n const parentPath = segments.slice(0, i).join(' > ');\n if (seen.has(parentPath)) {\n return parentPath;\n }\n }\n\n return null;\n }\n\n function shouldKeepNestedElement(elementInfo, parentPath) {\n let result = false;\n const parentSegments = parentPath.split(' > ');\n\n const isParentLink = /^a(:nth-of-type\\(\\d+\\))?$/.test(parentSegments[parentSegments.length - 1]);\n if (isParentLink) {\n return false; \n }\n // If this is a checkbox/radio input\n if (elementInfo.tag === 'input' && \n (elementInfo.type === 'checkbox' || elementInfo.type === 'radio')) {\n \n // Check if parent is a label by looking at the parent xpath's last segment\n \n const isParentLabel = /^label(:nth-of-type\\(\\d+\\))?$/.test(parentSegments[parentSegments.length - 1]);\n \n // If parent is a label, don't keep the input (we'll keep the label instead)\n if (isParentLabel) {\n return false;\n }\n }\n \n // Keep all other form controls and dropdown items\n if (isFormControl(elementInfo) || isDropdownItem(elementInfo)) {\n result = true;\n }\n\n if(isTableCell(elementInfo)) {\n result = true;\n }\n \n \n // console.log(`shouldKeepNestedElement: ${elementInfo.tag} ${elementInfo.text} ${elementInfo.xpath} -> ${parentXPath} -> ${result}`);\n return result;\n }\n\n\n function isTableCell(elementInfo) {\n const element = elementInfo.element;\n if(!element || !(element instanceof HTMLElement)) {\n return false;\n }\n const validTags = new Set(['td', 'th']);\n const validRoles = new Set(['cell', 'gridcell', 'columnheader', 'rowheader']);\n \n const tag = element.tagName.toLowerCase();\n const role = element.getAttribute('role')?.toLowerCase();\n\n if (validTags.has(tag) || (role && validRoles.has(role))) {\n return true;\n }\n return false;\n \n }\n\n function isOverlaid(elementInfo) {\n const element = elementInfo.element;\n const boundingRect = elementInfo.bounding_box;\n \n\n \n \n // Create a diagnostic logging function that only logs when needed\n const diagnosticLog = (...args) => {\n { // set to true for debugging\n console.log('[OVERLAY-DEBUG]', ...args);\n }\n };\n\n // Special handling for tooltips\n if (elementInfo.element.className && typeof elementInfo.element.className === 'string' && \n elementInfo.element.className.includes('tooltip')) {\n diagnosticLog('Element is a tooltip, not considering it overlaid');\n return false;\n }\n \n \n \n // Get element at the center point to check if it's covered by a popup/modal\n const middleX = boundingRect.x + boundingRect.width/2;\n const middleY = boundingRect.y + boundingRect.height/2;\n const elementAtMiddle = element.ownerDocument.elementFromPoint(middleX, middleY);\n \n if (elementAtMiddle && \n elementAtMiddle !== element && \n !isDecendent(element, elementAtMiddle) && \n !isDecendent(elementAtMiddle, element)) {\n\n // Add detailed logging for overlaid elements with formatted output\n console.log('[OVERLAY-DEBUG]', JSON.stringify({\n originalElement: {\n selector: elementInfo.css_selector,\n rect: {\n x: boundingRect.x,\n y: boundingRect.y,\n width: boundingRect.width,\n height: boundingRect.height,\n top: boundingRect.top,\n right: boundingRect.right,\n bottom: boundingRect.bottom,\n left: boundingRect.left\n }\n },\n overlayingElement: {\n selector: generateCssPath(elementAtMiddle),\n rect: {\n x: elementAtMiddle.getBoundingClientRect().x,\n y: elementAtMiddle.getBoundingClientRect().y,\n width: elementAtMiddle.getBoundingClientRect().width,\n height: elementAtMiddle.getBoundingClientRect().height,\n top: elementAtMiddle.getBoundingClientRect().top,\n right: elementAtMiddle.getBoundingClientRect().right,\n bottom: elementAtMiddle.getBoundingClientRect().bottom,\n left: elementAtMiddle.getBoundingClientRect().left\n }\n },\n middlePoint: { x: middleX, y: middleY }\n }, null, 2));\n\n console.log('[OVERLAY-REMOVED]', elementInfo.css_selector, elementInfo.bounding_box, 'elementAtMiddle:', elementAtMiddle, 'elementAtMiddle selector:', generateCssPath(elementAtMiddle));\n return true;\n }\n \n // Check specifically if the element at middle is a popup/modal\n // if (elementAtMiddle && isElementOrAncestorPopup(elementAtMiddle)) {\n // diagnosticLog('Element at middle is a popup/modal, element IS overlaid');\n // return true; // It's under a popup, so it is overlaid\n // }\n return false;\n // }\n // return false;\n }\n\n const highlight = {\n execute: async function(elementTypes, handleScroll=false) {\n const elements = await findElements(elementTypes);\n highlightElements(elements, handleScroll);\n return elements;\n },\n\n unexecute: function(handleScroll=false) {\n unhighlightElements(handleScroll);\n },\n\n generateJSON: async function() {\n const json = {};\n\n // Capture viewport dimensions\n const viewportData = {\n width: window.innerWidth,\n height: window.innerHeight,\n documentWidth: document.documentElement.clientWidth,\n documentHeight: document.documentElement.clientHeight,\n timestamp: new Date().toISOString()\n };\n\n // Add viewport data to the JSON output\n json.viewport = viewportData;\n\n\n await Promise.all(Object.values(ElementTag).map(async elementType => {\n const elements = await findElements(elementType);\n json[elementType] = elements;\n }));\n\n // Serialize the JSON object\n const jsonString = JSON.stringify(json, null, 4); // Pretty print with 4 spaces\n\n console.log(`JSON: ${jsonString}`);\n return jsonString;\n },\n\n getElementInfo\n };\n\n\n function unhighlightElements(handleScroll=false) {\n const documents = getAllFrames();\n documents.forEach(doc => {\n const overlay = doc.getElementById('highlight-overlay');\n if (overlay) {\n if (handleScroll) {\n // Remove event listeners\n doc.removeEventListener('scroll', overlay.scrollHandler, true);\n doc.removeEventListener('resize', overlay.resizeHandler);\n }\n overlay.remove();\n }\n });\n }\n\n\n\n\n async function findElements(elementTypes, verbose=true) {\n const typesArray = Array.isArray(elementTypes) ? elementTypes : [elementTypes];\n console.log('Starting element search for types:', typesArray);\n\n const elements = [];\n typesArray.forEach(elementType => {\n if (elementType === ElementTag.FILLABLE) {\n elements.push(...findFillables());\n }\n if (elementType === ElementTag.SELECTABLE) {\n elements.push(...findDropdowns());\n }\n if (elementType === ElementTag.CLICKABLE) {\n elements.push(...findClickables());\n elements.push(...findToggles());\n elements.push(...findCheckables());\n }\n if (elementType === ElementTag.NON_INTERACTIVE_ELEMENT) {\n elements.push(...findNonInteractiveElements());\n }\n });\n\n // console.log('Before uniquify:', elements.length);\n const elementsWithInfo = elements.map((element, index) => \n getElementInfo(element, index)\n );\n \n const uniqueElements = uniquifyElements(elementsWithInfo);\n console.log(`Found ${uniqueElements.length} elements:`);\n \n // More comprehensive visibility check\n const visibleElements = uniqueElements.filter(elementInfo => {\n const el = elementInfo.element;\n const style = getComputedStyle(el);\n \n // Check various style properties that affect visibility\n if (style.display === 'none' || \n style.visibility === 'hidden' || \n parseFloat(style.opacity) === 0) {\n return false;\n }\n \n // Check if element has non-zero dimensions\n const rect = el.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) {\n return false;\n }\n \n // Check if element is within viewport\n if (rect.bottom < 0 || \n rect.top > window.innerHeight || \n rect.right < 0 || \n rect.left > window.innerWidth) {\n // Element is outside viewport, but still might be valid \n // if user scrolls to it, so we'll include it\n return true;\n }\n \n return true;\n });\n \n console.log(`Out of which ${visibleElements.length} elements are visible:`);\n if (verbose) {\n visibleElements.forEach(info => {\n console.log(`Element ${info.index}:`, info);\n });\n }\n \n return visibleElements;\n }\n\n // elements is an array of objects with index, xpath\n function highlightElements(elements, handleScroll=false) {\n // console.log('Starting highlight for elements:', elements);\n \n // Create overlay if it doesn't exist and store it in a dictionary\n const documents = getAllFrames(); \n let overlays = {};\n documents.forEach(doc => {\n let overlay = doc.getElementById('highlight-overlay');\n if (!overlay) {\n overlay = doc.createElement('div');\n overlay.id = 'highlight-overlay';\n overlay.style.cssText = `\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n z-index: 2147483647;\n `;\n doc.body.appendChild(overlay);\n }\n overlays[doc.documentURI] = overlay;\n });\n \n\n const updateHighlights = (doc = null) => {\n if (doc) {\n overlays[doc.documentURI].innerHTML = '';\n } else {\n Object.values(overlays).forEach(overlay => { overlay.innerHTML = ''; });\n } \n elements.forEach(elementInfo => {\n // console.log('updateHighlights-Processing elementInfo:', elementInfo);\n let element = elementInfo.element; //getElementByXPathOrCssSelector(elementInfo);\n if (!element) {\n element = getElementByXPathOrCssSelector(elementInfo);\n if (!element)\n return;\n }\n \n //if highlights requested for a specific doc, skip unrelated elements\n if (doc && element.ownerDocument !== doc) {\n console.log(\"skipped element \", element, \" since it doesn't belong to document \", doc);\n return;\n }\n\n const rect = element.getBoundingClientRect();\n // console.log('Element rect:', elementInfo.tag, rect);\n \n if (rect.width === 0 || rect.height === 0) {\n console.warn('Element has zero dimensions:', elementInfo);\n return;\n }\n \n // Create border highlight (red rectangle)\n // use ownerDocument to support iframes/frames\n const highlight = element.ownerDocument.createElement('div');\n highlight.style.cssText = `\n position: fixed;\n left: ${rect.x}px;\n top: ${rect.y}px;\n width: ${rect.width}px;\n height: ${rect.height}px;\n border: 1px solid rgb(255, 0, 0);\n transition: all 0.2s ease-in-out;\n `;\n\n // Create index label container - now positioned to the right and slightly up\n const labelContainer = element.ownerDocument.createElement('div');\n labelContainer.style.cssText = `\n position: absolute;\n right: -10px; /* Offset to the right */\n top: -10px; /* Offset upwards */\n padding: 4px;\n background-color: rgba(255, 255, 0, 0.6);\n display: flex;\n align-items: center;\n justify-content: center;\n `;\n\n const text = element.ownerDocument.createElement('span');\n text.style.cssText = `\n color: rgb(0, 0, 0, 0.8);\n font-family: 'Courier New', Courier, monospace;\n font-size: 12px;\n font-weight: bold;\n line-height: 1;\n `;\n text.textContent = elementInfo.index;\n \n labelContainer.appendChild(text);\n highlight.appendChild(labelContainer); \n overlays[element.ownerDocument.documentURI].appendChild(highlight);\n });\n };\n\n // Initial highlight\n updateHighlights();\n\n if (handleScroll) {\n documents.forEach(doc => {\n // Update highlights on scroll and resize\n console.log('registering scroll and resize handlers for document: ', doc);\n const scrollHandler = () => {\n requestAnimationFrame(() => updateHighlights(doc));\n };\n const resizeHandler = () => {\n updateHighlights(doc);\n };\n doc.addEventListener('scroll', scrollHandler, true);\n doc.addEventListener('resize', resizeHandler);\n // Store event handlers for cleanup\n overlays[doc.documentURI].scrollHandler = scrollHandler;\n overlays[doc.documentURI].resizeHandler = resizeHandler;\n }); \n }\n }\n\n // function unexecute() {\n // unhighlightElements();\n // }\n\n // Make it available globally for both Extension and Playwright\n if (typeof window !== 'undefined') {\n window.ProboLabs = {\n ElementTag,\n highlight,\n unhighlightElements,\n findElements,\n highlightElements,\n getElementInfo\n };\n }\n\n exports.findElements = findElements;\n exports.getElementInfo = getElementInfo;\n exports.highlight = highlight;\n exports.highlightElements = highlightElements;\n exports.unhighlightElements = unhighlightElements;\n\n Object.defineProperty(exports, '__esModule', { value: true });\n\n}));\n//# sourceMappingURL=probolabs.umd.js.map\n";
|
|
2
2
|
const ElementTag = {
|
|
3
3
|
CLICKABLE: "CLICKABLE", // button, link, toggle switch, checkbox, radio, dropdowns, clickable divs
|
|
4
4
|
FILLABLE: "FILLABLE", // input, textarea content_editable, date picker??
|
|
@@ -483,7 +483,7 @@ async function executePlaywrightAction(page, action, value, iframe_selector, ele
|
|
|
483
483
|
* Execute a given Playwright action using native Playwright functions where possible
|
|
484
484
|
*/
|
|
485
485
|
async function executeCachedPlaywrightAction(page, action, value, iframe_selector, element_css_selector) {
|
|
486
|
-
proboLogger.log(`performing Cached Action: ${action} Value: ${value} on locator: ${element_css_selector}`);
|
|
486
|
+
proboLogger.log(`performing Cached Action: ${action} Value: ${value} on iframe: ${iframe_selector} locator: ${element_css_selector}`);
|
|
487
487
|
try {
|
|
488
488
|
let locator = undefined;
|
|
489
489
|
if (iframe_selector)
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../probo-highlighter/src/constants.js","../src/utils.ts","../src/actions.ts","../src/highlight.ts","../../../node_modules/.pnpm/retry@0.13.1/node_modules/retry/lib/retry_operation.js","../../../node_modules/.pnpm/retry@0.13.1/node_modules/retry/lib/retry.js","../../../node_modules/.pnpm/retry@0.13.1/node_modules/retry/index.js","../../../node_modules/.pnpm/is-network-error@1.1.0/node_modules/is-network-error/index.js","../../../node_modules/.pnpm/p-retry@6.2.1/node_modules/p-retry/index.js","../src/api-client.ts","../src/index.ts"],"sourcesContent":["export const ElementTag = {\n CLICKABLE: \"CLICKABLE\", // button, link, toggle switch, checkbox, radio, dropdowns, clickable divs\n FILLABLE: \"FILLABLE\", // input, textarea content_editable, date picker??\n SELECTABLE: \"SELECTABLE\", // select\n NON_INTERACTIVE_ELEMENT: 'NON_INTERACTIVE_ELEMENT',\n};\n\nexport class ElementInfo {\n constructor(element, index, {tag, type, text, html, xpath, css_selector, bounding_box, iframe_selector}) {\n this.index = index.toString();\n this.tag = tag;\n this.type = type;\n this.text = text;\n this.html = html;\n this.xpath = xpath;\n this.css_selector = css_selector;\n this.bounding_box = bounding_box;\n this.iframe_selector = iframe_selector;\n this.element = element;\n this.depth = -1;\n }\n\n getSelector() {\n return this.xpath ? this.xpath : this.css_selector;\n }\n\n getDepth() {\n if (this.depth >= 0) {\n return this.depth;\n }\n \n this.depth = 0;\n let currentElement = this.element;\n \n while (currentElement.nodeType === Node.ELEMENT_NODE) { \n this.depth++;\n if (currentElement.assignedSlot) {\n currentElement = currentElement.assignedSlot;\n }\n else {\n currentElement = currentElement.parentNode;\n // Check if we're at a shadow root\n if (currentElement && currentElement.nodeType !== Node.ELEMENT_NODE && currentElement.getRootNode() instanceof ShadowRoot) {\n // Get the shadow root's host element\n currentElement = currentElement.getRootNode().host; \n }\n }\n }\n \n return this.depth;\n }\n}\n","export enum ProboLogLevel {\n DEBUG = 'DEBUG',\n INFO = 'INFO',\n LOG = 'LOG',\n WARN = 'WARN',\n ERROR = 'ERROR'\n}\n\n// Add a severity map for comparison\nexport const LogLevelSeverity: Record<ProboLogLevel, number> = {\n [ProboLogLevel.DEBUG]: 0,\n [ProboLogLevel.INFO]: 1,\n [ProboLogLevel.LOG]: 2,\n [ProboLogLevel.WARN]: 3,\n [ProboLogLevel.ERROR]: 4,\n};\n\nexport class ProboLogger {\n constructor(\n private prefix: string,\n private logLevel: ProboLogLevel = ProboLogLevel.LOG\n ) {}\n\n setLogLevel(level: ProboLogLevel): void {\n this.logLevel = level;\n console.log(`[${this.prefix}-INFO] Log level set to: ${ProboLogLevel[level]}`);\n }\n\n debug(...args: any[]): void {\n this.msg(ProboLogLevel.DEBUG, ...args);\n }\n\n info(...args: any[]): void {\n this.msg(ProboLogLevel.INFO, ...args);\n }\n\n log(...args: any[]): void {\n this.msg(ProboLogLevel.LOG, ...args);\n }\n\n warn(...args: any[]): void {\n this.msg(ProboLogLevel.WARN, ...args);\n }\n\n error(...args: any[]): void {\n this.msg(ProboLogLevel.ERROR, ...args);\n }\n\n private msg(logLevel: ProboLogLevel, ...args: any[]): void {\n if (LogLevelSeverity[logLevel] >= LogLevelSeverity[this.logLevel]) {\n const now = new Date();\n const timestamp = now.toLocaleString('en-GB', {\n day: '2-digit',\n month: 'short',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n hour12: false\n }).replace(',', '');\n\n // const stack = new Error().stack;\n // const callerLine = stack?.split('\\n')[3];\n // const callerInfo = callerLine?.match(/at\\s+(?:(.+)\\s+\\()?(.+):(\\d+):(\\d+)\\)?/);\n // const [, fnName, file, line] = callerInfo || [];\n // const fileInfo = file ? `${file.split('/').pop()}:${line}` : '';\n // const functionInfo = fnName ? `${fnName}` : '';\n\n console.log(`[${timestamp}] ${logLevel.padEnd(5, ' ')} [${this.prefix}]`, ...args);\n }\n }\n}\n\nexport const proboLogger = new ProboLogger('probolib');\n\nexport interface ElementInfo {\n index: string;\n tag: string;\n type: string;\n text: string;\n html: string;\n xpath: string;\n css_selector: string;\n bounding_box: {\n x: number;\n y: number;\n width: number;\n height: number;\n top: number;\n right: number;\n bottom: number;\n left: number;\n };\n iframe_selector: string;\n element: any;\n depth?: number;\n getSelector(): string;\n getDepth(): number;\n}\n\nexport interface CleanElementInfo {\n index: string;\n tag: string;\n type: string;\n text: string;\n html: string;\n xpath: string;\n css_selector: string;\n iframe_selector: string;\n bounding_box: {\n x: number;\n y: number;\n width: number;\n height: number;\n top: number;\n right: number;\n bottom: number;\n left: number;\n };\n depth: number;\n}\n\nconst elementLogger = new ProboLogger('element-cleaner');\n\nexport function cleanupElementInfo(elementInfo: ElementInfo): CleanElementInfo {\n elementLogger.debug(`Cleaning up element info for ${elementInfo.tag} element at index ${elementInfo.index}`);\n \n const depth = elementInfo.depth ?? elementInfo.getDepth();\n \n const cleanElement = {\n index: elementInfo.index,\n tag: elementInfo.tag,\n type: elementInfo.type,\n text: elementInfo.text,\n html: elementInfo.html,\n xpath: elementInfo.xpath,\n css_selector: elementInfo.css_selector,\n iframe_selector: elementInfo.iframe_selector,\n bounding_box: elementInfo.bounding_box,\n depth: depth\n };\n\n elementLogger.debug(`Cleaned element structure:`, cleanElement);\n return cleanElement;\n}\n\nexport function cleanupInstructionElements(instruction: any): any {\n if (!instruction?.result?.highlighted_elements) {\n elementLogger.debug('No highlighted elements to clean');\n return instruction;\n }\n\n elementLogger.debug(`Cleaning ${instruction.result.highlighted_elements.length} highlighted elements`);\n \n const cleanInstruction = {\n ...instruction,\n result: {\n ...instruction.result,\n highlighted_elements: instruction.result.highlighted_elements.map((element: ElementInfo) => \n cleanupElementInfo(element)\n )\n }\n };\n\n elementLogger.debug('Instruction cleaning completed');\n return cleanInstruction;\n}\n","import { Page, Frame, Locator } from 'playwright';\nimport { proboLogger } from './utils';\n\n// Action constants\nexport const PlaywrightAction = {\n VISIT_BASE_URL: 'VISIT_BASE_URL',\n VISIT_URL: 'VISIT_URL',\n CLICK: 'CLICK',\n FILL_IN: 'FILL_IN',\n SELECT_DROPDOWN: 'SELECT_DROPDOWN',\n SELECT_MULTIPLE_DROPDOWN: 'SELECT_MULTIPLE_DROPDOWN',\n CHECK_CHECKBOX: 'CHECK_CHECKBOX',\n SELECT_RADIO: 'SELECT_RADIO',\n TOGGLE_SWITCH: 'TOGGLE_SWITCH',\n TYPE_KEYS: 'TYPE_KEYS',\n HOVER: 'HOVER',\n VALIDATE_EXACT_VALUE: 'VALIDATE_EXACT_VALUE',\n VALIDATE_CONTAINS_VALUE: 'VALIDATE_CONTAINS_VALUE',\n VALIDATE_URL: 'VALIDATE_URL',\n} as const;\nexport type PlaywrightActionType = typeof PlaywrightAction[keyof typeof PlaywrightAction];\n\nexport const SPECIAL_KEYS = [\n 'Enter', 'Tab', 'Escape', 'Backspace', 'Delete',\n 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown',\n 'Home', 'End', 'PageUp', 'PageDown',\n 'Insert', 'F1', 'F2', 'F3', 'F4', 'F5', 'F6', 'F7', 'F8', 'F9', 'F10', 'F11', 'F12',\n 'Shift', 'Control', 'Alt', 'Meta',\n 'CapsLock', 'NumLock', 'ScrollLock',\n 'Pause', 'PrintScreen', 'ContextMenu',\n 'AudioVolumeUp', 'AudioVolumeDown', 'AudioVolumeMute',\n 'MediaTrackNext', 'MediaTrackPrevious', 'MediaStop', 'MediaPlayPause',\n 'BrowserBack', 'BrowserForward', 'BrowserRefresh', 'BrowserFavorites'\n] as const;\n\n/**\n * Handle potential navigation exactly like Python's handle_potential_navigation\n */\nexport async function handlePotentialNavigation(\n page: Page,\n locator: Locator | null = null,\n value: string | null = null,\n options: {\n initialTimeout?: number;\n navigationTimeout?: number;\n globalTimeout?: number;\n } = {}\n): Promise<boolean> {\n const {\n initialTimeout = 5000,\n navigationTimeout = 7000,\n globalTimeout = 15000,\n } = options;\n\n const startTime = Date.now();\n let navigationCount = 0;\n let lastNavTime: number | null = null;\n\n const onFrameNav = (frame: Frame) => {\n if (frame === page.mainFrame()) {\n navigationCount++;\n lastNavTime = Date.now();\n proboLogger.debug(\n `DEBUG_NAV[${((Date.now() - startTime) / 1000).toFixed(3)}s]: navigation detected (count=${navigationCount})`\n );\n }\n };\n\n proboLogger.debug(`DEBUG_NAV[0.000s]: Starting navigation detection`);\n page.on(\"framenavigated\", onFrameNav);\n\n try {\n if (locator) {\n proboLogger.debug(`DEBUG_NAV: Executing click(${value})`);\n await clickAtPosition(page, locator, value as ClickPosition | null);\n }\n\n // wait for any initial nav to fire\n await page.waitForTimeout(initialTimeout);\n proboLogger.debug(\n `DEBUG_NAV[${((Date.now() - startTime) / 1000).toFixed(3)}s]: After initial wait, count=${navigationCount}`\n );\n\n if (navigationCount > 0) {\n // loop until either per-nav or global timeout\n while (true) {\n const now = Date.now();\n if (\n lastNavTime !== null &&\n now - lastNavTime > navigationTimeout\n ) {\n proboLogger.debug(\n `DEBUG_NAV[${((now - startTime) / 1000).toFixed(3)}s]: per‐navigation timeout reached`\n );\n break;\n }\n if (now - startTime > globalTimeout) {\n proboLogger.debug(\n `DEBUG_NAV[${((now - startTime) / 1000).toFixed(3)}s]: overall timeout reached`\n );\n break;\n }\n await page.waitForTimeout(500);\n }\n\n // now wait for load + idle\n proboLogger.debug(`DEBUG_NAV: waiting for load state`);\n await page.waitForLoadState(\"load\", { timeout: globalTimeout });\n\n proboLogger.debug(`DEBUG_NAV: waiting for networkidle`);\n try {\n // shorter idle‐wait so we don't hang the full globalTimeout here\n await page.waitForLoadState(\"networkidle\", {\n timeout: navigationTimeout,\n });\n } catch {\n proboLogger.debug(\n `DEBUG_NAV: networkidle not reached in ${navigationTimeout}ms, proceeding anyway`\n );\n }\n\n await scrollToBottomRight(page);\n proboLogger.debug(`DEBUG_NAV: done`);\n return true;\n }\n\n proboLogger.debug(`DEBUG_NAV: no navigation detected`);\n return false;\n } finally {\n page.removeListener(\"framenavigated\", onFrameNav);\n proboLogger.debug(`DEBUG_NAV: listener removed`);\n }\n}\n\n\n/**\n * Scroll entire page to bottom-right, triggering lazy-loaded content\n */\nexport async function scrollToBottomRight(page: Page): Promise<void> {\n const startTime = performance.now();\n proboLogger.debug(`Starting scroll to bottom-right`);\n\n let lastHeight = await page.evaluate(() => document.documentElement.scrollHeight);\n let lastWidth = await page.evaluate(() => document.documentElement.scrollWidth);\n\n let smoothingSteps = 0;\n while (true) { \n const initY = await page.evaluate(() => window.scrollY);\n const initX = await page.evaluate(() => window.scrollX);\n const clientHeight = await page.evaluate(() => document.documentElement.clientHeight);\n const maxHeight = await page.evaluate(() => document.documentElement.scrollHeight);\n const clientWidth = await page.evaluate(() => document.documentElement.clientWidth);\n const maxWidth = await page.evaluate(() => document.documentElement.scrollWidth);\n \n let currX = initX;\n while (currX < maxWidth - clientWidth) {\n let currY = initY;\n while (currY < maxHeight - clientHeight) {\n currY += clientHeight;\n await page.evaluate(([x, y]) => window.scrollTo(x, y), [currX, currY]);\n await page.waitForTimeout(50);\n smoothingSteps++;\n }\n currX += clientWidth;\n }\n\n proboLogger.debug(\n `performed ${smoothingSteps} smoothing steps while scrolling`\n );\n\n const newHeight = await page.evaluate(() => document.documentElement.scrollHeight);\n const newWidth = await page.evaluate(() => document.documentElement.scrollWidth);\n if (newHeight === lastHeight && newWidth === lastWidth) break;\n proboLogger.debug(`page dimensions updated, repeating scroll`);\n lastHeight = newHeight;\n lastWidth = newWidth;\n }\n\n if (smoothingSteps > 0) {\n await page.waitForTimeout(200);\n await page.evaluate('window.scrollTo(0, 0)');\n await page.waitForTimeout(50);\n }\n proboLogger.debug(`Scroll completed in ${(performance.now() - startTime).toFixed(3)}ms`);\n}\n\n/**\n * Wait for DOM mutations to settle using MutationObserver logic\n */\nexport async function waitForMutationsToSettle(\n page: Page,\n mutationTimeout: number = 1500,\n initTimeout: number = 2000\n): Promise<boolean> {\n const startTime = Date.now();\n proboLogger.debug(\n `Starting mutation settlement (initTimeout=${initTimeout}, mutationTimeout=${mutationTimeout})`\n );\n\n const result = await page.evaluate(\n async ({ mutationTimeout, initTimeout }) => {\n async function blockUntilStable(\n targetNode: HTMLElement,\n options = { childList: true, subtree: true }\n ) {\n return new Promise<boolean>((resolve) => {\n let initTimerExpired = false;\n let mutationsOccurred = false;\n const observerTimers = new Set<number>();\n\n const initTimer = window.setTimeout(() => {\n initTimerExpired = true;\n if (observerTimers.size === 0) resolve(mutationsOccurred);\n }, initTimeout);\n\n const observer = new MutationObserver(() => {\n mutationsOccurred = true;\n observerTimers.forEach((t) => clearTimeout(t));\n observerTimers.clear();\n const t = window.setTimeout(() => {\n observerTimers.delete(t);\n if (initTimerExpired && observerTimers.size === 0) {\n observer.disconnect();\n resolve(mutationsOccurred);\n }\n }, mutationTimeout);\n observerTimers.add(t);\n });\n\n observer.observe(targetNode, options);\n });\n }\n return blockUntilStable(document.body as HTMLElement);\n },\n { mutationTimeout, initTimeout }\n );\n\n const total = ((Date.now() - startTime) / 1000).toFixed(2);\n proboLogger.debug(\n result\n ? `Mutations settled. Took ${total}s`\n : `No mutations observed. Took ${total}s`\n );\n\n return result;\n}\n\n\n/**\n * Get element text value: allTextContents + innerText fallback\n */\nexport async function getElementValue(\n page: Page,\n locator: Locator\n): Promise<string> {\n const texts = await locator.allTextContents();\n let allText = texts.join('').trim();\n if (!allText) {\n allText = await locator.evaluate((el: HTMLElement) => el.innerText);\n }\n proboLogger.debug(`getElementValue: [${allText}]`);\n return allText;\n}\n\n/**\n * Select dropdown option: native <select>, <option>, child select, or ARIA listbox\n */\nexport async function selectDropdownOption(\n page: Page,\n locator: Locator,\n value: string | string[]\n): Promise<void> { \n const tagName = await locator?.evaluate((el) => el.tagName.toLowerCase());\n const role = await locator?.getAttribute('role');\n\n if (tagName === 'option' || role === 'option') {\n proboLogger.debug('selectDropdownOption: option role detected');\n await locator?.click();\n } else if (tagName === 'select') {\n proboLogger.debug('selectDropdownOption: simple select tag detected');\n try {\n await locator?.selectOption(value as any);\n } catch {\n proboLogger.debug('selectDropdownOption: manual change event fallback');\n const handle = locator ? await locator.elementHandle() : null;\n await page.evaluate(\n ({ h, val }: { h: HTMLElement | SVGElement | null, val: string | string[] }) => {\n const el = h as HTMLSelectElement;\n if (el) {\n el.value = Array.isArray(val) ? val[0] : (val as string);\n el.dispatchEvent(new Event('change', { bubbles: true }));\n }\n },\n { h: handle, val: value }\n );\n }\n } else {\n proboLogger.debug('selectDropdownOption: custom dropdown path');\n let listbox = locator.locator('select');\n let count = await listbox.count();\n if (count > 1) throw new Error(`selectDropdownOption: ambiguous <select> count=${count}`);\n if (count === 1) {\n proboLogger.debug('selectDropdownOption: child <select> found');\n await listbox.selectOption(value as any);\n return;\n }\n await locator.click();\n let container = locator;\n count = 0;\n if (role !== 'listbox') {\n for (let i = 0; i < 7; i++) {\n listbox = container.getByRole('listbox');\n count = await listbox.count();\n if (count >= 1) break;\n proboLogger.debug(`selectDropdownOption: iteration #${i} no listbox found`);\n container = container.locator('xpath=..');\n }\n } else {\n listbox = container;\n count = await listbox.count();\n }\n if (count !== 1) throw new Error(`selectDropdownOption: found ${count} listbox locators`);\n const vals = Array.isArray(value) ? value : [value];\n for (const val of vals) {\n const option = listbox.getByRole('option').getByText(new RegExp(`^${val}$`, 'i'));\n const optCount = await option.count();\n if (optCount !== 1) throw new Error(`selectDropdownOption: ${optCount} options for '${val}'`);\n await option.click();\n }\n }\n}\n\n/**\n * Execute a given Playwright action, mirroring Python's _perform_action\n */\nexport async function executePlaywrightAction(\n page: Page,\n action: PlaywrightActionType,\n value: string,\n iframe_selector: string,\n element_css_selector: string\n): Promise<boolean> {\n proboLogger.info(`performing Action: ${action} Value: ${value}`);\n try {\n \n if (action === PlaywrightAction.VISIT_BASE_URL || action === PlaywrightAction.VISIT_URL) {\n await page.goto(value, { waitUntil: 'load' });\n await handlePotentialNavigation(page, null); \n }\n else {\n let locator = undefined;\n if (iframe_selector)\n locator = page.frameLocator(iframe_selector).locator(element_css_selector);\n else\n locator = page.locator(element_css_selector);\n\n switch (action) { \n case PlaywrightAction.CLICK:\n await handlePotentialNavigation(page, locator, value as ClickPosition | null);\n break;\n\n case PlaywrightAction.FILL_IN:\n // await locator.click();\n await locator.fill(value);\n break;\n\n case PlaywrightAction.TYPE_KEYS:\n // Check if the value contains any special keys\n const specialKey = SPECIAL_KEYS.find(key => value.includes(key));\n if (specialKey) {\n // If it's a single special key, just press it\n if (value === specialKey) {\n await locator?.press(specialKey);\n } else {\n // Handle combinations like 'Control+A' or 'Shift+ArrowRight'\n const parts = value.split('+');\n if (parts.length === 2 && SPECIAL_KEYS.includes(parts[0] as any) && SPECIAL_KEYS.includes(parts[1] as any)) {\n await locator?.press(value);\n } else {\n // If it's a mix of special keys and text, use pressSequentially\n await locator?.pressSequentially(value);\n }\n }\n } else {\n // No special keys, just type normally\n await locator?.pressSequentially(value);\n }\n break;\n\n case PlaywrightAction.SELECT_DROPDOWN:\n await selectDropdownOption(page, locator, value);\n break;\n\n case PlaywrightAction.SELECT_MULTIPLE_DROPDOWN:\n let optsArr: string[];\n if (value.startsWith('[')) {\n try { optsArr = JSON.parse(value); } catch {\n optsArr = value.slice(1, -1).split(',').map(o => o.trim());\n }\n } else {\n optsArr = value.split(',').map(o => o.trim());\n }\n await locator?.selectOption(optsArr as any);\n break;\n\n case PlaywrightAction.CHECK_CHECKBOX:\n await locator?.setChecked(value.toLowerCase() === 'true');\n break;\n\n case PlaywrightAction.SELECT_RADIO:\n case PlaywrightAction.TOGGLE_SWITCH:\n await locator?.click();\n break;\n\n case PlaywrightAction.HOVER:\n await locator?.hover({ noWaitAfter: false });\n await page.waitForTimeout(100); // short delay for hover to take effect\n break;\n\n case PlaywrightAction.VALIDATE_EXACT_VALUE:\n const actualExact = await getElementValue(page, locator);\n proboLogger.debug(`actual value is [${actualExact}]`);\n if (actualExact !== value) {\n proboLogger.info(`Validation *FAIL* expected '${value}' but got '${actualExact}'`);\n return false;\n }\n proboLogger.info('Validation *PASS*');\n break;\n\n case PlaywrightAction.VALIDATE_CONTAINS_VALUE:\n const actualContains = await getElementValue(page, locator);\n proboLogger.debug(`actual value is [${actualContains}]`);\n if (!actualContains.includes(value)) {\n proboLogger.info(`Validation *FAIL* expected '${value}' to be contained in '${actualContains}'`);\n return false;\n }\n proboLogger.info('Validation *PASS*');\n break;\n\n case PlaywrightAction.VALIDATE_URL:\n const currUrl = page.url();\n if (currUrl !== value) {\n proboLogger.info(`Validation *FAIL* expected url '${value}' while is '${currUrl}'`);\n return false;\n }\n proboLogger.info('Validation *PASS*');\n break;\n\n default:\n throw new Error(`Unknown action: ${action}`);\n }\n }\n return true;\n } catch (e) {\n proboLogger.debug(`***ERROR failed to execute action ${action}: ${e}`);\n throw e;\n }\n}\n\n/**\n * Execute a given Playwright action using native Playwright functions where possible\n */\nexport async function executeCachedPlaywrightAction(\n page: Page,\n action: PlaywrightActionType,\n value: string,\n iframe_selector: string,\n element_css_selector: string\n): Promise<boolean> {\n proboLogger.log(`performing Cached Action: ${action} Value: ${value} on locator: ${element_css_selector}`);\n try {\n let locator = undefined;\n if (iframe_selector)\n locator = page.frameLocator(iframe_selector).locator(element_css_selector);\n else\n locator = page.locator(element_css_selector);\n\n switch (action) {\n case PlaywrightAction.VISIT_BASE_URL:\n case PlaywrightAction.VISIT_URL:\n await page.goto(value, { waitUntil: 'networkidle' });\n break;\n\n case PlaywrightAction.CLICK:\n await clickAtPosition(page, locator, value as ClickPosition | null);\n await handlePotentialNavigation(page);\n break;\n\n case PlaywrightAction.FILL_IN:\n // await locator.click();\n await locator.fill(value);\n break;\n\n case PlaywrightAction.TYPE_KEYS:\n // Check if the value contains any special keys\n const specialKey = SPECIAL_KEYS.find(key => value.includes(key));\n if (specialKey) {\n // If it's a single special key, just press it\n if (value === specialKey) {\n await locator.press(specialKey);\n } else {\n // Handle combinations like 'Control+A' or 'Shift+ArrowRight'\n const parts = value.split('+');\n if (parts.length === 2 && SPECIAL_KEYS.includes(parts[0] as any) && SPECIAL_KEYS.includes(parts[1] as any)) {\n await locator.press(value);\n } else {\n // If it's a mix of special keys and text, use pressSequentially\n await locator.pressSequentially(value);\n }\n }\n } else {\n // No special keys, just type normally\n await locator.pressSequentially(value);\n }\n break;\n\n case PlaywrightAction.SELECT_DROPDOWN:\n await locator.selectOption(value as any);\n break;\n\n case PlaywrightAction.SELECT_MULTIPLE_DROPDOWN:\n let optsArr: string[];\n if (value.startsWith('[')) {\n try { optsArr = JSON.parse(value); } catch {\n optsArr = value.slice(1, -1).split(',').map(o => o.trim());\n }\n } else {\n optsArr = value.split(',').map(o => o.trim());\n }\n await locator.selectOption(optsArr as any);\n break;\n\n case PlaywrightAction.CHECK_CHECKBOX:\n await locator.setChecked(value.toLowerCase() === 'true');\n break;\n\n case PlaywrightAction.SELECT_RADIO:\n case PlaywrightAction.TOGGLE_SWITCH:\n await locator.click();\n break;\n\n case PlaywrightAction.HOVER:\n await locator?.hover({ noWaitAfter: false });\n await page.waitForTimeout(100); // short delay for hover to take effect\n break;\n\n case PlaywrightAction.VALIDATE_EXACT_VALUE:\n const actualExact = await getElementValue(page, locator);\n proboLogger.debug(`actual value is [${actualExact}]`);\n if (actualExact !== value) {\n proboLogger.info(`Validation *FAIL* expected '${value}' but got '${actualExact}'`);\n return false;\n }\n proboLogger.info('Validation *PASS*');\n break;\n\n case PlaywrightAction.VALIDATE_CONTAINS_VALUE:\n const actualContains = await getElementValue(page, locator);\n proboLogger.debug(`actual value is [${actualContains}]`);\n if (!actualContains.includes(value)) {\n proboLogger.info(`Validation *FAIL* expected '${value}' to be contained in '${actualContains}'`);\n return false;\n }\n proboLogger.info('Validation *PASS*');\n break;\n\n case PlaywrightAction.VALIDATE_URL:\n const currUrl = page.url();\n if (currUrl !== value) {\n proboLogger.info(`Validation *FAIL* expected url '${value}' while is '${currUrl}'`);\n return false;\n }\n proboLogger.info('Validation *PASS*');\n break;\n\n default:\n throw new Error(`Unknown action: ${action}`);\n }\n return true;\n } catch (e) {\n proboLogger.debug(`***ERROR failed to execute cached action ${action}: ${e}`);\n throw e;\n }\n}\n\nexport enum ClickPosition {\n LEFT = 'LEFT',\n RIGHT = 'RIGHT',\n CENTER = 'CENTER'\n}\n\n/**\n * Click on an element at a specific position\n */\nexport async function clickAtPosition(page: Page, locator: Locator, clickPosition: ClickPosition | null): Promise<void> {\n if (!clickPosition || clickPosition === ClickPosition.CENTER) {\n await locator.click({noWaitAfter: false});\n return\n }\n const boundingBox = await locator.boundingBox();\n if (boundingBox) {\n if (clickPosition === ClickPosition.LEFT) {\n await page.mouse.click(boundingBox.x + 10, boundingBox.y + boundingBox.height/2);\n }\n else if (clickPosition === ClickPosition.RIGHT) {\n await page.mouse.click(boundingBox.x + boundingBox.width - 10, boundingBox.y + boundingBox.height/2);\n }\n }\n}\n\n","import type { Page } from 'playwright';\nimport { ElementTag } from '@probolabs/highlighter/src/constants';\nimport { proboLogger } from './utils';\n\n// Fix the type definition\ntype ElementTagType = typeof ElementTag[keyof typeof ElementTag];\n\n// Add type declaration for the ProboLabs global\ndeclare global {\n // Declare highlighterCode in the global scope\n var highlighterCode: string;\n \n interface Window {\n ProboLabs?: {\n highlight: {\n execute: (elementTypes: ElementTagType[]) => Promise<any>;\n unexecute: () => Promise<any>;\n };\n highlightElements: (elements: Array<{ css_selector: string, iframe_selector: string, index: string }>) => void;\n ElementTag: typeof ElementTag;\n };\n }\n}\n\nexport class Highlighter {\n constructor(private enableConsoleLogs: boolean = true) {}\n\n private async ensureHighlighterScript(page: Page, maxRetries = 3) {\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n try {\n const scriptExists = await page.evaluate(\n `typeof window.ProboLabs?.highlight?.execute === 'function'`\n );\n\n if (!scriptExists) {\n proboLogger.debug('Injecting highlighter script...');\n await page.evaluate(highlighterCode);\n \n // Verify the script was injected correctly\n const verified = await page.evaluate(`\n //console.log('ProboLabs global:', window.ProboLabs);\n typeof window.ProboLabs?.highlight?.execute === 'function'\n `);\n proboLogger.debug('Script injection verified:', verified);\n }\n return; // Success - exit the function\n } catch (error) {\n if (attempt === maxRetries - 1) {\n throw error;\n }\n proboLogger.debug(`Script injection attempt ${attempt + 1} failed, retrying after delay...`);\n await new Promise(resolve => setTimeout(resolve, 100));\n }\n }\n }\n\n public async highlightElements(page: Page, elementTags: [ElementTagType]) {\n proboLogger.debug('highlightElements called with:', elementTags);\n await this.ensureHighlighterScript(page);\n \n // Execute the highlight function and await its result\n const result = await page.evaluate(\n async (tags) => {\n //proboLogger.debug('Browser: Starting highlight execution with tag:', tag);\n if (!window.ProboLabs?.highlight?.execute) {\n console.error('Browser: ProboLabs.highlight.execute is not available!');\n return null;\n }\n const elements = await window.ProboLabs.highlight.execute(tags);\n //proboLogger.debug('Browser: Found elements:', elements);\n return elements;\n },\n elementTags\n );\n \n // proboLogger.debug(\"highlighted elements =>\");\n // for (let i = 0; i < result.length; i++) { \n // proboLogger.debug(result[i]);\n // };\n \n return result;\n }\n\n public async unhighlightElements(page: Page) {\n proboLogger.debug('unhighlightElements called');\n await this.ensureHighlighterScript(page);\n await page.evaluate(() => {\n window?.ProboLabs?.highlight?.unexecute();\n });\n }\n\n public async highlightElement(page: Page, element_css_selector: string, iframe_selector: string, element_index: string) {\n await this.ensureHighlighterScript(page);\n proboLogger.debug('Highlighting element with:', { element_css_selector, iframe_selector, element_index });\n \n await page.evaluate(\n ({ css_selector, iframe_selector, index }) => {\n const proboLabs = window.ProboLabs;\n if (!proboLabs) {\n proboLogger.warn('ProboLabs not initialized');\n return;\n }\n // Create ElementInfo object for the element\n const elementInfo = {\n css_selector: css_selector,\n iframe_selector: iframe_selector,\n index: index\n };\n \n // Call highlightElements directly\n proboLabs.highlightElements([elementInfo]);\n },\n { \n css_selector: element_css_selector,\n iframe_selector: iframe_selector,\n index: element_index \n }\n );\n }\n}\n\nexport { ElementTag, ElementTagType };\n","function RetryOperation(timeouts, options) {\n // Compatibility for the old (timeouts, retryForever) signature\n if (typeof options === 'boolean') {\n options = { forever: options };\n }\n\n this._originalTimeouts = JSON.parse(JSON.stringify(timeouts));\n this._timeouts = timeouts;\n this._options = options || {};\n this._maxRetryTime = options && options.maxRetryTime || Infinity;\n this._fn = null;\n this._errors = [];\n this._attempts = 1;\n this._operationTimeout = null;\n this._operationTimeoutCb = null;\n this._timeout = null;\n this._operationStart = null;\n this._timer = null;\n\n if (this._options.forever) {\n this._cachedTimeouts = this._timeouts.slice(0);\n }\n}\nmodule.exports = RetryOperation;\n\nRetryOperation.prototype.reset = function() {\n this._attempts = 1;\n this._timeouts = this._originalTimeouts.slice(0);\n}\n\nRetryOperation.prototype.stop = function() {\n if (this._timeout) {\n clearTimeout(this._timeout);\n }\n if (this._timer) {\n clearTimeout(this._timer);\n }\n\n this._timeouts = [];\n this._cachedTimeouts = null;\n};\n\nRetryOperation.prototype.retry = function(err) {\n if (this._timeout) {\n clearTimeout(this._timeout);\n }\n\n if (!err) {\n return false;\n }\n var currentTime = new Date().getTime();\n if (err && currentTime - this._operationStart >= this._maxRetryTime) {\n this._errors.push(err);\n this._errors.unshift(new Error('RetryOperation timeout occurred'));\n return false;\n }\n\n this._errors.push(err);\n\n var timeout = this._timeouts.shift();\n if (timeout === undefined) {\n if (this._cachedTimeouts) {\n // retry forever, only keep last error\n this._errors.splice(0, this._errors.length - 1);\n timeout = this._cachedTimeouts.slice(-1);\n } else {\n return false;\n }\n }\n\n var self = this;\n this._timer = setTimeout(function() {\n self._attempts++;\n\n if (self._operationTimeoutCb) {\n self._timeout = setTimeout(function() {\n self._operationTimeoutCb(self._attempts);\n }, self._operationTimeout);\n\n if (self._options.unref) {\n self._timeout.unref();\n }\n }\n\n self._fn(self._attempts);\n }, timeout);\n\n if (this._options.unref) {\n this._timer.unref();\n }\n\n return true;\n};\n\nRetryOperation.prototype.attempt = function(fn, timeoutOps) {\n this._fn = fn;\n\n if (timeoutOps) {\n if (timeoutOps.timeout) {\n this._operationTimeout = timeoutOps.timeout;\n }\n if (timeoutOps.cb) {\n this._operationTimeoutCb = timeoutOps.cb;\n }\n }\n\n var self = this;\n if (this._operationTimeoutCb) {\n this._timeout = setTimeout(function() {\n self._operationTimeoutCb();\n }, self._operationTimeout);\n }\n\n this._operationStart = new Date().getTime();\n\n this._fn(this._attempts);\n};\n\nRetryOperation.prototype.try = function(fn) {\n console.log('Using RetryOperation.try() is deprecated');\n this.attempt(fn);\n};\n\nRetryOperation.prototype.start = function(fn) {\n console.log('Using RetryOperation.start() is deprecated');\n this.attempt(fn);\n};\n\nRetryOperation.prototype.start = RetryOperation.prototype.try;\n\nRetryOperation.prototype.errors = function() {\n return this._errors;\n};\n\nRetryOperation.prototype.attempts = function() {\n return this._attempts;\n};\n\nRetryOperation.prototype.mainError = function() {\n if (this._errors.length === 0) {\n return null;\n }\n\n var counts = {};\n var mainError = null;\n var mainErrorCount = 0;\n\n for (var i = 0; i < this._errors.length; i++) {\n var error = this._errors[i];\n var message = error.message;\n var count = (counts[message] || 0) + 1;\n\n counts[message] = count;\n\n if (count >= mainErrorCount) {\n mainError = error;\n mainErrorCount = count;\n }\n }\n\n return mainError;\n};\n","var RetryOperation = require('./retry_operation');\n\nexports.operation = function(options) {\n var timeouts = exports.timeouts(options);\n return new RetryOperation(timeouts, {\n forever: options && (options.forever || options.retries === Infinity),\n unref: options && options.unref,\n maxRetryTime: options && options.maxRetryTime\n });\n};\n\nexports.timeouts = function(options) {\n if (options instanceof Array) {\n return [].concat(options);\n }\n\n var opts = {\n retries: 10,\n factor: 2,\n minTimeout: 1 * 1000,\n maxTimeout: Infinity,\n randomize: false\n };\n for (var key in options) {\n opts[key] = options[key];\n }\n\n if (opts.minTimeout > opts.maxTimeout) {\n throw new Error('minTimeout is greater than maxTimeout');\n }\n\n var timeouts = [];\n for (var i = 0; i < opts.retries; i++) {\n timeouts.push(this.createTimeout(i, opts));\n }\n\n if (options && options.forever && !timeouts.length) {\n timeouts.push(this.createTimeout(i, opts));\n }\n\n // sort the array numerically ascending\n timeouts.sort(function(a,b) {\n return a - b;\n });\n\n return timeouts;\n};\n\nexports.createTimeout = function(attempt, opts) {\n var random = (opts.randomize)\n ? (Math.random() + 1)\n : 1;\n\n var timeout = Math.round(random * Math.max(opts.minTimeout, 1) * Math.pow(opts.factor, attempt));\n timeout = Math.min(timeout, opts.maxTimeout);\n\n return timeout;\n};\n\nexports.wrap = function(obj, options, methods) {\n if (options instanceof Array) {\n methods = options;\n options = null;\n }\n\n if (!methods) {\n methods = [];\n for (var key in obj) {\n if (typeof obj[key] === 'function') {\n methods.push(key);\n }\n }\n }\n\n for (var i = 0; i < methods.length; i++) {\n var method = methods[i];\n var original = obj[method];\n\n obj[method] = function retryWrapper(original) {\n var op = exports.operation(options);\n var args = Array.prototype.slice.call(arguments, 1);\n var callback = args.pop();\n\n args.push(function(err) {\n if (op.retry(err)) {\n return;\n }\n if (err) {\n arguments[0] = op.mainError();\n }\n callback.apply(this, arguments);\n });\n\n op.attempt(function() {\n original.apply(obj, args);\n });\n }.bind(obj, original);\n obj[method].options = options;\n }\n};\n","module.exports = require('./lib/retry');","const objectToString = Object.prototype.toString;\n\nconst isError = value => objectToString.call(value) === '[object Error]';\n\nconst errorMessages = new Set([\n\t'network error', // Chrome\n\t'Failed to fetch', // Chrome\n\t'NetworkError when attempting to fetch resource.', // Firefox\n\t'The Internet connection appears to be offline.', // Safari 16\n\t'Load failed', // Safari 17+\n\t'Network request failed', // `cross-fetch`\n\t'fetch failed', // Undici (Node.js)\n\t'terminated', // Undici (Node.js)\n]);\n\nexport default function isNetworkError(error) {\n\tconst isValid = error\n\t\t&& isError(error)\n\t\t&& error.name === 'TypeError'\n\t\t&& typeof error.message === 'string';\n\n\tif (!isValid) {\n\t\treturn false;\n\t}\n\n\t// We do an extra check for Safari 17+ as it has a very generic error message.\n\t// Network errors in Safari have no stack.\n\tif (error.message === 'Load failed') {\n\t\treturn error.stack === undefined;\n\t}\n\n\treturn errorMessages.has(error.message);\n}\n","import retry from 'retry';\nimport isNetworkError from 'is-network-error';\n\nexport class AbortError extends Error {\n\tconstructor(message) {\n\t\tsuper();\n\n\t\tif (message instanceof Error) {\n\t\t\tthis.originalError = message;\n\t\t\t({message} = message);\n\t\t} else {\n\t\t\tthis.originalError = new Error(message);\n\t\t\tthis.originalError.stack = this.stack;\n\t\t}\n\n\t\tthis.name = 'AbortError';\n\t\tthis.message = message;\n\t}\n}\n\nconst decorateErrorWithCounts = (error, attemptNumber, options) => {\n\t// Minus 1 from attemptNumber because the first attempt does not count as a retry\n\tconst retriesLeft = options.retries - (attemptNumber - 1);\n\n\terror.attemptNumber = attemptNumber;\n\terror.retriesLeft = retriesLeft;\n\treturn error;\n};\n\nexport default async function pRetry(input, options) {\n\treturn new Promise((resolve, reject) => {\n\t\toptions = {...options};\n\t\toptions.onFailedAttempt ??= () => {};\n\t\toptions.shouldRetry ??= () => true;\n\t\toptions.retries ??= 10;\n\n\t\tconst operation = retry.operation(options);\n\n\t\tconst abortHandler = () => {\n\t\t\toperation.stop();\n\t\t\treject(options.signal?.reason);\n\t\t};\n\n\t\tif (options.signal && !options.signal.aborted) {\n\t\t\toptions.signal.addEventListener('abort', abortHandler, {once: true});\n\t\t}\n\n\t\tconst cleanUp = () => {\n\t\t\toptions.signal?.removeEventListener('abort', abortHandler);\n\t\t\toperation.stop();\n\t\t};\n\n\t\toperation.attempt(async attemptNumber => {\n\t\t\ttry {\n\t\t\t\tconst result = await input(attemptNumber);\n\t\t\t\tcleanUp();\n\t\t\t\tresolve(result);\n\t\t\t} catch (error) {\n\t\t\t\ttry {\n\t\t\t\t\tif (!(error instanceof Error)) {\n\t\t\t\t\t\tthrow new TypeError(`Non-error was thrown: \"${error}\". You should only throw errors.`);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (error instanceof AbortError) {\n\t\t\t\t\t\tthrow error.originalError;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (error instanceof TypeError && !isNetworkError(error)) {\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t}\n\n\t\t\t\t\tdecorateErrorWithCounts(error, attemptNumber, options);\n\n\t\t\t\t\tif (!(await options.shouldRetry(error))) {\n\t\t\t\t\t\toperation.stop();\n\t\t\t\t\t\treject(error);\n\t\t\t\t\t}\n\n\t\t\t\t\tawait options.onFailedAttempt(error);\n\n\t\t\t\t\tif (!operation.retry(error)) {\n\t\t\t\t\t\tthrow operation.mainError();\n\t\t\t\t\t}\n\t\t\t\t} catch (finalError) {\n\t\t\t\t\tdecorateErrorWithCounts(finalError, attemptNumber, options);\n\t\t\t\t\tcleanUp();\n\t\t\t\t\treject(finalError);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n","import pRetry from 'p-retry';\nimport { proboLogger } from './utils';\nimport { inspect } from 'util';\nimport { cleanupInstructionElements } from './utils';\n\nexport interface Instruction {\n what_to_do: string;\n args: any;\n result: any;\n}\n\nexport interface CreateStepOptions {\n stepIdFromServer?: number | null; // Make optional and allow null\n scenarioName: string;\n stepPrompt: string;\n initial_screenshot_url: string;\n initial_html_content: string;\n use_cache: boolean;\n}\n\nexport interface StepMinimal {\n id: string;\n prompt: string;\n step_runner_state: string;\n status: string;\n action: string;\n action_value: string;\n element_css_selector: string;\n iframe_selector: string;\n}\n\n\nexport interface FindStepByPromptResult {\n step: StepMinimal;\n total_count: number;\n}\n\nexport class ApiError extends Error {\n constructor(\n public status: number,\n message: string,\n public data?: any\n ) {\n super(message);\n this.name = 'ApiError';\n \n // Remove stack trace for cleaner error messages\n this.stack = undefined;\n }\n\n toString() {\n return `${this.message} (Status: ${this.status})`;\n }\n}\n\nexport class ApiClient {\n constructor(\n private apiUrl: string,\n private token: string,\n private maxRetries: number = 3,\n private initialBackoff: number = 1000\n ) {}\n\n private async handleResponse(response: Response) {\n try {\n const data = await response.json();\n \n if (!response.ok) {\n switch (response.status) {\n case 401:\n throw new ApiError(401, 'Unauthorized - Invalid or missing authentication token');\n case 403:\n throw new ApiError(403, 'Forbidden - You do not have permission to perform this action');\n case 400:\n throw new ApiError(400, 'Bad Request', data);\n case 404:\n throw new ApiError(404, 'Not Found', data);\n case 500:\n throw new ApiError(500, 'Internal Server Error', data);\n default:\n throw new ApiError(response.status, `API Error: ${data.error || 'Unknown error'}`, data);\n }\n }\n \n return data;\n } catch (error: any) {\n // Only throw the original error if it's not a network error\n if (!error.message?.includes('fetch failed')) {\n throw error;\n }\n throw new ApiError(0, 'Network error: fetch failed');\n }\n }\n\n private getHeaders() {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n \n // Always include token in headers now that we have a default\n headers['Authorization'] = `Token ${this.token}`;\n \n return headers;\n }\n\n async createStep(options: CreateStepOptions): Promise<string> {\n proboLogger.debug('creating step ', options.stepPrompt);\n return pRetry(async () => {\n const response = await fetch(`${this.apiUrl}/step-runners/`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({ \n step_id: options.stepIdFromServer,\n scenario_name: options.scenarioName,\n step_prompt: options.stepPrompt, \n initial_screenshot: options.initial_screenshot_url, \n initial_html_content: options.initial_html_content,\n use_cache: options.use_cache,\n }),\n });\n \n const data = await this.handleResponse(response);\n return data.step.id;\n }, {\n retries: this.maxRetries,\n minTimeout: this.initialBackoff,\n onFailedAttempt: error => {\n proboLogger.warn(`API call failed, attempt ${error.attemptNumber} of ${error.retriesLeft + error.attemptNumber}...`);\n }\n });\n }\n\n async resolveNextInstruction(stepId: string, instruction: Instruction | null, aiModel?: string) {\n proboLogger.debug(`resolving next instruction: ${instruction}`);\n return pRetry(async () => {\n proboLogger.debug(`API client: Resolving next instruction for step ${stepId}`);\n \n const cleanInstruction = cleanupInstructionElements(instruction);\n \n const response = await fetch(`${this.apiUrl}/step-runners/${stepId}/run/`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({ \n executed_instruction: cleanInstruction,\n ai_model: aiModel \n }),\n });\n \n const data = await this.handleResponse(response);\n return data.instruction;\n }, {\n retries: this.maxRetries,\n minTimeout: this.initialBackoff,\n onFailedAttempt: error => {\n proboLogger.warn(`API call failed, attempt ${error.attemptNumber} of ${error.retriesLeft + error.attemptNumber}...`);\n }\n });\n }\n\n async uploadScreenshot(screenshot_bytes: Buffer): Promise<string> {\n return pRetry(async () => {\n const response = await fetch(`${this.apiUrl}/upload-screenshots/`, {\n method: 'POST',\n headers: {\n 'Authorization': `Token ${this.token}`\n },\n body: screenshot_bytes,\n });\n \n const data = await this.handleResponse(response);\n return data.screenshot_url;\n }, {\n retries: this.maxRetries,\n minTimeout: this.initialBackoff,\n onFailedAttempt: error => {\n proboLogger.warn(`API call failed, attempt ${error.attemptNumber} of ${error.retriesLeft + error.attemptNumber}...`);\n }\n });\n }\n\n async findStepByPrompt(prompt: string, scenarioName: string): Promise<FindStepByPromptResult | null> {\n proboLogger.debug(`Finding step by prompt: ${prompt} and scenario: ${scenarioName}`);\n return pRetry(async () => {\n const response = await fetch(`${this.apiUrl}/step-runners/find-step-by-prompt/`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({\n prompt: prompt,\n scenario_name: scenarioName\n }),\n });\n \n try {\n const data = await this.handleResponse(response);\n return {\n step: data.step,\n total_count: data.total_count\n };\n } catch (error: any) {\n // If we get a 404, the step doesn't exist\n if (error instanceof ApiError && error.status === 404) {\n return null;\n }\n // For any other error, rethrow\n throw error;\n }\n }, {\n retries: this.maxRetries,\n minTimeout: this.initialBackoff,\n onFailedAttempt: error => {\n proboLogger.warn(`API call failed, attempt ${error.attemptNumber} of ${error.retriesLeft + error.attemptNumber}...`);\n }\n });\n }\n\n async resetStep(stepId: string) {\n return pRetry(async () => {\n const response = await fetch(`${this.apiUrl}/steps/${stepId}/reset/`, {\n method: 'POST',\n headers: this.getHeaders(),\n });\n const data = await this.handleResponse(response);\n return data;\n });\n }\n}\n","import type { Page } from 'playwright';\nimport { ElementTag } from '@probolabs/highlighter/src/constants';\nimport { executePlaywrightAction, PlaywrightAction, waitForMutationsToSettle, executeCachedPlaywrightAction, PlaywrightActionType } from './actions';\nimport { Highlighter, ElementTagType } from './highlight';\nimport { ApiClient, Instruction, FindStepByPromptResult } from './api-client';\nimport { proboLogger , ProboLogLevel } from './utils';\nimport pRetry, { FailedAttemptError } from 'p-retry';\n\n/**\n * Available AI models for LLM operations\n */\nexport enum AIModel {\n AZURE_GPT4 = \"AZURE_GPT4\",\n AZURE_GPT4_MINI = \"AZURE_GPT4_MINI\",\n GEMINI_1_5_FLASH = \"GEMINI_1_5_FLASH\",\n GEMINI_2_5_FLASH = \"GEMINI_2_5_FLASH\",\n GPT4 = \"GPT4\",\n GPT4_MINI = \"GPT4_MINI\",\n CLAUDE_3_5 = \"CLAUDE_3_5\",\n GROK_2 = \"GROK_2\",\n LLAMA_4_SCOUT = \"LLAMA_4_SCOUT\",\n DEEPSEEK_V3 = \"DEEPSEEK_V3\",\n DEFAULT_AI_MODEL = \"DEFAULT_AI_MODEL\"\n}\n\n// export const DEMO_TOKEN = 'b31793f81a1f58b8a153c86a5fdf4df0e5179c51';\nexport { ProboLogLevel };\ninterface ProboConfig {\n scenarioName: string;\n token?: string;\n apiUrl?: string;\n enableConsoleLogs?: boolean;\n debugLevel?: ProboLogLevel;\n aiModel?: AIModel;\n}\n\nexport interface RunStepOptions {\n useCache: boolean;\n stepIdFromServer: number | null | undefined;\n aiModel?: AIModel;\n}\n\nconst retryOptions = {\n retries: 3,\n minTimeout: 1000,\n onFailedAttempt: (error: FailedAttemptError) => {\n proboLogger.warn(\n `Page operation failed, attempt ${error.attemptNumber} of ${error.retriesLeft + error.attemptNumber}...`\n );\n }\n};\n\nexport class Probo {\n private highlighter: Highlighter;\n private apiClient: ApiClient;\n private readonly enableConsoleLogs: boolean; \n private readonly scenarioName: string;\n private readonly aiModel: AIModel;\n constructor({\n scenarioName,\n token = '',\n apiUrl = '',\n enableConsoleLogs = false,\n debugLevel = ProboLogLevel.LOG,\n aiModel = AIModel.DEFAULT_AI_MODEL\n }: ProboConfig) {\n const apiKey = token || process.env.PROBO_API_KEY;\n if (!apiKey) {\n proboLogger.error(\"API key wasn't provided. Either pass it as argument 'token' to Probo constructor or set environment variable PROBO_API_KEY\");\n throw Error('Probo API key not provided');\n }\n\n const apiEndPoint = apiUrl || process.env.PROBO_API_ENDPOINT;\n if (!apiEndPoint) {\n proboLogger.error(\"API endpoint wasn't provided. Either pass it as argument 'apiUrl' to Probo constructor or set environment variable PROBO_API_ENDPOINT\");\n throw Error('Probo API endpoint not provided');\n }\n\n this.highlighter = new Highlighter(enableConsoleLogs);\n this.apiClient = new ApiClient(apiEndPoint, apiKey);\n this.enableConsoleLogs = enableConsoleLogs;\n this.scenarioName = scenarioName;\n this.aiModel = aiModel;\n proboLogger.setLogLevel(debugLevel);\n proboLogger.log(`Initializing: scenarioName: ${scenarioName}, apiUrl: ${apiEndPoint}, enableConsoleLogs: ${enableConsoleLogs}, debugLevel: ${debugLevel}, aiModel: ${aiModel}`);\n }\n\n public async runStep(\n page: Page, \n stepPrompt: string, \n options: RunStepOptions = { useCache: true, stepIdFromServer: undefined, aiModel: this.aiModel }\n ): Promise<boolean> {\n // Use the aiModel from options if provided, otherwise use the one from constructor\n const aiModelToUse = options.aiModel !== undefined ? options.aiModel : this.aiModel;\n \n proboLogger.log(`runStep: ${options.stepIdFromServer ? '#'+options.stepIdFromServer+' - ' : ''}${stepPrompt}, aiModel: ${aiModelToUse}, pageUrl: ${page.url()}`);\n this.setupConsoleLogs(page);\n \n // First check if the step exists in the database\n let stepId: string;\n \n if (options.useCache) {\n const isCachedStep = await this._handleCachedStep(page, stepPrompt);\n if (isCachedStep) {\n proboLogger.debug('performed cached step!');\n return true;\n }\n }\n \n proboLogger.debug(`Cache disabled or step not found, creating new step`);\n stepId = await this._handleStepCreation(page, stepPrompt, options.stepIdFromServer, options.useCache);\n proboLogger.debug('Step ID:', stepId);\n let instruction: Instruction | null = null;\n // Main execution loop\n while (true) {\n try {\n // Get next instruction from server\n const nextInstruction = await this.apiClient.resolveNextInstruction(stepId, instruction, aiModelToUse);\n proboLogger.debug('Next Instruction from server:', nextInstruction);\n\n // Exit conditions\n \n if (nextInstruction.what_to_do === 'do_nothing') {\n if (nextInstruction.args.success) {\n proboLogger.info(`Reasoning: ${nextInstruction.args.message}`)\n proboLogger.info('Step completed successfully');\n return nextInstruction.args.status;\n }\n else { \n throw new Error(nextInstruction.args.message)\n } \n }\n\n // Handle different instruction types\n switch (nextInstruction.what_to_do) {\n case 'highlight_candidate_elements':\n proboLogger.debug('Highlighting candidate elements:', nextInstruction.args.element_types);\n const highlighted_elements = await this.highlightElements(page, nextInstruction.args.element_types);\n proboLogger.debug(`Highlighted ${highlighted_elements.length} elements`);\n const candidate_elements_screenshot_url = await this.screenshot(page);\n // proboLogger.log('candidate_elements_screenshot_url:', candidate_elements_screenshot_url);\n const executed_instruction: Instruction = {\n what_to_do: 'highlight_candidate_elements',\n args: {\n element_types: nextInstruction.args.element_types\n },\n result: {\n highlighted_elements: highlighted_elements,\n candidate_elements_screenshot_url: candidate_elements_screenshot_url\n }\n }\n proboLogger.debug('Executed Instruction:', executed_instruction);\n instruction = executed_instruction;\n break;\n\n case 'perform_action':\n instruction = await this._handlePerformAction(page, nextInstruction);\n break;\n\n default:\n throw new Error(`Unknown instruction type: ${nextInstruction.what_to_do}`);\n }\n\n } catch (error: any) {\n proboLogger.error(error.message); \n throw Error(error.message); \n }\n }\n \n\n }\n \n private async _handleCachedStep(page: Page, stepPrompt: string): Promise<boolean> {\n proboLogger.debug(`Checking if step exists in database: ${stepPrompt}`);\n const result: FindStepByPromptResult | null = await this.apiClient.findStepByPrompt(stepPrompt, this.scenarioName);\n if (result) {\n proboLogger.log(`Found existing step with ID: ${result.step.id} going to perform action: ${result.step.action} with value: ${result.step.action_value}`);\n proboLogger.debug(`Step in the DB: #${result.step.id} status: ${result.step.status} action: ${result.step.action} action_value: ${result.step.action_value} locator: ${result.step.element_css_selector}`);\n if (result.step.status !== 'EXECUTED') {\n proboLogger.debug(`Step ${result.step.id} is not executed, returning false`);\n return false;\n }\n proboLogger.debug(`Step ${result.step.id} is in status executed, performing action directly with Playwright`);\n const element_css_selector = result.step.element_css_selector\n const iframe_selector = result.step.iframe_selector\n try {\n await executeCachedPlaywrightAction(page, result.step.action as PlaywrightActionType, result.step.action_value, iframe_selector, element_css_selector);\n } catch (error: any) {\n proboLogger.error(`Error executing action for step ${result.step.id} going to reset the step`);\n proboLogger.debug('Error details:', error);\n await this.apiClient.resetStep(result.step.id);\n return false;\n }\n return true\n } else {\n proboLogger.debug(`Step not found in database, continuing with the normal flow`);\n return false\n }\n\n }\n \n private async _handleStepCreation(\n page: Page, \n stepPrompt: string, \n stepIdFromServer: number | null | undefined, \n useCache: boolean\n ): Promise<string> {\n \n proboLogger.debug(`Taking initial screenshot from the page ${page.url()}`);\n // not sure if this is needed\n // await handlePotentialNavigation(page);\n await waitForMutationsToSettle(page);\n const initial_screenshot_url = await pRetry(() => this.screenshot(page), retryOptions);\n proboLogger.debug(`Taking initial html content from the page ${page.url()}`);\n const initial_html_content = await pRetry(async () => {\n try {\n return await page.content();\n } catch (error: any) {\n console.log('Error caught:', {\n name: error.name,\n message: error.message,\n code: error.code,\n constructor: error.constructor.name,\n prototype: Object.getPrototypeOf(error).constructor.name\n });\n throw error; // Re-throw to trigger retry\n }\n }, retryOptions);\n \n return await this.apiClient.createStep({\n stepIdFromServer,\n scenarioName: this.scenarioName,\n stepPrompt: stepPrompt,\n initial_screenshot_url,\n initial_html_content,\n use_cache: useCache\n });\n }\n\n\n private setupConsoleLogs(page: Page) {\n if (this.enableConsoleLogs) {\n page.on('console', msg => {\n const type = msg.type();\n const text = msg.text();\n proboLogger.log(`[Browser-${type}]: ${text}`);\n });\n }\n }\n\n public async highlightElements(page: Page, elementTags: [ElementTagType]) {\n return this.highlighter.highlightElements(page, elementTags);\n }\n\n public async unhighlightElements(page: Page) {\n return this.highlighter.unhighlightElements(page);\n }\n\n public async highlightElement(page: Page, element_css_selector: string, iframe_selector: string, element_index: string) {\n return this.highlighter.highlightElement(page, element_css_selector, iframe_selector, element_index);\n }\n\n public async screenshot(page: Page) { \n proboLogger.debug(`taking screenshot of current page: ${page.url()}`);\n // await page.evaluate(() => document.fonts?.ready.catch(() => {}));\n const screenshot_bytes = await page.screenshot({ fullPage: true, animations: 'disabled' });\n // make an api call to upload the screenshot to cloudinary\n proboLogger.debug('uploading image data to cloudinary');\n const screenshot_url = await this.apiClient.uploadScreenshot(screenshot_bytes);\n return screenshot_url;\n \n }\n\n private async _handlePerformAction(page: Page, nextInstruction: Instruction) {\n proboLogger.debug('Handling perform action:', nextInstruction);\n const action = nextInstruction.args.action;\n const value = nextInstruction.args.value;\n const element_css_selector = nextInstruction.args.element_css_selector;\n const iframe_selector = nextInstruction.args.iframe_selector;\n const element_index = nextInstruction.args.element_index;\n if(action !== PlaywrightAction.VISIT_URL) {\n await this.unhighlightElements(page);\n proboLogger.debug('Unhighlighted elements');\n await this.highlightElement(page, element_css_selector,iframe_selector, element_index);\n proboLogger.debug('Highlighted element');\n }\n const pre_action_screenshot_url = await this.screenshot(page);\n const step_status = await executePlaywrightAction(page, action, value, iframe_selector, element_css_selector); \n await this.unhighlightElements(page);\n proboLogger.debug('UnHighlighted element');\n await waitForMutationsToSettle(page);\n const post_action_screenshot_url = await this.screenshot(page);\n const post_html_content = await pRetry(async () => {\n try {\n return await page.content();\n } catch (error: any) {\n console.log('Error caught:', {\n name: error.name,\n message: error.message,\n code: error.code,\n constructor: error.constructor.name,\n prototype: Object.getPrototypeOf(error).constructor.name\n });\n throw error; // Re-throw to trigger retry\n }\n }, retryOptions);\n \n\n const executed_instruction: Instruction = {\n what_to_do: 'perform_action',\n args: {\n action: action,\n value: value,\n element_css_selector: element_css_selector,\n iframe_selector: iframe_selector\n },\n result: {\n pre_action_screenshot_url: pre_action_screenshot_url,\n post_action_screenshot_url: post_action_screenshot_url,\n post_html_content: post_html_content,\n validation_status: step_status ?? true\n }\n }\n return executed_instruction;\n }\n\n \n}\n\n// Re-export ElementTag for convenience\nexport { ElementTag };\n\n\n\n"],"names":["require$$0","retry"],"mappings":"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","x_google_ignoreList":[4,5,6,7,8]}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../probo-highlighter/src/constants.js","../src/utils.ts","../src/actions.ts","../src/highlight.ts","../../../node_modules/.pnpm/retry@0.13.1/node_modules/retry/lib/retry_operation.js","../../../node_modules/.pnpm/retry@0.13.1/node_modules/retry/lib/retry.js","../../../node_modules/.pnpm/retry@0.13.1/node_modules/retry/index.js","../../../node_modules/.pnpm/is-network-error@1.1.0/node_modules/is-network-error/index.js","../../../node_modules/.pnpm/p-retry@6.2.1/node_modules/p-retry/index.js","../src/api-client.ts","../src/index.ts"],"sourcesContent":["export const ElementTag = {\n CLICKABLE: \"CLICKABLE\", // button, link, toggle switch, checkbox, radio, dropdowns, clickable divs\n FILLABLE: \"FILLABLE\", // input, textarea content_editable, date picker??\n SELECTABLE: \"SELECTABLE\", // select\n NON_INTERACTIVE_ELEMENT: 'NON_INTERACTIVE_ELEMENT',\n};\n\nexport class ElementInfo {\n constructor(element, index, {tag, type, text, html, xpath, css_selector, bounding_box, iframe_selector}) {\n this.index = index.toString();\n this.tag = tag;\n this.type = type;\n this.text = text;\n this.html = html;\n this.xpath = xpath;\n this.css_selector = css_selector;\n this.bounding_box = bounding_box;\n this.iframe_selector = iframe_selector;\n this.element = element;\n this.depth = -1;\n }\n\n getSelector() {\n return this.xpath ? this.xpath : this.css_selector;\n }\n\n getDepth() {\n if (this.depth >= 0) {\n return this.depth;\n }\n \n this.depth = 0;\n let currentElement = this.element;\n \n while (currentElement.nodeType === Node.ELEMENT_NODE) { \n this.depth++;\n if (currentElement.assignedSlot) {\n currentElement = currentElement.assignedSlot;\n }\n else {\n currentElement = currentElement.parentNode;\n // Check if we're at a shadow root\n if (currentElement && currentElement.nodeType !== Node.ELEMENT_NODE && currentElement.getRootNode() instanceof ShadowRoot) {\n // Get the shadow root's host element\n currentElement = currentElement.getRootNode().host; \n }\n }\n }\n \n return this.depth;\n }\n}\n","export enum ProboLogLevel {\n DEBUG = 'DEBUG',\n INFO = 'INFO',\n LOG = 'LOG',\n WARN = 'WARN',\n ERROR = 'ERROR'\n}\n\n// Add a severity map for comparison\nexport const LogLevelSeverity: Record<ProboLogLevel, number> = {\n [ProboLogLevel.DEBUG]: 0,\n [ProboLogLevel.INFO]: 1,\n [ProboLogLevel.LOG]: 2,\n [ProboLogLevel.WARN]: 3,\n [ProboLogLevel.ERROR]: 4,\n};\n\nexport class ProboLogger {\n constructor(\n private prefix: string,\n private logLevel: ProboLogLevel = ProboLogLevel.LOG\n ) {}\n\n setLogLevel(level: ProboLogLevel): void {\n this.logLevel = level;\n console.log(`[${this.prefix}-INFO] Log level set to: ${ProboLogLevel[level]}`);\n }\n\n debug(...args: any[]): void {\n this.msg(ProboLogLevel.DEBUG, ...args);\n }\n\n info(...args: any[]): void {\n this.msg(ProboLogLevel.INFO, ...args);\n }\n\n log(...args: any[]): void {\n this.msg(ProboLogLevel.LOG, ...args);\n }\n\n warn(...args: any[]): void {\n this.msg(ProboLogLevel.WARN, ...args);\n }\n\n error(...args: any[]): void {\n this.msg(ProboLogLevel.ERROR, ...args);\n }\n\n private msg(logLevel: ProboLogLevel, ...args: any[]): void {\n if (LogLevelSeverity[logLevel] >= LogLevelSeverity[this.logLevel]) {\n const now = new Date();\n const timestamp = now.toLocaleString('en-GB', {\n day: '2-digit',\n month: 'short',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n hour12: false\n }).replace(',', '');\n\n // const stack = new Error().stack;\n // const callerLine = stack?.split('\\n')[3];\n // const callerInfo = callerLine?.match(/at\\s+(?:(.+)\\s+\\()?(.+):(\\d+):(\\d+)\\)?/);\n // const [, fnName, file, line] = callerInfo || [];\n // const fileInfo = file ? `${file.split('/').pop()}:${line}` : '';\n // const functionInfo = fnName ? `${fnName}` : '';\n\n console.log(`[${timestamp}] ${logLevel.padEnd(5, ' ')} [${this.prefix}]`, ...args);\n }\n }\n}\n\nexport const proboLogger = new ProboLogger('probolib');\n\nexport interface ElementInfo {\n index: string;\n tag: string;\n type: string;\n text: string;\n html: string;\n xpath: string;\n css_selector: string;\n bounding_box: {\n x: number;\n y: number;\n width: number;\n height: number;\n top: number;\n right: number;\n bottom: number;\n left: number;\n };\n iframe_selector: string;\n element: any;\n depth?: number;\n getSelector(): string;\n getDepth(): number;\n}\n\nexport interface CleanElementInfo {\n index: string;\n tag: string;\n type: string;\n text: string;\n html: string;\n xpath: string;\n css_selector: string;\n iframe_selector: string;\n bounding_box: {\n x: number;\n y: number;\n width: number;\n height: number;\n top: number;\n right: number;\n bottom: number;\n left: number;\n };\n depth: number;\n}\n\nconst elementLogger = new ProboLogger('element-cleaner');\n\nexport function cleanupElementInfo(elementInfo: ElementInfo): CleanElementInfo {\n elementLogger.debug(`Cleaning up element info for ${elementInfo.tag} element at index ${elementInfo.index}`);\n \n const depth = elementInfo.depth ?? elementInfo.getDepth();\n \n const cleanElement = {\n index: elementInfo.index,\n tag: elementInfo.tag,\n type: elementInfo.type,\n text: elementInfo.text,\n html: elementInfo.html,\n xpath: elementInfo.xpath,\n css_selector: elementInfo.css_selector,\n iframe_selector: elementInfo.iframe_selector,\n bounding_box: elementInfo.bounding_box,\n depth: depth\n };\n\n elementLogger.debug(`Cleaned element structure:`, cleanElement);\n return cleanElement;\n}\n\nexport function cleanupInstructionElements(instruction: any): any {\n if (!instruction?.result?.highlighted_elements) {\n elementLogger.debug('No highlighted elements to clean');\n return instruction;\n }\n\n elementLogger.debug(`Cleaning ${instruction.result.highlighted_elements.length} highlighted elements`);\n \n const cleanInstruction = {\n ...instruction,\n result: {\n ...instruction.result,\n highlighted_elements: instruction.result.highlighted_elements.map((element: ElementInfo) => \n cleanupElementInfo(element)\n )\n }\n };\n\n elementLogger.debug('Instruction cleaning completed');\n return cleanInstruction;\n}\n","import { Page, Frame, Locator } from 'playwright';\nimport { proboLogger } from './utils';\n\n// Action constants\nexport const PlaywrightAction = {\n VISIT_BASE_URL: 'VISIT_BASE_URL',\n VISIT_URL: 'VISIT_URL',\n CLICK: 'CLICK',\n FILL_IN: 'FILL_IN',\n SELECT_DROPDOWN: 'SELECT_DROPDOWN',\n SELECT_MULTIPLE_DROPDOWN: 'SELECT_MULTIPLE_DROPDOWN',\n CHECK_CHECKBOX: 'CHECK_CHECKBOX',\n SELECT_RADIO: 'SELECT_RADIO',\n TOGGLE_SWITCH: 'TOGGLE_SWITCH',\n TYPE_KEYS: 'TYPE_KEYS',\n HOVER: 'HOVER',\n VALIDATE_EXACT_VALUE: 'VALIDATE_EXACT_VALUE',\n VALIDATE_CONTAINS_VALUE: 'VALIDATE_CONTAINS_VALUE',\n VALIDATE_URL: 'VALIDATE_URL',\n} as const;\nexport type PlaywrightActionType = typeof PlaywrightAction[keyof typeof PlaywrightAction];\n\nexport const SPECIAL_KEYS = [\n 'Enter', 'Tab', 'Escape', 'Backspace', 'Delete',\n 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown',\n 'Home', 'End', 'PageUp', 'PageDown',\n 'Insert', 'F1', 'F2', 'F3', 'F4', 'F5', 'F6', 'F7', 'F8', 'F9', 'F10', 'F11', 'F12',\n 'Shift', 'Control', 'Alt', 'Meta',\n 'CapsLock', 'NumLock', 'ScrollLock',\n 'Pause', 'PrintScreen', 'ContextMenu',\n 'AudioVolumeUp', 'AudioVolumeDown', 'AudioVolumeMute',\n 'MediaTrackNext', 'MediaTrackPrevious', 'MediaStop', 'MediaPlayPause',\n 'BrowserBack', 'BrowserForward', 'BrowserRefresh', 'BrowserFavorites'\n] as const;\n\n/**\n * Handle potential navigation exactly like Python's handle_potential_navigation\n */\nexport async function handlePotentialNavigation(\n page: Page,\n locator: Locator | null = null,\n value: string | null = null,\n options: {\n initialTimeout?: number;\n navigationTimeout?: number;\n globalTimeout?: number;\n } = {}\n): Promise<boolean> {\n const {\n initialTimeout = 5000,\n navigationTimeout = 7000,\n globalTimeout = 15000,\n } = options;\n\n const startTime = Date.now();\n let navigationCount = 0;\n let lastNavTime: number | null = null;\n\n const onFrameNav = (frame: Frame) => {\n if (frame === page.mainFrame()) {\n navigationCount++;\n lastNavTime = Date.now();\n proboLogger.debug(\n `DEBUG_NAV[${((Date.now() - startTime) / 1000).toFixed(3)}s]: navigation detected (count=${navigationCount})`\n );\n }\n };\n\n proboLogger.debug(`DEBUG_NAV[0.000s]: Starting navigation detection`);\n page.on(\"framenavigated\", onFrameNav);\n\n try {\n if (locator) {\n proboLogger.debug(`DEBUG_NAV: Executing click(${value})`);\n await clickAtPosition(page, locator, value as ClickPosition | null);\n }\n\n // wait for any initial nav to fire\n await page.waitForTimeout(initialTimeout);\n proboLogger.debug(\n `DEBUG_NAV[${((Date.now() - startTime) / 1000).toFixed(3)}s]: After initial wait, count=${navigationCount}`\n );\n\n if (navigationCount > 0) {\n // loop until either per-nav or global timeout\n while (true) {\n const now = Date.now();\n if (\n lastNavTime !== null &&\n now - lastNavTime > navigationTimeout\n ) {\n proboLogger.debug(\n `DEBUG_NAV[${((now - startTime) / 1000).toFixed(3)}s]: per‐navigation timeout reached`\n );\n break;\n }\n if (now - startTime > globalTimeout) {\n proboLogger.debug(\n `DEBUG_NAV[${((now - startTime) / 1000).toFixed(3)}s]: overall timeout reached`\n );\n break;\n }\n await page.waitForTimeout(500);\n }\n\n // now wait for load + idle\n proboLogger.debug(`DEBUG_NAV: waiting for load state`);\n await page.waitForLoadState(\"load\", { timeout: globalTimeout });\n\n proboLogger.debug(`DEBUG_NAV: waiting for networkidle`);\n try {\n // shorter idle‐wait so we don't hang the full globalTimeout here\n await page.waitForLoadState(\"networkidle\", {\n timeout: navigationTimeout,\n });\n } catch {\n proboLogger.debug(\n `DEBUG_NAV: networkidle not reached in ${navigationTimeout}ms, proceeding anyway`\n );\n }\n\n await scrollToBottomRight(page);\n proboLogger.debug(`DEBUG_NAV: done`);\n return true;\n }\n\n proboLogger.debug(`DEBUG_NAV: no navigation detected`);\n return false;\n } finally {\n page.removeListener(\"framenavigated\", onFrameNav);\n proboLogger.debug(`DEBUG_NAV: listener removed`);\n }\n}\n\n\n/**\n * Scroll entire page to bottom-right, triggering lazy-loaded content\n */\nexport async function scrollToBottomRight(page: Page): Promise<void> {\n const startTime = performance.now();\n proboLogger.debug(`Starting scroll to bottom-right`);\n\n let lastHeight = await page.evaluate(() => document.documentElement.scrollHeight);\n let lastWidth = await page.evaluate(() => document.documentElement.scrollWidth);\n\n let smoothingSteps = 0;\n while (true) { \n const initY = await page.evaluate(() => window.scrollY);\n const initX = await page.evaluate(() => window.scrollX);\n const clientHeight = await page.evaluate(() => document.documentElement.clientHeight);\n const maxHeight = await page.evaluate(() => document.documentElement.scrollHeight);\n const clientWidth = await page.evaluate(() => document.documentElement.clientWidth);\n const maxWidth = await page.evaluate(() => document.documentElement.scrollWidth);\n \n let currX = initX;\n while (currX < maxWidth - clientWidth) {\n let currY = initY;\n while (currY < maxHeight - clientHeight) {\n currY += clientHeight;\n await page.evaluate(([x, y]) => window.scrollTo(x, y), [currX, currY]);\n await page.waitForTimeout(50);\n smoothingSteps++;\n }\n currX += clientWidth;\n }\n\n proboLogger.debug(\n `performed ${smoothingSteps} smoothing steps while scrolling`\n );\n\n const newHeight = await page.evaluate(() => document.documentElement.scrollHeight);\n const newWidth = await page.evaluate(() => document.documentElement.scrollWidth);\n if (newHeight === lastHeight && newWidth === lastWidth) break;\n proboLogger.debug(`page dimensions updated, repeating scroll`);\n lastHeight = newHeight;\n lastWidth = newWidth;\n }\n\n if (smoothingSteps > 0) {\n await page.waitForTimeout(200);\n await page.evaluate('window.scrollTo(0, 0)');\n await page.waitForTimeout(50);\n }\n proboLogger.debug(`Scroll completed in ${(performance.now() - startTime).toFixed(3)}ms`);\n}\n\n/**\n * Wait for DOM mutations to settle using MutationObserver logic\n */\nexport async function waitForMutationsToSettle(\n page: Page,\n mutationTimeout: number = 1500,\n initTimeout: number = 2000\n): Promise<boolean> {\n const startTime = Date.now();\n proboLogger.debug(\n `Starting mutation settlement (initTimeout=${initTimeout}, mutationTimeout=${mutationTimeout})`\n );\n\n const result = await page.evaluate(\n async ({ mutationTimeout, initTimeout }) => {\n async function blockUntilStable(\n targetNode: HTMLElement,\n options = { childList: true, subtree: true }\n ) {\n return new Promise<boolean>((resolve) => {\n let initTimerExpired = false;\n let mutationsOccurred = false;\n const observerTimers = new Set<number>();\n\n const initTimer = window.setTimeout(() => {\n initTimerExpired = true;\n if (observerTimers.size === 0) resolve(mutationsOccurred);\n }, initTimeout);\n\n const observer = new MutationObserver(() => {\n mutationsOccurred = true;\n observerTimers.forEach((t) => clearTimeout(t));\n observerTimers.clear();\n const t = window.setTimeout(() => {\n observerTimers.delete(t);\n if (initTimerExpired && observerTimers.size === 0) {\n observer.disconnect();\n resolve(mutationsOccurred);\n }\n }, mutationTimeout);\n observerTimers.add(t);\n });\n\n observer.observe(targetNode, options);\n });\n }\n return blockUntilStable(document.body as HTMLElement);\n },\n { mutationTimeout, initTimeout }\n );\n\n const total = ((Date.now() - startTime) / 1000).toFixed(2);\n proboLogger.debug(\n result\n ? `Mutations settled. Took ${total}s`\n : `No mutations observed. Took ${total}s`\n );\n\n return result;\n}\n\n\n/**\n * Get element text value: allTextContents + innerText fallback\n */\nexport async function getElementValue(\n page: Page,\n locator: Locator\n): Promise<string> {\n const texts = await locator.allTextContents();\n let allText = texts.join('').trim();\n if (!allText) {\n allText = await locator.evaluate((el: HTMLElement) => el.innerText);\n }\n proboLogger.debug(`getElementValue: [${allText}]`);\n return allText;\n}\n\n/**\n * Select dropdown option: native <select>, <option>, child select, or ARIA listbox\n */\nexport async function selectDropdownOption(\n page: Page,\n locator: Locator,\n value: string | string[]\n): Promise<void> { \n const tagName = await locator?.evaluate((el) => el.tagName.toLowerCase());\n const role = await locator?.getAttribute('role');\n\n if (tagName === 'option' || role === 'option') {\n proboLogger.debug('selectDropdownOption: option role detected');\n await locator?.click();\n } else if (tagName === 'select') {\n proboLogger.debug('selectDropdownOption: simple select tag detected');\n try {\n await locator?.selectOption(value as any);\n } catch {\n proboLogger.debug('selectDropdownOption: manual change event fallback');\n const handle = locator ? await locator.elementHandle() : null;\n await page.evaluate(\n ({ h, val }: { h: HTMLElement | SVGElement | null, val: string | string[] }) => {\n const el = h as HTMLSelectElement;\n if (el) {\n el.value = Array.isArray(val) ? val[0] : (val as string);\n el.dispatchEvent(new Event('change', { bubbles: true }));\n }\n },\n { h: handle, val: value }\n );\n }\n } else {\n proboLogger.debug('selectDropdownOption: custom dropdown path');\n let listbox = locator.locator('select');\n let count = await listbox.count();\n if (count > 1) throw new Error(`selectDropdownOption: ambiguous <select> count=${count}`);\n if (count === 1) {\n proboLogger.debug('selectDropdownOption: child <select> found');\n await listbox.selectOption(value as any);\n return;\n }\n await locator.click();\n let container = locator;\n count = 0;\n if (role !== 'listbox') {\n for (let i = 0; i < 7; i++) {\n listbox = container.getByRole('listbox');\n count = await listbox.count();\n if (count >= 1) break;\n proboLogger.debug(`selectDropdownOption: iteration #${i} no listbox found`);\n container = container.locator('xpath=..');\n }\n } else {\n listbox = container;\n count = await listbox.count();\n }\n if (count !== 1) throw new Error(`selectDropdownOption: found ${count} listbox locators`);\n const vals = Array.isArray(value) ? value : [value];\n for (const val of vals) {\n const option = listbox.getByRole('option').getByText(new RegExp(`^${val}$`, 'i'));\n const optCount = await option.count();\n if (optCount !== 1) throw new Error(`selectDropdownOption: ${optCount} options for '${val}'`);\n await option.click();\n }\n }\n}\n\n/**\n * Execute a given Playwright action, mirroring Python's _perform_action\n */\nexport async function executePlaywrightAction(\n page: Page,\n action: PlaywrightActionType,\n value: string,\n iframe_selector: string,\n element_css_selector: string\n): Promise<boolean> {\n proboLogger.info(`performing Action: ${action} Value: ${value}`);\n try {\n \n if (action === PlaywrightAction.VISIT_BASE_URL || action === PlaywrightAction.VISIT_URL) {\n await page.goto(value, { waitUntil: 'load' });\n await handlePotentialNavigation(page, null); \n }\n else {\n let locator = undefined;\n if (iframe_selector)\n locator = page.frameLocator(iframe_selector).locator(element_css_selector);\n else\n locator = page.locator(element_css_selector);\n\n switch (action) { \n case PlaywrightAction.CLICK:\n await handlePotentialNavigation(page, locator, value as ClickPosition | null);\n break;\n\n case PlaywrightAction.FILL_IN:\n // await locator.click();\n await locator.fill(value);\n break;\n\n case PlaywrightAction.TYPE_KEYS:\n // Check if the value contains any special keys\n const specialKey = SPECIAL_KEYS.find(key => value.includes(key));\n if (specialKey) {\n // If it's a single special key, just press it\n if (value === specialKey) {\n await locator?.press(specialKey);\n } else {\n // Handle combinations like 'Control+A' or 'Shift+ArrowRight'\n const parts = value.split('+');\n if (parts.length === 2 && SPECIAL_KEYS.includes(parts[0] as any) && SPECIAL_KEYS.includes(parts[1] as any)) {\n await locator?.press(value);\n } else {\n // If it's a mix of special keys and text, use pressSequentially\n await locator?.pressSequentially(value);\n }\n }\n } else {\n // No special keys, just type normally\n await locator?.pressSequentially(value);\n }\n break;\n\n case PlaywrightAction.SELECT_DROPDOWN:\n await selectDropdownOption(page, locator, value);\n break;\n\n case PlaywrightAction.SELECT_MULTIPLE_DROPDOWN:\n let optsArr: string[];\n if (value.startsWith('[')) {\n try { optsArr = JSON.parse(value); } catch {\n optsArr = value.slice(1, -1).split(',').map(o => o.trim());\n }\n } else {\n optsArr = value.split(',').map(o => o.trim());\n }\n await locator?.selectOption(optsArr as any);\n break;\n\n case PlaywrightAction.CHECK_CHECKBOX:\n await locator?.setChecked(value.toLowerCase() === 'true');\n break;\n\n case PlaywrightAction.SELECT_RADIO:\n case PlaywrightAction.TOGGLE_SWITCH:\n await locator?.click();\n break;\n\n case PlaywrightAction.HOVER:\n await locator?.hover({ noWaitAfter: false });\n await page.waitForTimeout(100); // short delay for hover to take effect\n break;\n\n case PlaywrightAction.VALIDATE_EXACT_VALUE:\n const actualExact = await getElementValue(page, locator);\n proboLogger.debug(`actual value is [${actualExact}]`);\n if (actualExact !== value) {\n proboLogger.info(`Validation *FAIL* expected '${value}' but got '${actualExact}'`);\n return false;\n }\n proboLogger.info('Validation *PASS*');\n break;\n\n case PlaywrightAction.VALIDATE_CONTAINS_VALUE:\n const actualContains = await getElementValue(page, locator);\n proboLogger.debug(`actual value is [${actualContains}]`);\n if (!actualContains.includes(value)) {\n proboLogger.info(`Validation *FAIL* expected '${value}' to be contained in '${actualContains}'`);\n return false;\n }\n proboLogger.info('Validation *PASS*');\n break;\n\n case PlaywrightAction.VALIDATE_URL:\n const currUrl = page.url();\n if (currUrl !== value) {\n proboLogger.info(`Validation *FAIL* expected url '${value}' while is '${currUrl}'`);\n return false;\n }\n proboLogger.info('Validation *PASS*');\n break;\n\n default:\n throw new Error(`Unknown action: ${action}`);\n }\n }\n return true;\n } catch (e) {\n proboLogger.debug(`***ERROR failed to execute action ${action}: ${e}`);\n throw e;\n }\n}\n\n/**\n * Execute a given Playwright action using native Playwright functions where possible\n */\nexport async function executeCachedPlaywrightAction(\n page: Page,\n action: PlaywrightActionType,\n value: string,\n iframe_selector: string,\n element_css_selector: string\n): Promise<boolean> {\n proboLogger.log(`performing Cached Action: ${action} Value: ${value} on iframe: ${iframe_selector} locator: ${element_css_selector}`);\n try {\n let locator = undefined;\n if (iframe_selector)\n locator = page.frameLocator(iframe_selector).locator(element_css_selector);\n else\n locator = page.locator(element_css_selector);\n\n switch (action) {\n case PlaywrightAction.VISIT_BASE_URL:\n case PlaywrightAction.VISIT_URL:\n await page.goto(value, { waitUntil: 'networkidle' });\n break;\n\n case PlaywrightAction.CLICK:\n await clickAtPosition(page, locator, value as ClickPosition | null);\n await handlePotentialNavigation(page);\n break;\n\n case PlaywrightAction.FILL_IN:\n // await locator.click();\n await locator.fill(value);\n break;\n\n case PlaywrightAction.TYPE_KEYS:\n // Check if the value contains any special keys\n const specialKey = SPECIAL_KEYS.find(key => value.includes(key));\n if (specialKey) {\n // If it's a single special key, just press it\n if (value === specialKey) {\n await locator.press(specialKey);\n } else {\n // Handle combinations like 'Control+A' or 'Shift+ArrowRight'\n const parts = value.split('+');\n if (parts.length === 2 && SPECIAL_KEYS.includes(parts[0] as any) && SPECIAL_KEYS.includes(parts[1] as any)) {\n await locator.press(value);\n } else {\n // If it's a mix of special keys and text, use pressSequentially\n await locator.pressSequentially(value);\n }\n }\n } else {\n // No special keys, just type normally\n await locator.pressSequentially(value);\n }\n break;\n\n case PlaywrightAction.SELECT_DROPDOWN:\n await locator.selectOption(value as any);\n break;\n\n case PlaywrightAction.SELECT_MULTIPLE_DROPDOWN:\n let optsArr: string[];\n if (value.startsWith('[')) {\n try { optsArr = JSON.parse(value); } catch {\n optsArr = value.slice(1, -1).split(',').map(o => o.trim());\n }\n } else {\n optsArr = value.split(',').map(o => o.trim());\n }\n await locator.selectOption(optsArr as any);\n break;\n\n case PlaywrightAction.CHECK_CHECKBOX:\n await locator.setChecked(value.toLowerCase() === 'true');\n break;\n\n case PlaywrightAction.SELECT_RADIO:\n case PlaywrightAction.TOGGLE_SWITCH:\n await locator.click();\n break;\n\n case PlaywrightAction.HOVER:\n await locator?.hover({ noWaitAfter: false });\n await page.waitForTimeout(100); // short delay for hover to take effect\n break;\n\n case PlaywrightAction.VALIDATE_EXACT_VALUE:\n const actualExact = await getElementValue(page, locator);\n proboLogger.debug(`actual value is [${actualExact}]`);\n if (actualExact !== value) {\n proboLogger.info(`Validation *FAIL* expected '${value}' but got '${actualExact}'`);\n return false;\n }\n proboLogger.info('Validation *PASS*');\n break;\n\n case PlaywrightAction.VALIDATE_CONTAINS_VALUE:\n const actualContains = await getElementValue(page, locator);\n proboLogger.debug(`actual value is [${actualContains}]`);\n if (!actualContains.includes(value)) {\n proboLogger.info(`Validation *FAIL* expected '${value}' to be contained in '${actualContains}'`);\n return false;\n }\n proboLogger.info('Validation *PASS*');\n break;\n\n case PlaywrightAction.VALIDATE_URL:\n const currUrl = page.url();\n if (currUrl !== value) {\n proboLogger.info(`Validation *FAIL* expected url '${value}' while is '${currUrl}'`);\n return false;\n }\n proboLogger.info('Validation *PASS*');\n break;\n\n default:\n throw new Error(`Unknown action: ${action}`);\n }\n return true;\n } catch (e) {\n proboLogger.debug(`***ERROR failed to execute cached action ${action}: ${e}`);\n throw e;\n }\n}\n\nexport enum ClickPosition {\n LEFT = 'LEFT',\n RIGHT = 'RIGHT',\n CENTER = 'CENTER'\n}\n\n/**\n * Click on an element at a specific position\n */\nexport async function clickAtPosition(page: Page, locator: Locator, clickPosition: ClickPosition | null): Promise<void> {\n if (!clickPosition || clickPosition === ClickPosition.CENTER) {\n await locator.click({noWaitAfter: false});\n return\n }\n const boundingBox = await locator.boundingBox();\n if (boundingBox) {\n if (clickPosition === ClickPosition.LEFT) {\n await page.mouse.click(boundingBox.x + 10, boundingBox.y + boundingBox.height/2);\n }\n else if (clickPosition === ClickPosition.RIGHT) {\n await page.mouse.click(boundingBox.x + boundingBox.width - 10, boundingBox.y + boundingBox.height/2);\n }\n }\n}\n\n","import type { Page } from 'playwright';\nimport { ElementTag } from '@probolabs/highlighter/src/constants';\nimport { proboLogger } from './utils';\n\n// Fix the type definition\ntype ElementTagType = typeof ElementTag[keyof typeof ElementTag];\n\n// Add type declaration for the ProboLabs global\ndeclare global {\n // Declare highlighterCode in the global scope\n var highlighterCode: string;\n \n interface Window {\n ProboLabs?: {\n highlight: {\n execute: (elementTypes: ElementTagType[]) => Promise<any>;\n unexecute: () => Promise<any>;\n };\n highlightElements: (elements: Array<{ css_selector: string, iframe_selector: string, index: string }>) => void;\n ElementTag: typeof ElementTag;\n };\n }\n}\n\nexport class Highlighter {\n constructor(private enableConsoleLogs: boolean = true) {}\n\n private async ensureHighlighterScript(page: Page, maxRetries = 3) {\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n try {\n const scriptExists = await page.evaluate(\n `typeof window.ProboLabs?.highlight?.execute === 'function'`\n );\n\n if (!scriptExists) {\n proboLogger.debug('Injecting highlighter script...');\n await page.evaluate(highlighterCode);\n \n // Verify the script was injected correctly\n const verified = await page.evaluate(`\n //console.log('ProboLabs global:', window.ProboLabs);\n typeof window.ProboLabs?.highlight?.execute === 'function'\n `);\n proboLogger.debug('Script injection verified:', verified);\n }\n return; // Success - exit the function\n } catch (error) {\n if (attempt === maxRetries - 1) {\n throw error;\n }\n proboLogger.debug(`Script injection attempt ${attempt + 1} failed, retrying after delay...`);\n await new Promise(resolve => setTimeout(resolve, 100));\n }\n }\n }\n\n public async highlightElements(page: Page, elementTags: [ElementTagType]) {\n proboLogger.debug('highlightElements called with:', elementTags);\n await this.ensureHighlighterScript(page);\n \n // Execute the highlight function and await its result\n const result = await page.evaluate(\n async (tags) => {\n //proboLogger.debug('Browser: Starting highlight execution with tag:', tag);\n if (!window.ProboLabs?.highlight?.execute) {\n console.error('Browser: ProboLabs.highlight.execute is not available!');\n return null;\n }\n const elements = await window.ProboLabs.highlight.execute(tags);\n //proboLogger.debug('Browser: Found elements:', elements);\n return elements;\n },\n elementTags\n );\n \n // proboLogger.debug(\"highlighted elements =>\");\n // for (let i = 0; i < result.length; i++) { \n // proboLogger.debug(result[i]);\n // };\n \n return result;\n }\n\n public async unhighlightElements(page: Page) {\n proboLogger.debug('unhighlightElements called');\n await this.ensureHighlighterScript(page);\n await page.evaluate(() => {\n window?.ProboLabs?.highlight?.unexecute();\n });\n }\n\n public async highlightElement(page: Page, element_css_selector: string, iframe_selector: string, element_index: string) {\n await this.ensureHighlighterScript(page);\n proboLogger.debug('Highlighting element with:', { element_css_selector, iframe_selector, element_index });\n \n await page.evaluate(\n ({ css_selector, iframe_selector, index }) => {\n const proboLabs = window.ProboLabs;\n if (!proboLabs) {\n proboLogger.warn('ProboLabs not initialized');\n return;\n }\n // Create ElementInfo object for the element\n const elementInfo = {\n css_selector: css_selector,\n iframe_selector: iframe_selector,\n index: index\n };\n \n // Call highlightElements directly\n proboLabs.highlightElements([elementInfo]);\n },\n { \n css_selector: element_css_selector,\n iframe_selector: iframe_selector,\n index: element_index \n }\n );\n }\n}\n\nexport { ElementTag, ElementTagType };\n","function RetryOperation(timeouts, options) {\n // Compatibility for the old (timeouts, retryForever) signature\n if (typeof options === 'boolean') {\n options = { forever: options };\n }\n\n this._originalTimeouts = JSON.parse(JSON.stringify(timeouts));\n this._timeouts = timeouts;\n this._options = options || {};\n this._maxRetryTime = options && options.maxRetryTime || Infinity;\n this._fn = null;\n this._errors = [];\n this._attempts = 1;\n this._operationTimeout = null;\n this._operationTimeoutCb = null;\n this._timeout = null;\n this._operationStart = null;\n this._timer = null;\n\n if (this._options.forever) {\n this._cachedTimeouts = this._timeouts.slice(0);\n }\n}\nmodule.exports = RetryOperation;\n\nRetryOperation.prototype.reset = function() {\n this._attempts = 1;\n this._timeouts = this._originalTimeouts.slice(0);\n}\n\nRetryOperation.prototype.stop = function() {\n if (this._timeout) {\n clearTimeout(this._timeout);\n }\n if (this._timer) {\n clearTimeout(this._timer);\n }\n\n this._timeouts = [];\n this._cachedTimeouts = null;\n};\n\nRetryOperation.prototype.retry = function(err) {\n if (this._timeout) {\n clearTimeout(this._timeout);\n }\n\n if (!err) {\n return false;\n }\n var currentTime = new Date().getTime();\n if (err && currentTime - this._operationStart >= this._maxRetryTime) {\n this._errors.push(err);\n this._errors.unshift(new Error('RetryOperation timeout occurred'));\n return false;\n }\n\n this._errors.push(err);\n\n var timeout = this._timeouts.shift();\n if (timeout === undefined) {\n if (this._cachedTimeouts) {\n // retry forever, only keep last error\n this._errors.splice(0, this._errors.length - 1);\n timeout = this._cachedTimeouts.slice(-1);\n } else {\n return false;\n }\n }\n\n var self = this;\n this._timer = setTimeout(function() {\n self._attempts++;\n\n if (self._operationTimeoutCb) {\n self._timeout = setTimeout(function() {\n self._operationTimeoutCb(self._attempts);\n }, self._operationTimeout);\n\n if (self._options.unref) {\n self._timeout.unref();\n }\n }\n\n self._fn(self._attempts);\n }, timeout);\n\n if (this._options.unref) {\n this._timer.unref();\n }\n\n return true;\n};\n\nRetryOperation.prototype.attempt = function(fn, timeoutOps) {\n this._fn = fn;\n\n if (timeoutOps) {\n if (timeoutOps.timeout) {\n this._operationTimeout = timeoutOps.timeout;\n }\n if (timeoutOps.cb) {\n this._operationTimeoutCb = timeoutOps.cb;\n }\n }\n\n var self = this;\n if (this._operationTimeoutCb) {\n this._timeout = setTimeout(function() {\n self._operationTimeoutCb();\n }, self._operationTimeout);\n }\n\n this._operationStart = new Date().getTime();\n\n this._fn(this._attempts);\n};\n\nRetryOperation.prototype.try = function(fn) {\n console.log('Using RetryOperation.try() is deprecated');\n this.attempt(fn);\n};\n\nRetryOperation.prototype.start = function(fn) {\n console.log('Using RetryOperation.start() is deprecated');\n this.attempt(fn);\n};\n\nRetryOperation.prototype.start = RetryOperation.prototype.try;\n\nRetryOperation.prototype.errors = function() {\n return this._errors;\n};\n\nRetryOperation.prototype.attempts = function() {\n return this._attempts;\n};\n\nRetryOperation.prototype.mainError = function() {\n if (this._errors.length === 0) {\n return null;\n }\n\n var counts = {};\n var mainError = null;\n var mainErrorCount = 0;\n\n for (var i = 0; i < this._errors.length; i++) {\n var error = this._errors[i];\n var message = error.message;\n var count = (counts[message] || 0) + 1;\n\n counts[message] = count;\n\n if (count >= mainErrorCount) {\n mainError = error;\n mainErrorCount = count;\n }\n }\n\n return mainError;\n};\n","var RetryOperation = require('./retry_operation');\n\nexports.operation = function(options) {\n var timeouts = exports.timeouts(options);\n return new RetryOperation(timeouts, {\n forever: options && (options.forever || options.retries === Infinity),\n unref: options && options.unref,\n maxRetryTime: options && options.maxRetryTime\n });\n};\n\nexports.timeouts = function(options) {\n if (options instanceof Array) {\n return [].concat(options);\n }\n\n var opts = {\n retries: 10,\n factor: 2,\n minTimeout: 1 * 1000,\n maxTimeout: Infinity,\n randomize: false\n };\n for (var key in options) {\n opts[key] = options[key];\n }\n\n if (opts.minTimeout > opts.maxTimeout) {\n throw new Error('minTimeout is greater than maxTimeout');\n }\n\n var timeouts = [];\n for (var i = 0; i < opts.retries; i++) {\n timeouts.push(this.createTimeout(i, opts));\n }\n\n if (options && options.forever && !timeouts.length) {\n timeouts.push(this.createTimeout(i, opts));\n }\n\n // sort the array numerically ascending\n timeouts.sort(function(a,b) {\n return a - b;\n });\n\n return timeouts;\n};\n\nexports.createTimeout = function(attempt, opts) {\n var random = (opts.randomize)\n ? (Math.random() + 1)\n : 1;\n\n var timeout = Math.round(random * Math.max(opts.minTimeout, 1) * Math.pow(opts.factor, attempt));\n timeout = Math.min(timeout, opts.maxTimeout);\n\n return timeout;\n};\n\nexports.wrap = function(obj, options, methods) {\n if (options instanceof Array) {\n methods = options;\n options = null;\n }\n\n if (!methods) {\n methods = [];\n for (var key in obj) {\n if (typeof obj[key] === 'function') {\n methods.push(key);\n }\n }\n }\n\n for (var i = 0; i < methods.length; i++) {\n var method = methods[i];\n var original = obj[method];\n\n obj[method] = function retryWrapper(original) {\n var op = exports.operation(options);\n var args = Array.prototype.slice.call(arguments, 1);\n var callback = args.pop();\n\n args.push(function(err) {\n if (op.retry(err)) {\n return;\n }\n if (err) {\n arguments[0] = op.mainError();\n }\n callback.apply(this, arguments);\n });\n\n op.attempt(function() {\n original.apply(obj, args);\n });\n }.bind(obj, original);\n obj[method].options = options;\n }\n};\n","module.exports = require('./lib/retry');","const objectToString = Object.prototype.toString;\n\nconst isError = value => objectToString.call(value) === '[object Error]';\n\nconst errorMessages = new Set([\n\t'network error', // Chrome\n\t'Failed to fetch', // Chrome\n\t'NetworkError when attempting to fetch resource.', // Firefox\n\t'The Internet connection appears to be offline.', // Safari 16\n\t'Load failed', // Safari 17+\n\t'Network request failed', // `cross-fetch`\n\t'fetch failed', // Undici (Node.js)\n\t'terminated', // Undici (Node.js)\n]);\n\nexport default function isNetworkError(error) {\n\tconst isValid = error\n\t\t&& isError(error)\n\t\t&& error.name === 'TypeError'\n\t\t&& typeof error.message === 'string';\n\n\tif (!isValid) {\n\t\treturn false;\n\t}\n\n\t// We do an extra check for Safari 17+ as it has a very generic error message.\n\t// Network errors in Safari have no stack.\n\tif (error.message === 'Load failed') {\n\t\treturn error.stack === undefined;\n\t}\n\n\treturn errorMessages.has(error.message);\n}\n","import retry from 'retry';\nimport isNetworkError from 'is-network-error';\n\nexport class AbortError extends Error {\n\tconstructor(message) {\n\t\tsuper();\n\n\t\tif (message instanceof Error) {\n\t\t\tthis.originalError = message;\n\t\t\t({message} = message);\n\t\t} else {\n\t\t\tthis.originalError = new Error(message);\n\t\t\tthis.originalError.stack = this.stack;\n\t\t}\n\n\t\tthis.name = 'AbortError';\n\t\tthis.message = message;\n\t}\n}\n\nconst decorateErrorWithCounts = (error, attemptNumber, options) => {\n\t// Minus 1 from attemptNumber because the first attempt does not count as a retry\n\tconst retriesLeft = options.retries - (attemptNumber - 1);\n\n\terror.attemptNumber = attemptNumber;\n\terror.retriesLeft = retriesLeft;\n\treturn error;\n};\n\nexport default async function pRetry(input, options) {\n\treturn new Promise((resolve, reject) => {\n\t\toptions = {...options};\n\t\toptions.onFailedAttempt ??= () => {};\n\t\toptions.shouldRetry ??= () => true;\n\t\toptions.retries ??= 10;\n\n\t\tconst operation = retry.operation(options);\n\n\t\tconst abortHandler = () => {\n\t\t\toperation.stop();\n\t\t\treject(options.signal?.reason);\n\t\t};\n\n\t\tif (options.signal && !options.signal.aborted) {\n\t\t\toptions.signal.addEventListener('abort', abortHandler, {once: true});\n\t\t}\n\n\t\tconst cleanUp = () => {\n\t\t\toptions.signal?.removeEventListener('abort', abortHandler);\n\t\t\toperation.stop();\n\t\t};\n\n\t\toperation.attempt(async attemptNumber => {\n\t\t\ttry {\n\t\t\t\tconst result = await input(attemptNumber);\n\t\t\t\tcleanUp();\n\t\t\t\tresolve(result);\n\t\t\t} catch (error) {\n\t\t\t\ttry {\n\t\t\t\t\tif (!(error instanceof Error)) {\n\t\t\t\t\t\tthrow new TypeError(`Non-error was thrown: \"${error}\". You should only throw errors.`);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (error instanceof AbortError) {\n\t\t\t\t\t\tthrow error.originalError;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (error instanceof TypeError && !isNetworkError(error)) {\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t}\n\n\t\t\t\t\tdecorateErrorWithCounts(error, attemptNumber, options);\n\n\t\t\t\t\tif (!(await options.shouldRetry(error))) {\n\t\t\t\t\t\toperation.stop();\n\t\t\t\t\t\treject(error);\n\t\t\t\t\t}\n\n\t\t\t\t\tawait options.onFailedAttempt(error);\n\n\t\t\t\t\tif (!operation.retry(error)) {\n\t\t\t\t\t\tthrow operation.mainError();\n\t\t\t\t\t}\n\t\t\t\t} catch (finalError) {\n\t\t\t\t\tdecorateErrorWithCounts(finalError, attemptNumber, options);\n\t\t\t\t\tcleanUp();\n\t\t\t\t\treject(finalError);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n","import pRetry from 'p-retry';\nimport { proboLogger } from './utils';\nimport { inspect } from 'util';\nimport { cleanupInstructionElements } from './utils';\n\nexport interface Instruction {\n what_to_do: string;\n args: any;\n result: any;\n}\n\nexport interface CreateStepOptions {\n stepIdFromServer?: number | null; // Make optional and allow null\n scenarioName: string;\n stepPrompt: string;\n initial_screenshot_url: string;\n initial_html_content: string;\n use_cache: boolean;\n}\n\nexport interface StepMinimal {\n id: string;\n prompt: string;\n step_runner_state: string;\n status: string;\n action: string;\n action_value: string;\n element_css_selector: string;\n iframe_selector: string;\n}\n\n\nexport interface FindStepByPromptResult {\n step: StepMinimal;\n total_count: number;\n}\n\nexport class ApiError extends Error {\n constructor(\n public status: number,\n message: string,\n public data?: any\n ) {\n super(message);\n this.name = 'ApiError';\n \n // Remove stack trace for cleaner error messages\n this.stack = undefined;\n }\n\n toString() {\n return `${this.message} (Status: ${this.status})`;\n }\n}\n\nexport class ApiClient {\n constructor(\n private apiUrl: string,\n private token: string,\n private maxRetries: number = 3,\n private initialBackoff: number = 1000\n ) {}\n\n private async handleResponse(response: Response) {\n try {\n const data = await response.json();\n \n if (!response.ok) {\n switch (response.status) {\n case 401:\n throw new ApiError(401, 'Unauthorized - Invalid or missing authentication token');\n case 403:\n throw new ApiError(403, 'Forbidden - You do not have permission to perform this action');\n case 400:\n throw new ApiError(400, 'Bad Request', data);\n case 404:\n throw new ApiError(404, 'Not Found', data);\n case 500:\n throw new ApiError(500, 'Internal Server Error', data);\n default:\n throw new ApiError(response.status, `API Error: ${data.error || 'Unknown error'}`, data);\n }\n }\n \n return data;\n } catch (error: any) {\n // Only throw the original error if it's not a network error\n if (!error.message?.includes('fetch failed')) {\n throw error;\n }\n throw new ApiError(0, 'Network error: fetch failed');\n }\n }\n\n private getHeaders() {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n \n // Always include token in headers now that we have a default\n headers['Authorization'] = `Token ${this.token}`;\n \n return headers;\n }\n\n async createStep(options: CreateStepOptions): Promise<string> {\n proboLogger.debug('creating step ', options.stepPrompt);\n return pRetry(async () => {\n const response = await fetch(`${this.apiUrl}/step-runners/`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({ \n step_id: options.stepIdFromServer,\n scenario_name: options.scenarioName,\n step_prompt: options.stepPrompt, \n initial_screenshot: options.initial_screenshot_url, \n initial_html_content: options.initial_html_content,\n use_cache: options.use_cache,\n }),\n });\n \n const data = await this.handleResponse(response);\n return data.step.id;\n }, {\n retries: this.maxRetries,\n minTimeout: this.initialBackoff,\n onFailedAttempt: error => {\n proboLogger.warn(`API call failed, attempt ${error.attemptNumber} of ${error.retriesLeft + error.attemptNumber}...`);\n }\n });\n }\n\n async resolveNextInstruction(stepId: string, instruction: Instruction | null, aiModel?: string) {\n proboLogger.debug(`resolving next instruction: ${instruction}`);\n return pRetry(async () => {\n proboLogger.debug(`API client: Resolving next instruction for step ${stepId}`);\n \n const cleanInstruction = cleanupInstructionElements(instruction);\n \n const response = await fetch(`${this.apiUrl}/step-runners/${stepId}/run/`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({ \n executed_instruction: cleanInstruction,\n ai_model: aiModel \n }),\n });\n \n const data = await this.handleResponse(response);\n return data.instruction;\n }, {\n retries: this.maxRetries,\n minTimeout: this.initialBackoff,\n onFailedAttempt: error => {\n proboLogger.warn(`API call failed, attempt ${error.attemptNumber} of ${error.retriesLeft + error.attemptNumber}...`);\n }\n });\n }\n\n async uploadScreenshot(screenshot_bytes: Buffer): Promise<string> {\n return pRetry(async () => {\n const response = await fetch(`${this.apiUrl}/upload-screenshots/`, {\n method: 'POST',\n headers: {\n 'Authorization': `Token ${this.token}`\n },\n body: screenshot_bytes,\n });\n \n const data = await this.handleResponse(response);\n return data.screenshot_url;\n }, {\n retries: this.maxRetries,\n minTimeout: this.initialBackoff,\n onFailedAttempt: error => {\n proboLogger.warn(`API call failed, attempt ${error.attemptNumber} of ${error.retriesLeft + error.attemptNumber}...`);\n }\n });\n }\n\n async findStepByPrompt(prompt: string, scenarioName: string): Promise<FindStepByPromptResult | null> {\n proboLogger.debug(`Finding step by prompt: ${prompt} and scenario: ${scenarioName}`);\n return pRetry(async () => {\n const response = await fetch(`${this.apiUrl}/step-runners/find-step-by-prompt/`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({\n prompt: prompt,\n scenario_name: scenarioName\n }),\n });\n \n try {\n const data = await this.handleResponse(response);\n return {\n step: data.step,\n total_count: data.total_count\n };\n } catch (error: any) {\n // If we get a 404, the step doesn't exist\n if (error instanceof ApiError && error.status === 404) {\n return null;\n }\n // For any other error, rethrow\n throw error;\n }\n }, {\n retries: this.maxRetries,\n minTimeout: this.initialBackoff,\n onFailedAttempt: error => {\n proboLogger.warn(`API call failed, attempt ${error.attemptNumber} of ${error.retriesLeft + error.attemptNumber}...`);\n }\n });\n }\n\n async resetStep(stepId: string) {\n return pRetry(async () => {\n const response = await fetch(`${this.apiUrl}/steps/${stepId}/reset/`, {\n method: 'POST',\n headers: this.getHeaders(),\n });\n const data = await this.handleResponse(response);\n return data;\n });\n }\n}\n","import type { Page } from 'playwright';\nimport { ElementTag } from '@probolabs/highlighter/src/constants';\nimport { executePlaywrightAction, PlaywrightAction, waitForMutationsToSettle, executeCachedPlaywrightAction, PlaywrightActionType } from './actions';\nimport { Highlighter, ElementTagType } from './highlight';\nimport { ApiClient, Instruction, FindStepByPromptResult } from './api-client';\nimport { proboLogger , ProboLogLevel } from './utils';\nimport pRetry, { FailedAttemptError } from 'p-retry';\n\n/**\n * Available AI models for LLM operations\n */\nexport enum AIModel {\n AZURE_GPT4 = \"AZURE_GPT4\",\n AZURE_GPT4_MINI = \"AZURE_GPT4_MINI\",\n GEMINI_1_5_FLASH = \"GEMINI_1_5_FLASH\",\n GEMINI_2_5_FLASH = \"GEMINI_2_5_FLASH\",\n GPT4 = \"GPT4\",\n GPT4_MINI = \"GPT4_MINI\",\n CLAUDE_3_5 = \"CLAUDE_3_5\",\n GROK_2 = \"GROK_2\",\n LLAMA_4_SCOUT = \"LLAMA_4_SCOUT\",\n DEEPSEEK_V3 = \"DEEPSEEK_V3\",\n DEFAULT_AI_MODEL = \"DEFAULT_AI_MODEL\"\n}\n\n// export const DEMO_TOKEN = 'b31793f81a1f58b8a153c86a5fdf4df0e5179c51';\nexport { ProboLogLevel };\ninterface ProboConfig {\n scenarioName: string;\n token?: string;\n apiUrl?: string;\n enableConsoleLogs?: boolean;\n debugLevel?: ProboLogLevel;\n aiModel?: AIModel;\n}\n\nexport interface RunStepOptions {\n useCache: boolean;\n stepIdFromServer: number | null | undefined;\n aiModel?: AIModel;\n}\n\nconst retryOptions = {\n retries: 3,\n minTimeout: 1000,\n onFailedAttempt: (error: FailedAttemptError) => {\n proboLogger.warn(\n `Page operation failed, attempt ${error.attemptNumber} of ${error.retriesLeft + error.attemptNumber}...`\n );\n }\n};\n\nexport class Probo {\n private highlighter: Highlighter;\n private apiClient: ApiClient;\n private readonly enableConsoleLogs: boolean; \n private readonly scenarioName: string;\n private readonly aiModel: AIModel;\n constructor({\n scenarioName,\n token = '',\n apiUrl = '',\n enableConsoleLogs = false,\n debugLevel = ProboLogLevel.LOG,\n aiModel = AIModel.DEFAULT_AI_MODEL\n }: ProboConfig) {\n const apiKey = token || process.env.PROBO_API_KEY;\n if (!apiKey) {\n proboLogger.error(\"API key wasn't provided. Either pass it as argument 'token' to Probo constructor or set environment variable PROBO_API_KEY\");\n throw Error('Probo API key not provided');\n }\n\n const apiEndPoint = apiUrl || process.env.PROBO_API_ENDPOINT;\n if (!apiEndPoint) {\n proboLogger.error(\"API endpoint wasn't provided. Either pass it as argument 'apiUrl' to Probo constructor or set environment variable PROBO_API_ENDPOINT\");\n throw Error('Probo API endpoint not provided');\n }\n\n this.highlighter = new Highlighter(enableConsoleLogs);\n this.apiClient = new ApiClient(apiEndPoint, apiKey);\n this.enableConsoleLogs = enableConsoleLogs;\n this.scenarioName = scenarioName;\n this.aiModel = aiModel;\n proboLogger.setLogLevel(debugLevel);\n proboLogger.log(`Initializing: scenarioName: ${scenarioName}, apiUrl: ${apiEndPoint}, enableConsoleLogs: ${enableConsoleLogs}, debugLevel: ${debugLevel}, aiModel: ${aiModel}`);\n }\n\n public async runStep(\n page: Page, \n stepPrompt: string, \n options: RunStepOptions = { useCache: true, stepIdFromServer: undefined, aiModel: this.aiModel }\n ): Promise<boolean> {\n // Use the aiModel from options if provided, otherwise use the one from constructor\n const aiModelToUse = options.aiModel !== undefined ? options.aiModel : this.aiModel;\n \n proboLogger.log(`runStep: ${options.stepIdFromServer ? '#'+options.stepIdFromServer+' - ' : ''}${stepPrompt}, aiModel: ${aiModelToUse}, pageUrl: ${page.url()}`);\n this.setupConsoleLogs(page);\n \n // First check if the step exists in the database\n let stepId: string;\n \n if (options.useCache) {\n const isCachedStep = await this._handleCachedStep(page, stepPrompt);\n if (isCachedStep) {\n proboLogger.debug('performed cached step!');\n return true;\n }\n }\n \n proboLogger.debug(`Cache disabled or step not found, creating new step`);\n stepId = await this._handleStepCreation(page, stepPrompt, options.stepIdFromServer, options.useCache);\n proboLogger.debug('Step ID:', stepId);\n let instruction: Instruction | null = null;\n // Main execution loop\n while (true) {\n try {\n // Get next instruction from server\n const nextInstruction = await this.apiClient.resolveNextInstruction(stepId, instruction, aiModelToUse);\n proboLogger.debug('Next Instruction from server:', nextInstruction);\n\n // Exit conditions\n \n if (nextInstruction.what_to_do === 'do_nothing') {\n if (nextInstruction.args.success) {\n proboLogger.info(`Reasoning: ${nextInstruction.args.message}`)\n proboLogger.info('Step completed successfully');\n return nextInstruction.args.status;\n }\n else { \n throw new Error(nextInstruction.args.message)\n } \n }\n\n // Handle different instruction types\n switch (nextInstruction.what_to_do) {\n case 'highlight_candidate_elements':\n proboLogger.debug('Highlighting candidate elements:', nextInstruction.args.element_types);\n const highlighted_elements = await this.highlightElements(page, nextInstruction.args.element_types);\n proboLogger.debug(`Highlighted ${highlighted_elements.length} elements`);\n const candidate_elements_screenshot_url = await this.screenshot(page);\n // proboLogger.log('candidate_elements_screenshot_url:', candidate_elements_screenshot_url);\n const executed_instruction: Instruction = {\n what_to_do: 'highlight_candidate_elements',\n args: {\n element_types: nextInstruction.args.element_types\n },\n result: {\n highlighted_elements: highlighted_elements,\n candidate_elements_screenshot_url: candidate_elements_screenshot_url\n }\n }\n proboLogger.debug('Executed Instruction:', executed_instruction);\n instruction = executed_instruction;\n break;\n\n case 'perform_action':\n instruction = await this._handlePerformAction(page, nextInstruction);\n break;\n\n default:\n throw new Error(`Unknown instruction type: ${nextInstruction.what_to_do}`);\n }\n\n } catch (error: any) {\n proboLogger.error(error.message); \n throw Error(error.message); \n }\n }\n \n\n }\n \n private async _handleCachedStep(page: Page, stepPrompt: string): Promise<boolean> {\n proboLogger.debug(`Checking if step exists in database: ${stepPrompt}`);\n const result: FindStepByPromptResult | null = await this.apiClient.findStepByPrompt(stepPrompt, this.scenarioName);\n if (result) {\n proboLogger.log(`Found existing step with ID: ${result.step.id} going to perform action: ${result.step.action} with value: ${result.step.action_value}`);\n proboLogger.debug(`Step in the DB: #${result.step.id} status: ${result.step.status} action: ${result.step.action} action_value: ${result.step.action_value} locator: ${result.step.element_css_selector}`);\n if (result.step.status !== 'EXECUTED') {\n proboLogger.debug(`Step ${result.step.id} is not executed, returning false`);\n return false;\n }\n proboLogger.debug(`Step ${result.step.id} is in status executed, performing action directly with Playwright`);\n const element_css_selector = result.step.element_css_selector\n const iframe_selector = result.step.iframe_selector\n try {\n await executeCachedPlaywrightAction(page, result.step.action as PlaywrightActionType, result.step.action_value, iframe_selector, element_css_selector);\n } catch (error: any) {\n proboLogger.error(`Error executing action for step ${result.step.id} going to reset the step`);\n proboLogger.debug('Error details:', error);\n await this.apiClient.resetStep(result.step.id);\n return false;\n }\n return true\n } else {\n proboLogger.debug(`Step not found in database, continuing with the normal flow`);\n return false\n }\n\n }\n \n private async _handleStepCreation(\n page: Page, \n stepPrompt: string, \n stepIdFromServer: number | null | undefined, \n useCache: boolean\n ): Promise<string> {\n \n proboLogger.debug(`Taking initial screenshot from the page ${page.url()}`);\n // not sure if this is needed\n // await handlePotentialNavigation(page);\n await waitForMutationsToSettle(page);\n const initial_screenshot_url = await pRetry(() => this.screenshot(page), retryOptions);\n proboLogger.debug(`Taking initial html content from the page ${page.url()}`);\n const initial_html_content = await pRetry(async () => {\n try {\n return await page.content();\n } catch (error: any) {\n console.log('Error caught:', {\n name: error.name,\n message: error.message,\n code: error.code,\n constructor: error.constructor.name,\n prototype: Object.getPrototypeOf(error).constructor.name\n });\n throw error; // Re-throw to trigger retry\n }\n }, retryOptions);\n \n return await this.apiClient.createStep({\n stepIdFromServer,\n scenarioName: this.scenarioName,\n stepPrompt: stepPrompt,\n initial_screenshot_url,\n initial_html_content,\n use_cache: useCache\n });\n }\n\n\n private setupConsoleLogs(page: Page) {\n if (this.enableConsoleLogs) {\n page.on('console', msg => {\n const type = msg.type();\n const text = msg.text();\n proboLogger.log(`[Browser-${type}]: ${text}`);\n });\n }\n }\n\n public async highlightElements(page: Page, elementTags: [ElementTagType]) {\n return this.highlighter.highlightElements(page, elementTags);\n }\n\n public async unhighlightElements(page: Page) {\n return this.highlighter.unhighlightElements(page);\n }\n\n public async highlightElement(page: Page, element_css_selector: string, iframe_selector: string, element_index: string) {\n return this.highlighter.highlightElement(page, element_css_selector, iframe_selector, element_index);\n }\n\n public async screenshot(page: Page) { \n proboLogger.debug(`taking screenshot of current page: ${page.url()}`);\n // await page.evaluate(() => document.fonts?.ready.catch(() => {}));\n const screenshot_bytes = await page.screenshot({ fullPage: true, animations: 'disabled' });\n // make an api call to upload the screenshot to cloudinary\n proboLogger.debug('uploading image data to cloudinary');\n const screenshot_url = await this.apiClient.uploadScreenshot(screenshot_bytes);\n return screenshot_url;\n \n }\n\n private async _handlePerformAction(page: Page, nextInstruction: Instruction) {\n proboLogger.debug('Handling perform action:', nextInstruction);\n const action = nextInstruction.args.action;\n const value = nextInstruction.args.value;\n const element_css_selector = nextInstruction.args.element_css_selector;\n const iframe_selector = nextInstruction.args.iframe_selector;\n const element_index = nextInstruction.args.element_index;\n if(action !== PlaywrightAction.VISIT_URL) {\n await this.unhighlightElements(page);\n proboLogger.debug('Unhighlighted elements');\n await this.highlightElement(page, element_css_selector,iframe_selector, element_index);\n proboLogger.debug('Highlighted element');\n }\n const pre_action_screenshot_url = await this.screenshot(page);\n const step_status = await executePlaywrightAction(page, action, value, iframe_selector, element_css_selector); \n await this.unhighlightElements(page);\n proboLogger.debug('UnHighlighted element');\n await waitForMutationsToSettle(page);\n const post_action_screenshot_url = await this.screenshot(page);\n const post_html_content = await pRetry(async () => {\n try {\n return await page.content();\n } catch (error: any) {\n console.log('Error caught:', {\n name: error.name,\n message: error.message,\n code: error.code,\n constructor: error.constructor.name,\n prototype: Object.getPrototypeOf(error).constructor.name\n });\n throw error; // Re-throw to trigger retry\n }\n }, retryOptions);\n \n\n const executed_instruction: Instruction = {\n what_to_do: 'perform_action',\n args: {\n action: action,\n value: value,\n element_css_selector: element_css_selector,\n iframe_selector: iframe_selector\n },\n result: {\n pre_action_screenshot_url: pre_action_screenshot_url,\n post_action_screenshot_url: post_action_screenshot_url,\n post_html_content: post_html_content,\n validation_status: step_status ?? true\n }\n }\n return executed_instruction;\n }\n\n \n}\n\n// Re-export ElementTag for convenience\nexport { ElementTag };\n\n\n\n"],"names":["require$$0","retry"],"mappings":"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","x_google_ignoreList":[4,5,6,7,8]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@probolabs/playwright",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.11",
|
|
4
4
|
"description": "Playwright utilities for testing and automation",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"license": "MIT",
|
|
23
23
|
"dependencies": {
|
|
24
24
|
"p-retry": "^6.2.1",
|
|
25
|
-
"@probolabs/highlighter": "0.2.
|
|
25
|
+
"@probolabs/highlighter": "0.2.21"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"@rollup/plugin-commonjs": "^28.0.2",
|