1 package playwright_test
2
3 import (
4 "errors"
5 "strings"
6 "testing"
7
8 "github.com/playwright-community/playwright-go"
9 "github.com/stretchr/testify/require"
10 )
11
12 func TestBrowserContextExposeBinding(t *testing.T) {
13 BeforeEach(t)
14 defer AfterEach(t)
15 bindingSource := []*playwright.BindingSource{}
16 binding := func(source *playwright.BindingSource, a, b int) int {
17 bindingSource = append(bindingSource, source)
18 return a + b
19 }
20 err := context.ExposeBinding("add", func(source *playwright.BindingSource, args ...interface{}) interface{} {
21 return binding(source, args[0].(int), args[1].(int))
22 })
23 require.NoError(t, err)
24 page, err := context.NewPage()
25 require.NoError(t, err)
26 result, err := page.Evaluate("add(5, 6)")
27 require.NoError(t, err)
28 require.Equal(t, bindingSource[0].Context, context)
29 require.Equal(t, bindingSource[0].Page, page)
30 require.Equal(t, bindingSource[0].Frame, page.MainFrame())
31 require.Equal(t, result, 11)
32 }
33
34 func TestBrowserContextExposeFunction(t *testing.T) {
35 BeforeEach(t)
36 defer AfterEach(t)
37 err := context.ExposeFunction("add", func(args ...interface{}) interface{} {
38 return args[0].(int) + args[1].(int)
39 })
40 require.NoError(t, err)
41 page, err := context.NewPage()
42 require.NoError(t, err)
43 err = page.ExposeFunction("mul", func(args ...interface{}) interface{} {
44 return args[0].(int) * args[1].(int)
45 })
46 require.NoError(t, err)
47 err = context.ExposeFunction("sub", func(args ...interface{}) interface{} {
48 return args[0].(int) - args[1].(int)
49 })
50 require.NoError(t, err)
51 result, err := page.Evaluate(`async function() {
52 return { mul: await mul(9, 4), add: await add(9, 4), sub: await sub(9, 4) }
53 }`)
54 require.NoError(t, err)
55 resultMap := result.(map[string]interface{})
56 require.Equal(t, 36, resultMap["mul"])
57 require.Equal(t, 13, resultMap["add"])
58 require.Equal(t, 5, resultMap["sub"])
59 }
60
61 func TestBrowserContextExposeBindingPanic(t *testing.T) {
62 BeforeEach(t)
63 defer AfterEach(t)
64 err := context.ExposeBinding("woof", func(source *playwright.BindingSource, args ...interface{}) interface{} {
65 panic(errors.New("WOOF WOOF"))
66 })
67 require.NoError(t, err)
68 page, err := context.NewPage()
69 require.NoError(t, err)
70 result, err := page.Evaluate(`async () => {
71 try {
72 await window['woof']();
73 } catch (e) {
74 return {message: e.message, stack: e.stack};
75 }
76 }`)
77 require.NoError(t, err)
78 innerError := result.(map[string]interface{})
79 require.Equal(t, innerError["message"], "WOOF WOOF")
80 stack := strings.Split(innerError["stack"].(string), "\n")
81 require.Contains(t, stack[len(stack)-1], "binding_test.go")
82 }
83
84 func TestBrowserContextExposeBindingHandleShouldWork(t *testing.T) {
85 BeforeEach(t)
86 defer AfterEach(t)
87 targets := []playwright.JSHandle{}
88
89 logme := func(t interface{}) int {
90 targets = append(targets, t.(playwright.JSHandle))
91 return 17
92 }
93
94 err := page.ExposeBinding("logme", func(source *playwright.BindingSource, args ...interface{}) interface{} {
95 return logme(args[0])
96 }, true)
97 require.NoError(t, err)
98 result, err := page.Evaluate("logme({ foo: 42 })")
99 require.NoError(t, err)
100 require.Equal(t, result, 17)
101 res, err := targets[0].Evaluate("x => x.foo")
102 require.NoError(t, err)
103 require.Equal(t, 42, res)
104 }
105
View as plain text