ff-dom 1.0.18-beta.1 → 1.0.18-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cdn.js CHANGED
@@ -2,8 +2,8 @@
2
2
  'use strict';
3
3
 
4
4
  const reWhiteSpace$1 = /^[\S]+( [\S]+)*$/gi;
5
+ let cspEnabled = false;
5
6
  const xpathCache$1 = {};
6
- let multiElementReferenceMode = false;
7
7
  let relativeXPathCache = new Map();
8
8
  let modifiedElementAttributes$1 = [];
9
9
  let mutationObserver;
@@ -62,7 +62,7 @@
62
62
  const getFilteredText = (element) => {
63
63
  return element?.childNodes[0]?.nodeValue || "";
64
64
  };
65
- const getCountOfXPath = (xpath, element, docmt) => {
65
+ const getCountOfXPath = (xpath, element, docmt, multiElementReferenceMode = false) => {
66
66
  try {
67
67
  let count;
68
68
  // Check if result is cached
@@ -76,7 +76,23 @@
76
76
  count = owner.evaluate(`count(${xpath})`, docmt, null, XPathResult.NUMBER_TYPE, null).numberValue;
77
77
  xpathCache$1[xpath] = count;
78
78
  }
79
- if (multiElementReferenceMode && Array.isArray(element)) ;
79
+ if (multiElementReferenceMode && Array.isArray(element)) {
80
+ if (count > 1) {
81
+ const elementsFromXpath = getElementFromXpath(xpath, docmt, true);
82
+ let nodex, matchedCount = 0;
83
+ if (elementsFromXpath instanceof XPathResult) {
84
+ while ((nodex = elementsFromXpath?.iterateNext())) {
85
+ if (element.includes(nodex)) {
86
+ matchedCount += 1;
87
+ if (matchedCount === 2)
88
+ break;
89
+ }
90
+ }
91
+ }
92
+ if (matchedCount !== 2)
93
+ return 0;
94
+ }
95
+ }
80
96
  else {
81
97
  // Short-circuit if we only need to match one element
82
98
  if (count === 1) {
@@ -215,12 +231,6 @@
215
231
  ? "self"
216
232
  : "";
217
233
  };
218
- const findRoot = (node) => {
219
- while (node && node.parentNode) {
220
- node = node.parentNode;
221
- }
222
- return node;
223
- };
224
234
  const isSvg = (element) => {
225
235
  return element instanceof SVGElement;
226
236
  };
@@ -462,9 +472,9 @@
462
472
  while (currentNode) {
463
473
  let xpathe = "";
464
474
  let hasUniqueAttr = false;
465
- let attributes = domNode === currentNode ? attributesArray : currentNode.attributes;
475
+ let attributes = domNode === currentNode ? attributesArray ?? currentNode.attributes : currentNode.attributes;
466
476
  // Loop through attributes to check for unique identifiers
467
- for (const attrName of attributes) {
477
+ for (const attrName of Array.from(attributes)) {
468
478
  if (checkBlockedAttributes(attrName, currentNode, isTarget)) {
469
479
  let attrValue = attrName.nodeValue;
470
480
  // Clean up attribute value
@@ -781,7 +791,7 @@
781
791
  }
782
792
  }
783
793
  if (domNode.attributes) {
784
- for (const attrName of domNode.attributes) {
794
+ for (const attrName of Array.from(domNode.attributes)) {
785
795
  if (checkBlockedAttributes(attrName, domNode, isTarget)) {
786
796
  let attrValue = attrName.nodeValue;
787
797
  if (attrValue) {
@@ -858,12 +868,12 @@
858
868
  }
859
869
  return xpaths1;
860
870
  };
861
- function parseXml(xmlStr) {
871
+ const parseXml = (xmlStr) => {
862
872
  if (window.DOMParser) {
863
873
  return new window.DOMParser().parseFromString(xmlStr, "text/xml");
864
874
  }
865
875
  return null;
866
- }
876
+ };
867
877
  const normalizeXPath = (xpath) => {
868
878
  // Replace text() = "value" or text()='value'
869
879
  xpath = xpath.replace(/text\(\)\s*=\s*(['"])(.*?)\1/g, "normalize-space(.)=$1$2$1");
@@ -911,6 +921,7 @@
911
921
  startObserver,
912
922
  stopObserver,
913
923
  modifiedElementAttributes: modifiedElementAttributes$1,
924
+ cspEnabled
914
925
  };
915
926
 
916
927
  let xpathData$1 = [];
@@ -993,7 +1004,7 @@
993
1004
  let currentNode = domNode;
994
1005
  while (currentNode && currentNode.nodeType === 1) {
995
1006
  const hasUniqueAttr = false;
996
- for (const attrName of currentNode.attributes) {
1007
+ for (const attrName of Array.from(currentNode.attributes)) {
997
1008
  if (checkBlockedAttributes(attrName, currentNode, isTarget)) {
998
1009
  let attrValue = attrName.nodeValue;
999
1010
  attrValue = attrValue?.replace("removePointers", "") ?? "";
@@ -1099,7 +1110,7 @@
1099
1110
  }
1100
1111
  // BASE CASE #2: Check for unique attributes
1101
1112
  let uniqueAttrFound = false;
1102
- for (const attr of currentNode.attributes) {
1113
+ for (const attr of Array.from(currentNode.attributes)) {
1103
1114
  if (checkBlockedAttributes(attr, currentNode, isTarget)) {
1104
1115
  let attrValue = attr.nodeValue;
1105
1116
  attrValue = attrValue?.replace("removePointers", "") ?? "";
@@ -1175,7 +1186,7 @@
1175
1186
  do {
1176
1187
  let uniqueAttrFound = false;
1177
1188
  for (currentNode = st.pop(); currentNode !== null;) {
1178
- for (const attr of currentNode.attributes) {
1189
+ for (const attr of Array.from(currentNode.attributes)) {
1179
1190
  if (checkBlockedAttributes(attr, currentNode, true)) {
1180
1191
  let attrValue = attr.nodeValue;
1181
1192
  attrValue = attrValue?.replace("removePointers", "") ?? "";
@@ -1257,7 +1268,7 @@
1257
1268
  const processSibling = (sibling, domNode, docmt, nodeXpath, axis, isTarget) => {
1258
1269
  try {
1259
1270
  if (sibling.hasAttributes()) {
1260
- for (const attr of sibling.attributes) {
1271
+ for (const attr of Array.from(sibling.attributes)) {
1261
1272
  let xpathe = intermediateXpathStep(sibling, {
1262
1273
  name: attr.name,
1263
1274
  value: attr.value,
@@ -1614,13 +1625,13 @@
1614
1625
  const docmt = targetElemt?.ownerDocument || doc;
1615
1626
  const tag = targetElemt.tagName;
1616
1627
  const { attributes } = targetElemt;
1617
- addAllXPathAttributes([...attributes], targetElemt, docmt, isIndex, isTarget);
1628
+ addAllXPathAttributes(Array.from(attributes), targetElemt, docmt, isIndex, isTarget);
1618
1629
  {
1619
1630
  if (xpathData$1.length) {
1620
1631
  const len = xpathData$1.length;
1621
1632
  for (let i = 0; i < len; i++) {
1622
1633
  let xpth = xpathData$1[i].value;
1623
- xpth = xpth.replace(tag, "*");
1634
+ xpth = "//*" + xpth.substring(xpth.indexOf("//") + 2 + tag.length);
1624
1635
  const count = getCountOfXPath(xpth, element, docmt);
1625
1636
  if (count === 1) {
1626
1637
  xpathData$1.push({
@@ -1633,7 +1644,7 @@
1633
1644
  }
1634
1645
  console.log(xpathData$1);
1635
1646
  if (!xpathData$1.length) {
1636
- addRelativeXpaths(targetElemt, docmt, isIndex, isTarget, [...targetElemt.attributes]);
1647
+ addRelativeXpaths(targetElemt, docmt, isIndex, isTarget, Array.from(targetElemt.attributes));
1637
1648
  }
1638
1649
  return xpathData$1;
1639
1650
  };
@@ -1655,13 +1666,12 @@
1655
1666
  let xpathDataWithIndex = [];
1656
1667
  let xpathData = [];
1657
1668
  const reWhiteSpace = /^[\S]+( [\S]+)*$/gi;
1658
- const findRelativeXpath = (element1, element2, docmt, xpaths1, xpaths2, isIndex) => {
1669
+ const findRelativeXpath = (element1, element2, docmt, xpaths1, xpaths2, isIndex, multiElementReferenceMode = false) => {
1659
1670
  // debugger;
1660
1671
  const par1 = element1.parentElement;
1661
1672
  const par2 = element2.parentElement;
1662
1673
  let rel_xpath = [];
1663
1674
  let tempElement;
1664
- findRoot(element1);
1665
1675
  let finalXpaths = [];
1666
1676
  if (isIndex) {
1667
1677
  if (xpathDataWithIndex.length) {
@@ -1681,14 +1691,14 @@
1681
1691
  // both are same
1682
1692
  if (element1.isSameNode(element2)) {
1683
1693
  // rel_xpath = xpath1 + "/self::" + element1.tagName;
1684
- rel_xpath = getXpathRelationExpression(element1, element2, "self", xpaths1, xpaths2, isIndex);
1694
+ rel_xpath = getXpathRelationExpression(element1, element2, "self", xpaths1, xpaths2, isIndex, multiElementReferenceMode);
1685
1695
  if (rel_xpath)
1686
1696
  finalXpaths = finalXpaths.concat(rel_xpath);
1687
1697
  }
1688
1698
  // parent
1689
1699
  tempElement = element1.parentElement;
1690
1700
  if (tempElement === element2) {
1691
- rel_xpath = getXpathRelationExpression(element1, element2, "parent", xpaths1, xpaths2, isIndex);
1701
+ rel_xpath = getXpathRelationExpression(element1, element2, "parent", xpaths1, xpaths2, isIndex, multiElementReferenceMode);
1692
1702
  if (rel_xpath)
1693
1703
  finalXpaths = finalXpaths.concat(rel_xpath);
1694
1704
  }
@@ -1696,7 +1706,7 @@
1696
1706
  tempElement = element1.parentElement;
1697
1707
  while (tempElement !== null) {
1698
1708
  if (tempElement === element2) {
1699
- rel_xpath = getXpathRelationExpression(element1, element2, "ancestor", xpaths1, xpaths2, isIndex);
1709
+ rel_xpath = getXpathRelationExpression(element1, element2, "ancestor", xpaths1, xpaths2, isIndex, multiElementReferenceMode);
1700
1710
  if (rel_xpath) {
1701
1711
  finalXpaths = finalXpaths.concat(rel_xpath);
1702
1712
  break;
@@ -1708,7 +1718,7 @@
1708
1718
  tempElement = element1;
1709
1719
  do {
1710
1720
  if (tempElement === element2) {
1711
- rel_xpath = getXpathRelationExpression(element1, element2, "ancestor-or-self", xpaths1, xpaths2, isIndex);
1721
+ rel_xpath = getXpathRelationExpression(element1, element2, "ancestor-or-self", xpaths1, xpaths2, isIndex, multiElementReferenceMode);
1712
1722
  if (rel_xpath) {
1713
1723
  finalXpaths = finalXpaths.concat(rel_xpath);
1714
1724
  break;
@@ -1720,7 +1730,7 @@
1720
1730
  if (par1?.isSameNode(par2)) {
1721
1731
  for (let m = element1.nextElementSibling; m != null; m = m.nextElementSibling) {
1722
1732
  if (m != null && m.isSameNode(element2)) {
1723
- rel_xpath = getXpathRelationExpression(element1, element2, "following-sibling", xpaths1, xpaths2, isIndex);
1733
+ rel_xpath = getXpathRelationExpression(element1, element2, "following-sibling", xpaths1, xpaths2, isIndex, multiElementReferenceMode);
1724
1734
  if (rel_xpath) {
1725
1735
  finalXpaths = finalXpaths.concat(rel_xpath);
1726
1736
  break;
@@ -1729,7 +1739,7 @@
1729
1739
  }
1730
1740
  for (let n = element1.previousElementSibling; n != null; n = n.previousElementSibling) {
1731
1741
  if (n != null && n.isSameNode(element2)) {
1732
- rel_xpath = getXpathRelationExpression(element1, element2, "preceding-sibling", xpaths1, xpaths2, isIndex);
1742
+ rel_xpath = getXpathRelationExpression(element1, element2, "preceding-sibling", xpaths1, xpaths2, isIndex, multiElementReferenceMode);
1733
1743
  if (rel_xpath) {
1734
1744
  finalXpaths = finalXpaths.concat(rel_xpath);
1735
1745
  break;
@@ -1741,7 +1751,7 @@
1741
1751
  if (element1?.children?.length) {
1742
1752
  for (let m = element1.children[0]; m !== null; m = m?.nextElementSibling) {
1743
1753
  if (m === element2) {
1744
- rel_xpath = getXpathRelationExpression(element1, element2, "child", xpaths1, xpaths2, isIndex);
1754
+ rel_xpath = getXpathRelationExpression(element1, element2, "child", xpaths1, xpaths2, isIndex, multiElementReferenceMode);
1745
1755
  if (rel_xpath) {
1746
1756
  finalXpaths = finalXpaths.concat(rel_xpath);
1747
1757
  break;
@@ -1752,18 +1762,18 @@
1752
1762
  // following
1753
1763
  const relation = element1.compareDocumentPosition(element2);
1754
1764
  if (relation === 2) {
1755
- rel_xpath = getXpathRelationExpression(element1, element2, "preceding", xpaths1, xpaths2, isIndex);
1765
+ rel_xpath = getXpathRelationExpression(element1, element2, "preceding", xpaths1, xpaths2, isIndex, multiElementReferenceMode);
1756
1766
  }
1757
1767
  if (relation === 4) {
1758
- rel_xpath = getXpathRelationExpression(element1, element2, "following", xpaths1, xpaths2, isIndex);
1768
+ rel_xpath = getXpathRelationExpression(element1, element2, "following", xpaths1, xpaths2, isIndex, multiElementReferenceMode);
1759
1769
  }
1760
1770
  if (rel_xpath) {
1761
1771
  finalXpaths = finalXpaths.concat(rel_xpath);
1762
1772
  }
1763
- const descendantXpath = getDescendantXpath([element1, element2], docmt, xpaths1, xpaths2, "descendant", isIndex);
1773
+ const descendantXpath = getDescendantXpath([element1, element2], docmt, xpaths1, xpaths2, "descendant", isIndex, multiElementReferenceMode);
1764
1774
  if (descendantXpath)
1765
1775
  finalXpaths = finalXpaths.concat(descendantXpath);
1766
- const descendantSelfXpath = getDescendantXpath([element1, element2], docmt, xpaths1, xpaths2, "descedant-or-self", isIndex);
1776
+ const descendantSelfXpath = getDescendantXpath([element1, element2], docmt, xpaths1, xpaths2, "descedant-or-self", isIndex, multiElementReferenceMode);
1767
1777
  if (descendantSelfXpath) {
1768
1778
  finalXpaths = finalXpaths.concat(descendantSelfXpath);
1769
1779
  }
@@ -1780,7 +1790,7 @@
1780
1790
  return [finalXpaths[0]];
1781
1791
  }
1782
1792
  };
1783
- const descendantExpression = (refExpectElement, xpath2, relation, docmt, isIndex, expCommonParentXpathElements, step4, refCommonParentXpathElementLength) => {
1793
+ const descendantExpression = (refExpectElement, xpath2, relation, docmt, isIndex, expCommonParentXpathElements, step4, refCommonParentXpathElementLength = 0, multiElementReferenceMode = false) => {
1784
1794
  let finalExpectedElementXpath = "";
1785
1795
  if (xpath2.split(/\/(?=(?:[^']*\'[^\']*\')*[^\']*$)/g)?.length >=
1786
1796
  expCommonParentXpathElements.length) {
@@ -1794,7 +1804,7 @@
1794
1804
  const traverseXpath = getTraverseXpathExpression(`${step4 +
1795
1805
  (refCommonParentXpathElementLength
1796
1806
  ? "]".repeat(refCommonParentXpathElementLength)
1797
- : "")}`, xpaths2Els, refExpectElement[refExpectElement.length - 1], refExpectElement, docmt, relation, isIndex);
1807
+ : "")}`, xpaths2Els, refExpectElement[refExpectElement.length - 1], refExpectElement, docmt, relation, isIndex, multiElementReferenceMode);
1798
1808
  if (traverseXpath) {
1799
1809
  return traverseXpath;
1800
1810
  }
@@ -1831,7 +1841,7 @@
1831
1841
  }
1832
1842
  }
1833
1843
  };
1834
- const getDescendantXpath = (refExpectElement, docmt, xpaths1, xpaths2, relation, isIndex) => {
1844
+ const getDescendantXpath = (refExpectElement, docmt, xpaths1, xpaths2, relation, isIndex = false, multiElementReferenceMode = false) => {
1835
1845
  const refElement = refExpectElement[refExpectElement.length - 2];
1836
1846
  const expElement = refExpectElement[refExpectElement.length - 1];
1837
1847
  const expElementDocmnt = getShadowRoot(expElement) ?? expElement.ownerDocument;
@@ -1895,13 +1905,13 @@
1895
1905
  xpath2 = xpathData[i].value; // No need to modify the value
1896
1906
  }
1897
1907
  if (xpath2) {
1898
- return descendantExpression(refExpectElement, xpath2, relation, expElementDocmnt || docmt, isIndex, expCommonParentXpathElements, step4, refCommonParentXpathElementLength);
1908
+ return descendantExpression(refExpectElement, xpath2, relation, expElementDocmnt || docmt, isIndex, expCommonParentXpathElements, step4, refCommonParentXpathElementLength, multiElementReferenceMode);
1899
1909
  }
1900
1910
  }
1901
1911
  }
1902
1912
  if (refExpectElement[refExpectElement.length - 2].attributes) {
1903
- for (const attrName of refExpectElement[refExpectElement.length - 2]
1904
- .attributes) {
1913
+ for (const attrName of Array.from(refExpectElement[refExpectElement.length - 2]
1914
+ .attributes)) {
1905
1915
  if (checkBlockedAttributes(attrName, refExpectElement[refExpectElement.length - 2], false)) {
1906
1916
  let attrValue = attrName.nodeValue;
1907
1917
  if (attrValue) {
@@ -1922,13 +1932,13 @@
1922
1932
  else {
1923
1933
  xpath2 = xpathData[i].value; // No need to modify the value
1924
1934
  }
1925
- return descendantExpression(refExpectElement, xpath2, relation, expElementDocmnt || docmt, isIndex, expCommonParentXpathElements, step4, refCommonParentXpathElementLength);
1935
+ return descendantExpression(refExpectElement, xpath2, relation, expElementDocmnt || docmt, isIndex, expCommonParentXpathElements, step4, refCommonParentXpathElementLength, multiElementReferenceMode);
1926
1936
  }
1927
1937
  }
1928
1938
  }
1929
1939
  }
1930
- for (const attrName of refExpectElement[refExpectElement.length - 2]
1931
- .attributes) {
1940
+ for (const attrName of Array.from(refExpectElement[refExpectElement.length - 2]
1941
+ .attributes)) {
1932
1942
  if (checkBlockedAttributes(attrName, refExpectElement[refExpectElement.length - 2], false)) {
1933
1943
  let attrValue = attrName.nodeValue;
1934
1944
  if (attrValue) {
@@ -1953,7 +1963,7 @@
1953
1963
  else {
1954
1964
  xpath2 = xpathData[i].value; // No need to modify the value
1955
1965
  }
1956
- return descendantExpression(refExpectElement, xpath2, relation, expElementDocmnt || docmt, isIndex, expCommonParentXpathElements, step4, refCommonParentXpathElementLength);
1966
+ return descendantExpression(refExpectElement, xpath2, relation, expElementDocmnt || docmt, isIndex, expCommonParentXpathElements, step4, refCommonParentXpathElementLength, multiElementReferenceMode);
1957
1967
  }
1958
1968
  }
1959
1969
  }
@@ -1966,12 +1976,12 @@
1966
1976
  const traverseXpath = getTraverseXpathExpression(`${step4 +
1967
1977
  (refCommonParentXpathElementLength
1968
1978
  ? "]".repeat(refCommonParentXpathElementLength)
1969
- : "")}`, expCommonParentXpathElements.reverse(), refExpectElement[refExpectElement.length - 1], refExpectElement, docmt, relation, isIndex);
1979
+ : "")}`, expCommonParentXpathElements, refExpectElement[refExpectElement.length - 1], refExpectElement, docmt, relation, isIndex, multiElementReferenceMode);
1970
1980
  if (traverseXpath) {
1971
1981
  return traverseXpath;
1972
1982
  }
1973
1983
  };
1974
- const getXpathRelationExpression = (element1, element2, relation, xpath1, xpath2, isIndex) => {
1984
+ const getXpathRelationExpression = (element1, element2, relation, xpath1, xpath2, isIndex, multiElementReferenceMode) => {
1975
1985
  let xpaths1;
1976
1986
  let xpaths2;
1977
1987
  console.log('getXpathRelationExpression', relation);
@@ -2038,7 +2048,7 @@
2038
2048
  if (xpath2Elements.length > 1) {
2039
2049
  const traverseXpath = getTraverseXpathExpression(`${xpaths1[i].value.indexOf("//") !== 0
2040
2050
  ? replaceActualAttributes(xpaths1[i].value, element1)
2041
- : replaceActualAttributes(xpaths1[i].value.substring(xpaths1[i].value.indexOf("//") + 2), element1)}`, xpath2Elements, element2, [element1, element2], element2.ownerDocument, relation, isIndex);
2051
+ : replaceActualAttributes(xpaths1[i].value.substring(xpaths1[i].value.indexOf("//") + 2), element1)}`, xpath2Elements, element2, [element1, element2], element2.ownerDocument, relation, isIndex, multiElementReferenceMode);
2042
2052
  console.log('getXpathRelationExpression traverseXpath', traverseXpath);
2043
2053
  if (traverseXpath) {
2044
2054
  finalXpaths.concat(traverseXpath);
@@ -2078,7 +2088,7 @@
2078
2088
  xpaths1 = [
2079
2089
  {
2080
2090
  key: "",
2081
- value: getRelativeXPath(element, element.ownerDocument, false, false, [...element.attributes]),
2091
+ value: getRelativeXPath(element, element.ownerDocument, false, false, Array.from(element.attributes)),
2082
2092
  },
2083
2093
  ];
2084
2094
  }
@@ -2086,7 +2096,7 @@
2086
2096
  xpaths1 = [
2087
2097
  {
2088
2098
  key: "",
2089
- value: getRelativeXPath(element, element.ownerDocument, true, false, [...element.attributes]),
2099
+ value: getRelativeXPath(element, element.ownerDocument, true, false, Array.from(element.attributes)),
2090
2100
  },
2091
2101
  ];
2092
2102
  xpaths1 = xpaths1?.map((x) => x.value.charAt(0) == "(" &&
@@ -2111,9 +2121,9 @@
2111
2121
  });
2112
2122
  return xpaths1;
2113
2123
  };
2114
- const getTraverseXpathExpression = (xpathe1, absoluteXpathElements, element2, refExpectElement, docmt, relation, isIndex) => {
2124
+ const getTraverseXpathExpression = (xpathe1, absoluteXpathElements, element2, refExpectElement, docmt, relation, isIndex, multiElementReferenceMode) => {
2115
2125
  let finalExpectedElementXpath;
2116
- {
2126
+ if (!multiElementReferenceMode) {
2117
2127
  for (let x = 1; x <= absoluteXpathElements.length; x++) {
2118
2128
  const xpath2 = absoluteXpathElements
2119
2129
  .slice(absoluteXpathElements.length - x, absoluteXpathElements.length)
@@ -2143,6 +2153,32 @@
2143
2153
  }
2144
2154
  }
2145
2155
  }
2156
+ else {
2157
+ const xpath2 = absoluteXpathElements.join("/");
2158
+ finalExpectedElementXpath = `//${xpathe1}/${relation}::${replaceActualAttributes(xpath2)}`;
2159
+ const rel_count = getCountOfXPath(finalExpectedElementXpath, element2, docmt);
2160
+ if (rel_count === 1) {
2161
+ return [
2162
+ {
2163
+ key: `dynamic ${relation}`,
2164
+ value: replaceTempAttributes(finalExpectedElementXpath),
2165
+ },
2166
+ ];
2167
+ }
2168
+ if (rel_count > 1) {
2169
+ if (isIndex) {
2170
+ finalExpectedElementXpath = findXpathWithIndex(finalExpectedElementXpath, refExpectElement[refExpectElement.length - 1], docmt, rel_count);
2171
+ if (finalExpectedElementXpath) {
2172
+ return [
2173
+ {
2174
+ key: `dynamic ${relation}${isIndex ? " index" : ""}`,
2175
+ value: replaceTempAttributes(finalExpectedElementXpath),
2176
+ },
2177
+ ];
2178
+ }
2179
+ }
2180
+ }
2181
+ }
2146
2182
  };
2147
2183
  const referenceXpath = {
2148
2184
  findRelativeXpath,
@@ -20,22 +20,22 @@ export declare const createXPathAPI: () => {
20
20
  checkRelativeXpathRelation: (nodeXpath1: string, nodeXpath2: string, targetElemt: HTMLElement | Element, docmt: Document, isIndex: boolean, relationType: string) => string | null;
21
21
  };
22
22
  referenceXpaths: {
23
- findRelativeXpath: (element1: HTMLElement | Element, element2: HTMLElement | Element, docmt: Document, xpaths1: any[], xpaths2: any[], isIndex: any) => any[] | undefined;
23
+ findRelativeXpath: (element1: HTMLElement | Element, element2: HTMLElement | Element, docmt: Document, xpaths1: any[], xpaths2: any[], isIndex: boolean, multiElementReferenceMode?: boolean) => any[] | undefined;
24
24
  getDescendantXpath: (refExpectElement: Array<HTMLElement | Element>, docmt: Document, xpaths1: {
25
25
  key: string;
26
26
  value: string;
27
27
  }[], xpaths2: {
28
28
  key: string;
29
29
  value: string;
30
- }[], relation: "descendant" | "descedant-or-self", isIndex: boolean) => {
30
+ }[], relation: "descendant" | "descedant-or-self", isIndex?: boolean, multiElementReferenceMode?: boolean) => {
31
31
  key: string;
32
32
  value: string;
33
33
  }[] | undefined;
34
- getXpathRelationExpression: (element1: HTMLElement | Element, element2: HTMLElement | Element, relation: string, xpath1: any[], xpath2: any[], isIndex: any) => {
34
+ getXpathRelationExpression: (element1: HTMLElement | Element, element2: HTMLElement | Element, relation: string, xpath1: any[], xpath2: any[], isIndex: boolean, multiElementReferenceMode: boolean) => {
35
35
  key: string;
36
36
  value: any;
37
37
  }[];
38
- getTraverseXpathExpression: (xpathe1: string, absoluteXpathElements: any[], element2: HTMLElement | Element, refExpectElement: Array<HTMLElement | Element>, docmt: Node, relation: string, isIndex: any) => {
38
+ getTraverseXpathExpression: (xpathe1: string, absoluteXpathElements: string[], element2: HTMLElement | Element, refExpectElement: Array<HTMLElement | Element>, docmt: Node, relation: string, isIndex: boolean, multiElementReferenceMode: boolean) => {
39
39
  key: string;
40
40
  value: string;
41
41
  }[] | undefined;
@@ -45,7 +45,7 @@ export declare const createXPathAPI: () => {
45
45
  }[];
46
46
  };
47
47
  xpathUtils: {
48
- parseXml: typeof import("../utils/xpathHelpers.ts").parseXml;
48
+ parseXml: (xmlStr: string) => Document | null;
49
49
  getReferenceElementsXpath: (domNode: HTMLElement | Element, docmt: Document, isTarget: boolean) => {
50
50
  key: string;
51
51
  value: string;
@@ -59,7 +59,7 @@ export declare const createXPathAPI: () => {
59
59
  findXpathWithIndex: (val: string, node: HTMLElement | Element, docmt: Node, count: number) => string | undefined;
60
60
  isNumberExist: (str: string) => boolean;
61
61
  getTextContent: (targetElement: HTMLElement | Element) => string;
62
- getCountOfXPath: (xpath: string, element: HTMLElement | Element, docmt: Node) => number;
62
+ getCountOfXPath: (xpath: string, element: HTMLElement | Element, docmt: Node, multiElementReferenceMode?: boolean) => number;
63
63
  normalizeXPath: (xpath: string) => string;
64
64
  getShadowRoot: (a: HTMLElement | Element) => Element | null;
65
65
  escapeCharacters: (text: string) => string;
@@ -68,7 +68,7 @@ export declare const createXPathAPI: () => {
68
68
  name: string;
69
69
  value: string;
70
70
  }, targetElement: HTMLElement | Element, isTarget: boolean) => boolean;
71
- getRelationship: (a: HTMLElement, b: HTMLElement) => "" | "preceding" | "following" | "ancestor" | "descendant" | "self";
71
+ getRelationship: (a: HTMLElement, b: HTMLElement) => string;
72
72
  findMatchingParenthesis: (text: string, openPos: number) => number;
73
73
  deleteGarbageFromInnerText: (a: string) => string;
74
74
  replaceTempAttributes: (str: string) => string;
@@ -81,6 +81,7 @@ export declare const createXPathAPI: () => {
81
81
  element: HTMLElement | Element;
82
82
  doc: Document;
83
83
  }[];
84
+ cspEnabled: boolean;
84
85
  };
85
86
  getElementsFromHTML: (record: import("../types/locator.ts").ElementRecord, docmt: Document) => {
86
87
  [key: string]: any;
@@ -1,21 +1,21 @@
1
- export declare const findRelativeXpath: (element1: HTMLElement | Element, element2: HTMLElement | Element, docmt: Document, xpaths1: any[], xpaths2: any[], isIndex: any) => any[] | undefined;
1
+ export declare const findRelativeXpath: (element1: HTMLElement | Element, element2: HTMLElement | Element, docmt: Document, xpaths1: any[], xpaths2: any[], isIndex: boolean, multiElementReferenceMode?: boolean) => any[] | undefined;
2
2
  declare const referenceXpath: {
3
- findRelativeXpath: (element1: HTMLElement | Element, element2: HTMLElement | Element, docmt: Document, xpaths1: any[], xpaths2: any[], isIndex: any) => any[] | undefined;
3
+ findRelativeXpath: (element1: HTMLElement | Element, element2: HTMLElement | Element, docmt: Document, xpaths1: any[], xpaths2: any[], isIndex: boolean, multiElementReferenceMode?: boolean) => any[] | undefined;
4
4
  getDescendantXpath: (refExpectElement: Array<HTMLElement | Element>, docmt: Document, xpaths1: {
5
5
  key: string;
6
6
  value: string;
7
7
  }[], xpaths2: {
8
8
  key: string;
9
9
  value: string;
10
- }[], relation: "descendant" | "descedant-or-self", isIndex: boolean) => {
10
+ }[], relation: "descendant" | "descedant-or-self", isIndex?: boolean, multiElementReferenceMode?: boolean) => {
11
11
  key: string;
12
12
  value: string;
13
13
  }[] | undefined;
14
- getXpathRelationExpression: (element1: HTMLElement | Element, element2: HTMLElement | Element, relation: string, xpath1: any[], xpath2: any[], isIndex: any) => {
14
+ getXpathRelationExpression: (element1: HTMLElement | Element, element2: HTMLElement | Element, relation: string, xpath1: any[], xpath2: any[], isIndex: boolean, multiElementReferenceMode: boolean) => {
15
15
  key: string;
16
16
  value: any;
17
17
  }[];
18
- getTraverseXpathExpression: (xpathe1: string, absoluteXpathElements: any[], element2: HTMLElement | Element, refExpectElement: Array<HTMLElement | Element>, docmt: Node, relation: string, isIndex: any) => {
18
+ getTraverseXpathExpression: (xpathe1: string, absoluteXpathElements: string[], element2: HTMLElement | Element, refExpectElement: Array<HTMLElement | Element>, docmt: Node, relation: string, isIndex: boolean, multiElementReferenceMode: boolean) => {
19
19
  key: string;
20
20
  value: string;
21
21
  }[] | undefined;
@@ -1,4 +1,5 @@
1
1
  export declare const reWhiteSpace: RegExp;
2
+ export declare let cspEnabled: boolean;
2
3
  export declare let modifiedElementAttributes: {
3
4
  url: string | null;
4
5
  attributeName: string | null;
@@ -12,7 +13,7 @@ export declare const isNumberExist: (str: string) => boolean;
12
13
  export declare const buildPattern: (pattern: string, isSvg: boolean, tagName: string) => string;
13
14
  export declare const getTextContent: (targetElement: HTMLElement | Element) => string;
14
15
  export declare const getFilteredText: (element: Node) => string;
15
- export declare const getCountOfXPath: (xpath: string, element: HTMLElement | Element, docmt: Node) => number;
16
+ export declare const getCountOfXPath: (xpath: string, element: HTMLElement | Element, docmt: Node, multiElementReferenceMode?: boolean) => number;
16
17
  export declare const escapeCharacters: (text: string) => string;
17
18
  export declare const removeParenthesis: (xpath: string) => string;
18
19
  export declare const findXpathWithIndex: (val: string, node: HTMLElement | Element, docmt: Node, count: number) => string | undefined;
@@ -22,8 +23,7 @@ export declare const checkBlockedAttributes: (attribute: {
22
23
  name: string;
23
24
  value: string;
24
25
  }, targetElement: HTMLElement | Element, isTarget: boolean) => boolean;
25
- export declare const getRelationship: (a: HTMLElement, b: HTMLElement) => "" | "preceding" | "following" | "ancestor" | "descendant" | "self";
26
- export declare const findRoot: (node: Node) => Node;
26
+ export declare const getRelationship: (a: HTMLElement, b: HTMLElement) => string;
27
27
  export declare const isSvg: (element: HTMLElement | Element) => element is SVGElement;
28
28
  export declare const replaceTempAttributes: (str: string) => string;
29
29
  export declare const getPropertyXPath: (element: HTMLElement | Element, docmt: Document, prop: string, value: string, isIndex: boolean, isTarget: boolean) => string | undefined;
@@ -45,11 +45,11 @@ export declare const getReferenceElementsXpath: (domNode: HTMLElement | Element,
45
45
  key: string;
46
46
  value: string;
47
47
  }[];
48
- export declare function parseXml(xmlStr: string): Document | null;
48
+ export declare const parseXml: (xmlStr: string) => Document | null;
49
49
  export declare const normalizeXPath: (xpath: string) => string;
50
50
  export declare const findMatchingParenthesis: (text: string, openPos: number) => number;
51
51
  export declare const xpathUtils: {
52
- parseXml: typeof parseXml;
52
+ parseXml: (xmlStr: string) => Document | null;
53
53
  getReferenceElementsXpath: (domNode: HTMLElement | Element, docmt: Document, isTarget: boolean) => {
54
54
  key: string;
55
55
  value: string;
@@ -63,7 +63,7 @@ export declare const xpathUtils: {
63
63
  findXpathWithIndex: (val: string, node: HTMLElement | Element, docmt: Node, count: number) => string | undefined;
64
64
  isNumberExist: (str: string) => boolean;
65
65
  getTextContent: (targetElement: HTMLElement | Element) => string;
66
- getCountOfXPath: (xpath: string, element: HTMLElement | Element, docmt: Node) => number;
66
+ getCountOfXPath: (xpath: string, element: HTMLElement | Element, docmt: Node, multiElementReferenceMode?: boolean) => number;
67
67
  normalizeXPath: (xpath: string) => string;
68
68
  getShadowRoot: (a: HTMLElement | Element) => Element | null;
69
69
  escapeCharacters: (text: string) => string;
@@ -72,7 +72,7 @@ export declare const xpathUtils: {
72
72
  name: string;
73
73
  value: string;
74
74
  }, targetElement: HTMLElement | Element, isTarget: boolean) => boolean;
75
- getRelationship: (a: HTMLElement, b: HTMLElement) => "" | "preceding" | "following" | "ancestor" | "descendant" | "self";
75
+ getRelationship: (a: HTMLElement, b: HTMLElement) => string;
76
76
  findMatchingParenthesis: (text: string, openPos: number) => number;
77
77
  deleteGarbageFromInnerText: (a: string) => string;
78
78
  replaceTempAttributes: (str: string) => string;
@@ -85,4 +85,5 @@ export declare const xpathUtils: {
85
85
  element: HTMLElement | Element;
86
86
  doc: Document;
87
87
  }[];
88
+ cspEnabled: boolean;
88
89
  };
package/dist/xpath.mjs CHANGED
@@ -46,8 +46,6 @@ async function createXPathAPI() {
46
46
  return {
47
47
  autoHeal: async (data, htmlString) => {
48
48
  await page?.evaluate((datum, html) => {
49
- // let docmt = (window as any).XpathLib.parseXml(html);
50
- // return (window as any).XpathLib.getElementsFromHTML(datum, docmt);
51
49
  // @ts-ignore
52
50
  let xpathAPI = window.XpathLib.createXPathAPI();
53
51
  let docmt = xpathAPI.xpathUtils.parseXml(html);
@@ -1 +1 @@
1
- {"version":3,"file":"xpath.mjs","sources":["../src/node/xpath.ts"],"sourcesContent":["import { fileURLToPath } from \"url\";\r\nimport path, { join } from \"path\";\r\nimport { readFileSync } from \"fs\";\r\nimport { ElementRecord } from \"../types/locator\";\r\n\r\nconst _filename = fileURLToPath(import.meta.url);\r\nconst _dirname = path.dirname(_filename);\r\n\r\nlet puppeteer: any;\r\n\r\nconst injectScriptPath = join(_dirname, \"index.cdn.js\");\r\nconst injectScript = readFileSync(injectScriptPath, \"utf-8\");\r\n\r\nasync function createXPathAPI() {\r\n puppeteer = await import('puppeteer');\r\n\r\n let browser = await puppeteer.launch({ headless: true });\r\n let page = await browser.newPage();\r\n\r\n const fromHTML = async (html: string) => {\r\n await page?.setContent(html);\r\n await page?.addScriptTag({ content: injectScript });\r\n\r\n page?.on(\r\n \"console\",\r\n async (msg: { type: () => any; text: () => any; args: () => any }) => {\r\n const type = msg.type();\r\n const txt = msg.text();\r\n\r\n const args = msg.args();\r\n if (!args || args.length === 0) {\r\n console.log(`[Browser:${type}]`, txt);\r\n return;\r\n }\r\n\r\n for (let i = 0; i < args.length; i++) {\r\n try {\r\n const arg = args[i];\r\n const obj = arg.remoteObject();\r\n\r\n console.log(obj);\r\n\r\n if (obj.value !== undefined) {\r\n console.log(`[Browser:${type}]`, obj.value);\r\n } else {\r\n const value = await arg.jsonValue().catch(() => txt);\r\n console.log(`[Browser:${type}]`, value);\r\n }\r\n } catch (err) {\r\n console.log(`[Browser:${type}]`, txt);\r\n }\r\n }\r\n }\r\n );\r\n\r\n page?.on(\"pageerror\", (msg: any) => {\r\n console.log(\"error\", msg);\r\n });\r\n\r\n return {\r\n autoHeal: async (data: ElementRecord, htmlString: string) => {\r\n await page?.evaluate((datum: ElementRecord, html: string) => {\r\n // let docmt = (window as any).XpathLib.parseXml(html);\r\n // return (window as any).XpathLib.getElementsFromHTML(datum, docmt);\r\n // @ts-ignore\r\n let xpathAPI = window.XpathLib.createXPathAPI();\r\n let docmt = xpathAPI.xpathUtils.parseXml(html);\r\n return xpathAPI.getElementsFromHTML(datum, docmt);\r\n }, data, htmlString);\r\n },\r\n };\r\n };\r\n\r\n return { fromHTML, browser };\r\n}\r\n\r\nexport default createXPathAPI;\r\n"],"names":[],"mappings":";;;;AAKA,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;AAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;AAExC,IAAI,SAAc;AAElB,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC;AACvD,MAAM,YAAY,GAAG,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC;AAE5D,eAAe,cAAc,GAAA;AAC3B,IAAA,SAAS,GAAG,MAAM,OAAO,WAAW,CAAC;AAErC,IAAA,IAAI,OAAO,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACxD,IAAA,IAAI,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE;AAElC,IAAA,MAAM,QAAQ,GAAG,OAAO,IAAY,KAAI;AACtC,QAAA,MAAM,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC;QAC5B,MAAM,IAAI,EAAE,YAAY,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;QAEnD,IAAI,EAAE,EAAE,CACN,SAAS,EACT,OAAO,GAA0D,KAAI;AACnE,YAAA,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE;AACvB,YAAA,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE;AAEtB,YAAA,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE;YACvB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC9B,OAAO,CAAC,GAAG,CAAC,CAAA,SAAA,EAAY,IAAI,CAAA,CAAA,CAAG,EAAE,GAAG,CAAC;gBACrC;YACF;AAEA,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACpC,gBAAA,IAAI;AACF,oBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;AACnB,oBAAA,MAAM,GAAG,GAAG,GAAG,CAAC,YAAY,EAAE;AAE9B,oBAAA,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;AAEhB,oBAAA,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,EAAE;wBAC3B,OAAO,CAAC,GAAG,CAAC,CAAA,SAAA,EAAY,IAAI,CAAA,CAAA,CAAG,EAAE,GAAG,CAAC,KAAK,CAAC;oBAC7C;yBAAO;AACL,wBAAA,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;wBACpD,OAAO,CAAC,GAAG,CAAC,CAAA,SAAA,EAAY,IAAI,CAAA,CAAA,CAAG,EAAE,KAAK,CAAC;oBACzC;gBACF;gBAAE,OAAO,GAAG,EAAE;oBACZ,OAAO,CAAC,GAAG,CAAC,CAAA,SAAA,EAAY,IAAI,CAAA,CAAA,CAAG,EAAE,GAAG,CAAC;gBACvC;YACF;AACF,QAAA,CAAC,CACF;QAED,IAAI,EAAE,EAAE,CAAC,WAAW,EAAE,CAAC,GAAQ,KAAI;AACjC,YAAA,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC;AAC3B,QAAA,CAAC,CAAC;QAEF,OAAO;AACL,YAAA,QAAQ,EAAE,OAAO,IAAmB,EAAE,UAAkB,KAAI;gBAC1D,MAAM,IAAI,EAAE,QAAQ,CAAC,CAAC,KAAoB,EAAE,IAAY,KAAI;;;;oBAI1D,IAAI,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE;oBAC/C,IAAI,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC;oBAC9C,OAAO,QAAQ,CAAC,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC;AACnD,gBAAA,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC;YACtB,CAAC;SACF;AACH,IAAA,CAAC;AAED,IAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE;AAC9B;;;;"}
1
+ {"version":3,"file":"xpath.mjs","sources":["../src/node/xpath.ts"],"sourcesContent":["import { fileURLToPath } from \"url\";\r\nimport path, { join } from \"path\";\r\nimport { readFileSync } from \"fs\";\r\nimport { ElementRecord } from \"../types/locator\";\r\n\r\nconst _filename = fileURLToPath(import.meta.url);\r\nconst _dirname = path.dirname(_filename);\r\n\r\nlet puppeteer: any;\r\n\r\nconst injectScriptPath = join(_dirname, \"index.cdn.js\");\r\nconst injectScript = readFileSync(injectScriptPath, \"utf-8\");\r\n\r\nasync function createXPathAPI() {\r\n puppeteer = await import('puppeteer');\r\n\r\n let browser = await puppeteer.launch({ headless: true });\r\n let page = await browser.newPage();\r\n\r\n const fromHTML = async (html: string) => {\r\n await page?.setContent(html);\r\n await page?.addScriptTag({ content: injectScript });\r\n\r\n page?.on(\r\n \"console\",\r\n async (msg: { type: () => any; text: () => any; args: () => any }) => {\r\n const type = msg.type();\r\n const txt = msg.text();\r\n\r\n const args = msg.args();\r\n if (!args || args.length === 0) {\r\n console.log(`[Browser:${type}]`, txt);\r\n return;\r\n }\r\n\r\n for (let i = 0; i < args.length; i++) {\r\n try {\r\n const arg = args[i];\r\n const obj = arg.remoteObject();\r\n\r\n console.log(obj);\r\n\r\n if (obj.value !== undefined) {\r\n console.log(`[Browser:${type}]`, obj.value);\r\n } else {\r\n const value = await arg.jsonValue().catch(() => txt);\r\n console.log(`[Browser:${type}]`, value);\r\n }\r\n } catch (err) {\r\n console.log(`[Browser:${type}]`, txt);\r\n }\r\n }\r\n }\r\n );\r\n\r\n page?.on(\"pageerror\", (msg: any) => {\r\n console.log(\"error\", msg);\r\n });\r\n\r\n return {\r\n autoHeal: async (data: ElementRecord, htmlString: string) => {\r\n await page?.evaluate((datum: ElementRecord, html: string) => {\r\n // @ts-ignore\r\n let xpathAPI = window.XpathLib.createXPathAPI();\r\n let docmt = xpathAPI.xpathUtils.parseXml(html);\r\n return xpathAPI.getElementsFromHTML(datum, docmt);\r\n }, data, htmlString);\r\n },\r\n };\r\n };\r\n\r\n return { fromHTML, browser };\r\n}\r\n\r\nexport default createXPathAPI;\r\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ff-dom",
3
- "version": "1.0.18-beta.1",
3
+ "version": "1.0.18-beta.3",
4
4
  "description": "",
5
5
  "type": "module",
6
6
  "files": [