diff --git a/playwright.go b/playwright.go index cfc41e4..bc374ae 100644 --- a/playwright.go +++ b/playwright.go @@ -6,18 +6,20 @@ import ( "fmt" "io" "log/slog" + "os" "time" "github.com/playwright-community/playwright-go" ) type playWrightBrowser struct { - pw *playwright.Playwright - browser playwright.Browser - ctx playwright.BrowserContext - userAgent string - timeout time.Duration - cookieJar CookieJar + pw *playwright.Playwright + browser playwright.Browser + ctx playwright.BrowserContext + userAgent string + timeout time.Duration + cookieJar CookieJar + serverAddr string } var _ Browser = playWrightBrowser{} @@ -53,6 +55,10 @@ type PlayWrightBrowserOptions struct { Dimensions Size DarkMode bool + + // PlayWrightServerAddress is the address of a PlayWright server to connect to. + // Defaults to the value of the environment variable PLAYWRIGHT_SERVER_ADDRESS. + PlayWrightServerAddress string } func cookieToPlaywrightOptionalCookie(cookie Cookie) playwright.OptionalCookie { @@ -80,10 +86,11 @@ func playwrightCookieToCookie(cookie playwright.Cookie) Cookie { func NewPlayWrightBrowser(opts ...PlayWrightBrowserOptions) (Browser, error) { var thirtySeconds = 30 * time.Second opt := PlayWrightBrowserOptions{ - UserAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:137.0) Gecko/20100101 Firefox/137.0", - Browser: PlayWrightBrowserSelectionFirefox, - Timeout: &thirtySeconds, - DarkMode: false, + UserAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0", + Browser: PlayWrightBrowserSelectionFirefox, + Timeout: &thirtySeconds, + DarkMode: false, + PlayWrightServerAddress: os.Getenv("PLAYWRIGHT_SERVER_ADDRESS"), } for _, o := range opts { @@ -140,12 +147,20 @@ func NewPlayWrightBrowser(opts ...PlayWrightBrowserOptions) (Browser, error) { default: return nil, ErrInvalidBrowserSelection } + var browser playwright.Browser - browser, err := bt.Launch(playwright.BrowserTypeLaunchOptions{ - Headless: playwright.Bool(!opt.ShowBrowser), - }) - if err != nil { - return nil, err + if opt.PlayWrightServerAddress != "" { + browser, err = bt.Connect(opt.PlayWrightServerAddress, playwright.BrowserTypeConnectOptions{}) + if err != nil { + return nil, err + } + } else { + browser, err = bt.Launch(playwright.BrowserTypeLaunchOptions{ + Headless: playwright.Bool(!opt.ShowBrowser), + }) + if err != nil { + return nil, err + } } var viewport *playwright.Size @@ -193,12 +208,13 @@ func NewPlayWrightBrowser(opts ...PlayWrightBrowserOptions) (Browser, error) { } return playWrightBrowser{ - pw: pw, - browser: browser, - userAgent: opt.UserAgent, - timeout: *opt.Timeout, - cookieJar: opt.CookieJar, - ctx: c, + pw: pw, + browser: browser, + userAgent: opt.UserAgent, + timeout: *opt.Timeout, + cookieJar: opt.CookieJar, + ctx: c, + serverAddr: opt.PlayWrightServerAddress, }, nil }