From ee1b64086eb7ddc19be08c1e3fe91320212c4258 Mon Sep 17 00:00:00 2001 From: "yazhou.qian" Date: Mon, 7 Sep 2026 12:25:04 +0800 Subject: [PATCH] fix(browser): stop waiting for full page load --- pkg/provider/browser/browser.go | 13 ++++++++++++- pkg/provider/browser/browser_test.go | 24 ++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/pkg/provider/browser/browser.go b/pkg/provider/browser/browser.go index 0681589b1..508315597 100644 --- a/pkg/provider/browser/browser.go +++ b/pkg/provider/browser/browser.go @@ -18,6 +18,10 @@ var logger = logrus.WithField("provider", "browser") const DEFAULT_TIMEOUT float64 = 300000 +type pageNavigator interface { + Goto(url string, options ...playwright.PageGotoOptions) (playwright.Response, error) +} + // Client client for browser based Identity Provider type Client struct { BrowserType string @@ -171,7 +175,7 @@ var getSAMLResponse = func(page playwright.Page, loginDetails *creds.LoginDetail data, dataErr = request.PostData() } }) - if _, err := page.Goto(loginDetails.URL); err != nil { + if err := navigateToLoginPage(page, loginDetails.URL); err != nil { return "", err } @@ -202,6 +206,13 @@ var getSAMLResponse = func(page playwright.Page, loginDetails *creds.LoginDetail return values.Get("SAMLResponse"), nil } +func navigateToLoginPage(page pageNavigator, loginURL string) error { + _, err := page.Goto(loginURL, playwright.PageGotoOptions{ + WaitUntil: playwright.WaitUntilStateCommit, + }) + return err +} + var autoFill = func(page playwright.Page, loginDetails *creds.LoginDetails) error { passwordField := page.Locator("input[type='password']") err := passwordField.WaitFor(playwright.LocatorWaitForOptions{ diff --git a/pkg/provider/browser/browser_test.go b/pkg/provider/browser/browser_test.go index af702db2a..25d018fd9 100644 --- a/pkg/provider/browser/browser_test.go +++ b/pkg/provider/browser/browser_test.go @@ -168,6 +168,30 @@ func TestGetSAMLResponse(t *testing.T) { // assert.Equal(t, samlp, samlResp) } +type fakePageNavigator struct { + url string + options []playwright.PageGotoOptions +} + +func (f *fakePageNavigator) Goto(url string, options ...playwright.PageGotoOptions) (playwright.Response, error) { + f.url = url + f.options = options + return nil, nil +} + +func TestNavigateToLoginPageWaitsForCommit(t *testing.T) { + page := &fakePageNavigator{} + loginURL := "https://idp.example.com/login" + + err := navigateToLoginPage(page, loginURL) + + require.NoError(t, err) + assert.Equal(t, loginURL, page.url) + require.Len(t, page.options, 1) + require.NotNil(t, page.options[0].WaitUntil) + assert.Equal(t, *playwright.WaitUntilStateCommit, *page.options[0].WaitUntil) +} + func TestExpectRequestOptions(t *testing.T) { timeout := float64(100000) idpAccount := cfg.IDPAccount{