1
0
mirror of https://github.com/MontFerret/ferret.git synced 2025-08-13 19:52:52 +02:00

Bugfix/http driver xpath (#725)

* Fixed XPath eval in http driver for attrribute values

* Added unit test to cover http XPath func eval

* Added integration test for covering XPath by CDP driver
This commit is contained in:
Tim Voronov
2022-01-28 15:19:50 -05:00
committed by GitHub
parent 8d8afed51f
commit 0c6d4e6401
3 changed files with 67 additions and 5 deletions

View File

@@ -0,0 +1,8 @@
LET url = @lab.cdn.dynamic
LET page = DOCUMENT(url, true)
LET actual = XPATH(page, "//body/@class")
T::NOT::EMPTY(actual)
RETURN T::EQ(actual[0], "text-center")

View File

@@ -6,6 +6,7 @@ import (
"github.com/MontFerret/ferret/pkg/drivers"
"github.com/MontFerret/ferret/pkg/drivers/http"
"github.com/MontFerret/ferret/pkg/runtime/values"
"github.com/MontFerret/ferret/pkg/runtime/values/types"
"github.com/PuerkitoBio/goquery"
. "github.com/smartystreets/goconvey/convey"
"testing"
@@ -447,5 +448,55 @@ func TestElement(t *testing.T) {
So(err, ShouldBeNil)
So(nt.String(), ShouldEqual, "[\"Album example for Bootstrap\"]")
})
Convey("Func", func() {
buff := bytes.NewBuffer([]byte(doc))
buff.Write([]byte(doc))
doc, err := goquery.NewDocumentFromReader(buff)
So(err, ShouldBeNil)
el, err := http.NewHTMLElement(doc.Find("html"))
So(err, ShouldBeNil)
nt, err := el.XPath(context.Background(), values.NewString("count(//div)"))
So(err, ShouldBeNil)
So(nt.Type().String(), ShouldEqual, types.Float.String())
})
Convey("Attributes", func() {
buff := bytes.NewBuffer([]byte(`<!DOCTYPE html><body><div><a title="30"/></div></body></html>`))
godoc, err := goquery.NewDocumentFromReader(buff)
So(err, ShouldBeNil)
doc, err := http.NewRootHTMLDocument(godoc, "localhost:9090")
So(err, ShouldBeNil)
nt, err := doc.XPath(context.Background(), values.NewString("//a/@title"))
So(err, ShouldBeNil)
So(nt.Type().String(), ShouldEqual, types.Array.String())
So(nt.(*values.Array).First().Type().String(), ShouldEqual, types.String.String())
So(nt.(*values.Array).First().String(), ShouldEqual, "30")
})
Convey("Element node", func() {
buff := bytes.NewBuffer([]byte(`<!DOCTYPE html><body><div><a title="30"/></div></body></html>`))
godoc, err := goquery.NewDocumentFromReader(buff)
So(err, ShouldBeNil)
doc, err := http.NewRootHTMLDocument(godoc, "localhost:9090")
So(err, ShouldBeNil)
nt, err := doc.XPath(context.Background(), values.NewString("//div"))
So(err, ShouldBeNil)
So(nt.Type().String(), ShouldEqual, types.Array.String())
So(nt.(*values.Array).First().Type().String(), ShouldEqual, drivers.HTMLElementType.String())
})
})
}

View File

@@ -84,12 +84,15 @@ func EvalXPathTo(selection *goquery.Selection, expression string) (core.Value, e
for res.MoveNext() {
var item core.Value
node := res.Current().(*htmlquery.NodeNavigator).Current()
node := res.Current()
if node.Type == html.TextNode {
item = values.NewString(node.Data)
} else {
i, err := parseXPathNode(node)
switch node.NodeType() {
case xpath.TextNode:
item = values.NewString(node.Value())
case xpath.AttributeNode:
item = values.NewString(node.Value())
default:
i, err := parseXPathNode(node.(*htmlquery.NodeNavigator).Current())
if err != nil {
return nil, err