167 lines
5.7 KiB
HTML
167 lines
5.7 KiB
HTML
<!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>
|