@@ -111,10 +111,26 @@ func NewBrowser(proxy string, useLocal bool, optionalArgs map[string]string) (*B
111111}
112112
113113func (b * Browser ) ScreenshotWithBody (url string , timeout time.Duration , idle time.Duration , headers []string , fullPage bool , jsCodes []string ) ([]byte , string , []NetworkRequest , error ) {
114- page , err := b .engine . Page (proto. TargetCreateTarget {} )
114+ page , networkRequests , err := b .setupPageAndNavigate ( url , timeout , headers , jsCodes )
115115 if err != nil {
116116 return nil , "" , []NetworkRequest {}, err
117117 }
118+ defer b .closePage (page )
119+
120+ screenshot , body , err := b .takeScreenshotAndGetBody (page , idle , fullPage )
121+ if err != nil {
122+ return nil , "" , networkRequests , err
123+ }
124+
125+ return screenshot , body , networkRequests , nil
126+ }
127+
128+ // setupPageAndNavigate opens a page, performs all adaptive actions including JS injection
129+ func (b * Browser ) setupPageAndNavigate (url string , timeout time.Duration , headers []string , jsCodes []string ) (* rod.Page , []NetworkRequest , error ) {
130+ page , err := b .engine .Page (proto.TargetCreateTarget {})
131+ if err != nil {
132+ return nil , []NetworkRequest {}, err
133+ }
118134
119135 // Enable network
120136 page .EnableDomain (proto.NetworkEnable {})
@@ -184,39 +200,46 @@ func (b *Browser) ScreenshotWithBody(url string, timeout time.Duration, idle tim
184200 }
185201
186202 page = page .Timeout (timeout )
187- defer func () {
188- _ = page .Close ()
189- }()
190203
191204 if err := page .Navigate (url ); err != nil {
192- return nil , "" , networkRequests .Slice , err
205+ return page , networkRequests .Slice , err
193206 }
194207
195208 if len (jsCodes ) > 0 {
196209 _ , err := b .ExecuteJavascriptCodesWithPage (page , jsCodes )
197210 if err != nil {
198- return nil , "" , networkRequests .Slice , err
211+ return page , networkRequests .Slice , err
199212 }
200213 }
201214
202215 page .Timeout (5 * time .Second ).WaitNavigation (proto .PageLifecycleEventNameFirstMeaningfulPaint )()
203216
217+ return page , networkRequests .Slice , nil
218+ }
219+
220+ // takeScreenshotAndGetBody performs the screenshot actions
221+ func (b * Browser ) takeScreenshotAndGetBody (page * rod.Page , idle time.Duration , fullPage bool ) ([]byte , string , error ) {
204222 if err := page .WaitLoad (); err != nil {
205- return nil , "" , networkRequests . Slice , err
223+ return nil , "" , err
206224 }
207225 _ = page .WaitIdle (idle )
208226
209227 screenshot , err := page .Screenshot (fullPage , & proto.PageCaptureScreenshot {})
210228 if err != nil {
211- return nil , "" , networkRequests . Slice , err
229+ return nil , "" , err
212230 }
213231
214232 body , err := page .HTML ()
215233 if err != nil {
216- return screenshot , "" , networkRequests . Slice , err
234+ return screenshot , "" , err
217235 }
218236
219- return screenshot , body , networkRequests .Slice , nil
237+ return screenshot , body , nil
238+ }
239+
240+ // closePage closes the page and performs cleanup
241+ func (b * Browser ) closePage (page * rod.Page ) {
242+ _ = page .Close ()
220243}
221244
222245func (b * Browser ) Close () {
0 commit comments