Skip to content

Commit 568088b

Browse files
committed
Allow page-free Playwright execution
1 parent a28340b commit 568088b

5 files changed

Lines changed: 610 additions & 579 deletions

File tree

server/cmd/api/api/playwright.go

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,10 @@ const (
2323
)
2424

2525
type playwrightDaemonRequest struct {
26-
ID string `json:"id"`
27-
Code string `json:"code"`
28-
TimeoutMs int `json:"timeout_ms,omitempty"`
26+
ID string `json:"id"`
27+
Code string `json:"code"`
28+
TimeoutMs int `json:"timeout_ms,omitempty"`
29+
ResolveActivePage bool `json:"resolve_active_page"`
2930
}
3031

3132
type playwrightDaemonResponse struct {
@@ -84,7 +85,7 @@ func (s *ApiService) ensurePlaywrightDaemon(ctx context.Context) error {
8485
return fmt.Errorf("playwright daemon failed to start within %v", playwrightDaemonStartup)
8586
}
8687

87-
func (s *ApiService) executeViaUnixSocket(ctx context.Context, code string, timeout time.Duration) (*playwrightDaemonResponse, error) {
88+
func (s *ApiService) executeViaUnixSocket(ctx context.Context, code string, timeout time.Duration, resolveActivePage bool) (*playwrightDaemonResponse, error) {
8889
conn, err := net.DialTimeout("unix", playwrightDaemonSocket, 2*time.Second)
8990
if err != nil {
9091
return nil, fmt.Errorf("failed to connect to daemon: %w", err)
@@ -97,9 +98,10 @@ func (s *ApiService) executeViaUnixSocket(ctx context.Context, code string, time
9798

9899
reqID := uuid.New().String()
99100
req := playwrightDaemonRequest{
100-
ID: reqID,
101-
Code: code,
102-
TimeoutMs: int(timeout.Milliseconds()),
101+
ID: reqID,
102+
Code: code,
103+
TimeoutMs: int(timeout.Milliseconds()),
104+
ResolveActivePage: resolveActivePage,
103105
}
104106

105107
reqBytes, err := json.Marshal(req)
@@ -160,7 +162,8 @@ func (s *ApiService) ExecutePlaywrightCode(ctx context.Context, request oapi.Exe
160162
}, nil
161163
}
162164

163-
resp, err := s.executeViaUnixSocket(ctx, request.Body.Code, timeout)
165+
resolveActivePage := request.Body.ResolveActivePage == nil || *request.Body.ResolveActivePage
166+
resp, err := s.executeViaUnixSocket(ctx, request.Body.Code, timeout, resolveActivePage)
164167
if err != nil {
165168
log.Error("playwright execution failed", "error", err)
166169
errorMsg := fmt.Sprintf("execution failed: %v", err)

server/e2e/e2e_playwright_test.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,17 @@ func TestPlaywrightExecuteAPI(t *testing.T) {
179179
require.Zero(t, setupResult.FirstContextPageCount, "expected the first context to remain open without pages")
180180
require.Equal(t, 2, setupResult.SecondContextPageCount, "expected a foreground page and a newer fallback page in the second context")
181181

182+
resolveActivePage := false
183+
pageFreeRsp, err := client.ExecutePlaywrightCodeWithResponse(ctx, instanceoapi.ExecutePlaywrightCodeJSONRequestBody{
184+
Code: `return browser.contexts().flatMap(browserContext => browserContext.pages()).length;`,
185+
ResolveActivePage: &resolveActivePage,
186+
})
187+
require.NoError(t, err, "page-free request error: %v", err)
188+
require.Equal(t, http.StatusOK, pageFreeRsp.StatusCode(), "page-free request returned %s body=%s", pageFreeRsp.Status(), string(pageFreeRsp.Body))
189+
require.NotNil(t, pageFreeRsp.JSON200)
190+
require.True(t, pageFreeRsp.JSON200.Success, "expected page-free request success=true")
191+
require.EqualValues(t, 2, pageFreeRsp.JSON200.Result, "expected page-free request to list both pages in the second context")
192+
182193
crossContextRsp, err := client.ExecutePlaywrightCodeWithResponse(ctx, instanceoapi.ExecutePlaywrightCodeJSONRequestBody{
183194
Code: `return { url: page.url(), contextPageUrls: page.context().pages().map(candidate => candidate.url()) };`,
184195
})

0 commit comments

Comments
 (0)