From 295b21a2271f116bbd2b2aa80f99a2e0ce0e37bd Mon Sep 17 00:00:00 2001 From: Daniel Cazzulino Date: Fri, 21 Jan 2022 01:17:00 -0300 Subject: [PATCH] Fix child combinator to XPath conversion Existing implementation would only select the first child. Fixes #36 --- src/Css/Css.cs | 2 +- src/Tests/XPathTests.cs | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Css/Css.cs b/src/Css/Css.cs index 43a85f1..1952fd4 100644 --- a/src/Css/Css.cs +++ b/src/Css/Css.cs @@ -63,7 +63,7 @@ public override void Append(StringBuilder builder) { Combinator.None => ".//", Combinator.Descendant => "//", - Combinator.Child => "/child::*[1]/self::", + Combinator.Child => "/", Combinator.NextSibling => "/following-sibling::*[1]/self::", Combinator.SubsequentSibling => "/following-sibling::", _ => throw new NotSupportedException(), diff --git a/src/Tests/XPathTests.cs b/src/Tests/XPathTests.cs index 1387edd..1c6a4c1 100644 --- a/src/Tests/XPathTests.cs +++ b/src/Tests/XPathTests.cs @@ -9,7 +9,9 @@ public record XPathTests(ITestOutputHelper Console) { [InlineData("foo", ".//foo")] [InlineData(".foo", ".//*[contains(concat(\" \",normalize-space(@class),\" \"),\" foo \")]")] - [InlineData("foo > bar", ".//foo/child::*[1]/self::bar")] + [InlineData("foo > bar", ".//foo/bar")] + [InlineData("foo > bar > baz", ".//foo/bar/baz")] + [InlineData("foo ~ bar", ".//foo/following-sibling::bar")] // .//*[@data-tags="flow" or starts-with(@data-tags,concat("flow","-"))] [InlineData("[data-tags|=flow]", ".//*[@data-tags=\"flow\" or starts-with(@data-tags,concat(\"flow\",\"-\"))]")] [InlineData("[role*=nu]", ".//*[contains(@role,\"nu\")]")] @@ -62,7 +64,7 @@ public void ToXPath(string css, string xpath) [InlineData("div[role],span", "Warning 1 2 4 5 Standard File Archivo Edit Footer")] [InlineData("span:not([text()='4']),div[role]", "Warning 1 2 5 Standard File Archivo Edit Footer")] [InlineData(".item__hiden-content", "Archivo")] - //item__hiden-content + [InlineData("body > div > span", "1 2 4")] [Theory] public void EvaluatePageHtml(string expression, string expected) {