@@ -59,8 +59,6 @@ module.exports = {
5959 } ,
6060 async metamaskExtensionId ( ) {
6161 const extensionsData = await module . exports . getExtensionsData ( ) ;
62- console . log ( 'Available extensions:' , Object . keys ( extensionsData ) ) ;
63- console . log ( 'Available extensions (with quotes):' , Object . keys ( extensionsData ) . map ( key => `"${ key } "` ) ) ;
6462
6563 const metamaskExtensionData = extensionsData . metamask ;
6664 if ( ! metamaskExtensionData ) {
@@ -70,11 +68,10 @@ module.exports = {
7068 ) ;
7169
7270 if ( metamaskKey ) {
73- console . log ( `Found MetaMask with key: "${ metamaskKey } "` ) ;
7471 return extensionsData [ metamaskKey ] . id ;
7572 }
7673
77- throw new Error ( `MetaMask extension not found in extensions list. Available extensions: ${ Object . keys ( extensionsData ) . map ( key => `" ${ key } "` ) . join ( ', ' ) } ` ) ;
74+ throw new Error ( `MetaMask extension not found in extensions list. Available extensions: ${ Object . keys ( extensionsData ) . join ( ', ' ) } ` ) ;
7875 }
7976
8077 return metamaskExtensionData . id ;
@@ -191,56 +188,90 @@ module.exports = {
191188 return true ;
192189 } ,
193190 async switchToMetamaskNotification ( ) {
194- const metamaskExtensionId = await module . exports . metamaskExtensionId ( ) ;
191+ try {
192+ const metamaskExtensionId = await module . exports . metamaskExtensionId ( ) ;
195193
196- let pages = await browser . contexts ( ) [ 0 ] . pages ( ) ;
197- for ( const page of pages ) {
198- if (
199- page
200- . url ( )
201- . includes (
202- `chrome-extension://${ metamaskExtensionId } /notification.html` ,
203- )
204- ) {
205- metamaskNotificationWindow = page ;
194+ let pages = await browser . contexts ( ) [ 0 ] . pages ( ) ;
195+ for ( const page of pages ) {
196+ if ( page . isClosed ( ) ) {
197+ continue ;
198+ }
199+
200+ if (
201+ page
202+ . url ( )
203+ . includes (
204+ `chrome-extension://${ metamaskExtensionId } /notification.html` ,
205+ )
206+ ) {
207+ metamaskNotificationWindow = page ;
208+ retries = 0 ;
209+ await page . bringToFront ( ) ;
210+ await module . exports . waitUntilStable ( page ) ;
211+ await module . exports . waitFor (
212+ notificationPageElements . notificationAppContent ,
213+ page ,
214+ ) ;
215+ return page ;
216+ }
217+ }
218+ await sleep ( 200 ) ;
219+ if ( retries < 50 ) {
220+ retries ++ ;
221+ return await module . exports . switchToMetamaskNotification ( ) ;
222+ } else if ( retries >= 50 ) {
206223 retries = 0 ;
207- await page . bringToFront ( ) ;
208- await module . exports . waitUntilStable ( page ) ;
209- await module . exports . waitFor (
210- notificationPageElements . notificationAppContent ,
211- page ,
224+ throw new Error (
225+ '[switchToMetamaskNotification] Max amount of retries to switch to metamask notification window has been reached. It was never found.' ,
212226 ) ;
213- return page ;
214227 }
215- }
216- await sleep ( 200 ) ;
217- if ( retries < 50 ) {
218- retries ++ ;
219- return await module . exports . switchToMetamaskNotification ( ) ;
220- } else if ( retries >= 50 ) {
221- retries = 0 ;
222- throw new Error (
223- '[switchToMetamaskNotification] Max amount of retries to switch to metamask notification window has been reached. It was never found.' ,
224- ) ;
228+ } catch ( error ) {
229+ if ( error . message . includes ( 'Target page, context or browser has been closed' ) ) {
230+ console . log ( 'Browser/context closed during switchToMetamaskNotification, retrying...' ) ;
231+ await sleep ( 1000 ) ;
232+ if ( retries < 10 ) {
233+ retries ++ ;
234+ return await module . exports . switchToMetamaskNotification ( ) ;
235+ }
236+ }
237+ throw error ;
225238 }
226239 } ,
227240 async waitFor ( selector , page = metamaskWindow ) {
228- await module . exports . waitUntilStable ( page ) ;
229- await page . waitForSelector ( selector , { strict : false } ) ;
230- const element = page . locator ( selector ) . first ( ) ;
231- await element . waitFor ( ) ;
232- await element . focus ( ) ;
233- if ( process . env . STABLE_MODE ) {
234- if ( ! isNaN ( process . env . STABLE_MODE ) ) {
235- await page . waitForTimeout ( Number ( process . env . STABLE_MODE ) ) ;
236- } else {
237- await page . waitForTimeout ( 300 ) ;
241+ try {
242+ if ( page . isClosed ( ) ) {
243+ console . log ( 'Page is closed, skipping waitFor' ) ;
244+ return null ;
245+ }
246+
247+ await module . exports . waitUntilStable ( page ) ;
248+ await page . waitForSelector ( selector , { strict : false } ) ;
249+ const element = page . locator ( selector ) . first ( ) ;
250+ await element . waitFor ( ) ;
251+ await element . focus ( ) ;
252+ if ( process . env . STABLE_MODE ) {
253+ if ( ! isNaN ( process . env . STABLE_MODE ) ) {
254+ await page . waitForTimeout ( Number ( process . env . STABLE_MODE ) ) ;
255+ } else {
256+ await page . waitForTimeout ( 300 ) ;
257+ }
238258 }
259+ return element ;
260+ } catch ( error ) {
261+ if ( error . message . includes ( 'Target page, context or browser has been closed' ) ) {
262+ console . log ( 'Page/browser closed during waitFor, skipping' ) ;
263+ return null ;
264+ }
265+ throw error ;
239266 }
240- return element ;
241267 } ,
242268 async waitAndClick ( selector , page = metamaskWindow , args = { } ) {
243269 const element = await module . exports . waitFor ( selector , page ) ;
270+ if ( ! element ) {
271+ console . log ( 'Element not found or page closed, skipping waitAndClick' ) ;
272+ return ;
273+ }
274+
244275 if ( args . numberOfClicks && ! args . waitForEvent ) {
245276 await element . click ( {
246277 clickCount : args . numberOfClicks ,
@@ -359,19 +390,35 @@ module.exports = {
359390 } ,
360391 async waitToBeHidden ( selector , page = metamaskWindow ) {
361392 // info: waits for 60 seconds
362- const locator = page . locator ( selector ) ;
363- for ( const element of await locator . all ( ) ) {
364- if ( ( await element . count ( ) ) > 0 && retries < 300 ) {
365- retries ++ ;
366- await page . waitForTimeout ( 200 ) ;
367- await module . exports . waitToBeHidden ( selector , page ) ;
368- } else if ( retries >= 300 ) {
393+ try {
394+ // 检查页面是否仍然有效
395+ if ( page . isClosed ( ) ) {
396+ console . log ( 'Page is closed, skipping waitToBeHidden' ) ;
397+ return ;
398+ }
399+
400+ const locator = page . locator ( selector ) ;
401+ const elements = await locator . all ( ) ;
402+
403+ for ( const element of elements ) {
404+ if ( ( await element . count ( ) ) > 0 && retries < 300 ) {
405+ retries ++ ;
406+ await page . waitForTimeout ( 200 ) ;
407+ await module . exports . waitToBeHidden ( selector , page ) ;
408+ } else if ( retries >= 300 ) {
409+ retries = 0 ;
410+ throw new Error (
411+ `[waitToBeHidden] Max amount of retries reached while waiting for ${ selector } to disappear.` ,
412+ ) ;
413+ }
369414 retries = 0 ;
370- throw new Error (
371- `[waitToBeHidden] Max amount of retries reached while waiting for ${ selector } to disappear.` ,
372- ) ;
373415 }
374- retries = 0 ;
416+ } catch ( error ) {
417+ if ( error . message . includes ( 'Target page, context or browser has been closed' ) ) {
418+ console . log ( 'Page/browser closed during waitToBeHidden, skipping' ) ;
419+ return ;
420+ }
421+ throw error ;
375422 }
376423 } ,
377424 async waitUntilStable ( page ) {
@@ -496,7 +543,6 @@ module.exports = {
496543 await devModeButton . click ( ) ;
497544
498545 const extensionDataItems = await page . locator ( 'extensions-item' ) . all ( ) ;
499- console . log ( `Found ${ extensionDataItems . length } extensions` ) ;
500546
501547 for ( const extensionData of extensionDataItems ) {
502548 try {
@@ -518,19 +564,15 @@ module.exports = {
518564 await extensionData . locator ( '#extension-id' ) . textContent ( )
519565 ) . trim ( ) . split ( ': ' ) [ 1 ] ;
520566
521- console . log ( `Found extension: ${ extensionName } (${ extensionVersion } ) - ID: ${ extensionId } ` ) ;
522-
523567 extensionsData [ extensionName ] = {
524568 version : extensionVersion ,
525569 id : extensionId ,
526570 } ;
527571 } catch ( error ) {
528- console . log ( `Error processing extension: ${ error . message } ` ) ;
572+ // 静默处理扩展解析错误
529573 }
530574 }
531575 await page . close ( ) ;
532-
533- console . log ( 'Final extensions data:' , Object . keys ( extensionsData ) ) ;
534576 return extensionsData ;
535577 } ,
536578
0 commit comments