From 7c0e44a22f2c4fa90600acce6d88e3c286d7f1e7 Mon Sep 17 00:00:00 2001 From: Steve Dudenhoeffer Date: Sat, 15 Mar 2025 00:46:02 -0400 Subject: [PATCH] Add viewport dimensions and dark mode support This commit introduces optional viewport dimensions and dark mode support to the PlayWrightBrowserOptions struct and its usage. It ensures more control over browser display settings and improves flexibility when configuring browser contexts. Additionally, visibility checking logic in SetHidden was refined to avoid redundant operations. --- node.go | 17 +++++++++++++++-- playwright.go | 35 ++++++++++++++++++++++++++++++++++- 2 files changed, 49 insertions(+), 3 deletions(-) diff --git a/node.go b/node.go index 000c6a0..64221f7 100644 --- a/node.go +++ b/node.go @@ -87,8 +87,21 @@ func (n node) ForEach(selector string, fn func(Node) error) error { } func (n node) SetHidden(val bool) error { - _, err := n.locator.Evaluate(fmt.Sprintf(`(element) => element.hidden = %t;`, val), nil) - return err + visible, err := n.locator.IsVisible() + if err != nil { + return fmt.Errorf("error checking visibility: %w", err) + } + if visible == !val { + return nil + } + + // Set the hidden property + _, err = n.locator.Evaluate(fmt.Sprintf(`(element) => element.hidden = %t;`, val), nil) + if err != nil { + return fmt.Errorf("error setting hidden property: %w", err) + } + + return nil } func escapeJavaScript(s string) string { diff --git a/playwright.go b/playwright.go index 0e81340..3656ece 100644 --- a/playwright.go +++ b/playwright.go @@ -36,6 +36,10 @@ const ( PlayWrightBrowserSelectionWebKit PlayWrightBrowserSelection = "webkit" ) +type Size struct { + Width int + Height int +} type PlayWrightBrowserOptions struct { UserAgent string // If empty, defaults to "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0" Browser PlayWrightBrowserSelection // If unset defaults to Firefox. @@ -46,6 +50,9 @@ type PlayWrightBrowserOptions struct { CookieJar ShowBrowser bool // If false, browser will be headless + + Dimensions Size + DarkMode bool } func cookieToPlaywrightOptionalCookie(cookie Cookie) playwright.OptionalCookie { @@ -76,6 +83,7 @@ func NewPlayWrightBrowser(opts ...PlayWrightBrowserOptions) (Browser, error) { UserAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0", Browser: PlayWrightBrowserSelectionFirefox, Timeout: &thirtySeconds, + DarkMode: false, } for _, o := range opts { @@ -91,6 +99,13 @@ func NewPlayWrightBrowser(opts ...PlayWrightBrowserOptions) (Browser, error) { if o.CookieJar != nil { opt.CookieJar = o.CookieJar } + if o.Dimensions.Width > 0 && o.Dimensions.Height > 0 { + opt.Dimensions = o.Dimensions + } + if o.DarkMode { + opt.DarkMode = true + } + opt.ShowBrowser = o.ShowBrowser } @@ -133,8 +148,26 @@ func NewPlayWrightBrowser(opts ...PlayWrightBrowserOptions) (Browser, error) { return nil, err } + var viewport *playwright.Size + if opt.Dimensions.Width > 0 && opt.Dimensions.Height > 0 { + viewport = &playwright.Size{ + Width: opt.Dimensions.Width, + Height: opt.Dimensions.Height, + } + } + + var scheme *playwright.ColorScheme + + if opt.DarkMode { + scheme = playwright.ColorSchemeDark + } else { + scheme = playwright.ColorSchemeNoPreference + } + c, err := browser.NewContext(playwright.BrowserNewContextOptions{ - UserAgent: playwright.String(opt.UserAgent), + UserAgent: playwright.String(opt.UserAgent), + Viewport: viewport, + ColorScheme: scheme, }) if err != nil { return nil, err