🐛 xpath return undefined while the dom have not append to document yet (#991)

This commit is contained in:
Kuitos 2020-10-12 18:27:08 +08:00 committed by GitHub
parent 9b5cafc328
commit d2e2e760d6
2 changed files with 13 additions and 4 deletions

View File

@ -111,4 +111,8 @@ test('should getXPathForElement work well', () => {
// eslint-disable-next-line max-len // eslint-disable-next-line max-len
`/*[name()='HTML' and namespace-uri()='http://www.w3.org/1999/xhtml']/*[name()='BODY' and namespace-uri()='http://www.w3.org/1999/xhtml'][1]/*[name()='ARTICLE' and namespace-uri()='http://www.w3.org/1999/xhtml'][1]/*[name()='DIV' and namespace-uri()='http://www.w3.org/1999/xhtml'][1]/*[name()='DIV' and namespace-uri()='http://www.w3.org/1999/xhtml'][2]`, `/*[name()='HTML' and namespace-uri()='http://www.w3.org/1999/xhtml']/*[name()='BODY' and namespace-uri()='http://www.w3.org/1999/xhtml'][1]/*[name()='ARTICLE' and namespace-uri()='http://www.w3.org/1999/xhtml'][1]/*[name()='DIV' and namespace-uri()='http://www.w3.org/1999/xhtml'][1]/*[name()='DIV' and namespace-uri()='http://www.w3.org/1999/xhtml'][2]`,
); );
const virtualDOM = document.createElement('div');
const xpath1 = getXPathForElement(virtualDOM, document);
expect(xpath1).toBeUndefined();
}); });

View File

@ -142,15 +142,20 @@ export function isEnableScopedCSS(opt: FrameworkConfiguration) {
/** /**
* copy from https://developer.mozilla.org/zh-CN/docs/Using_XPath * copy from https://developer.mozilla.org/zh-CN/docs/Using_XPath
* @param el * @param el
* @param xml * @param document
*/ */
export function getXPathForElement(el: Node, xml: Document) { export function getXPathForElement(el: Node, document: Document): string | void {
// not support that if el not existed in document yet(such as it not append to document before it mounted)
if (!document.contains(el)) {
return undefined;
}
let xpath = ''; let xpath = '';
let pos; let pos;
let tmpEle; let tmpEle;
let element = el; let element = el;
while (element !== xml.documentElement) { while (element !== document.documentElement) {
pos = 0; pos = 0;
tmpEle = element; tmpEle = element;
while (tmpEle) { while (tmpEle) {
@ -168,7 +173,7 @@ export function getXPathForElement(el: Node, xml: Document) {
element = element.parentNode!; element = element.parentNode!;
} }
xpath = `/*[name()='${xml.documentElement.nodeName}' and namespace-uri()='${ xpath = `/*[name()='${document.documentElement.nodeName}' and namespace-uri()='${
element.namespaceURI === null ? '' : element.namespaceURI element.namespaceURI === null ? '' : element.namespaceURI
}']/${xpath}`; }']/${xpath}`;
xpath = xpath.replace(/\/$/, ''); xpath = xpath.replace(/\/$/, '');