| <!DOCTYPE html> |
| <html> |
| <head> |
| <script src="../../http/tests/inspector/resources/inspector-test.js"></script> |
| <script> |
| function test() |
| { |
| let documentNode; |
| |
| function nodeForSelector(selector, callback) { |
| documentNode.querySelector(selector, (nodeId) => { |
| callback(WI.domManager.nodeForId(nodeId)); |
| }); |
| } |
| |
| let suite = InspectorTest.createAsyncSuite("WI.xpath"); |
| |
| suite.addTestCase({ |
| name: "WI.xpath.TopLevelNode", |
| description: "Top level nodes like html, body, and head are unique.", |
| test(resolve, reject) { |
| nodeForSelector("html", (node) => { |
| InspectorTest.expectEqual(WI.xpath(node), "/html", "HTML element should have simple XPath '/html'."); |
| }); |
| nodeForSelector("html > body", (node) => { |
| InspectorTest.expectEqual(WI.xpath(node), "/html/body", "BODY element should have simple XPath '/html/body'."); |
| }); |
| nodeForSelector("html > head", (node) => { |
| InspectorTest.expectEqual(WI.xpath(node), "/html/head", "HEAD element should have simple XPath '/html/head'."); |
| resolve(); |
| }); |
| } |
| }); |
| |
| suite.addTestCase({ |
| name: "WI.xpath.ElementWithID", |
| description: "Element with ID is unique (#id). Path does not need to go past it.", |
| test(resolve, reject) { |
| nodeForSelector("#id-test", (node) => { |
| InspectorTest.expectEqual(WI.xpath(node), "//*[@id=\"id-test\"]", "Element with id should have a single path component '//*[@id=\"id-test\"]'."); |
| }); |
| nodeForSelector("#id-test > div", (node) => { |
| InspectorTest.expectEqual(WI.xpath(node), "//*[@id=\"id-test\"]/div", "Element inside element with id should have path from id."); |
| resolve(); |
| }); |
| } |
| }); |
| |
| suite.addTestCase({ |
| name: "WI.xpath.UniqueTagName", |
| description: "Elements with unique tag name do not need nth-child.", |
| test(resolve, reject) { |
| nodeForSelector("#unique-tag-test > span", (node) => { |
| InspectorTest.expectEqual(WI.xpath(node), "//*[@id=\"unique-tag-test\"]/span", "Elements with unique tag name should not need XPath index."); |
| resolve(); |
| }); |
| } |
| }); |
| |
| suite.addTestCase({ |
| name: "WI.xpath.NonUniqueTagName", |
| description: "Elements with non-unique tag name need index.", |
| test(resolve, reject) { |
| nodeForSelector("#non-unique-tag-test > span ~ span", (node) => { |
| InspectorTest.expectEqual(WI.xpath(node), "//*[@id=\"non-unique-tag-test\"]/span[2]", "Elements with non-unique tag name should need XPath index."); |
| resolve(); |
| }); |
| } |
| }); |
| |
| suite.addTestCase({ |
| name: "WI.xpath.DeepPath", |
| description: "Tests for element with complex path.", |
| test(resolve, reject) { |
| nodeForSelector("small", (node) => { |
| InspectorTest.log(WI.xpath(node)); |
| InspectorTest.expectEqual(WI.xpath(node), "/html/body/div/div[7]/ul/li/div[3]/ul/li[2]/a/small", "Should be able to get XPath for deep elements."); |
| resolve(); |
| }); |
| } |
| }); |
| |
| suite.addTestCase({ |
| name: "WI.xpath.TextAndCommentNode", |
| description: "Tests for non-Element nodes.", |
| test(resolve, reject) { |
| nodeForSelector("#non-element-test > p > br", (node) => { |
| let paragraphChildren = node.parentNode.children; |
| let lastTextChild = paragraphChildren[paragraphChildren.length - 1]; |
| let lastCommentChild = paragraphChildren[paragraphChildren.length - 2]; |
| InspectorTest.expectEqual(WI.xpath(lastTextChild), "//*[@id=\"non-element-test\"]/p/text()[3]", "Should be able to get XPath for TEXT_NODE."); |
| InspectorTest.expectEqual(WI.xpath(lastCommentChild), "//*[@id=\"non-element-test\"]/p/comment()", "Should be able to get XPath for COMMENT_NODE."); |
| resolve(); |
| }); |
| } |
| }); |
| |
| // FIXME: Write tests for nodes inside a Shadow DOM Tree. |
| // FIXME: Write test for CDATA. |
| |
| WI.domManager.requestDocument((node) => { |
| documentNode = node; |
| suite.runTestCasesAndFinish(); |
| }); |
| } |
| </script> |
| </head> |
| <body onload="runTest()"> |
| <p>Test for WI.xpath.</p> |
| <!-- If display:none pseudo elements are not created. --> |
| <div style="visibility:hidden"> |
| <div id="id-test"> |
| <div></div> |
| </div> |
| <div id="unique-tag-test"> |
| <div></div> |
| <span></span> |
| <div></div> |
| </div> |
| <div id="non-unique-tag-test"> |
| <div></div> |
| <span></span> |
| <span></span> |
| <div></div> |
| </div> |
| <div id="unique-class-test"> |
| <div class="alpha"></div> |
| <div class="alpha beta"></div> |
| <div class="alpha"></div> |
| </div> |
| <div id="non-unique-class-test"> |
| <div class="alpha"></div> |
| <div class="alpha"></div> |
| <div class="alpha"></div> |
| </div> |
| <div id="unique-tag-and-class-test"> |
| <div class="alpha"></div> |
| </div> |
| <div class="deep-path-test"> |
| <ul> |
| <li> |
| <h1></h1> |
| <div></div> |
| <div></div> |
| <div> |
| <ul class="list"> |
| <li></li> |
| <li class="active"><a href="#"><small></small></a></li> |
| <li></li> |
| </ul> |
| </div> |
| </li> |
| </ul> |
| </div> |
| <div id="non-element-test"> |
| <p> |
| Some leading text |
| <br> |
| Some trailing text |
| <!-- Comment --> |
| Some final text |
| </p> |
| </div> |
| </div> |
| </body> |
| </html> |