blob: 20c6e73018419e90abce16040dbdc62f3db5c2ce [file] [log] [blame]
<!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>