Skip to content

Commit 4e5b0c5

Browse files
committed
push
1 parent 36c2a93 commit 4e5b0c5

2 files changed

Lines changed: 102 additions & 60 deletions

File tree

commands/playwright.js

Lines changed: 101 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -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

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@gracefnr/synpress",
3-
"version": "1.0.12",
3+
"version": "1.0.13",
44
"packageManager": "pnpm@9.1.3",
55
"description": "Synpress is e2e testing framework based around Cypress.io & playwright with included MetaMask support. Test your dapps with ease.",
66
"keywords": [

0 commit comments

Comments
 (0)