From 32d5fdc768a4c9e4478eaf55982fefef6873d855 Mon Sep 17 00:00:00 2001 From: Rohit Date: Mon, 7 Jul 2025 01:45:18 +0530 Subject: [PATCH] feat: add xpath content sign logic --- maxun-core/src/interpret.ts | 49 ++++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/maxun-core/src/interpret.ts b/maxun-core/src/interpret.ts index b51652b1..0718a639 100644 --- a/maxun-core/src/interpret.ts +++ b/maxun-core/src/interpret.ts @@ -805,10 +805,53 @@ export default class Interpreter extends EventEmitter { let retryCount = 0; let paginationSuccess = false; - // Capture basic content signature before click + // Capture basic content signature before click - with XPath support const captureContentSignature = async () => { - return await page.evaluate((selector) => { - const items = document.querySelectorAll(selector); + return await page.evaluate((listSelector) => { + const isXPath = (selector: string) => { + return selector.startsWith('//') || selector.startsWith('./') || selector.includes('::'); + }; + + let items: NodeListOf | Element[] = []; + + if (isXPath(listSelector)) { + try { + // Use XPath to find elements + const xpathResult = document.evaluate( + listSelector, + document, + null, + XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, + null + ); + + items = []; + for (let i = 0; i < xpathResult.snapshotLength; i++) { + const node = xpathResult.snapshotItem(i); + if (node && node.nodeType === Node.ELEMENT_NODE) { + items.push(node as Element); + } + } + } catch (xpathError) { + console.warn('XPath evaluation failed, trying CSS selector as fallback:', xpathError); + // Fallback to CSS selector + try { + items = document.querySelectorAll(listSelector); + } catch (cssError) { + console.warn('CSS selector fallback also failed:', cssError); + items = []; + } + } + } else { + try { + // Use CSS selector + items = document.querySelectorAll(listSelector); + } catch (cssError) { + console.warn('CSS selector failed:', cssError); + items = []; + } + } + return { url: window.location.href, itemCount: items.length,