From 0fce84a3843ad43c06dcdd4655a3d3aa02917d3d Mon Sep 17 00:00:00 2001 From: pedrohsdb Date: Wed, 1 Oct 2025 11:24:43 -0700 Subject: [PATCH] skip malformed css selector (#3577) --- skyvern/webeye/scraper/domUtils.js | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/skyvern/webeye/scraper/domUtils.js b/skyvern/webeye/scraper/domUtils.js index 802595a5..89e7c095 100644 --- a/skyvern/webeye/scraper/domUtils.js +++ b/skyvern/webeye/scraper/domUtils.js @@ -763,7 +763,11 @@ function isHoverPointerElement(element, hoverStylesMap) { } } if (shouldMatch || selector.includes(tagName)) { - if (element.matches(selector) && styles.cursor === "pointer") { + if ( + isValidCSSSelector(selector) && + element.matches(selector) && + styles.cursor === "pointer" + ) { return true; } } @@ -2192,6 +2196,11 @@ async function getHoverStylesMap() { // Get base selector without :hover const baseSelector = hoverPart.replace(/:hover/g, "").trim(); + // Skip invalid CSS selectors + if (!isValidCSSSelector(baseSelector)) { + continue; + } + // Get or create styles object for this selector let styles = hoverMap.get(baseSelector) || {}; @@ -2204,13 +2213,16 @@ async function getHoverStylesMap() { // store it in a special format if (parts.length > 1) { const fullSelector = selector; - styles["__nested__"] = styles["__nested__"] || []; - styles["__nested__"].push({ - selector: fullSelector, - styles: Object.fromEntries( - [...rule.style].map((prop) => [prop, rule.style[prop]]), - ), - }); + // Skip if the full selector is invalid + if (isValidCSSSelector(fullSelector)) { + styles["__nested__"] = styles["__nested__"] || []; + styles["__nested__"].push({ + selector: fullSelector, + styles: Object.fromEntries( + [...rule.style].map((prop) => [prop, rule.style[prop]]), + ), + }); + } } // only need the style which includes the cursor attribute.