Skip to content

Commit

Permalink
chore: WaitForRequest/WaitForResponse accepts Options args (#292)
Browse files Browse the repository at this point in the history
  • Loading branch information
ninadingole committed Oct 12, 2022
1 parent 5e306ad commit 7f5cccf
Show file tree
Hide file tree
Showing 4 changed files with 132 additions and 11 deletions.
4 changes: 2 additions & 2 deletions generated-interfaces.go
Original file line number Diff line number Diff line change
Expand Up @@ -1689,9 +1689,9 @@ type Page interface {
WaitForNavigation(options ...PageWaitForNavigationOptions) (Response, error)
// Waits for the matching request and returns it. See [waiting for event](../events.md#waiting-for-event) for more details
// about events.
WaitForRequest(url interface{}, options ...interface{}) Request
WaitForRequest(url interface{}, options ...PageWaitForRequestOptions) (Request, error)
// Returns the matched response. See [waiting for event](../events.md#waiting-for-event) for more details about events.
WaitForResponse(url interface{}, options ...interface{}) Response
WaitForResponse(url interface{}, options ...PageWaitForResponseOptions) (Response, error)
// Returns when element specified by selector satisfies `state` option. Returns `null` if waiting for `hidden` or
// `detached`.
// > NOTE: Playwright automatically waits for element to be ready before performing an action. Using `Locator` objects and
Expand Down
38 changes: 34 additions & 4 deletions page.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"fmt"
"io/ioutil"
"reflect"
"time"
)

type pageImpl struct {
Expand Down Expand Up @@ -328,7 +329,16 @@ func (p *pageImpl) WaitForNavigation(options ...PageWaitForNavigationOptions) (R
return p.mainFrame.WaitForNavigation(options...)
}

func (p *pageImpl) WaitForRequest(url interface{}, options ...interface{}) Request {
func (p *pageImpl) WaitForRequest(url interface{}, options ...PageWaitForRequestOptions) (Request, error) {
option := PageWaitForRequestOptions{}

if len(options) == 1 {
option = options[0]
}
if option.Timeout == nil {
option.Timeout = Float(p.timeoutSettings.timeout)
}
deadline := time.After(time.Duration(*option.Timeout) * time.Millisecond)
var matcher *urlMatcher
if url != nil {
matcher = newURLMatcher(url)
Expand All @@ -342,10 +352,24 @@ func (p *pageImpl) WaitForRequest(url interface{}, options ...interface{}) Reque
}
return true
}
return p.WaitForEvent("request", predicate).(*requestImpl)

select {
case <-deadline:
return nil, fmt.Errorf("Timeout %.2fms exceeded.", *option.Timeout)
case req := <-waitForEvent(p, "request", predicate):
return req.(*requestImpl), nil
}
}

func (p *pageImpl) WaitForResponse(url interface{}, options ...interface{}) Response {
func (p *pageImpl) WaitForResponse(url interface{}, options ...PageWaitForResponseOptions) (Response, error) {
option := PageWaitForResponseOptions{}
if len(options) == 1 {
option = options[0]
}
if option.Timeout == nil {
option.Timeout = Float(p.timeoutSettings.timeout)
}
deadline := time.After(time.Duration(*option.Timeout) * time.Millisecond)
var matcher *urlMatcher
if url != nil {
matcher = newURLMatcher(url)
Expand All @@ -359,7 +383,13 @@ func (p *pageImpl) WaitForResponse(url interface{}, options ...interface{}) Resp
}
return true
}
return p.WaitForEvent("response", predicate).(*responseImpl)

select {
case <-deadline:
return nil, fmt.Errorf("Timeout %.2fms exceeded.", *option.Timeout)
case res := <-waitForEvent(p, "response", predicate):
return res.(*responseImpl), nil
}
}

func (p *pageImpl) ExpectEvent(event string, cb func() error, predicates ...interface{}) (interface{}, error) {
Expand Down
10 changes: 5 additions & 5 deletions scripts/data/interfaces.json
Original file line number Diff line number Diff line change
Expand Up @@ -1316,12 +1316,12 @@
"(Response, error)"
],
"WaitForRequest": [
"url interface{}, options ...interface{}",
"Request"
"url interface{}, options ...PageWaitForRequestOptions",
"(Request, error)"
],
"WaitForResponse": [
"url interface{}, options ...interface{}",
"Response"
"url interface{}, options ...PageWaitForResponseOptions",
"(Response, error)"
],
"WaitForSelector": [
"selector string, options ...PageWaitForSelectorOptions",
Expand Down Expand Up @@ -1580,4 +1580,4 @@
"(interface{}, error)"
]
}
}
}
91 changes: 91 additions & 0 deletions tests/page_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"regexp"
"strconv"
"strings"
"sync"
"testing"
"time"

Expand Down Expand Up @@ -924,3 +925,93 @@ func TestPageSetChecked(t *testing.T) {
require.NoError(t, err)
require.False(t, isChecked.(bool))
}

func TestPageWaitForRequest(t *testing.T) {
t.Run("should work", func(t *testing.T) {
BeforeEach(t)
defer AfterEach(t)

var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
request, err := page.WaitForRequest("**/one-style.html", playwright.PageWaitForRequestOptions{Timeout: playwright.Float(3 * 1000)})
require.NoError(t, err)
require.Equal(t, fmt.Sprintf("%s/one-style.html", server.PREFIX), request.URL())
}()

_, err := page.Goto(server.PREFIX + "/one-style.html")
require.NoError(t, err)
wg.Wait()
})

t.Run("should respect timeout", func(t *testing.T) {
BeforeEach(t)
defer AfterEach(t)
_, err := page.Goto(server.EMPTY_PAGE)
require.NoError(t, err)
request, err := page.WaitForRequest("**/one-style.html", playwright.PageWaitForRequestOptions{Timeout: playwright.Float(1000)})

require.Nil(t, request)
require.EqualError(t, err, "Timeout 1000.00ms exceeded.")
})

t.Run("should use default timeout", func(t *testing.T) {
BeforeEach(t)
defer AfterEach(t)
_, err := page.Goto(server.EMPTY_PAGE)
page.SetDefaultTimeout(500)
defer page.SetDefaultTimeout(30 * 1000) // reset

require.NoError(t, err)
request, err := page.WaitForRequest("**/one-style.html")

require.Nil(t, request)
require.EqualError(t, err, "Timeout 500.00ms exceeded.")
})
}

func TestPageWaitForResponse(t *testing.T) {
t.Run("should work", func(t *testing.T) {
BeforeEach(t)
defer AfterEach(t)

var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
response, err := page.WaitForResponse("**/one-style.html", playwright.PageWaitForResponseOptions{Timeout: playwright.Float(3 * 1000)})
require.NoError(t, err)
require.Equal(t, fmt.Sprintf("%s/one-style.html", server.PREFIX), response.URL())
}()

_, err := page.Goto(server.PREFIX + "/one-style.html")
require.NoError(t, err)
wg.Wait()
})

t.Run("should respect timeout", func(t *testing.T) {
BeforeEach(t)
defer AfterEach(t)
_, err := page.Goto(server.EMPTY_PAGE)
require.NoError(t, err)
response, err := page.WaitForResponse("**/one-style.html", playwright.PageWaitForResponseOptions{Timeout: playwright.Float(1000)})

require.Nil(t, response)
require.EqualError(t, err, "Timeout 1000.00ms exceeded.")
})

t.Run("should use default timeout", func(t *testing.T) {
BeforeEach(t)
defer AfterEach(t)
_, err := page.Goto(server.EMPTY_PAGE)
page.SetDefaultTimeout(500)
defer page.SetDefaultTimeout(30 * 1000) // reset

require.NoError(t, err)
response, err := page.WaitForResponse("**/one-style.html")

require.Nil(t, response)
require.EqualError(t, err, "Timeout 500.00ms exceeded.")
})
}

0 comments on commit 7f5cccf

Please sign in to comment.