From cc9664ff1b3f265e2e51a8b1fbb7ec324ded3a35 Mon Sep 17 00:00:00 2001 From: Paul Cento Date: Fri, 13 Jan 2023 20:36:34 -0500 Subject: [PATCH] `Element.ShadowRoot` returns error when `ShadowRoots` is empty (#788) * Element.ShadowRoot returns an error when ShadowRoots slice is empty * comment exported ErrNoShadowRoot * unit test shadow root error * test shadow root error contains correct error message --- element.go | 3 +++ element_test.go | 5 +++++ error.go | 13 +++++++++++++ 3 files changed, 21 insertions(+) diff --git a/element.go b/element.go index f6d6e684..7d1e7da0 100644 --- a/element.go +++ b/element.go @@ -402,6 +402,9 @@ func (el *Element) ShadowRoot() (*Element, error) { } // though now it's an array, w3c changed the spec of it to be a single. + if len(node.ShadowRoots) == 0 { + return nil, &ErrNoShadowRoot{el} + } id := node.ShadowRoots[0].BackendNodeID shadowNode, err := proto.DOMResolveNode{BackendNodeID: id}.Call(el) diff --git a/element_test.go b/element_test.go index d560eec0..7dff62bd 100644 --- a/element_test.go +++ b/element_test.go @@ -284,6 +284,11 @@ func TestShadowDOM(t *testing.T) { g.mc.stubErr(1, proto.DOMResolveNode{}) el.MustShadowRoot() }) + + elNoShadow := p.MustElement("script") + _, err := elNoShadow.ShadowRoot() + g.True((&rod.ErrNoShadowRoot{}).Is(err)) + g.Has(err.Error(), "element has no shadow root:") } func TestInputTime(t *testing.T) { diff --git a/error.go b/error.go index 400e0f1a..ec926551 100644 --- a/error.go +++ b/error.go @@ -181,3 +181,16 @@ type ErrPageNotFound struct { func (e *ErrPageNotFound) Error() string { return "cannot find page" } + +// ErrNoShadowRoot error +type ErrNoShadowRoot struct { + *Element +} + +// Error ... +func (e *ErrNoShadowRoot) Error() string { + return fmt.Sprintf("element has no shadow root: %s", e.String()) +} + +// Is interface +func (e *ErrNoShadowRoot) Is(err error) bool { _, ok := err.(*ErrNoShadowRoot); return ok }