...

Source file src/github.com/playwright-community/playwright-go/tests/binding_test.go

Documentation: github.com/playwright-community/playwright-go/tests

     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