mirror of
https://github.com/priyanshujain/sanderling.git
synced 2026-10-03 19:47:10 +00:00
test(chrome): editable flag for inputs, textarea, contenteditable
This commit is contained in:
1 parent
b8b183e970
commit
9df104e5b2
1 file changed
+61
@@ -2,10 +2,71 @@ package chrome
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"encoding/json"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// TestHierarchy_EditableFlag confirms the injected hierarchy script marks text
|
||||||
|
// inputs, textareas, and contenteditable elements editable while leaving
|
||||||
|
// buttons and non-text inputs alone.
|
||||||
|
func TestHierarchy_EditableFlag(t *testing.T) {
|
||||||
|
const html = `<body>` +
|
||||||
|
`<input id="name">` +
|
||||||
|
`<textarea id="bio"></textarea>` +
|
||||||
|
`<button id="go">go</button>` +
|
||||||
|
`<div id="rich" contenteditable="true">x</div>` +
|
||||||
|
`<input id="chk" type="checkbox">` +
|
||||||
|
`</body>`
|
||||||
|
|
||||||
|
d := New()
|
||||||
|
defer d.Terminate(context.Background())
|
||||||
|
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
|
||||||
|
defer cancel()
|
||||||
|
if err := d.Launch(ctx, "data:text/html,"+html, false, nil); err != nil {
|
||||||
|
t.Fatalf("Launch: %v", err)
|
||||||
|
}
|
||||||
|
dump, err := d.Hierarchy(ctx)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Hierarchy: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
type node struct {
|
||||||
|
Attributes map[string]string `json:"attributes"`
|
||||||
|
Children []node `json:"children"`
|
||||||
|
Editable *bool `json:"editable"`
|
||||||
|
}
|
||||||
|
var root node
|
||||||
|
if err := json.Unmarshal([]byte(dump), &root); err != nil {
|
||||||
|
t.Fatalf("unmarshal hierarchy: %v", err)
|
||||||
|
}
|
||||||
|
editableByID := map[string]*bool{}
|
||||||
|
var walk func(n node)
|
||||||
|
walk = func(n node) {
|
||||||
|
if id := n.Attributes["resource-id"]; id != "" {
|
||||||
|
editableByID[id] = n.Editable
|
||||||
|
}
|
||||||
|
for _, c := range n.Children {
|
||||||
|
walk(c)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
walk(root)
|
||||||
|
|
||||||
|
isEditable := func(id string) bool {
|
||||||
|
return editableByID[id] != nil && *editableByID[id]
|
||||||
|
}
|
||||||
|
for _, id := range []string{"name", "bio", "rich"} {
|
||||||
|
if !isEditable(id) {
|
||||||
|
t.Errorf("%q: editable = %v, want true", id, editableByID[id])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for _, id := range []string{"go", "chk"} {
|
||||||
|
if isEditable(id) {
|
||||||
|
t.Errorf("%q: editable = true, want false/absent", id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// TestRunCtx_CallerCancelPropagates confirms that cancelling the caller's
|
// TestRunCtx_CallerCancelPropagates confirms that cancelling the caller's
|
||||||
// context cancels the chromedp-bound context returned by runCtx. This is the
|
// context cancels the chromedp-bound context returned by runCtx. This is the
|
||||||
// channel by which step deadlines and Ctrl-C reach in-flight CDP calls.
|
// channel by which step deadlines and Ctrl-C reach in-flight CDP calls.
|
||||||
|
|||||||
Reference in new issue
Block a user