@probolabs/playwright 0.1.1 → 0.1.4

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.
@@ -0,0 +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}) {\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.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} [${this.prefix}.${fileInfo}${functionInfo ? ` ${functionInfo}` : ''}]`, ...args);\n console.log(`[${timestamp}] ${logLevel} [${this.prefix}]`, ...args);\n }\n }\n}\n\nexport const proboLogger = new ProboLogger('probolib');\n","import { Page, Frame } from 'playwright';\nimport { proboLogger } from './utils';\n\n// Utility functions for enhanced Playwright interactions\nexport async function waitForNavigationToSettle(\n page: Page,\n options: {\n initialWait?: number;\n navigationTimeout?: number;\n totalTimeout?: number;\n } = {}\n): Promise<boolean> {\n const startTime = Date.now();\n let navigationCount = 0;\n let lastNavigationTime: number | null = null;\n\n const onFrameNavigated = (frame: Frame) => {\n if (frame === page.mainFrame()) {\n navigationCount++;\n lastNavigationTime = Date.now();\n proboLogger.debug(`Navigation ${navigationCount} detected at +${(lastNavigationTime - startTime)/1000}s`);\n }\n };\n\n try {\n page.on('framenavigated', onFrameNavigated);\n await page.waitForTimeout(options.initialWait || 1500);\n proboLogger.debug(`After initial wait (${(Date.now() - startTime)/1000}s), navigation_count: ${navigationCount}`);\n\n if (navigationCount > 0) {\n while (true) {\n const currentTime = Date.now();\n if (lastNavigationTime && (currentTime - lastNavigationTime) > (options.navigationTimeout || 5000)) {\n break;\n }\n if ((currentTime - startTime) > (options.totalTimeout || 10000)) {\n break;\n }\n await page.waitForTimeout(100);\n }\n\n await page.waitForLoadState('domcontentloaded', { timeout: options.totalTimeout || 10000 });\n proboLogger.debug(`Navigation settled in ${(Date.now() - startTime)/1000}s`);\n return true;\n }\n\n proboLogger.debug(`No navigation detected (${(Date.now() - startTime)/1000}s)`);\n return false;\n\n } finally {\n page.removeListener('framenavigated', onFrameNavigated);\n proboLogger.debug(`Navigation listener removed at ${(Date.now() - startTime)/1000}s`);\n }\n}\n\nexport async function stabilizePage(page: Page): Promise<void> {\n const startTime = Date.now();\n proboLogger.debug('Starting page stabilization...');\n \n await waitForNavigationToSettle(page);\n const afterNavTime = Date.now();\n proboLogger.debug(`Navigation phase: ${(afterNavTime - startTime)/1000}s`);\n \n await scrollToBottomRight(page);\n const afterScrollTime = Date.now();\n proboLogger.debug(`Scroll phase: ${(afterScrollTime - afterNavTime)/1000}s`);\n \n await waitForMutationsToSettle(page);\n const totalTime = (Date.now() - startTime)/1000;\n \n proboLogger.debug(`Page stabilization complete in ${totalTime}s`);\n}\n\nasync function enhancedClick(page: Page, selector: string, options: any = {}) {\n await stabilizePage(page);\n proboLogger.debug(`Clicking element: ${selector}`);\n await page.click(selector, { noWaitAfter: false, ...options });\n await stabilizePage(page);\n}\n\nasync function selectDropdownOption(page: Page, selector: string, value: string | string[]) {\n const locator = page.locator(selector);\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 tag/role detected');\n await locator.click();\n }\n else if (tagName === 'select') {\n // Handle native select element\n proboLogger.debug('selectDropdownOption: simple select tag');\n try {\n // First try direct selectOption\n await page.selectOption(selector, value);\n } catch (error) {\n proboLogger.debug('selectDropdownOption: direct selectOption failed, trying alternative approach');\n // If direct selection fails, try force-selecting\n await page.evaluate(({ sel, val }: { sel: string, val: string | string[] }) => {\n const element = document.querySelector(sel) as HTMLSelectElement;\n if (element) {\n const event = new Event('change', { bubbles: true });\n element.value = Array.isArray(val) ? val[0] : val;\n element.dispatchEvent(event);\n }\n }, { sel: selector, val: value });\n }\n } else {\n // Handle custom dropdown (non-select element)\n //look for child <select> if exists\n let listboxLocator = locator.locator('select');\n let count = await listboxLocator.count(); \n if (count > 1)\n throw new Error(`selectDropdownOption: ambiguous action found ${count} <select> elements`); \n if (count === 1) { //delegate to child <select>\n proboLogger.debug(\"selectDropdownOption: identified child element with <select>\");\n await listboxLocator.selectOption(value);\n }\n else { //no child <select> found\n //click the original locator to expose the real listbox and options\n proboLogger.debug(\"selectDropdownOption: clicking container element, looking for child element with role listbox\");\n await locator.click();\n let container = locator;\n count = 0;\n if (role !== 'listbox') {\n //search up to 7 levels above original locator\n for (let i=0; i<7; i++) {\n listboxLocator = container.getByRole('listbox');\n count = await listboxLocator.count();\n if (count >= 1)\n break;\n else {\n proboLogger.debug(`selectDropdownOption: iteration #${i}: no listbox found`);\n container = container.locator('xpath=..');\n }\n }\n }\n else\n listboxLocator = container;\n if (count !== 1)\n throw new Error(`selectDropdownOption: found ${count} listbox locators`);\n proboLogger.debug(`selectDropdownOption: clicking options ${value}`);\n // Handle both string and array values\n const values = Array.isArray(value) ? value : [value];\n \n for (const val of values) {\n const optionLocator = listboxLocator\n .getByRole('option')\n .getByText(new RegExp(`^${val}$`, 'i'));\n count = await optionLocator.count();\n if (count !== 1)\n throw new Error(`selectDropdownOption: found ${count} option locators`);\n await optionLocator.click();\n } \n }\n }\n}\n\nasync function getElementValue(page: Page, selector: string): Promise<string> {\n const element = page.locator(selector).first();\n return await element.textContent() || '';\n}\n\nasync function waitForMutationsToSettle(page: Page) {\n const startTime = Date.now();\n await page.waitForTimeout(500);\n proboLogger.debug(`Mutations settled in ${(Date.now() - startTime)/1000}s`);\n}\n\nasync function scrollToBottomRight(page: Page) {\n const startTime = Date.now();\n proboLogger.debug(\"Starting page scroll...\");\n \n let lastHeight = await page.evaluate(() => document.documentElement.scrollHeight);\n let lastWidth = await page.evaluate(() => document.documentElement.scrollWidth);\n let iterationCount = 0;\n\n while (true) {\n iterationCount++;\n let smoothingSteps = 0;\n \n const initScrollY = await page.evaluate(() => window.scrollY);\n const initScrollX = await page.evaluate(() => window.scrollX);\n const maxScrollY = await page.evaluate(() => document.documentElement.scrollHeight);\n const maxScrollX = await page.evaluate(() => document.documentElement.scrollWidth);\n const maxClientY = await page.evaluate(() => document.documentElement.clientHeight);\n const maxClientX = await page.evaluate(() => document.documentElement.clientWidth);\n\n let currScrollX = initScrollX;\n while (currScrollX <= (maxScrollX - maxClientX)) {\n let currScrollY = initScrollY;\n while (currScrollY <= (maxScrollY - maxClientY)) {\n currScrollY += maxClientY;\n await page.evaluate(({x, y}) => window.scrollTo(x, y), \n { x: currScrollX, y: currScrollY }\n );\n await page.waitForTimeout(50);\n smoothingSteps++;\n }\n currScrollX += maxClientX;\n }\n\n proboLogger.debug(`Iteration ${iterationCount}: ${smoothingSteps} smoothing steps in ${(Date.now() - startTime)/1000}s`);\n\n const newHeight = await page.evaluate(() => document.documentElement.scrollHeight);\n const newWidth = await page.evaluate(() => document.documentElement.scrollWidth);\n\n if (newHeight === lastHeight && newWidth === lastWidth) {\n break;\n }\n\n proboLogger.debug(`Page dimensions updated at ${(Date.now() - startTime)/1000}s, repeating scroll`);\n lastHeight = newHeight;\n lastWidth = newWidth;\n }\n\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 ${(Date.now() - startTime)/1000}s`);\n}\n\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 VALIDATE_EXACT_VALUE: 'VALIDATE_EXACT_VALUE',\n VALIDATE_CONTAINS_VALUE: 'VALIDATE_CONTAINS_VALUE',\n VALIDATE_URL: 'VALIDATE_URL'\n} as const;\n\n// Type for the action constants\nexport type PlaywrightActionType = typeof PlaywrightAction[keyof typeof PlaywrightAction];\n\nexport const executePlaywrightAction = async (\n page: Page, \n action: PlaywrightActionType,\n value: string,\n element_css_selector: string\n) => {\n proboLogger.info('Executing playwright action:', { action, value, element_css_selector });\n \n try {\n switch (action) {\n case PlaywrightAction.VISIT_BASE_URL:\n await page.goto(value, { waitUntil: 'domcontentloaded' });\n await stabilizePage(page);\n break;\n\n case PlaywrightAction.VISIT_URL:\n await page.goto(value, { waitUntil: 'domcontentloaded' });\n await stabilizePage(page);\n break;\n\n case PlaywrightAction.CLICK:\n const element = page.locator(element_css_selector);\n const tagName = await element.evaluate(el => el.tagName.toLowerCase());\n \n if (tagName === 'select') {\n // If it's a select element, use selectDropdownOption instead of click\n await selectDropdownOption(page, element_css_selector, value);\n } else {\n await enhancedClick(page, element_css_selector);\n }\n break;\n\n case PlaywrightAction.FILL_IN:\n await enhancedClick(page, element_css_selector);\n await page.fill(element_css_selector, value);\n break;\n\n case PlaywrightAction.SELECT_DROPDOWN:\n await stabilizePage(page);\n await selectDropdownOption(page, element_css_selector, value);\n break;\n\n case PlaywrightAction.SELECT_MULTIPLE_DROPDOWN:\n let options: string[];\n if (value.startsWith('[')) {\n // Handle array-like string: \"['option1', 'option2']\" or '[\"option1\", \"option2\"]'\n try {\n options = JSON.parse(value);\n } catch {\n // Handle case where quotes might be inconsistent\n options = value.slice(1, -1).split(',')\n .map(opt => opt.trim().replace(/^['\"]|['\"]$/g, ''));\n }\n } else {\n // Handle comma-separated string: \"option1, option2\"\n options = value.split(',').map(opt => opt.trim());\n }\n await selectDropdownOption(page, element_css_selector, options);\n break;\n\n case PlaywrightAction.CHECK_CHECKBOX:\n await stabilizePage(page);\n await page.setChecked(element_css_selector, value.toLowerCase() === 'true');\n break;\n\n case PlaywrightAction.SELECT_RADIO:\n case PlaywrightAction.TOGGLE_SWITCH:\n await enhancedClick(page, element_css_selector);\n break;\n\n case PlaywrightAction.TYPE_KEYS:\n await stabilizePage(page);\n await page.locator(element_css_selector).pressSequentially(value);\n break;\n\n case PlaywrightAction.VALIDATE_EXACT_VALUE:\n await stabilizePage(page);\n const exactValue = await getElementValue(page, element_css_selector);\n if (exactValue !== value) {\n proboLogger.info(`Validation FAIL: expected ${value} but got ${exactValue}`);\n return false;\n }\n proboLogger.info('Validation PASS');\n return true;\n\n case PlaywrightAction.VALIDATE_CONTAINS_VALUE:\n await stabilizePage(page);\n const containsValue = await getElementValue(page, element_css_selector);\n if (!containsValue.includes(value)) {\n proboLogger.info(`Validation FAIL: expected ${value} to be contained in ${containsValue}`);\n return false;\n }\n proboLogger.info('Validation PASS');\n return true;\n\n case PlaywrightAction.VALIDATE_URL:\n await stabilizePage(page);\n const currentUrl = page.url();\n if (currentUrl !== value) {\n proboLogger.info(`Validation FAIL: expected url ${value} but got ${currentUrl}`);\n return false;\n }\n proboLogger.info('Validation PASS');\n return true;\n\n default:\n throw new Error(`Unknown action: ${action}`);\n }\n\n return true;\n } catch (error) {\n proboLogger.error(`Failed to execute action ${action}:`, error);\n throw error;\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, 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, elementTag: ElementTagType) {\n proboLogger.debug('highlightElements called with:', elementTag);\n await this.ensureHighlighterScript(page);\n \n // Execute the highlight function and await its result\n const result = await page.evaluate(\n async (tag) => {\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([tag]);\n //proboLogger.debug('Browser: Found elements:', elements);\n return elements;\n },\n elementTag\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, element_index: string) {\n await this.ensureHighlighterScript(page);\n proboLogger.debug('Highlighting element with:', { element_css_selector, element_index });\n \n await page.evaluate(\n ({ css_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 index: index\n };\n \n // Call highlightElements directly\n proboLabs.highlightElements([elementInfo]);\n },\n { \n css_selector: element_css_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';\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 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 = 'b31793f81a1f58b8a153c86a5fdf4df0e5179c51', // Default to demo token\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 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 console.log(`[probolib-LOG] API call failed, attempt ${error.attemptNumber} of ${error.retriesLeft + error.attemptNumber}...`);\n }\n });\n }\n\n async resolveNextInstruction(stepId: string, instruction: Instruction | null) {\n return pRetry(async () => {\n const response = await fetch(`${this.apiUrl}/step-runners/${stepId}/run/`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({ executed_instruction: instruction }),\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 console.log(`[probolib-LOG] 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 console.log(`[probolib-LOG] API call failed, attempt ${error.attemptNumber} of ${error.retriesLeft + error.attemptNumber}...`);\n }\n });\n }\n}\n","import type { Page } from 'playwright';\nimport { ElementTag } from '@probolabs/highlighter/src/constants';\nimport { executePlaywrightAction, PlaywrightAction, stabilizePage, waitForNavigationToSettle } from './actions';\nimport { Highlighter, ElementTagType } from './highlight';\nimport { ApiClient, Instruction, CreateStepOptions } from './api-client';\nimport { proboLogger , ProboLogLevel } from './utils';\nimport pRetry, { FailedAttemptError } from 'p-retry';\n\nexport const DEMO_TOKEN = 'b31793f81a1f58b8a153c86a5fdf4df0e5179c51';\nexport { ProboLogLevel };\ninterface ProboConfig {\n scenarioName: string;\n token: string;\n apiUrl: string;\n enableConsoleLogs?: boolean;\n debugLevel?: ProboLogLevel;\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 constructor({\n scenarioName,\n token,\n apiUrl,\n enableConsoleLogs = false,\n debugLevel = ProboLogLevel.LOG\n }: ProboConfig) {\n this.highlighter = new Highlighter(enableConsoleLogs);\n this.apiClient = new ApiClient(apiUrl, token);\n this.enableConsoleLogs = enableConsoleLogs;\n this.scenarioName = scenarioName;\n proboLogger.setLogLevel(debugLevel);\n proboLogger.log(`Initializing: scenarioName: ${scenarioName}, apiUrl: ${apiUrl}, enableConsoleLogs: ${enableConsoleLogs}, debugLevel: ${debugLevel}`);\n }\n\n public async runStep(\n page: Page, \n stepPrompt: string, \n stepIdFromServer?: number | null, // Make optional\n useCache: boolean = true\n ): Promise<boolean> {\n proboLogger.log(`runStep: #${stepIdFromServer} - ${stepPrompt}. pageUrl: ${page.url()}`);\n this.setupConsoleLogs(page);\n \n const stepId = await this._handleStepCreation(page, stepPrompt, stepIdFromServer, 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);\n proboLogger.debug('Next Instruction from server:', nextInstruction);\n\n // Exit conditions\n if (nextInstruction.what_to_do === 'do_nothing') {\n if (nextInstruction.args.success) {\n proboLogger.log(`Reasoning: ${nextInstruction.args.message}`)\n proboLogger.info('Step completed successfully');\n return nextInstruction.args.status;\n }\n else { \n throw new Error(`Step failed: ${nextInstruction.args.message}`)\n }\n break;\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_type);\n const highlighted_elements = await this.highlightElements(page, nextInstruction.args.element_type);\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_type: nextInstruction.args.element_type\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) {\n proboLogger.error('Error during step execution:', error); \n throw error;\n }\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 await stabilizePage(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, elementTag: ElementTagType) {\n return this.highlighter.highlightElements(page, elementTag);\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, element_index: string) {\n return this.highlighter.highlightElement(page, element_css_selector, element_index);\n }\n\n public async screenshot(page: Page) {\n const screenshot_bytes = await page.screenshot({ fullPage: true, animations: 'disabled' });\n // make an api call to upload the screenshot 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 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, 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, element_css_selector); \n await this.unhighlightElements(page);\n proboLogger.debug('UnHighlighted element');\n await waitForNavigationToSettle(page,{initialWait: 500});\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 },\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]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAS,MAAM,YAAY,CAAC;AAIzC,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,IAAI,EACV,OAAO,GAAE;IACP,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;CAClB,GACL,OAAO,CAAC,OAAO,CAAC,CA0ClB;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB7D;AAwJD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;CAcnB,CAAC;AAGX,MAAM,MAAM,oBAAoB,GAAG,OAAO,gBAAgB,CAAC,MAAM,OAAO,gBAAgB,CAAC,CAAC;AAE1F,eAAO,MAAM,uBAAuB,SAC5B,IAAI,UACF,oBAAoB,SACrB,MAAM,wBACS,MAAM,qBA8G7B,CAAA"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,GAAG,CAAC;IACV,MAAM,EAAE,GAAG,CAAC;CACb;AAED,MAAM,WAAW,iBAAiB;IAChC,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,qBAAa,QAAS,SAAQ,KAAK;IAExB,MAAM,EAAE,MAAM;IAEd,IAAI,CAAC,EAAE,GAAG;gBAFV,MAAM,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,EACR,IAAI,CAAC,EAAE,GAAG,YAAA;IASnB,QAAQ;CAGT;AAED,qBAAa,SAAS;IAElB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,cAAc;gBAHd,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,MAAmD,EAAG,wBAAwB;IACrF,UAAU,GAAE,MAAU,EACtB,cAAc,GAAE,MAAa;YAGzB,cAAc;IA+B5B,OAAO,CAAC,UAAU;IAWZ,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;IA0BvD,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,GAAG,IAAI;IAmBtE,gBAAgB,CAAC,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAoBlE"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"highlight.d.ts","sourceRoot":"","sources":["../src/highlight.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAIlE,KAAK,cAAc,GAAG,OAAO,UAAU,CAAC,MAAM,OAAO,UAAU,CAAC,CAAC;AAGjE,OAAO,CAAC,MAAM,CAAC;IAEb,IAAI,eAAe,EAAE,MAAM,CAAC;IAE5B,UAAU,MAAM;QACd,SAAS,CAAC,EAAE;YACV,SAAS,EAAE;gBACT,OAAO,EAAE,CAAC,YAAY,EAAE,cAAc,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;gBAC1D,SAAS,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;aAC/B,CAAC;YACF,iBAAiB,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC;gBAAE,YAAY,EAAE,MAAM,CAAC;gBAAC,KAAK,EAAE,MAAM,CAAA;aAAE,CAAC,KAAK,IAAI,CAAC;YACtF,UAAU,EAAE,OAAO,UAAU,CAAC;SAC/B,CAAC;KACH;CACF;AAED,qBAAa,WAAW;IACV,OAAO,CAAC,iBAAiB;gBAAjB,iBAAiB,GAAE,OAAc;YAEvC,uBAAuB;IA6BxB,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,cAAc;IAsBxD,mBAAmB,CAAC,IAAI,EAAE,IAAI;IAQ9B,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,oBAAoB,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM;CA0B9F;AAED,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAElE,OAAO,EAAe,cAAc,EAAE,MAAM,aAAa,CAAC;AAE1D,OAAO,EAAgB,aAAa,EAAE,MAAM,SAAS,CAAC;AAGtD,eAAO,MAAM,UAAU,6CAA6C,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,CAAC;AACzB,UAAU,WAAW;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,UAAU,CAAC,EAAE,aAAa,CAAC;CAC5B;AAYD,qBAAa,KAAK;IAChB,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAU;IAC5C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAC1B,EACV,YAAY,EACZ,KAAK,EACL,MAAM,EACN,iBAAyB,EACzB,UAA8B,EAC/B,EAAE,WAAW;IASD,OAAO,CAClB,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,MAAM,EAClB,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,EAAG,gBAAgB;IACnD,QAAQ,GAAE,OAAc,GACvB,OAAO,CAAC,OAAO,CAAC;YAiEL,mBAAmB;IAqCjC,OAAO,CAAC,gBAAgB;IAUX,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,cAAc;IAIxD,mBAAmB,CAAC,IAAI,EAAE,IAAI;IAI9B,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,oBAAoB,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM;IAIhF,UAAU,CAAC,IAAI,EAAE,IAAI;YAQpB,oBAAoB;CAoDnC;AAGD,OAAO,EAAE,UAAU,EAAE,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,oBAAY,aAAa;IACrB,KAAK,UAAU;IACf,IAAI,SAAS;IACb,GAAG,QAAQ;IACX,IAAI,SAAS;IACb,KAAK,UAAU;CAClB;AAGD,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAM1D,CAAC;AAEF,qBAAa,WAAW;IAEhB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,QAAQ;gBADR,MAAM,EAAE,MAAM,EACd,QAAQ,GAAE,aAAiC;IAGvD,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAKvC,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAI3B,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAI1B,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAIzB,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAI1B,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAI3B,OAAO,CAAC,GAAG;CAwBd;AAED,eAAO,MAAM,WAAW,aAA8B,CAAC"}
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@probolabs/playwright",
3
- "version": "0.1.1",
3
+ "version": "0.1.4",
4
4
  "description": "Playwright utilities for testing and automation",
5
- "main": "dist/probo-playwright.umd.js",
6
- "module": "dist/probo-playwright.esm.js",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
8
8
  "files": [
9
9
  "dist"
@@ -21,15 +21,17 @@
21
21
  "author": "Probolabs",
22
22
  "license": "MIT",
23
23
  "dependencies": {
24
- "@probolabs/highlighter": "0.2.4"
24
+ "p-retry": "^6.2.1",
25
+ "@probolabs/highlighter": "0.2.14"
25
26
  },
26
27
  "devDependencies": {
27
28
  "@rollup/plugin-commonjs": "^28.0.2",
28
29
  "@rollup/plugin-node-resolve": "^16.0.0",
29
30
  "@rollup/plugin-typescript": "^11.1.6",
30
31
  "@types/node": "^20.11.24",
32
+ "@types/retry": "^0.12.5",
31
33
  "playwright": "^1.42.1",
32
- "rollup": "^2.79.2",
34
+ "rollup": "^3.0.0",
33
35
  "rollup-plugin-dts": "^6.1.0",
34
36
  "rollup-plugin-polyfill-node": "^0.13.0",
35
37
  "rollup-plugin-terser": "^7.0.2",
@@ -38,10 +40,18 @@
38
40
  "peerDependencies": {
39
41
  "playwright": "^1.42.0"
40
42
  },
43
+ "exports": {
44
+ ".": {
45
+ "types": "./dist/index.d.ts",
46
+ "import": "./dist/index.js",
47
+ "require": "./dist/index.js"
48
+ }
49
+ },
41
50
  "scripts": {
42
- "build": "rollup -c",
51
+ "build": "tsc --emitDeclarationOnly && rollup -c && rollup -c rollup.dts.config.js",
43
52
  "watch": "rollup -c -w",
44
53
  "type-check": "tsc --noEmit",
45
- "type-check:watch": "tsc --noEmit --watch"
54
+ "type-check:watch": "tsc --noEmit --watch",
55
+ "clean": "rm -rf dist && rm -rf .rollup.cache"
46
56
  }
47
57
  }
@@ -1,63 +0,0 @@
1
- import { readFileSync } from 'fs';
2
- import { join } from 'path';
3
-
4
- const ElementTag = {
5
- CLICKABLE: "CLICKABLE", // button, link, toggle switch, checkbox, radio, dropdowns, clickable divs
6
- FILLABLE: "FILLABLE", // input, textarea content_editable, date picker??
7
- SELECTABLE: "SELECTABLE", // select
8
- NON_INTERACTIVE_ELEMENT: 'NON_INTERACTIVE_ELEMENT',
9
- };
10
-
11
- // Import ElementTag from constants
12
- // Read the UMD bundle at build time
13
- const highlighterCode = readFileSync(join(__dirname, '../../probo-highlighter/dist/probolabs.umd.js'), 'utf8');
14
- class Probo {
15
- constructor(token, apiUrl) {
16
- this.token = token;
17
- this.apiUrl = apiUrl;
18
- console.log('Probo constructor', this.token, this.apiUrl);
19
- }
20
- setupConsoleLogs(page) {
21
- {
22
- page.on('console', msg => {
23
- const type = msg.type();
24
- const text = msg.text();
25
- console.log(`BROWSER CONSOLE [${type}]: ${text}`);
26
- });
27
- }
28
- }
29
- async ensureHighlighterScript(page) {
30
- this.setupConsoleLogs(page);
31
- const scriptExists = await page.evaluate(`typeof window.ProboLabs?.highlight?.execute === 'function'`);
32
- if (!scriptExists) {
33
- console.log('DEBUG: Injecting highlighter script...');
34
- await page.evaluate(highlighterCode);
35
- // Verify the script was injected correctly
36
- const verified = await page.evaluate(`
37
- console.log('ProboLabs global:', window.ProboLabs);
38
- typeof window.ProboLabs?.highlight?.execute === 'function'
39
- `);
40
- console.log('DEBUG: Script injection verified:', verified);
41
- }
42
- }
43
- async highlightElements(page, elementTag) {
44
- console.log('highlightElements called with:', elementTag);
45
- await this.ensureHighlighterScript(page);
46
- // Execute the highlight function and await its result
47
- const result = await page.evaluate(async (tag) => {
48
- var _a, _b;
49
- console.log('Browser: Starting highlight execution with tag:', tag);
50
- if (!((_b = (_a = window.ProboLabs) === null || _a === void 0 ? void 0 : _a.highlight) === null || _b === void 0 ? void 0 : _b.execute)) {
51
- console.error('Browser: ProboLabs.highlight.execute is not available!');
52
- return null;
53
- }
54
- const elements = await window.ProboLabs.highlight.execute([tag]);
55
- console.log('Browser: Found elements:', elements);
56
- return elements;
57
- }, elementTag);
58
- console.log('Highlight result:', result);
59
- return result;
60
- }
61
- }
62
-
63
- export { ElementTag, Probo };
@@ -1,69 +0,0 @@
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}) {\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.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 // Handle shadow DOM by counting host elements as 1 level\n let depth = 0;\n let currentElement = this.element;\n \n while (currentElement && currentElement.nodeType === Node.ELEMENT_NODE) {\n depth++;\n \n currentElement = currentElement.parentElement; \n if (currentElement && currentElement.nodeType !== Node.ELEMENT_NODE && currentElement.getRootNode() instanceof ShadowRoot) {\n // Skip to shadow host, counting it as one level\n currentElement = currentElement.getRootNode().host;\n }\n }\n \n this.depth = depth;\n return this.depth;\n }\n }\n\n const getElementByXPathOrCssSelector = (element_info) => {\n let element;\n\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 element = document.querySelector(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 generateCssPath(element) {\n const path = [];\n while (element.nodeType === Node.ELEMENT_NODE) { \n let selector = element.nodeName.toLowerCase();\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 let singleChild = true;\n while (sibling = sibling.nextElementSibling) {\n if (sibling.nodeName.toLowerCase() === selector) {\n singleChild = false;\n break;\n }\n }\n if (nth > 1 || !singleChild) selector += `:nth-of-type(${nth})`;\n \n path.unshift(selector);\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.nodeType !== Node.ELEMENT_NODE && element.getRootNode() instanceof ShadowRoot) {\n // Get the shadow root's host element\n element = element.getRootNode().host; \n }\n }\n }\n return path.join(' > ');\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 getElementInfo(element, index) {\n // Get text content with spaces between elements\n function getTextContent(element) {\n const walker = document.createTreeWalker(\n element,\n NodeFilter.SHOW_TEXT,\n null,\n false\n );\n\n let text = '';\n let node;\n\n while (node = walker.nextNode()) {\n const trimmedText = node.textContent.trim();\n if (trimmedText) {\n // Add space if there's already text\n if (text) {\n text += ' ';\n }\n text += trimmedText;\n }\n }\n\n return text;\n }\n\n const xpath = generateXPath(element);\n const css_selector = generateCssPath(element);\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: getTextContent(element),\n html: cleanHTML(element.outerHTML),\n xpath: xpath,\n css_selector: css_selector,\n bounding_box: element.getBoundingClientRect()\n });\n }\n\n\n\n\n const filterZeroDimensions = (elementInfo) => {\n const rect = elementInfo.bounding_box;\n const hasSize = rect.width > 0 && rect.height > 0;\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 function uniquifyElements(elements) {\n const seen = new Set();\n console.log(`Starting uniquification with ${elements.length} elements`);\n // First filter out elements with zero dimensions\n const nonZeroElements = elements.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 nonZeroElements.forEach(element_info => seen.add(element_info.css_selector));\n \n nonZeroElements.forEach(info => {\n // if (!info.xpath) {\n // console.log(`Element ${info.index}:`, info);\n // }\n });\n const filteredByParent = nonZeroElements.filter(element_info => {\n const parent = findClosestParent(seen, element_info);\n const keep = parent == null || shouldKeepNestedElement(element_info, 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 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 // 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 return areElementsOverlapping(element, other);\n });\n\n // Keep element if it has no earlier overlapping elements\n return !hasEarlierOverlap;\n });\n \n // further cleanup of of the element html to remove any element that we have already seen\n \n\n console.log(`Final elements after filtering: ${filteredResults.length} (${filteredByParent.length - filteredResults.length} removed by overlap)`);\n \n // for debugging purposes, add a data-probolabs_index attribute to the element\n // filteredResults.forEach((elementInfo, index) => {\n // // elementInfo.index = index.toString();\n // const foundElement = elementInfo.element; //getElementByXPathOrCssSelector(element);\n // if (foundElement) {\n // foundElement.dataset.probolabs_index = index.toString();\n // }\n // });\n\n // final path cleanup the html\n // filteredResults.forEach(elementInfo => {\n // const foundElement = elementInfo.element; //getElementByXPathOrCssSelector(element);\n // if (foundElement) {\n // // const parser = new DOMParser();\n // // const doc = parser.parseFromString(foundElement.outerHTML, \"text/html\");\n // // doc.querySelectorAll('[data-probolabs_index]').forEach(el => {\n // // if (el.dataset.probolabs_index !== element.index) {\n // // el.remove();\n // // }\n // // });\n // // // Get the first element from the processed document\n // // const container = doc.body.firstElementChild;\n // const clone = foundElement.cloneNode(false); // false = don't clone children\n // elementInfo.element.html = clone.outerHTML;\n // }\n // });\n\n return filteredResults;\n\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 \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 const parentSegments = parentPath.split(' > ');\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 // console.log(`shouldKeepNestedElement: ${elementInfo.tag} ${elementInfo.text} ${elementInfo.xpath} -> ${parentXPath} -> ${result}`);\n return result;\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 function getAllElementsIncludingShadow(selectors, root = document) {\n const elements = Array.from(root.querySelectorAll(selectors));\n root.querySelectorAll('*').forEach(el => {\n if (el.shadowRoot) {\n elements.push(...getAllElementsIncludingShadow(selectors, el.shadowRoot));\n }\n });\n return elements;\n }\n\n function findDropdowns() {\n const dropdowns = [];\n \n // Native select elements\n dropdowns.push(...getAllElementsIncludingShadow('select'));\n \n // Elements with dropdown roles\n dropdowns.push(...getAllElementsIncludingShadow('[role=\"combobox\"], [role=\"listbox\"], [role=\"dropdown\"]'));\n \n // Common dropdown class patterns\n const dropdownPattern = /.*(dropdown|select|combobox).*/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'].includes(el.tagName.toLowerCase());\n const result = hasDropdownClass && validTag;\n return result;\n });\n dropdowns.push(...dropdownClasses);\n \n // Elements with aria-haspopup attribute\n dropdowns.push(...getAllElementsIncludingShadow('[aria-haspopup=\"true\"], [aria-haspopup=\"listbox\"]'));\n\n dropdowns.push(...getAllElementsIncludingShadow('nav ul li'));\n\n return dropdowns;\n }\n\n function findClickables() {\n const clickables = [];\n \n // Collect all clickable elements first\n const links = [...getAllElementsIncludingShadow('a[href]')];\n const buttons = [...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 checkboxes = [...getAllElementsIncludingShadow('input[type=\"checkbox\"]')];\n const radios = [...getAllElementsIncludingShadow('input[type=\"radio\"]')];\n const toggles = findToggles();\n const pointerElements = findElementsWithPointer();\n // Add all elements at once\n clickables.push(\n ...links,\n ...buttons,\n ...inputButtons,\n ...roleButtons,\n ...tabbable,\n ...clickHandlers,\n ...dropdowns,\n ...checkboxes,\n ...radios,\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 return ['p', 'span', 'div', 'input', 'textarea'].includes(tag) || /^h\\d$/.test(tag);\n }\n }\n return false;\n });\n }\n\n function findElementsWithPointer() {\n const elements = [];\n // const allElements = document.querySelectorAll('*');\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) {\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 const highlight = {\n execute: async function(elementTypes) {\n const elements = await findElements(elementTypes);\n highlightElements(elements);\n return elements;\n },\n\n unexecute: function() {\n const overlay = document.getElementById('highlight-overlay');\n if (overlay) {\n overlay.remove();\n }\n },\n\n getElementInfo\n };\n\n\n function unhighlightElements() {\n const overlay = document.getElementById('highlight-overlay');\n if (overlay) {\n overlay.remove();\n }\n }\n\n\n\n\n async function findElements(elementTypes) {\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 const inputs = [...document.querySelectorAll('input:not([type=\"radio\"]):not([type=\"checkbox\"])')];\n console.log('Found inputs:', inputs.length, inputs);\n elements.push(...inputs);\n \n const textareas = [...document.querySelectorAll('textarea')];\n console.log('Found textareas:', textareas.length);\n elements.push(...textareas);\n \n const editables = [...document.querySelectorAll('[contenteditable=\"true\"]')];\n console.log('Found editables:', editables.length);\n elements.push(...editables);\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(...document.querySelectorAll('input[type=\"checkbox\"]'));\n elements.push(...document.querySelectorAll('input[type=\"radio\"]'));\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 uniqueElements.forEach(info => {\n console.log(`Element ${info.index}:`, info);\n });\n \n return uniqueElements;\n }\n\n // elements is an array of objects with index, xpath\n function highlightElements(elements) {\n // console.log('Starting highlight for elements:', elements);\n \n // Create overlay if it doesn't exist\n let overlay = document.getElementById('highlight-overlay');\n if (!overlay) {\n overlay = document.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: 10000;\n `;\n document.body.appendChild(overlay);\n }\n \n \n\n const updateHighlights = () => {\n overlay.innerHTML = '';\n \n elements.forEach(elementInfo => {\n let element = elementInfo.element; //getElementByXPathOrCssSelector(elementInfo);\n if (!element) {\n element = getElementByXPathOrCssSelector(elementInfo);\n if (!element)\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 const highlight = document.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 = document.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 = document.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 overlay.appendChild(highlight);\n });\n };\n\n // Initial highlight\n updateHighlights();\n\n // Update highlights on scroll and resize\n const scrollHandler = () => {\n requestAnimationFrame(updateHighlights);\n };\n \n window.addEventListener('scroll', scrollHandler, true);\n window.addEventListener('resize', updateHighlights);\n\n // Store event handlers for cleanup\n overlay.scrollHandler = scrollHandler;\n overlay.updateHighlights = updateHighlights;\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 };\n }\n\n exports.findElements = findElements;\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
- (function (global, factory) {
3
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
4
- typeof define === 'function' && define.amd ? define(['exports'], factory) :
5
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.ProboPlaywright = {}));
6
- })(this, (function (exports) { 'use strict';
7
-
8
- const ElementTag = {
9
- CLICKABLE: "CLICKABLE", // button, link, toggle switch, checkbox, radio, dropdowns, clickable divs
10
- FILLABLE: "FILLABLE", // input, textarea content_editable, date picker??
11
- SELECTABLE: "SELECTABLE", // select
12
- NON_INTERACTIVE_ELEMENT: 'NON_INTERACTIVE_ELEMENT',
13
- };
14
-
15
- class Probo {
16
- constructor(token, apiUrl) {
17
- this.token = token;
18
- this.apiUrl = apiUrl;
19
- console.log('Probo constructor', this.token, this.apiUrl);
20
- }
21
- setupConsoleLogs(page) {
22
- {
23
- page.on('console', msg => {
24
- const type = msg.type();
25
- const text = msg.text();
26
- console.log(`BROWSER CONSOLE [${type}]: ${text}`);
27
- });
28
- }
29
- }
30
- async ensureHighlighterScript(page) {
31
- this.setupConsoleLogs(page);
32
- const scriptExists = await page.evaluate(`typeof window.ProboLabs?.highlight?.execute === 'function'`);
33
- if (!scriptExists) {
34
- console.log('DEBUG: Injecting highlighter script...');
35
- await page.evaluate(highlighterCode);
36
- // Verify the script was injected correctly
37
- const verified = await page.evaluate(`
38
- console.log('ProboLabs global:', window.ProboLabs);
39
- typeof window.ProboLabs?.highlight?.execute === 'function'
40
- `);
41
- console.log('DEBUG: Script injection verified:', verified);
42
- }
43
- }
44
- async highlightElements(page, elementTag) {
45
- console.log('highlightElements called with:', elementTag);
46
- await this.ensureHighlighterScript(page);
47
- // Execute the highlight function and await its result
48
- const result = await page.evaluate(async (tag) => {
49
- var _a, _b;
50
- console.log('Browser: Starting highlight execution with tag:', tag);
51
- if (!((_b = (_a = window.ProboLabs) === null || _a === void 0 ? void 0 : _a.highlight) === null || _b === void 0 ? void 0 : _b.execute)) {
52
- console.error('Browser: ProboLabs.highlight.execute is not available!');
53
- return null;
54
- }
55
- const elements = await window.ProboLabs.highlight.execute([tag]);
56
- console.log('Browser: Found elements:', elements);
57
- return elements;
58
- }, elementTag);
59
- console.log('Highlight result:', result);
60
- return result;
61
- }
62
- }
63
-
64
- exports.ElementTag = ElementTag;
65
- exports.Probo = Probo;
66
-
67
- Object.defineProperty(exports, '__esModule', { value: true });
68
-
69
- }));
@@ -1,23 +0,0 @@
1
- import type { Page } from 'playwright';
2
- import { ElementTag } from '@probolabs/highlighter/src/constants';
3
- type ElementTagType = typeof ElementTag[keyof typeof ElementTag];
4
- declare global {
5
- var highlighterCode: string;
6
- interface Window {
7
- ProboLabs?: {
8
- highlight: {
9
- execute: (elementTypes: ElementTagType[]) => Promise<any>;
10
- };
11
- ElementTag: typeof ElementTag;
12
- };
13
- }
14
- }
15
- export declare class Probo {
16
- private token;
17
- private apiUrl;
18
- constructor(token: string, apiUrl: string);
19
- private setupConsoleLogs;
20
- private ensureHighlighterScript;
21
- highlightElements(page: Page, elementTag: ElementTagType): Promise<any>;
22
- }
23
- export { ElementTag };