@nodebug/browser-element-finder 1.1.6 → 1.1.7
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/index.js +11 -2
- package/index.min.js +1 -1
- package/package.json +1 -1
- package/src/element-definitions.json +2 -2
package/index.js
CHANGED
|
@@ -50,8 +50,8 @@ var ElementFinder = (() => {
|
|
|
50
50
|
checkbox: "(self::input and @type='checkbox') or @role='checkbox'",
|
|
51
51
|
switch: "(self::input and @type='checkbox') or @role='switch' or (self::button and (contains(@class, 'switch') or @data-state))",
|
|
52
52
|
slider: "self::input[@type='range'] or @role='slider'",
|
|
53
|
-
datepicker: "self::input
|
|
54
|
-
colorpicker: "self::input
|
|
53
|
+
datepicker: "self::input[@type='date'] or @role='date'",
|
|
54
|
+
colorpicker: "self::input[@type='color'] or @role='color'",
|
|
55
55
|
radio: "(self::input and @type='radio') or @role='radio'",
|
|
56
56
|
dropdown: "(self::select[descendant::option] or @role='combobox' or @role='listbox' or contains(@class, 'dropdown') or contains(@class, 'trigger') or ancestor::*[contains(@class, 'dropdown') or @role='combobox'])",
|
|
57
57
|
textbox: "self::textarea or (self::input and (@type='text' or @type='password' or @type='search' or @type='email' or @type='number' or @type='tel' or @type='url')) or @role='textbox'",
|
|
@@ -628,6 +628,15 @@ var ElementFinder = (() => {
|
|
|
628
628
|
return sibling;
|
|
629
629
|
}
|
|
630
630
|
}
|
|
631
|
+
for (const sibling of siblings) {
|
|
632
|
+
if (sibling === el) continue;
|
|
633
|
+
const siblingElements = getAllElements(sibling);
|
|
634
|
+
for (let i = 0; i < siblingElements.length; i++) {
|
|
635
|
+
if (matchesType(siblingElements[i], targetType)) {
|
|
636
|
+
return siblingElements[i];
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
}
|
|
631
640
|
return null;
|
|
632
641
|
}
|
|
633
642
|
function findProbableElements(elementType, attributeText, exact = false, parent = null) {
|
package/index.min.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var ElementFinder=(()=>{var M=Object.defineProperty;var j=Object.getOwnPropertyDescriptor;var _=Object.getOwnPropertyNames;var F=Object.prototype.hasOwnProperty;var U=(e,t)=>{for(var n in t)M(e,n,{get:t[n],enumerable:!0})},V=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of _(t))!F.call(e,r)&&r!==n&&M(e,r,{get:()=>t[r],enumerable:!(o=j(t,r))||o.enumerable});return e};var z=e=>V(M({},"__esModule",{value:!0}),e);var oe={};U(oe,{ELEMENT_DEFINITIONS:()=>g,findElementByAttributes:()=>q,findElementByType:()=>$,findElements:()=>Q,findProbableElements:()=>v,getAllElements:()=>w,getAllFrames:()=>N,getBoundingBox:()=>x,getSearchableAttributes:()=>H,getValidAttributes:()=>re,getValidTypes:()=>ne,highlight:()=>ee,matchesAttribute:()=>y,matchesType:()=>b,parseCondition:()=>k,parseXPath:()=>p,setSearchableAttributes:()=>W,splitByOperator:()=>T,unhighlight:()=>te});var I={link:"self::a or @role='link' or @href",navigation:"@role='navigation' or self::nav",heading:"@role='heading' or self::h1 or self::h2 or self::h3 or self::h4 or self::h5 or self::h6",button:"self::button or @role='button' or @type='button' or @type='submit'",checkbox:"(self::input and @type='checkbox') or @role='checkbox'",switch:"(self::input and @type='checkbox') or @role='switch' or (self::button and (contains(@class, 'switch') or @data-state))",slider:"self::input[@type='range'] or @role='slider'",datepicker:"self::input and @type='date'",colorpicker:"self::input and @type='color'",radio:"(self::input and @type='radio') or @role='radio'",dropdown:"(self::select[descendant::option] or @role='combobox' or @role='listbox' or contains(@class, 'dropdown') or contains(@class, 'trigger') or ancestor::*[contains(@class, 'dropdown') or @role='combobox'])",textbox:"self::textarea or (self::input and (@type='text' or @type='password' or @type='search' or @type='email' or @type='number' or @type='tel' or @type='url')) or @role='textbox'",file:"self::input and @type='file'",list:"self::ul or self::ol or @role='list'",listitem:"self::li or @role='listitem'",menu:"self::menu or @role='menu'",menuitem:"@role='menuitem'",toolbar:"@role='toolbar'",dialog:"@role='dialog'",table:"self::table or @role='table'",row:"self::tr or @role='row'",column:"self::td or self::th or @role='cell' or @role='gridcell' or @role='columnheader'",cell:"self::td or @role='cell' or @role='gridcell'",image:"self::img or @role='img' or @alt",element:"true()"};var O=["placeholder","value","data-test-id","data-testid","id","resource-id","name","aria-label","hint","title","tooltip","alt","src","aria-labelledby"];var h={selfWithTag:/^self::([a-zA-Z0-9-]+)(?:\[([^\]]+)\])?$/,contains:/contains\(@([a-zA-Z0-9-]+),\s*['"]([^'"]+)['"]\)/i,attrEquals:/@([a-zA-Z0-9-]+)\s*=\s*['"]([^'"]*)['"]/,attrExists:/^@([a-zA-Z0-9-]+)$/,descendant:/descendant::([a-zA-Z0-9-]+)/i,ancestor:/ancestor::\*\[([^\]]+)\]/i,operatorOr:/^\s*\bor\b\s*/i,operatorAnd:/^\s*\band\b\s*/i},Z=100,S=new Map;for(let[e,t]of Object.entries(I))t==="true()"?S.set(e,()=>!0):S.set(e,n=>p(t,n));var E=O;function W(e){if(!Array.isArray(e))throw new TypeError("attributes must be an array");E=e}function H(){return[...E]}function p(e,t,n=0){if(e==null||t==null)return!1;if(n>Z)throw new Error("XPath expression exceeds maximum recursion depth");if(e=e.trim(),e==="true()")return!0;if(e[0]==="("&&e[e.length-1]===")"){let s=1,l=!0;for(let a=1;a<e.length-1;a++)if(e[a]==="("?s++:e[a]===")"&&s--,s===0){l=!1;break}if(l)return p(e.slice(1,-1),t,n+1)}let o=T(e,"or");if(o.length>1){for(let s of o)if(p(s,t,n+1))return!0;return!1}let r=T(e,"and");if(r.length>1){for(let s of r)if(!p(s,t,n+1))return!1;return!0}return k(e,t,n)}function T(e,t){let n=[],o=0,r="",s=!1,l="",a=t==="or"?h.operatorOr:h.operatorAnd;for(let i=0;i<e.length;i++){let f=e[i];if((f==="'"||f==='"')&&(i===0||e[i-1]!=="\\")&&(s?f===l&&(s=!1):(s=!0,l=f)),!s&&(f==="("?o++:f===")"&&o--,o===0)){let u=e.slice(i).match(a);if(u){n.push(r.trim()),i+=u[0].length-1,r="";continue}}r+=f}return r.trim()&&n.push(r.trim()),n}function k(e,t,n=0){if(e==null||t==null)return!1;e=e.trim();let o=e.match(h.selfWithTag);if(o){let f=o[1].toUpperCase();return t.tagName!==f?!1:o[2]?p(o[2],t,n+1):!0}let r=e.match(h.contains);if(r)return(t.getAttribute(r[1])||"").toLowerCase().includes(r[2].toLowerCase());let s=e.match(h.attrEquals);if(s)return t.getAttribute(s[1])===s[2];let l=e.match(h.attrExists);if(l)return t.hasAttribute(l[1]);let a=e.match(h.descendant);if(a)return t.querySelector(a[1])!==null;let i=e.match(h.ancestor);if(i){let f=t.parentElement;for(;f;){if(p(i[1],f,n+1))return!0;f=f.parentElement}return!1}return!1}var g=Object.freeze(I);function L(e){let t="";for(let n=0;n<e.childNodes.length;n++){let o=e.childNodes[n];o.nodeType===Node.TEXT_NODE&&(t+=o.textContent)}return t.trim()}function G(e){if(e.tagName==="STYLE"||e.tagName==="SCRIPT"||e.querySelector("STYLE, SCRIPT"))return!0;let t=e.parentElement;for(;t;){if(t.tagName==="STYLE"||t.tagName==="SCRIPT")return!0;t=t.parentElement}return!1}function R(e){let t=e.getAttribute("aria-labelledby");if(!t)return"";let n=t.split(/\s+/),o="";for(let r of n)try{let s=document.getElementById(r);s&&(o+=s.textContent)}catch(s){}return o}function y(e,t,n=!1){if(e==null)return!1;if(t==null||t==="")return!0;if(G(e))return!1;let o=E;for(let l=0;l<o.length;l++){let a=o[l],i;try{i=e.getAttribute(a)}catch(f){continue}if(i){if(a==="aria-labelledby"){if(n?i===t:i.includes(t))return!0;let f=R(e);if(f&&(n?f===t:f.includes(t)))return!0}else if(n?i===t:i.includes(t))return!0}}let r=L(e);if(n?r===t:r.includes(t))return!0;let s=e.textContent;return!!(n?s.trim()===t:s.includes(t))}function b(e,t){if(e==null)return!1;let n=S.get(t);return n?n(e):!1}function w(e=document){let t=[];if(e==null)return t;let n=e.nodeType===Node.DOCUMENT_NODE?e.documentElement:e;if(!n)return t;let o=[n];for(;o.length>0;){let r=o.pop();if(r.nodeType!==Node.ELEMENT_NODE||r.tagName==="SCRIPT"||r.tagName==="STYLE")continue;t.push(r);let s=r.children;for(let l=s.length-1;l>=0;l--)o.push(s[l]);try{if(r.shadowRoot){let l=r.shadowRoot.children;for(let a=l.length-1;a>=0;a--)o.push(l[a])}}catch(l){}}return t}function N(e=window){let t=[];try{t.push({window:e,document:e.document,isMainFrame:!0,frameIndex:-1});let n=e.document.querySelectorAll("iframe");for(let o=0;o<n.length;o++){let r=n[o];try{r.contentWindow&&r.contentDocument&&t.push({window:r.contentWindow,document:r.contentDocument,isMainFrame:!1,frameElement:r,frameIndex:o})}catch(s){s.name==="SecurityError"?console.warn("Skipping cross-origin iframe:",s.message):console.warn("Error accessing iframe:",s.message)}}}catch(n){console.warn("Error getting frames:",n.message)}return t}function x(e){let t=e.getBoundingClientRect();return{x:t.x,y:t.y,width:t.width,height:t.height,top:t.top,bottom:t.bottom,left:t.left,right:t.right,midx:t.x+t.width/2,midy:t.y+t.height/2,tagName:e.tagName.toLowerCase()}}function $(e="element",t=null){if(e==null&&(e="element"),typeof e!="string")throw new TypeError(`type must be a string, got ${typeof e}`);if(e&&!g[e])return console.warn(`Unknown element type: ${e}. Valid types: ${Object.keys(g).join(", ")}`),{elements:[]};let n=[],o=N(window);for(let l of o){let a=w(t||l.document);for(let i=0;i<a.length;i++){let f=a[i];e&&!b(f,e)||n.push({element:f,frame:l})}}let r=[];if(n.length>0){let l=new Set(n.map(i=>i.element)),a=new Set;for(let i=n.length-1;i>=0;i--){let f=n[i],c=f.element;if(!a.has(c)){r.unshift(f);let u=c.parentElement;for(;u;)l.has(u)&&a.add(u),u=u.parentElement}}}return{elements:r.map(l=>{let a=x(l.element),i=l.element.tagName.toLowerCase();return l.frame.isMainFrame?{element:l.element,boundingBox:a,tagName:i,frameIndex:l.frame.frameIndex}:{boundingBox:a,tagName:i,frameIndex:l.frame.frameIndex}})}}function q(e,t=!1,n=null){if(e==null&&(e=""),typeof e!="string")throw new TypeError(`value must be a string, got ${typeof e}`);let o=[],r=N(window);for(let a of r){let i=w(n||a.document);for(let f=0;f<i.length;f++){let c=i[f];y(c,e,t)&&o.push({element:c,frame:a})}}return{elements:o.filter(a=>{let i=a.element;if(B(i,e,t))return!0;for(let c of o)if(c.element!==i&&i.contains(c.element))return!1;return!0}).map(a=>{let i=x(a.element),f=a.element.tagName.toLowerCase();return a.frame.isMainFrame?{element:a.element,boundingBox:i,tagName:f,frameIndex:a.frame.frameIndex}:{boundingBox:i,tagName:f,frameIndex:a.frame.frameIndex}})}}function B(e,t,n=!1){if(t==null||t==="")return!0;let o=E;for(let s=0;s<o.length;s++){let l=o[s],a;try{a=e.getAttribute(l)}catch(i){continue}if(a){if(l==="aria-labelledby"){if(n?a===t:a.includes(t))return!0;let i=R(e);if(i&&(n?i===t:i.includes(t)))return!0}else if(n?a===t:a.includes(t))return!0}}let r=L(e);return!!(n?r===t:r.includes(t))}function Q(e=null,t=null,n=!1,o=null){if(t==null&&(t=""),e!=null){if(typeof e!="string")throw new TypeError(`type must be a string, got ${typeof e}`);if(!g[e])return console.warn(`Unknown element type: ${e}. Valid types: ${Object.keys(g).join(", ")}`),{elements:[]}}if(t!==""&&typeof t!="string")throw new TypeError(`text must be a string, got ${typeof t}`);let r=[],s=N(window);for(let i of s){let f=w(o||i.document);for(let c=0;c<f.length;c++){let u=f[c];e!=null&&!b(u,e)||t!==""&&!y(u,t,n)||r.push({element:u,frame:i})}}return{elements:(t!==""?r.filter(i=>{let f=i.element;if(B(f,t,n))return!0;for(let u of r)if(u.element!==f&&f.contains(u.element))return!1;return!0}):r).map(i=>{let f=x(i.element),c=i.element.tagName.toLowerCase();return i.frame.isMainFrame?{element:i.element,boundingBox:f,tagName:c,frameIndex:i.frame.frameIndex}:{boundingBox:f,tagName:c,frameIndex:i.frame.frameIndex}})}}function C(e){if(e.parentElement)return e.parentElement;try{let t=e.getRootNode();if(t&&t.host)return t.host}catch(t){}return null}function J(e){let t=C(e);if(!t)return[];if(t.shadowRoot)try{return Array.from(t.shadowRoot.children)}catch(n){return[]}return Array.from(t.children)}function K(e,t){let n=C(e);for(;n;){if(b(n,t))return n;n=C(n)}let o=e.children||[];for(let s of o)if(b(s,t))return s;let r=J(e);for(let s of r)if(s!==e&&b(s,t))return s;return null}function v(e,t,n=!1,o=null){let r=e!=null&&e!=="",s=t!=null&&t!=="";if(r&&!s)return $(e,o);if(!r&&s)return q(t,n,o);if(r){if(typeof e!="string")throw new TypeError(`elementType must be a string, got ${typeof e}`);if(!g[e])return console.warn(`Unknown element type: ${e}. Valid types: ${Object.keys(g).join(", ")}`),{elements:[]}}if(s&&typeof t!="string")throw new TypeError(`attributeText must be a string, got ${typeof t}`);let l=[],a=N(window);for(let c of a){let u=w(o||c.document);for(let d=0;d<u.length;d++){let m=u[d];r&&!b(m,e)||s&&!y(m,t,n)||l.push({element:m,frame:c})}}if(l.length===0&&r&&s){let c=[];for(let d of a){let m=w(o||d.document);for(let A=0;A<m.length;A++){let D=m[A];y(D,t,n)&&c.push({element:D,frame:d})}}let u=new Set;for(let d of c){let m=K(d.element,e);m&&!u.has(m)&&(u.add(m),l.push({element:m,frame:d.frame}))}}return{elements:(s?l.filter(c=>{let u=c.element;if(B(u,t,n))return!0;for(let m of l)if(m.element!==u&&u.contains(m.element))return!1;return!0}):l).map(c=>{let u=x(c.element),d=c.element.tagName.toLowerCase();return c.frame.isMainFrame?{element:c.element,boundingBox:u,tagName:d,frameIndex:c.frame.frameIndex}:{boundingBox:u,tagName:d,frameIndex:c.frame.frameIndex}})}}function P(e){return e?e&&e.elements&&Array.isArray(e.elements)?e.elements:Array.isArray(e)?e:[e]:[]}function ee(e,t="red",n=3){let o=P(e);for(let r=0;r<o.length;r++){let s=o[r],l=s.element?s.element:s;l&&l.style&&(l.style.outline=`${n}px solid ${t}`,l.style.outlineOffset="2px",l.style.boxShadow="0 0 0 2px rgba(255, 255, 255, 0.8)",l.classList.add("elementfinder-highlighted"))}}function te(e){let t=P(e);for(let n=0;n<t.length;n++){let o=t[n],r=o.element?o.element:o;r&&r.style&&(r.style.outline="",r.style.outlineOffset="",r.style.boxShadow="",r.classList.remove("elementfinder-highlighted"))}}function ne(){return Object.keys(g)}function re(){return[...E]}return z(oe);})();
|
|
1
|
+
var ElementFinder=(()=>{var M=Object.defineProperty;var j=Object.getOwnPropertyDescriptor;var _=Object.getOwnPropertyNames;var F=Object.prototype.hasOwnProperty;var U=(e,t)=>{for(var n in t)M(e,n,{get:t[n],enumerable:!0})},V=(e,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of _(t))!F.call(e,r)&&r!==n&&M(e,r,{get:()=>t[r],enumerable:!(i=j(t,r))||i.enumerable});return e};var z=e=>V(M({},"__esModule",{value:!0}),e);var oe={};U(oe,{ELEMENT_DEFINITIONS:()=>p,findElementByAttributes:()=>q,findElementByType:()=>$,findElements:()=>Q,findProbableElements:()=>v,getAllElements:()=>w,getAllFrames:()=>N,getBoundingBox:()=>x,getSearchableAttributes:()=>H,getValidAttributes:()=>re,getValidTypes:()=>ne,highlight:()=>ee,matchesAttribute:()=>y,matchesType:()=>g,parseCondition:()=>k,parseXPath:()=>b,setSearchableAttributes:()=>W,splitByOperator:()=>T,unhighlight:()=>te});var I={link:"self::a or @role='link' or @href",navigation:"@role='navigation' or self::nav",heading:"@role='heading' or self::h1 or self::h2 or self::h3 or self::h4 or self::h5 or self::h6",button:"self::button or @role='button' or @type='button' or @type='submit'",checkbox:"(self::input and @type='checkbox') or @role='checkbox'",switch:"(self::input and @type='checkbox') or @role='switch' or (self::button and (contains(@class, 'switch') or @data-state))",slider:"self::input[@type='range'] or @role='slider'",datepicker:"self::input[@type='date'] or @role='date'",colorpicker:"self::input[@type='color'] or @role='color'",radio:"(self::input and @type='radio') or @role='radio'",dropdown:"(self::select[descendant::option] or @role='combobox' or @role='listbox' or contains(@class, 'dropdown') or contains(@class, 'trigger') or ancestor::*[contains(@class, 'dropdown') or @role='combobox'])",textbox:"self::textarea or (self::input and (@type='text' or @type='password' or @type='search' or @type='email' or @type='number' or @type='tel' or @type='url')) or @role='textbox'",file:"self::input and @type='file'",list:"self::ul or self::ol or @role='list'",listitem:"self::li or @role='listitem'",menu:"self::menu or @role='menu'",menuitem:"@role='menuitem'",toolbar:"@role='toolbar'",dialog:"@role='dialog'",table:"self::table or @role='table'",row:"self::tr or @role='row'",column:"self::td or self::th or @role='cell' or @role='gridcell' or @role='columnheader'",cell:"self::td or @role='cell' or @role='gridcell'",image:"self::img or @role='img' or @alt",element:"true()"};var O=["placeholder","value","data-test-id","data-testid","id","resource-id","name","aria-label","hint","title","tooltip","alt","src","aria-labelledby"];var h={selfWithTag:/^self::([a-zA-Z0-9-]+)(?:\[([^\]]+)\])?$/,contains:/contains\(@([a-zA-Z0-9-]+),\s*['"]([^'"]+)['"]\)/i,attrEquals:/@([a-zA-Z0-9-]+)\s*=\s*['"]([^'"]*)['"]/,attrExists:/^@([a-zA-Z0-9-]+)$/,descendant:/descendant::([a-zA-Z0-9-]+)/i,ancestor:/ancestor::\*\[([^\]]+)\]/i,operatorOr:/^\s*\bor\b\s*/i,operatorAnd:/^\s*\band\b\s*/i},Z=100,S=new Map;for(let[e,t]of Object.entries(I))t==="true()"?S.set(e,()=>!0):S.set(e,n=>b(t,n));var E=O;function W(e){if(!Array.isArray(e))throw new TypeError("attributes must be an array");E=e}function H(){return[...E]}function b(e,t,n=0){if(e==null||t==null)return!1;if(n>Z)throw new Error("XPath expression exceeds maximum recursion depth");if(e=e.trim(),e==="true()")return!0;if(e[0]==="("&&e[e.length-1]===")"){let o=1,l=!0;for(let a=1;a<e.length-1;a++)if(e[a]==="("?o++:e[a]===")"&&o--,o===0){l=!1;break}if(l)return b(e.slice(1,-1),t,n+1)}let i=T(e,"or");if(i.length>1){for(let o of i)if(b(o,t,n+1))return!0;return!1}let r=T(e,"and");if(r.length>1){for(let o of r)if(!b(o,t,n+1))return!1;return!0}return k(e,t,n)}function T(e,t){let n=[],i=0,r="",o=!1,l="",a=t==="or"?h.operatorOr:h.operatorAnd;for(let s=0;s<e.length;s++){let f=e[s];if((f==="'"||f==='"')&&(s===0||e[s-1]!=="\\")&&(o?f===l&&(o=!1):(o=!0,l=f)),!o&&(f==="("?i++:f===")"&&i--,i===0)){let u=e.slice(s).match(a);if(u){n.push(r.trim()),s+=u[0].length-1,r="";continue}}r+=f}return r.trim()&&n.push(r.trim()),n}function k(e,t,n=0){if(e==null||t==null)return!1;e=e.trim();let i=e.match(h.selfWithTag);if(i){let f=i[1].toUpperCase();return t.tagName!==f?!1:i[2]?b(i[2],t,n+1):!0}let r=e.match(h.contains);if(r)return(t.getAttribute(r[1])||"").toLowerCase().includes(r[2].toLowerCase());let o=e.match(h.attrEquals);if(o)return t.getAttribute(o[1])===o[2];let l=e.match(h.attrExists);if(l)return t.hasAttribute(l[1]);let a=e.match(h.descendant);if(a)return t.querySelector(a[1])!==null;let s=e.match(h.ancestor);if(s){let f=t.parentElement;for(;f;){if(b(s[1],f,n+1))return!0;f=f.parentElement}return!1}return!1}var p=Object.freeze(I);function L(e){let t="";for(let n=0;n<e.childNodes.length;n++){let i=e.childNodes[n];i.nodeType===Node.TEXT_NODE&&(t+=i.textContent)}return t.trim()}function G(e){if(e.tagName==="STYLE"||e.tagName==="SCRIPT"||e.querySelector("STYLE, SCRIPT"))return!0;let t=e.parentElement;for(;t;){if(t.tagName==="STYLE"||t.tagName==="SCRIPT")return!0;t=t.parentElement}return!1}function R(e){let t=e.getAttribute("aria-labelledby");if(!t)return"";let n=t.split(/\s+/),i="";for(let r of n)try{let o=document.getElementById(r);o&&(i+=o.textContent)}catch(o){}return i}function y(e,t,n=!1){if(e==null)return!1;if(t==null||t==="")return!0;if(G(e))return!1;let i=E;for(let l=0;l<i.length;l++){let a=i[l],s;try{s=e.getAttribute(a)}catch(f){continue}if(s){if(a==="aria-labelledby"){if(n?s===t:s.includes(t))return!0;let f=R(e);if(f&&(n?f===t:f.includes(t)))return!0}else if(n?s===t:s.includes(t))return!0}}let r=L(e);if(n?r===t:r.includes(t))return!0;let o=e.textContent;return!!(n?o.trim()===t:o.includes(t))}function g(e,t){if(e==null)return!1;let n=S.get(t);return n?n(e):!1}function w(e=document){let t=[];if(e==null)return t;let n=e.nodeType===Node.DOCUMENT_NODE?e.documentElement:e;if(!n)return t;let i=[n];for(;i.length>0;){let r=i.pop();if(r.nodeType!==Node.ELEMENT_NODE||r.tagName==="SCRIPT"||r.tagName==="STYLE")continue;t.push(r);let o=r.children;for(let l=o.length-1;l>=0;l--)i.push(o[l]);try{if(r.shadowRoot){let l=r.shadowRoot.children;for(let a=l.length-1;a>=0;a--)i.push(l[a])}}catch(l){}}return t}function N(e=window){let t=[];try{t.push({window:e,document:e.document,isMainFrame:!0,frameIndex:-1});let n=e.document.querySelectorAll("iframe");for(let i=0;i<n.length;i++){let r=n[i];try{r.contentWindow&&r.contentDocument&&t.push({window:r.contentWindow,document:r.contentDocument,isMainFrame:!1,frameElement:r,frameIndex:i})}catch(o){o.name==="SecurityError"?console.warn("Skipping cross-origin iframe:",o.message):console.warn("Error accessing iframe:",o.message)}}}catch(n){console.warn("Error getting frames:",n.message)}return t}function x(e){let t=e.getBoundingClientRect();return{x:t.x,y:t.y,width:t.width,height:t.height,top:t.top,bottom:t.bottom,left:t.left,right:t.right,midx:t.x+t.width/2,midy:t.y+t.height/2,tagName:e.tagName.toLowerCase()}}function $(e="element",t=null){if(e==null&&(e="element"),typeof e!="string")throw new TypeError(`type must be a string, got ${typeof e}`);if(e&&!p[e])return console.warn(`Unknown element type: ${e}. Valid types: ${Object.keys(p).join(", ")}`),{elements:[]};let n=[],i=N(window);for(let l of i){let a=w(t||l.document);for(let s=0;s<a.length;s++){let f=a[s];e&&!g(f,e)||n.push({element:f,frame:l})}}let r=[];if(n.length>0){let l=new Set(n.map(s=>s.element)),a=new Set;for(let s=n.length-1;s>=0;s--){let f=n[s],c=f.element;if(!a.has(c)){r.unshift(f);let u=c.parentElement;for(;u;)l.has(u)&&a.add(u),u=u.parentElement}}}return{elements:r.map(l=>{let a=x(l.element),s=l.element.tagName.toLowerCase();return l.frame.isMainFrame?{element:l.element,boundingBox:a,tagName:s,frameIndex:l.frame.frameIndex}:{boundingBox:a,tagName:s,frameIndex:l.frame.frameIndex}})}}function q(e,t=!1,n=null){if(e==null&&(e=""),typeof e!="string")throw new TypeError(`value must be a string, got ${typeof e}`);let i=[],r=N(window);for(let a of r){let s=w(n||a.document);for(let f=0;f<s.length;f++){let c=s[f];y(c,e,t)&&i.push({element:c,frame:a})}}return{elements:i.filter(a=>{let s=a.element;if(B(s,e,t))return!0;for(let c of i)if(c.element!==s&&s.contains(c.element))return!1;return!0}).map(a=>{let s=x(a.element),f=a.element.tagName.toLowerCase();return a.frame.isMainFrame?{element:a.element,boundingBox:s,tagName:f,frameIndex:a.frame.frameIndex}:{boundingBox:s,tagName:f,frameIndex:a.frame.frameIndex}})}}function B(e,t,n=!1){if(t==null||t==="")return!0;let i=E;for(let o=0;o<i.length;o++){let l=i[o],a;try{a=e.getAttribute(l)}catch(s){continue}if(a){if(l==="aria-labelledby"){if(n?a===t:a.includes(t))return!0;let s=R(e);if(s&&(n?s===t:s.includes(t)))return!0}else if(n?a===t:a.includes(t))return!0}}let r=L(e);return!!(n?r===t:r.includes(t))}function Q(e=null,t=null,n=!1,i=null){if(t==null&&(t=""),e!=null){if(typeof e!="string")throw new TypeError(`type must be a string, got ${typeof e}`);if(!p[e])return console.warn(`Unknown element type: ${e}. Valid types: ${Object.keys(p).join(", ")}`),{elements:[]}}if(t!==""&&typeof t!="string")throw new TypeError(`text must be a string, got ${typeof t}`);let r=[],o=N(window);for(let s of o){let f=w(i||s.document);for(let c=0;c<f.length;c++){let u=f[c];e!=null&&!g(u,e)||t!==""&&!y(u,t,n)||r.push({element:u,frame:s})}}return{elements:(t!==""?r.filter(s=>{let f=s.element;if(B(f,t,n))return!0;for(let u of r)if(u.element!==f&&f.contains(u.element))return!1;return!0}):r).map(s=>{let f=x(s.element),c=s.element.tagName.toLowerCase();return s.frame.isMainFrame?{element:s.element,boundingBox:f,tagName:c,frameIndex:s.frame.frameIndex}:{boundingBox:f,tagName:c,frameIndex:s.frame.frameIndex}})}}function C(e){if(e.parentElement)return e.parentElement;try{let t=e.getRootNode();if(t&&t.host)return t.host}catch(t){}return null}function J(e){let t=C(e);if(!t)return[];if(t.shadowRoot)try{return Array.from(t.shadowRoot.children)}catch(n){return[]}return Array.from(t.children)}function K(e,t){let n=C(e);for(;n;){if(g(n,t))return n;n=C(n)}let i=e.children||[];for(let o of i)if(g(o,t))return o;let r=J(e);for(let o of r)if(o!==e&&g(o,t))return o;for(let o of r){if(o===e)continue;let l=w(o);for(let a=0;a<l.length;a++)if(g(l[a],t))return l[a]}return null}function v(e,t,n=!1,i=null){let r=e!=null&&e!=="",o=t!=null&&t!=="";if(r&&!o)return $(e,i);if(!r&&o)return q(t,n,i);if(r){if(typeof e!="string")throw new TypeError(`elementType must be a string, got ${typeof e}`);if(!p[e])return console.warn(`Unknown element type: ${e}. Valid types: ${Object.keys(p).join(", ")}`),{elements:[]}}if(o&&typeof t!="string")throw new TypeError(`attributeText must be a string, got ${typeof t}`);let l=[],a=N(window);for(let c of a){let u=w(i||c.document);for(let d=0;d<u.length;d++){let m=u[d];r&&!g(m,e)||o&&!y(m,t,n)||l.push({element:m,frame:c})}}if(l.length===0&&r&&o){let c=[];for(let d of a){let m=w(i||d.document);for(let A=0;A<m.length;A++){let D=m[A];y(D,t,n)&&c.push({element:D,frame:d})}}let u=new Set;for(let d of c){let m=K(d.element,e);m&&!u.has(m)&&(u.add(m),l.push({element:m,frame:d.frame}))}}return{elements:(o?l.filter(c=>{let u=c.element;if(B(u,t,n))return!0;for(let m of l)if(m.element!==u&&u.contains(m.element))return!1;return!0}):l).map(c=>{let u=x(c.element),d=c.element.tagName.toLowerCase();return c.frame.isMainFrame?{element:c.element,boundingBox:u,tagName:d,frameIndex:c.frame.frameIndex}:{boundingBox:u,tagName:d,frameIndex:c.frame.frameIndex}})}}function P(e){return e?e&&e.elements&&Array.isArray(e.elements)?e.elements:Array.isArray(e)?e:[e]:[]}function ee(e,t="red",n=3){let i=P(e);for(let r=0;r<i.length;r++){let o=i[r],l=o.element?o.element:o;l&&l.style&&(l.style.outline=`${n}px solid ${t}`,l.style.outlineOffset="2px",l.style.boxShadow="0 0 0 2px rgba(255, 255, 255, 0.8)",l.classList.add("elementfinder-highlighted"))}}function te(e){let t=P(e);for(let n=0;n<t.length;n++){let i=t[n],r=i.element?i.element:i;r&&r.style&&(r.style.outline="",r.style.outlineOffset="",r.style.boxShadow="",r.classList.remove("elementfinder-highlighted"))}}function ne(){return Object.keys(p)}function re(){return[...E]}return z(oe);})();
|
package/package.json
CHANGED
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
"checkbox": "(self::input and @type='checkbox') or @role='checkbox'",
|
|
7
7
|
"switch": "(self::input and @type='checkbox') or @role='switch' or (self::button and (contains(@class, 'switch') or @data-state))",
|
|
8
8
|
"slider": "self::input[@type='range'] or @role='slider'",
|
|
9
|
-
"datepicker": "self::input
|
|
10
|
-
"colorpicker": "self::input
|
|
9
|
+
"datepicker": "self::input[@type='date'] or @role='date'",
|
|
10
|
+
"colorpicker": "self::input[@type='color'] or @role='color'",
|
|
11
11
|
"radio": "(self::input and @type='radio') or @role='radio'",
|
|
12
12
|
"dropdown": "(self::select[descendant::option] or @role='combobox' or @role='listbox' or contains(@class, 'dropdown') or contains(@class, 'trigger') or ancestor::*[contains(@class, 'dropdown') or @role='combobox'])",
|
|
13
13
|
"textbox": "self::textarea or (self::input and (@type='text' or @type='password' or @type='search' or @type='email' or @type='number' or @type='tel' or @type='url')) or @role='textbox'",
|