...

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

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

     1  package playwright_test
     2  
     3  import (
     4  	"fmt"
     5  	"runtime"
     6  	"testing"
     7  
     8  	"github.com/playwright-community/playwright-go"
     9  	"github.com/stretchr/testify/require"
    10  )
    11  
    12  func TestBrowserContextNewPage(t *testing.T) {
    13  	BeforeEach(t)
    14  	defer AfterEach(t)
    15  	require.Equal(t, context.Browser(), browser)
    16  }
    17  
    18  func TestBrowserContextNewContext(t *testing.T) {
    19  	BeforeEach(t)
    20  	defer AfterEach(t)
    21  	require.Equal(t, 1, len(browser.Contexts()))
    22  	context2, err := browser.NewContext()
    23  	require.NoError(t, err)
    24  	require.Equal(t, 2, len(browser.Contexts()))
    25  	require.Equal(t, browser.Contexts()[1], context2)
    26  	require.Equal(t, context2.Browser(), browser)
    27  	require.NoError(t, context2.Close())
    28  	require.Equal(t, 1, len(browser.Contexts()))
    29  	require.Equal(t, context.Browser(), browser)
    30  }
    31  
    32  func TestBrowserContextClose(t *testing.T) {
    33  	BeforeEach(t)
    34  	defer AfterEach(t, false)
    35  	context2, err := browser.NewContext()
    36  	require.NoError(t, err)
    37  	require.Equal(t, 2, len(browser.Contexts()))
    38  	require.Equal(t, context, browser.Contexts()[0])
    39  	require.Equal(t, context2, browser.Contexts()[1])
    40  	require.NoError(t, context.Close())
    41  	require.Equal(t, 1, len(browser.Contexts()))
    42  	require.NoError(t, context2.Close())
    43  	require.Equal(t, 0, len(browser.Contexts()))
    44  }
    45  
    46  func TestBrowserContextOffline(t *testing.T) {
    47  	BeforeEach(t)
    48  	defer AfterEach(t)
    49  	offline, err := page.Evaluate("window.navigator.onLine")
    50  	require.NoError(t, err)
    51  	require.True(t, offline.(bool))
    52  
    53  	require.NoError(t, context.SetOffline(true))
    54  	offline, err = page.Evaluate("window.navigator.onLine")
    55  	require.NoError(t, err)
    56  	require.False(t, offline.(bool))
    57  
    58  	require.NoError(t, context.SetOffline(false))
    59  	offline, err = page.Evaluate("window.navigator.onLine")
    60  	require.NoError(t, err)
    61  	require.True(t, offline.(bool))
    62  }
    63  
    64  func TestBrowserContextSetExtraHTTPHeaders(t *testing.T) {
    65  	BeforeEach(t)
    66  	defer AfterEach(t)
    67  	require.NoError(t, context.SetExtraHTTPHeaders(map[string]string{
    68  		"extra-http": "42",
    69  	}))
    70  	intercepted := make(chan bool, 1)
    71  	err := page.Route("**/empty.html", func(route playwright.Route, request playwright.Request) {
    72  		require.NoError(t, route.Continue())
    73  		intercepted <- true
    74  	})
    75  	require.NoError(t, err)
    76  	response, err := page.Goto(server.EMPTY_PAGE)
    77  	require.NoError(t, err)
    78  	require.True(t, response.Ok())
    79  	<-intercepted
    80  }
    81  
    82  func TestBrowserContextNewCDPSession(t *testing.T) {
    83  	BeforeEach(t)
    84  	defer AfterEach(t)
    85  	cdpSession, err := page.Context().NewCDPSession(page)
    86  	if isChromium {
    87  		require.NoError(t, err)
    88  		require.NoError(t, cdpSession.Detach())
    89  	} else {
    90  		require.Error(t, err)
    91  	}
    92  }
    93  
    94  func TestBrowserContextSetGeolocation(t *testing.T) {
    95  	BeforeEach(t)
    96  	defer AfterEach(t)
    97  	require.NoError(t, context.GrantPermissions([]string{"geolocation"}))
    98  	_, err := page.Goto(server.EMPTY_PAGE)
    99  	require.NoError(t, err)
   100  	require.NoError(t, context.SetGeolocation(&playwright.SetGeolocationOptions{
   101  		Longitude: 10,
   102  		Latitude:  10,
   103  	}))
   104  	geolocation, err := page.Evaluate(`() => new Promise(resolve => navigator.geolocation.getCurrentPosition(position => {
   105        resolve({latitude: position.coords.latitude, longitude: position.coords.longitude});
   106      }))`)
   107  	require.NoError(t, err)
   108  	require.Equal(t, geolocation, map[string]interface{}{
   109  		"latitude":  10,
   110  		"longitude": 10,
   111  	})
   112  	require.NoError(t, context.ClearPermissions())
   113  }
   114  
   115  func TestBrowserContextAddCookies(t *testing.T) {
   116  	BeforeEach(t)
   117  	defer AfterEach(t)
   118  	_, err := page.Goto(server.EMPTY_PAGE)
   119  	require.NoError(t, err)
   120  	require.NoError(t, context.AddCookies(playwright.BrowserContextAddCookiesOptionsCookies{
   121  		URL:   playwright.String(server.EMPTY_PAGE),
   122  		Name:  playwright.String("password"),
   123  		Value: playwright.String("123456"),
   124  	}))
   125  	cookie, err := page.Evaluate("() => document.cookie")
   126  	require.NoError(t, err)
   127  	require.Equal(t, "password=123456", cookie)
   128  
   129  	cookies, err := context.Cookies()
   130  	require.NoError(t, err)
   131  	sameSite := playwright.SameSiteAttributeNone
   132  	if isChromium {
   133  		sameSite = playwright.SameSiteAttributeLax
   134  	}
   135  	require.Equal(t, []*playwright.BrowserContextCookiesResult{
   136  		{
   137  			Name:    "password",
   138  			Value:   "123456",
   139  			Domain:  "127.0.0.1",
   140  			Path:    "/",
   141  			Expires: -1,
   142  
   143  			HttpOnly: false,
   144  			Secure:   false,
   145  			SameSite: *sameSite,
   146  		},
   147  	}, cookies)
   148  
   149  	require.NoError(t, page.Context().ClearCookies())
   150  	_, err = page.Reload()
   151  	require.NoError(t, err)
   152  	cookie, err = page.Evaluate("() => document.cookie")
   153  	require.NoError(t, err)
   154  	require.Equal(t, "", cookie)
   155  }
   156  
   157  func TestBrowserContextAddInitScript(t *testing.T) {
   158  	BeforeEach(t)
   159  	defer AfterEach(t)
   160  	require.NoError(t, context.AddInitScript(playwright.BrowserContextAddInitScriptOptions{
   161  		Script: playwright.String(`window['injected'] = 123;`),
   162  	}))
   163  	_, err := page.Goto(server.PREFIX + "/tamperable.html")
   164  	require.NoError(t, err)
   165  	result, err := page.Evaluate(`() => window['result']`)
   166  	require.NoError(t, err)
   167  	require.Equal(t, 123, result)
   168  }
   169  
   170  func TestBrowserContextAddInitScriptWithPath(t *testing.T) {
   171  	BeforeEach(t)
   172  	defer AfterEach(t)
   173  	require.NoError(t, context.AddInitScript(playwright.BrowserContextAddInitScriptOptions{
   174  		Path: playwright.String(Asset("injectedfile.js")),
   175  	}))
   176  	_, err := page.Goto(server.PREFIX + "/tamperable.html")
   177  	require.NoError(t, err)
   178  	result, err := page.Evaluate(`() => window['result']`)
   179  	require.NoError(t, err)
   180  	require.Equal(t, 123, result)
   181  }
   182  
   183  func TestBrowserContextWindowOpenshouldUseParentTabContext(t *testing.T) {
   184  	BeforeEach(t)
   185  	defer AfterEach(t)
   186  	_, err := page.Goto(server.EMPTY_PAGE)
   187  	require.NoError(t, err)
   188  	popupEvent, err := page.ExpectEvent("popup", func() error {
   189  		_, err := page.Evaluate("url => window.open(url)", server.EMPTY_PAGE)
   190  		return err
   191  	})
   192  	require.NoError(t, err)
   193  	popup := popupEvent.(playwright.Page)
   194  	require.Equal(t, popup.Context(), context)
   195  }
   196  
   197  func TestBrowserContextUnrouteShouldWork(t *testing.T) {
   198  	BeforeEach(t)
   199  	defer AfterEach(t)
   200  
   201  	intercepted := []int{}
   202  	handler1 := func(route playwright.Route, request playwright.Request) {
   203  		intercepted = append(intercepted, 1)
   204  		require.NoError(t, route.Continue())
   205  	}
   206  	require.NoError(t, context.Route("**/empty.html", handler1))
   207  	require.NoError(t, context.Route("**/empty.html", func(route playwright.Route, request playwright.Request) {
   208  		intercepted = append(intercepted, 2)
   209  		require.NoError(t, route.Continue())
   210  	}))
   211  	require.NoError(t, context.Route("**/empty.html", func(route playwright.Route, request playwright.Request) {
   212  		intercepted = append(intercepted, 3)
   213  		require.NoError(t, route.Continue())
   214  	}))
   215  	require.NoError(t, context.Route("**/*", func(route playwright.Route, request playwright.Request) {
   216  		intercepted = append(intercepted, 4)
   217  		require.NoError(t, route.Continue())
   218  	}))
   219  
   220  	_, err := page.Goto(server.EMPTY_PAGE)
   221  	require.NoError(t, err)
   222  	require.Equal(t, []int{1}, intercepted)
   223  
   224  	intercepted = []int{}
   225  	require.NoError(t, context.Unroute("**/empty.html", handler1))
   226  	_, err = page.Goto(server.EMPTY_PAGE)
   227  	require.NoError(t, err)
   228  	require.Equal(t, []int{2}, intercepted)
   229  
   230  	intercepted = []int{}
   231  	require.NoError(t, context.Unroute("**/empty.html"))
   232  	_, err = page.Goto(server.EMPTY_PAGE)
   233  	require.NoError(t, err)
   234  	require.Equal(t, []int{4}, intercepted)
   235  }
   236  
   237  func TestBrowserContextShouldReturnBackgroundPage(t *testing.T) {
   238  	BeforeEach(t)
   239  	defer AfterEach(t)
   240  	if !isChromium {
   241  		t.Skip()
   242  	}
   243  	if runtime.GOOS == "windows" {
   244  		t.Skip("flaky on windows")
   245  	}
   246  	extensionPath := Asset("simple-extension")
   247  	context, err := browserType.LaunchPersistentContext(
   248  		t.TempDir(),
   249  		playwright.BrowserTypeLaunchPersistentContextOptions{
   250  			Headless: playwright.Bool(false),
   251  			Args: []string{
   252  				fmt.Sprintf("--disable-extensions-except=%s", extensionPath),
   253  				fmt.Sprintf("--load-extension=%s", extensionPath),
   254  			},
   255  		},
   256  	)
   257  	require.NoError(t, err)
   258  	var page playwright.Page
   259  	if len(context.BackgroundPages()) == 1 {
   260  		page = context.BackgroundPages()[0]
   261  	} else {
   262  		page = context.WaitForEvent("backgroundpage").(playwright.Page)
   263  	}
   264  	require.NotNil(t, page)
   265  	require.NotContains(t, context.Pages(), page)
   266  	require.Contains(t, context.BackgroundPages(), page)
   267  	context.Close()
   268  	require.Len(t, context.BackgroundPages(), 0)
   269  	require.Len(t, context.Pages(), 0)
   270  }
   271  

View as plain text