...

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

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

     1  package playwright_test
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"io/ioutil"
     7  	"net/http"
     8  	"os"
     9  	"path/filepath"
    10  	"regexp"
    11  	"strconv"
    12  	"strings"
    13  	"testing"
    14  	"time"
    15  
    16  	"github.com/h2non/filetype"
    17  	"github.com/playwright-community/playwright-go"
    18  	"github.com/stretchr/testify/require"
    19  )
    20  
    21  func TestPageURL(t *testing.T) {
    22  	BeforeEach(t)
    23  	defer AfterEach(t)
    24  	require.Equal(t, "about:blank", page.URL())
    25  	_, err := page.Goto("https://example.com")
    26  	require.NoError(t, err)
    27  	require.Equal(t, "https://example.com/", page.URL())
    28  	require.Equal(t, context, page.Context())
    29  	require.Equal(t, 1, len(page.Frames()))
    30  }
    31  
    32  func TestPageSetContent(t *testing.T) {
    33  	BeforeEach(t)
    34  	defer AfterEach(t)
    35  	require.NoError(t, page.SetContent("<h1>foo</h1>",
    36  		playwright.PageSetContentOptions{
    37  			WaitUntil: playwright.WaitUntilStateNetworkidle,
    38  		}))
    39  	content, err := page.Content()
    40  	require.NoError(t, err)
    41  	require.Equal(t, content, "<html><head></head><body><h1>foo</h1></body></html>")
    42  }
    43  
    44  func TestPageScreenshot(t *testing.T) {
    45  	BeforeEach(t)
    46  	defer AfterEach(t)
    47  
    48  	require.NoError(t, page.SetContent("<h1>foobar</h1>"))
    49  	tmpfile, err := ioutil.TempDir("", "screenshot")
    50  	require.NoError(t, err)
    51  	screenshotPath := filepath.Join(tmpfile, "image.png")
    52  	screenshot, err := page.Screenshot()
    53  	require.NoError(t, err)
    54  	require.True(t, filetype.IsImage(screenshot))
    55  	require.Greater(t, len(screenshot), 50)
    56  
    57  	screenshot, err = page.Screenshot(playwright.PageScreenshotOptions{
    58  		Path: playwright.String(screenshotPath),
    59  	})
    60  	require.NoError(t, err)
    61  	require.True(t, filetype.IsImage(screenshot))
    62  	require.Greater(t, len(screenshot), 50)
    63  
    64  	_, err = os.Stat(screenshotPath)
    65  	require.NoError(t, err)
    66  }
    67  
    68  func TestPagePDF(t *testing.T) {
    69  	BeforeEach(t)
    70  	defer AfterEach(t)
    71  	if !isChromium {
    72  		t.Skip("Skipping")
    73  	}
    74  	require.NoError(t, page.SetContent("<h1>foobar</h1>"))
    75  	tmpfile, err := ioutil.TempDir("", "pdf")
    76  	require.NoError(t, err)
    77  	screenshotPath := filepath.Join(tmpfile, "image.png")
    78  	screenshot, err := page.PDF()
    79  	require.NoError(t, err)
    80  	require.Equal(t, "application/pdf", http.DetectContentType(screenshot))
    81  	require.Greater(t, len(screenshot), 50)
    82  
    83  	screenshot, err = page.PDF(playwright.PagePdfOptions{
    84  		Path: playwright.String(screenshotPath),
    85  	})
    86  	require.NoError(t, err)
    87  	require.Equal(t, "application/pdf", http.DetectContentType(screenshot))
    88  	require.Greater(t, len(screenshot), 50)
    89  
    90  	_, err = os.Stat(screenshotPath)
    91  	require.NoError(t, err)
    92  }
    93  
    94  func TestPageQuerySelector(t *testing.T) {
    95  	BeforeEach(t)
    96  	defer AfterEach(t)
    97  	require.NoError(t, page.SetContent(`<div id="one">
    98  		<span id="two">
    99  			<div id="three">
   100  				<span id="four">
   101  					foobar
   102  				</span>
   103  			</div>
   104  		</span>
   105  	</div>`))
   106  	one, err := page.QuerySelector("div#one")
   107  	require.NoError(t, err)
   108  	two, err := one.QuerySelector("span#two")
   109  	require.NoError(t, err)
   110  	three, err := two.QuerySelector("div#three")
   111  	require.NoError(t, err)
   112  	four, err := three.QuerySelector("span#four")
   113  	require.NoError(t, err)
   114  	textContent, err := four.TextContent()
   115  	require.NoError(t, err)
   116  	require.Equal(t, strings.TrimSpace(textContent), "foobar")
   117  }
   118  
   119  func TestPageQuerySelectorAll(t *testing.T) {
   120  	BeforeEach(t)
   121  	defer AfterEach(t)
   122  	require.NoError(t, page.SetContent(`
   123  	<div class="foo">0</div>
   124  	<div class="foo">1</div>
   125  	<div class="foo">2</div>
   126  	`))
   127  	elements, err := page.QuerySelectorAll("div.foo")
   128  	require.NoError(t, err)
   129  	require.Equal(t, 3, len(elements))
   130  	for i := 0; i < 3; i++ {
   131  		textContent, err := elements[i].TextContent()
   132  		require.NoError(t, err)
   133  		require.Equal(t, strconv.Itoa(i), textContent)
   134  	}
   135  }
   136  
   137  func TestPageEvaluate(t *testing.T) {
   138  	BeforeEach(t)
   139  	defer AfterEach(t)
   140  	val, err := page.Evaluate(`() => 123`)
   141  	require.NoError(t, err)
   142  	require.Equal(t, val, 123)
   143  }
   144  
   145  func TestPageEvalOnSelectorAll(t *testing.T) {
   146  	BeforeEach(t)
   147  	defer AfterEach(t)
   148  	err := page.SetContent(`
   149  		<div class="foo">1</div>
   150  		<div class="foo">2</div>
   151  		<div class="foo">3</div>
   152  	`)
   153  	require.NoError(t, err)
   154  	val, err := page.EvalOnSelectorAll(".foo", `(elements) => elements.map(el => el.textContent)`)
   155  	require.NoError(t, err)
   156  	require.Equal(t, val, []interface{}([]interface{}{"1", "2", "3"}))
   157  }
   158  
   159  func TestPageEvalOnSelector(t *testing.T) {
   160  	BeforeEach(t)
   161  	defer AfterEach(t)
   162  	err := page.SetContent(`
   163  		<div class="foo">bar</div>
   164  	`)
   165  	require.NoError(t, err)
   166  	val, err := page.EvalOnSelector(".foo", `(element) => element.textContent`)
   167  	require.NoError(t, err)
   168  	require.Equal(t, val, "bar")
   169  }
   170  
   171  func TestPageExpectWorker(t *testing.T) {
   172  	BeforeEach(t)
   173  	defer AfterEach(t)
   174  	worker, err := page.ExpectWorker(func() error {
   175  		_, err := page.Goto(server.PREFIX + "/worker/worker.html")
   176  		return err
   177  	})
   178  	require.NoError(t, err)
   179  	require.Equal(t, 1, len(page.Workers()))
   180  	require.Equal(t, worker, page.Workers()[0])
   181  	worker = page.Workers()[0]
   182  	require.Contains(t, worker.URL(), "worker.js")
   183  	res, err := worker.Evaluate(`() => self["workerFunction"]()`)
   184  	require.NoError(t, err)
   185  	require.Equal(t, "worker function result", res)
   186  	_, err = page.Goto(server.EMPTY_PAGE)
   187  	require.NoError(t, err)
   188  	require.Equal(t, 0, len(page.Workers()))
   189  }
   190  
   191  func TestPageExpectRequest(t *testing.T) {
   192  	BeforeEach(t)
   193  	defer AfterEach(t)
   194  	request, err := page.ExpectRequest("**/*", func() error {
   195  		_, err := page.Goto(server.EMPTY_PAGE)
   196  		return err
   197  	})
   198  	require.NoError(t, err)
   199  	require.Equal(t, server.EMPTY_PAGE, request.URL())
   200  	require.Equal(t, "document", request.ResourceType())
   201  	require.Equal(t, "GET", request.Method())
   202  }
   203  
   204  func TestPageExpectRequestRegexp(t *testing.T) {
   205  	BeforeEach(t)
   206  	defer AfterEach(t)
   207  	request, err := page.ExpectRequest(regexp.MustCompile(".*/empty.html"), func() error {
   208  		_, err := page.Goto(server.EMPTY_PAGE)
   209  		return err
   210  	})
   211  	require.NoError(t, err)
   212  	require.Equal(t, server.EMPTY_PAGE, request.URL())
   213  	require.Equal(t, "document", request.ResourceType())
   214  	require.Equal(t, "GET", request.Method())
   215  }
   216  
   217  func TestPageExpectRequestFunc(t *testing.T) {
   218  	BeforeEach(t)
   219  	defer AfterEach(t)
   220  	request, err := page.ExpectRequest(func(url string) bool {
   221  		return strings.HasSuffix(url, "empty.html")
   222  	}, func() error {
   223  		_, err := page.Goto(server.EMPTY_PAGE)
   224  		return err
   225  	})
   226  	require.NoError(t, err)
   227  	require.Equal(t, server.EMPTY_PAGE, request.URL())
   228  	require.Equal(t, "document", request.ResourceType())
   229  	require.Equal(t, "GET", request.Method())
   230  }
   231  
   232  func TestPageExpectResponse(t *testing.T) {
   233  	BeforeEach(t)
   234  	defer AfterEach(t)
   235  	response, err := page.ExpectResponse("**/*", func() error {
   236  		_, err := page.Goto(server.EMPTY_PAGE)
   237  		return err
   238  	})
   239  	require.NoError(t, err)
   240  	require.Equal(t, server.EMPTY_PAGE, response.URL())
   241  	require.True(t, response.Ok())
   242  	require.Equal(t, 200, response.Status())
   243  	require.Equal(t, "OK", response.StatusText())
   244  }
   245  
   246  func TestPageExpectPopup(t *testing.T) {
   247  	BeforeEach(t)
   248  	defer AfterEach(t)
   249  	_, err := page.Goto(server.EMPTY_PAGE)
   250  	require.NoError(t, err)
   251  	popup, err := page.ExpectPopup(func() error {
   252  		_, err := page.Evaluate(`window._popup = window.open(document.location.href)`)
   253  		return err
   254  	})
   255  	require.NoError(t, err)
   256  	require.Equal(t, popup.URL(), server.EMPTY_PAGE)
   257  }
   258  func TestPageExpectNavigation(t *testing.T) {
   259  	t.Skip()
   260  	BeforeEach(t)
   261  	defer AfterEach(t)
   262  }
   263  
   264  func TestPageExpectLoadState(t *testing.T) {
   265  	t.Skip()
   266  	BeforeEach(t)
   267  	defer AfterEach(t)
   268  }
   269  
   270  func TestPageExpectFileChooser(t *testing.T) {
   271  	t.Skip()
   272  	BeforeEach(t)
   273  	defer AfterEach(t)
   274  }
   275  
   276  func TestPageExpectDialog(t *testing.T) {
   277  	t.Skip()
   278  	BeforeEach(t)
   279  	defer AfterEach(t)
   280  }
   281  
   282  func TestPageExpectConsoleMessage(t *testing.T) {
   283  	BeforeEach(t)
   284  	defer AfterEach(t)
   285  	message, err := page.ExpectConsoleMessage(func() error {
   286  		_, err := page.Evaluate(`console.log(123, "abc")`)
   287  		return err
   288  	})
   289  	require.NoError(t, err)
   290  	require.Equal(t, message.Text(), "123 abc")
   291  }
   292  
   293  func TestPageExpectEvent(t *testing.T) {
   294  	t.Skip()
   295  	BeforeEach(t)
   296  	defer AfterEach(t)
   297  }
   298  
   299  func TestPageOpener(t *testing.T) {
   300  	BeforeEach(t)
   301  	defer AfterEach(t)
   302  	eventPage, err := context.ExpectEvent("page", func() error {
   303  		_, err := page.Goto(server.PREFIX + "/popup/window-open.html")
   304  		return err
   305  	})
   306  	require.NoError(t, err)
   307  	popup := eventPage.(playwright.Page)
   308  
   309  	opener, err := popup.Opener()
   310  	require.NoError(t, err)
   311  	require.Equal(t, opener, page)
   312  
   313  	opener, err = page.Opener()
   314  	require.NoError(t, err)
   315  	require.Nil(t, opener)
   316  }
   317  
   318  func TestPageTitle(t *testing.T) {
   319  	BeforeEach(t)
   320  	defer AfterEach(t)
   321  	require.NoError(t, page.SetContent(`<title>abc</title>`))
   322  	title, err := page.Title()
   323  	require.NoError(t, err)
   324  	require.Equal(t, "abc", title)
   325  }
   326  
   327  func TestPageWaitForSelector(t *testing.T) {
   328  	BeforeEach(t)
   329  	defer AfterEach(t)
   330  	require.NoError(t, page.SetContent(`<h1>myElement</h1>`))
   331  	element, err := page.WaitForSelector("text=myElement")
   332  	require.NoError(t, err)
   333  	textContent, err := element.TextContent()
   334  	require.NoError(t, err)
   335  	require.Equal(t, "myElement", textContent)
   336  
   337  	_, err = page.WaitForSelector("h1")
   338  	require.NoError(t, err)
   339  }
   340  
   341  func TestPageDispatchEvent(t *testing.T) {
   342  	BeforeEach(t)
   343  	defer AfterEach(t)
   344  	_, err := page.Goto(server.PREFIX + "/input/button.html")
   345  	require.NoError(t, err)
   346  	require.NoError(t, page.DispatchEvent("button", "click"))
   347  	clicked, err := page.Evaluate("() => result")
   348  	require.NoError(t, err)
   349  	require.Equal(t, "Clicked", clicked)
   350  }
   351  
   352  func TestPageReload(t *testing.T) {
   353  	BeforeEach(t)
   354  	defer AfterEach(t)
   355  	_, err := page.Goto(server.EMPTY_PAGE)
   356  	require.NoError(t, err)
   357  	_, err = page.Evaluate("window._foo = 10")
   358  	require.NoError(t, err)
   359  	_, err = page.Reload()
   360  	require.NoError(t, err)
   361  	v, err := page.Evaluate("window._foo")
   362  	require.NoError(t, err)
   363  	require.Nil(t, v)
   364  }
   365  
   366  func TestPageGoBackGoForward(t *testing.T) {
   367  	BeforeEach(t)
   368  	defer AfterEach(t)
   369  	resp, err := page.GoBack()
   370  	require.NoError(t, err)
   371  	require.Nil(t, resp)
   372  
   373  	_, err = page.Goto(server.EMPTY_PAGE)
   374  	require.NoError(t, err)
   375  	_, err = page.Goto(server.PREFIX + "/grid.html")
   376  	require.NoError(t, err)
   377  
   378  	resp, err = page.GoBack()
   379  	require.NoError(t, err)
   380  	require.True(t, resp.Ok())
   381  	require.Equal(t, resp.URL(), server.EMPTY_PAGE)
   382  
   383  	resp, err = page.GoForward()
   384  	require.NoError(t, err)
   385  	require.True(t, resp.Ok())
   386  	require.Contains(t, resp.URL(), "/grid.html")
   387  
   388  	resp, err = page.GoForward()
   389  	require.NoError(t, err)
   390  	require.Nil(t, resp)
   391  }
   392  
   393  func TestPageAddScriptTag(t *testing.T) {
   394  	BeforeEach(t)
   395  	defer AfterEach(t)
   396  	_, err := page.Goto(server.EMPTY_PAGE)
   397  	require.NoError(t, err)
   398  
   399  	scriptHandle, err := page.AddScriptTag(playwright.PageAddScriptTagOptions{
   400  		URL: playwright.String("injectedfile.js"),
   401  	})
   402  	require.NoError(t, err)
   403  	require.NotNil(t, scriptHandle.AsElement())
   404  	v, err := page.Evaluate("__injected")
   405  	require.NoError(t, err)
   406  	require.Equal(t, 42, v)
   407  }
   408  
   409  func TestPageAddScriptTagFile(t *testing.T) {
   410  	BeforeEach(t)
   411  	defer AfterEach(t)
   412  	_, err := page.Goto(server.EMPTY_PAGE)
   413  	require.NoError(t, err)
   414  
   415  	scriptHandle, err := page.AddScriptTag(playwright.PageAddScriptTagOptions{
   416  		Path: playwright.String(Asset("injectedfile.js")),
   417  	})
   418  	require.NoError(t, err)
   419  	require.NotNil(t, scriptHandle.AsElement())
   420  	v, err := page.Evaluate("__injected")
   421  	require.NoError(t, err)
   422  	require.Equal(t, 42, v)
   423  }
   424  
   425  func TestPageAddStyleTag(t *testing.T) {
   426  	BeforeEach(t)
   427  	defer AfterEach(t)
   428  	_, err := page.Goto(server.EMPTY_PAGE)
   429  	require.NoError(t, err)
   430  
   431  	_, err = page.AddStyleTag(playwright.PageAddStyleTagOptions{
   432  		URL: playwright.String("injectedstyle.css"),
   433  	})
   434  	require.NoError(t, err)
   435  	v, err := page.Evaluate("window.getComputedStyle(document.querySelector('body')).getPropertyValue('background-color')")
   436  	require.NoError(t, err)
   437  	require.Equal(t, "rgb(255, 0, 0)", v)
   438  }
   439  
   440  func TestPageAddStyleTagFile(t *testing.T) {
   441  	BeforeEach(t)
   442  	defer AfterEach(t)
   443  	_, err := page.Goto(server.EMPTY_PAGE)
   444  	require.NoError(t, err)
   445  
   446  	_, err = page.AddStyleTag(playwright.PageAddStyleTagOptions{
   447  		Path: playwright.String(Asset("injectedstyle.css")),
   448  	})
   449  	require.NoError(t, err)
   450  	v, err := page.Evaluate("window.getComputedStyle(document.querySelector('body')).getPropertyValue('background-color')")
   451  	require.NoError(t, err)
   452  	require.Equal(t, "rgb(255, 0, 0)", v)
   453  }
   454  
   455  func TestPageWaitForLoadState(t *testing.T) {
   456  	BeforeEach(t)
   457  	defer AfterEach(t)
   458  	_, err := page.Goto(server.PREFIX + "/one-style.html")
   459  	require.NoError(t, err)
   460  	page.WaitForLoadState()
   461  	page.WaitForLoadState("networkidle")
   462  }
   463  
   464  func TestPlaywrightDevices(t *testing.T) {
   465  	BeforeEach(t)
   466  	defer AfterEach(t)
   467  	require.Greater(t, len(pw.Devices), 10)
   468  	for name, device := range pw.Devices {
   469  		require.NotEmpty(t, name)
   470  		require.NotEmpty(t, device.UserAgent)
   471  		require.NotEmpty(t, device.Viewport)
   472  		require.Greater(t, device.DeviceScaleFactor, float64(0))
   473  		require.NotEmpty(t, device.DefaultBrowserType)
   474  	}
   475  }
   476  
   477  func TestPageAddInitScript(t *testing.T) {
   478  	BeforeEach(t)
   479  	defer AfterEach(t)
   480  	require.NoError(t, page.AddInitScript(playwright.PageAddInitScriptOptions{
   481  		Script: playwright.String(`window['injected'] = 123;`),
   482  	}))
   483  	_, err := page.Goto(server.PREFIX + "/tamperable.html")
   484  	require.NoError(t, err)
   485  	result, err := page.Evaluate(`() => window['result']`)
   486  	require.NoError(t, err)
   487  	require.Equal(t, 123, result)
   488  }
   489  
   490  func TestPageExpectSelectorTimeout(t *testing.T) {
   491  	BeforeEach(t)
   492  	defer AfterEach(t)
   493  	_, err := page.Goto(server.EMPTY_PAGE)
   494  	require.NoError(t, err)
   495  	timeoutError := errors.Unwrap(page.Click("foobar", playwright.PageClickOptions{
   496  		Timeout: playwright.Float(500),
   497  	})).(*playwright.TimeoutError)
   498  	require.Contains(t, timeoutError.Message, "Timeout 500ms exceeded.")
   499  }
   500  
   501  func TestPageType(t *testing.T) {
   502  	BeforeEach(t)
   503  	defer AfterEach(t)
   504  	_, err := page.Goto(server.EMPTY_PAGE)
   505  	require.NoError(t, err)
   506  	require.NoError(t, page.SetContent("<input type='text' />"))
   507  
   508  	require.NoError(t, page.Type("input", "hello"))
   509  	value, err := page.EvalOnSelector("input", "el => el.value")
   510  	require.NoError(t, err)
   511  	require.Equal(t, "hello", value)
   512  }
   513  
   514  func TestPagePress(t *testing.T) {
   515  	BeforeEach(t)
   516  	defer AfterEach(t)
   517  	_, err := page.Goto(server.EMPTY_PAGE)
   518  	require.NoError(t, err)
   519  	require.NoError(t, page.SetContent("<input type='text' />"))
   520  
   521  	require.NoError(t, page.Press("input", "h"))
   522  	value, err := page.EvalOnSelector("input", "el => el.value")
   523  	require.NoError(t, err)
   524  	require.Equal(t, "h", value)
   525  }
   526  
   527  func TestPageCheck(t *testing.T) {
   528  	BeforeEach(t)
   529  	defer AfterEach(t)
   530  	_, err := page.Goto(server.EMPTY_PAGE)
   531  	require.NoError(t, err)
   532  	require.NoError(t, page.SetContent("<input id='checkbox' type='checkbox'></input>"))
   533  
   534  	require.NoError(t, page.Check("input"))
   535  	value, err := page.EvalOnSelector("input", "el => el.checked")
   536  	require.NoError(t, err)
   537  	require.Equal(t, true, value)
   538  }
   539  
   540  func TestPageUncheck(t *testing.T) {
   541  	BeforeEach(t)
   542  	defer AfterEach(t)
   543  	_, err := page.Goto(server.EMPTY_PAGE)
   544  	require.NoError(t, err)
   545  	require.NoError(t, page.SetContent("<input id='checkbox' type='checkbox' checked></input>"))
   546  
   547  	require.NoError(t, page.Uncheck("input"))
   548  	value, err := page.EvalOnSelector("input", "el => el.checked")
   549  	require.NoError(t, err)
   550  	require.Equal(t, false, value)
   551  }
   552  
   553  func TestPageWaitForTimeout(t *testing.T) {
   554  	BeforeEach(t)
   555  	defer AfterEach(t)
   556  	before := time.Now()
   557  	page.WaitForTimeout(1000)
   558  	after := time.Now()
   559  	duration := after.Sub(before)
   560  	require.True(t, duration > time.Second)
   561  	require.True(t, duration < 2*time.Second)
   562  }
   563  
   564  func TestPageWaitForFunction(t *testing.T) {
   565  	BeforeEach(t)
   566  	defer AfterEach(t)
   567  	_, err := page.Evaluate(`() => setTimeout(() => window.FOO = true, 500)`)
   568  	require.NoError(t, err)
   569  	_, err = page.WaitForFunction(`window.FOO === true`, nil)
   570  	require.NoError(t, err)
   571  }
   572  
   573  func TestPageDblclick(t *testing.T) {
   574  	BeforeEach(t)
   575  	defer AfterEach(t)
   576  	_, err := page.Goto(server.EMPTY_PAGE)
   577  	require.NoError(t, err)
   578  	require.NoError(t, page.SetContent(`<button ondblclick="window.clicked=true"/>`))
   579  	require.NoError(t, page.Dblclick("button"))
   580  	result, err := page.Evaluate("window.clicked")
   581  	require.NoError(t, err)
   582  	require.True(t, result.(bool))
   583  }
   584  
   585  func TestPageFocus(t *testing.T) {
   586  	BeforeEach(t)
   587  	defer AfterEach(t)
   588  	_, err := page.Goto(server.EMPTY_PAGE)
   589  	require.NoError(t, err)
   590  	require.NoError(t, page.SetContent(`<button onfocus="window.clicked=true"/>`))
   591  	require.NoError(t, page.Focus("button"))
   592  	result, err := page.Evaluate("window.clicked")
   593  	require.NoError(t, err)
   594  	require.True(t, result.(bool))
   595  }
   596  
   597  func TestPageTextContent(t *testing.T) {
   598  	BeforeEach(t)
   599  	defer AfterEach(t)
   600  	_, err := page.Goto(server.PREFIX + "/dom.html")
   601  	require.NoError(t, err)
   602  	content, err := page.TextContent("#inner")
   603  	require.NoError(t, err)
   604  	require.Equal(t, "Text,\nmore text", content)
   605  }
   606  
   607  func TestPageAddInitScriptWithPath(t *testing.T) {
   608  	BeforeEach(t)
   609  	defer AfterEach(t)
   610  	require.NoError(t, page.AddInitScript(playwright.PageAddInitScriptOptions{
   611  		Path: playwright.String(Asset("injectedfile.js")),
   612  	}))
   613  	_, err := page.Goto(server.PREFIX + "/tamperable.html")
   614  	require.NoError(t, err)
   615  	result, err := page.Evaluate(`() => window['result']`)
   616  	require.NoError(t, err)
   617  	require.Equal(t, 123, result)
   618  }
   619  
   620  func TestPageSupportNetworkEvents(t *testing.T) {
   621  	BeforeEach(t)
   622  	defer AfterEach(t)
   623  	eventsChan := make(chan string, 6)
   624  	page.On("request", func(request playwright.Request) {
   625  		eventsChan <- fmt.Sprintf("%s %s", request.Method(), request.URL())
   626  	})
   627  	page.On("response", func(response playwright.Response) {
   628  		eventsChan <- fmt.Sprintf("%d %s", response.Status(), response.URL())
   629  	})
   630  	page.On("requestfinished", func(request playwright.Request) {
   631  		eventsChan <- fmt.Sprintf("DONE %s", request.URL())
   632  	})
   633  	page.On("requestfailed", func(request playwright.Request) {
   634  		eventsChan <- fmt.Sprintf("FAIL %s", request.URL())
   635  	})
   636  	server.SetRedirect("/foo.html", "/empty.html")
   637  	FOO_URL := server.PREFIX + "/foo.html"
   638  	response, err := page.Goto(FOO_URL)
   639  	require.NoError(t, err)
   640  	eventsSlice := ChanToSlice(eventsChan, 6)
   641  	require.Equal(t, []string{
   642  		fmt.Sprintf("GET %s", FOO_URL),
   643  		fmt.Sprintf("302 %s", FOO_URL),
   644  		fmt.Sprintf("DONE %s", FOO_URL),
   645  		fmt.Sprintf("GET %s", server.EMPTY_PAGE),
   646  		fmt.Sprintf("200 %s", server.EMPTY_PAGE),
   647  		fmt.Sprintf("DONE %s", server.EMPTY_PAGE),
   648  	}, eventsSlice)
   649  	redirectedFrom := response.Request().RedirectedFrom()
   650  	require.Contains(t, redirectedFrom.URL(), "foo.html")
   651  	require.Nil(t, redirectedFrom.RedirectedFrom())
   652  	require.Equal(t, redirectedFrom.RedirectedTo(), response.Request())
   653  }
   654  
   655  func TestPageSetViewport(t *testing.T) {
   656  	BeforeEach(t)
   657  	defer AfterEach(t)
   658  	utils.VerifyViewport(t, page, 1280, 720)
   659  	require.NoError(t, page.SetViewportSize(123, 456))
   660  	utils.VerifyViewport(t, page, 123, 456)
   661  }
   662  
   663  func TestPageEmulateMedia(t *testing.T) {
   664  	BeforeEach(t)
   665  	defer AfterEach(t)
   666  	utils.AssertEval(t, page, "matchMedia('screen').matches", true)
   667  	utils.AssertEval(t, page, "matchMedia('print').matches", false)
   668  	require.NoError(t, page.EmulateMedia(playwright.PageEmulateMediaOptions{
   669  		Media: playwright.MediaPrint,
   670  	}))
   671  	utils.AssertEval(t, page, "matchMedia('screen').matches", false)
   672  	utils.AssertEval(t, page, "matchMedia('print').matches", true)
   673  	require.NoError(t, page.EmulateMedia())
   674  	utils.AssertEval(t, page, "matchMedia('screen').matches", false)
   675  	utils.AssertEval(t, page, "matchMedia('print').matches", true)
   676  	require.NoError(t, page.EmulateMedia(playwright.PageEmulateMediaOptions{
   677  		Media: playwright.MediaNull,
   678  	}))
   679  	utils.AssertEval(t, page, "matchMedia('screen').matches", true)
   680  	utils.AssertEval(t, page, "matchMedia('print').matches", false)
   681  }
   682  
   683  func TestPageBringToFront(t *testing.T) {
   684  	BeforeEach(t)
   685  	defer AfterEach(t)
   686  	page1, err := browser.NewPage()
   687  	require.NoError(t, err)
   688  	require.NoError(t, page1.SetContent("Page1"))
   689  	page2, err := browser.NewPage()
   690  	require.NoError(t, err)
   691  	require.NoError(t, page2.SetContent("Page2"))
   692  
   693  	require.NoError(t, page1.BringToFront())
   694  	utils.AssertEval(t, page1, "document.visibilityState", "visible")
   695  	utils.AssertEval(t, page2, "document.visibilityState", "visible")
   696  
   697  	require.NoError(t, page2.BringToFront())
   698  	utils.AssertEval(t, page1, "document.visibilityState", "visible")
   699  	utils.AssertEval(t, page2, "document.visibilityState", "visible")
   700  	require.NoError(t, page1.Close())
   701  	require.NoError(t, page2.Close())
   702  }
   703  
   704  func TestPageFrame(t *testing.T) {
   705  	BeforeEach(t)
   706  	defer AfterEach(t)
   707  	err := page.SetContent(fmt.Sprintf("<iframe name=target src=%s></iframe>", server.EMPTY_PAGE))
   708  	require.NoError(t, err)
   709  
   710  	var name = "target"
   711  	frame1 := page.Frame(playwright.PageFrameOptions{Name: &name})
   712  	require.Equal(t, name, frame1.Name())
   713  	require.Equal(t, server.EMPTY_PAGE, frame1.URL())
   714  
   715  	frame2 := page.Frame(playwright.PageFrameOptions{URL: server.EMPTY_PAGE})
   716  	require.Equal(t, name, frame2.Name())
   717  	require.Equal(t, server.EMPTY_PAGE, frame2.URL())
   718  
   719  	var badName = "test"
   720  	frame3 := page.Frame(playwright.PageFrameOptions{Name: &badName, URL: server.EMPTY_PAGE})
   721  	require.Equal(t, name, frame3.Name())
   722  	require.Equal(t, server.EMPTY_PAGE, frame3.URL())
   723  
   724  	require.Nil(t, page.Frame(playwright.PageFrameOptions{Name: &badName, URL: "https://example.com"}))
   725  	require.Nil(t, page.Frame(playwright.PageFrameOptions{Name: &badName}))
   726  }
   727  
   728  func TestPageTap(t *testing.T) {
   729  	BeforeEach(t)
   730  	defer AfterEach(t)
   731  	_, err := page.Goto(server.EMPTY_PAGE)
   732  	require.NoError(t, err)
   733  	require.NoError(t, page.SetContent("<input id='checkbox' type='checkbox'></input>"))
   734  	value, err := page.EvalOnSelector("input", "el => el.checked")
   735  	require.NoError(t, err)
   736  	require.Equal(t, false, value)
   737  
   738  	require.NoError(t, page.Tap("input"))
   739  	value, err = page.EvalOnSelector("input", "el => el.checked")
   740  	require.NoError(t, err)
   741  	require.Equal(t, true, value)
   742  }
   743  
   744  func TestPagePageError(t *testing.T) {
   745  	BeforeEach(t)
   746  	defer AfterEach(t)
   747  	url := server.PREFIX + "/error.html"
   748  	errInterface, err := page.ExpectEvent("pageerror", func() error {
   749  		_, err := page.Goto(url)
   750  		return err
   751  	})
   752  	require.NoError(t, err)
   753  	pageError := errInterface.(*playwright.Error)
   754  	require.Equal(t, "Fancy error!", pageError.Message)
   755  	require.Equal(t, "Error", pageError.Name)
   756  
   757  	if browserName == "chromium" {
   758  		require.Equal(t, `Error: Fancy error!
   759      at c (myscript.js:14:11)
   760      at b (myscript.js:10:5)
   761      at a (myscript.js:6:5)
   762      at myscript.js:3:1`, pageError.Stack)
   763  	}
   764  	if browserName == "firefox" {
   765  		require.Equal(t, `Error: Fancy error!
   766      at c (myscript.js:14:11)
   767      at b (myscript.js:10:5)
   768      at a (myscript.js:6:5)
   769      at  (myscript.js:3:1)`, pageError.Stack)
   770  	}
   771  	if browserName == "webkit" {
   772  		require.Equal(t, fmt.Sprintf(`Error: Fancy error!
   773      at c (%[1]s:14:36)
   774      at b (%[1]s:10:6)
   775      at a (%[1]s:6:6)
   776      at global code (%[1]s:3:2)`, url), pageError.Stack)
   777  	}
   778  }
   779  
   780  func TestPageSelectOption(t *testing.T) {
   781  	BeforeEach(t)
   782  	defer AfterEach(t)
   783  	_, err := page.Goto(server.EMPTY_PAGE)
   784  	require.NoError(t, err)
   785  	require.NoError(t, page.SetContent("<select id='lang'><option value='go'>go</option><option value='python'>python</option></select>"))
   786  	selected, err := page.SelectOption("#lang", playwright.SelectOptionValues{
   787  		Values: playwright.StringSlice("python"),
   788  	})
   789  	require.NoError(t, err)
   790  	require.Equal(t, 1, len(selected))
   791  	require.Equal(t, "python", selected[0])
   792  }
   793  
   794  func TestPageUnrouteShouldWork(t *testing.T) {
   795  	BeforeEach(t)
   796  	defer AfterEach(t)
   797  	intercepted := []int{}
   798  	handler1 := func(route playwright.Route, request playwright.Request) {
   799  		intercepted = append(intercepted, 1)
   800  		require.NoError(t, route.Continue())
   801  	}
   802  	require.NoError(t, page.Route("**/empty.html", handler1))
   803  	require.NoError(t, page.Route("**/empty.html", func(route playwright.Route, request playwright.Request) {
   804  		intercepted = append(intercepted, 2)
   805  		require.NoError(t, route.Continue())
   806  	}))
   807  	require.NoError(t, page.Route("**/empty.html", func(route playwright.Route, request playwright.Request) {
   808  		intercepted = append(intercepted, 3)
   809  		require.NoError(t, route.Continue())
   810  	}))
   811  	require.NoError(t, page.Route("**/*", func(route playwright.Route, request playwright.Request) {
   812  		intercepted = append(intercepted, 4)
   813  		require.NoError(t, route.Continue())
   814  	}))
   815  
   816  	_, err := page.Goto(server.EMPTY_PAGE)
   817  	require.NoError(t, err)
   818  	require.Equal(t, []int{1}, intercepted)
   819  
   820  	intercepted = []int{}
   821  	require.NoError(t, page.Unroute("**/empty.html", handler1))
   822  	_, err = page.Goto(server.EMPTY_PAGE)
   823  	require.NoError(t, err)
   824  	require.Equal(t, []int{2}, intercepted)
   825  
   826  	intercepted = []int{}
   827  	require.NoError(t, page.Unroute("**/empty.html"))
   828  	_, err = page.Goto(server.EMPTY_PAGE)
   829  	require.NoError(t, err)
   830  	require.Equal(t, []int{4}, intercepted)
   831  }
   832  
   833  func TestPageDragAndDrop(t *testing.T) {
   834  	BeforeEach(t)
   835  	defer AfterEach(t)
   836  	_, err := page.Goto(server.PREFIX + "/drag-n-drop.html")
   837  	require.NoError(t, err)
   838  	require.NoError(t, page.DragAndDrop("#source", "#target"))
   839  	value, err := page.EvalOnSelector("#target", "target => target.contains(document.querySelector('#source'))")
   840  	require.NoError(t, err)
   841  	require.Equal(t, true, value)
   842  }
   843  func TestPageInputValue(t *testing.T) {
   844  	BeforeEach(t)
   845  	defer AfterEach(t)
   846  	require.NoError(t, page.SetContent(`
   847  		<input></input>
   848  	`))
   849  	require.NoError(t, page.Fill("input", "hello"))
   850  	value, err := page.InputValue("input")
   851  	require.NoError(t, err)
   852  	require.Equal(t, "hello", value)
   853  	require.NoError(t, page.Fill("input", ""))
   854  	value, err = page.InputValue("input")
   855  	require.NoError(t, err)
   856  	require.Equal(t, "", value)
   857  }
   858  
   859  func TestPageWaitForFunction2(t *testing.T) {
   860  	BeforeEach(t)
   861  	defer AfterEach(t)
   862  	_, err := page.Goto(server.EMPTY_PAGE)
   863  	require.NoError(t, err)
   864  	_, err = page.AddScriptTag(
   865  		playwright.PageAddScriptTagOptions{
   866  			Path: playwright.String(Asset(filepath.Join("es6", "es6pathimport.js"))),
   867  			Type: playwright.String("module"),
   868  		},
   869  	)
   870  	require.NoError(t, err)
   871  	_, err = page.WaitForFunction("window.__es6injected", nil)
   872  	require.NoError(t, err)
   873  	value, err := page.Evaluate("window.__es6injected")
   874  	require.NoError(t, err)
   875  	require.Equal(t, 42, value)
   876  }
   877  
   878  func TestPageShouldSetBodysizeAndHeadersize(t *testing.T) {
   879  	BeforeEach(t)
   880  	defer AfterEach(t)
   881  	_, err := page.Goto(server.EMPTY_PAGE)
   882  	require.NoError(t, err)
   883  	request, err := page.ExpectRequest("**/*", func() error {
   884  		_, err = page.Evaluate("() => fetch('./get', { method: 'POST', body: '12345'}).then(r => r.text())")
   885  		require.NoError(t, err)
   886  		return nil
   887  	},
   888  	)
   889  	require.NoError(t, err)
   890  	sizes, err := request.Sizes()
   891  	require.NoError(t, err)
   892  	require.Equal(t, 5, sizes.RequestBodySize)
   893  	require.GreaterOrEqual(t, sizes.RequestHeadersSize, 300)
   894  }
   895  
   896  func TestPageTestShouldSetBodysizeTo0(t *testing.T) {
   897  	BeforeEach(t)
   898  	defer AfterEach(t)
   899  	_, err := page.Goto(server.EMPTY_PAGE)
   900  	require.NoError(t, err)
   901  	request, err := page.ExpectRequest("**/*", func() error {
   902  		_, err = page.Evaluate("() => fetch('./get').then(r => r.text())")
   903  		require.NoError(t, err)
   904  		return nil
   905  	},
   906  	)
   907  	require.NoError(t, err)
   908  	sizes, err := request.Sizes()
   909  	require.NoError(t, err)
   910  	require.Equal(t, 0, sizes.RequestBodySize)
   911  	require.GreaterOrEqual(t, sizes.RequestHeadersSize, 200)
   912  }
   913  
   914  func TestPageSetChecked(t *testing.T) {
   915  	BeforeEach(t)
   916  	defer AfterEach(t)
   917  	require.NoError(t, page.SetContent(`<input id='checkbox' type='checkbox'></input>`))
   918  	require.NoError(t, page.SetChecked("input", true))
   919  	isChecked, err := page.Evaluate("checkbox.checked")
   920  	require.NoError(t, err)
   921  	require.True(t, isChecked.(bool))
   922  	require.NoError(t, page.SetChecked("input", false))
   923  	isChecked, err = page.Evaluate("checkbox.checked")
   924  	require.NoError(t, err)
   925  	require.False(t, isChecked.(bool))
   926  }
   927  

View as plain text