Skip to content

Commit 2bd07f7

Browse files
committed
push
1 parent f20b2b1 commit 2bd07f7

File tree

3 files changed

+156
-49
lines changed

3 files changed

+156
-49
lines changed

commands/metamask.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1542,11 +1542,25 @@ const metamask = {
15421542
} else {
15431543
await playwright.init();
15441544
}
1545+
log('[initialSetup] Starting window assignment...');
15451546
await playwright.assignWindows();
1547+
log('[initialSetup] Window assignment completed');
1548+
1549+
log('[initialSetup] Setting active tab name to metamask...');
15461550
await playwright.assignActiveTabName('metamask');
1551+
log('[initialSetup] Active tab name set');
1552+
1553+
log('[initialSetup] Getting extension details...');
15471554
await module.exports.getExtensionDetails();
1555+
log('[initialSetup] Extension details retrieved');
1556+
1557+
log('[initialSetup] Calling fixBlankPage...');
15481558
await playwright.fixBlankPage();
1559+
log('[initialSetup] fixBlankPage completed');
1560+
1561+
log('[initialSetup] Calling fixCriticalError...');
15491562
await playwright.fixCriticalError();
1563+
log('[initialSetup] fixCriticalError completed');
15501564
if (
15511565
(await playwright
15521566
.metamaskWindow()

commands/playwright.js

Lines changed: 141 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -58,24 +58,41 @@ module.exports = {
5858
return activeTabName;
5959
},
6060
async metamaskExtensionId() {
61-
const extensionsData = await module.exports.getExtensionsData();
61+
log('[metamaskExtensionId] Starting to get MetaMask extension ID...');
6262

63-
const metamaskExtensionData = extensionsData.metamask;
64-
if (!metamaskExtensionData) {
65-
// 尝试查找包含 "metamask" 的扩展
66-
const metamaskKey = Object.keys(extensionsData).find(key =>
67-
key.toLowerCase().includes('metamask')
68-
);
63+
try {
64+
const extensionsData = await module.exports.getExtensionsData();
65+
log(`[metamaskExtensionId] Extensions data keys: ${Object.keys(extensionsData).join(', ')}`);
6966

70-
if (metamaskKey) {
71-
console.log(`Found MetaMask with key: "${metamaskKey}"`);
72-
return extensionsData[metamaskKey].id;
67+
const metamaskExtensionData = extensionsData.metamask;
68+
if (!metamaskExtensionData) {
69+
log('[metamaskExtensionId] MetaMask not found with exact key "metamask", searching for similar keys...');
70+
71+
// 尝试查找包含 "metamask" 的扩展
72+
const metamaskKey = Object.keys(extensionsData).find(key =>
73+
key.toLowerCase().includes('metamask')
74+
);
75+
76+
if (metamaskKey) {
77+
log(`[metamaskExtensionId] Found MetaMask with key: "${metamaskKey}"`);
78+
const extensionId = extensionsData[metamaskKey].id;
79+
log(`[metamaskExtensionId] MetaMask extension ID: ${extensionId}`);
80+
return extensionId;
81+
}
82+
83+
const availableExtensions = Object.keys(extensionsData).map(key => `"${key}"`).join(', ');
84+
log(`[metamaskExtensionId] ERROR: MetaMask extension not found. Available extensions: ${availableExtensions}`);
85+
throw new Error(`MetaMask extension not found in extensions list. Available extensions: ${availableExtensions}`);
7386
}
7487

75-
throw new Error(`MetaMask extension not found in extensions list. Available extensions: ${Object.keys(extensionsData).map(key => `"${key}"`).join(', ')}`);
88+
const extensionId = metamaskExtensionData.id;
89+
log(`[metamaskExtensionId] MetaMask extension ID: ${extensionId}`);
90+
return extensionId;
91+
} catch (error) {
92+
log(`[metamaskExtensionId] ERROR: ${error.message}`);
93+
log(`[metamaskExtensionId] ERROR stack: ${error.stack}`);
94+
throw error;
7695
}
77-
78-
return metamaskExtensionData.id;
7996
},
8097
async setExpectInstance(expect) {
8198
expectInstance = expect;
@@ -116,35 +133,86 @@ module.exports = {
116133
return true;
117134
},
118135
async assignWindows() {
119-
const metamaskExtensionId = await module.exports.metamaskExtensionId();
136+
log('[assignWindows] Starting window assignment...');
137+
138+
try {
139+
const metamaskExtensionId = await module.exports.metamaskExtensionId();
140+
log(`[assignWindows] MetaMask Extension ID: ${metamaskExtensionId}`);
120141

121-
let pages = await browser.contexts()[0].pages();
122-
for (const page of pages) {
123-
if (page.url().includes('specs/runner')) {
124-
mainWindow = page;
125-
} else if (
126-
page
127-
.url()
128-
.includes(`chrome-extension://${metamaskExtensionId}/home.html`)
129-
) {
130-
metamaskWindow = page;
131-
} else if (
132-
page
133-
.url()
134-
.includes(
135-
`chrome-extension://${metamaskExtensionId}/notification.html`,
136-
)
137-
) {
138-
metamaskNotificationWindow = page;
139-
} else if (
140-
page
141-
.url()
142-
.includes(`chrome-extension://${metamaskExtensionId}/popup.html`)
143-
) {
144-
metamaskPopupWindow = page;
142+
if (!browser || !browser.contexts() || browser.contexts().length === 0) {
143+
log('[assignWindows] ERROR: Browser or contexts not available');
144+
throw new Error('Browser or contexts not available');
145+
}
146+
147+
let pages = await browser.contexts()[0].pages();
148+
log(`[assignWindows] Found ${pages.length} pages in browser context`);
149+
150+
// Log all page URLs for debugging
151+
for (let i = 0; i < pages.length; i++) {
152+
try {
153+
const url = pages[i].url();
154+
log(`[assignWindows] Page ${i}: ${url}`);
155+
} catch (error) {
156+
log(`[assignWindows] Page ${i}: Error getting URL - ${error.message}`);
157+
}
158+
}
159+
160+
let mainWindowAssigned = false;
161+
let metamaskWindowAssigned = false;
162+
let metamaskNotificationWindowAssigned = false;
163+
let metamaskPopupWindowAssigned = false;
164+
165+
for (const page of pages) {
166+
try {
167+
const pageUrl = page.url();
168+
169+
if (pageUrl.includes('specs/runner')) {
170+
mainWindow = page;
171+
mainWindowAssigned = true;
172+
log(`[assignWindows] Main window assigned: ${pageUrl}`);
173+
} else if (
174+
pageUrl.includes(`chrome-extension://${metamaskExtensionId}/home.html`)
175+
) {
176+
metamaskWindow = page;
177+
metamaskWindowAssigned = true;
178+
log(`[assignWindows] MetaMask window assigned: ${pageUrl}`);
179+
} else if (
180+
pageUrl.includes(
181+
`chrome-extension://${metamaskExtensionId}/notification.html`,
182+
)
183+
) {
184+
metamaskNotificationWindow = page;
185+
metamaskNotificationWindowAssigned = true;
186+
log(`[assignWindows] MetaMask notification window assigned: ${pageUrl}`);
187+
} else if (
188+
pageUrl.includes(`chrome-extension://${metamaskExtensionId}/popup.html`)
189+
) {
190+
metamaskPopupWindow = page;
191+
metamaskPopupWindowAssigned = true;
192+
log(`[assignWindows] MetaMask popup window assigned: ${pageUrl}`);
193+
}
194+
} catch (error) {
195+
log(`[assignWindows] Error processing page: ${error.message}`);
196+
}
197+
}
198+
199+
// Log assignment results
200+
log(`[assignWindows] Assignment results:`);
201+
log(`[assignWindows] - Main window: ${mainWindowAssigned ? 'ASSIGNED' : 'NOT ASSIGNED'}`);
202+
log(`[assignWindows] - MetaMask window: ${metamaskWindowAssigned ? 'ASSIGNED' : 'NOT ASSIGNED'}`);
203+
log(`[assignWindows] - MetaMask notification window: ${metamaskNotificationWindowAssigned ? 'ASSIGNED' : 'NOT ASSIGNED'}`);
204+
log(`[assignWindows] - MetaMask popup window: ${metamaskPopupWindowAssigned ? 'ASSIGNED' : 'NOT ASSIGNED'}`);
205+
206+
if (!metamaskWindowAssigned) {
207+
log(`[assignWindows] WARNING: MetaMask window not found! Looking for: chrome-extension://${metamaskExtensionId}/home.html`);
145208
}
209+
210+
return true;
211+
} catch (error) {
212+
log(`[assignWindows] ERROR: ${error.message}`);
213+
log(`[assignWindows] ERROR stack: ${error.stack}`);
214+
throw error;
146215
}
147-
return true;
148216
},
149217
async assignActiveTabName(tabName) {
150218
activeTabName = tabName;
@@ -429,16 +497,41 @@ module.exports = {
429497
},
430498
// workaround for metamask random blank page on first run
431499
async fixBlankPage(page = metamaskWindow) {
432-
await page.waitForTimeout(1000);
433-
for (let times = 0; times < 5; times++) {
434-
if (
435-
(await page.locator(onboardingWelcomePageElements.app).count()) === 0
436-
) {
437-
await page.reload();
438-
await module.exports.waitUntilMetamaskWindowIsStable();
439-
} else {
440-
break;
500+
log('[fixBlankPage] Starting fixBlankPage...');
501+
log(`[fixBlankPage] Page parameter: ${page ? 'PROVIDED' : 'UNDEFINED'}`);
502+
log(`[fixBlankPage] metamaskWindow: ${metamaskWindow ? 'AVAILABLE' : 'UNDEFINED'}`);
503+
504+
if (!page) {
505+
log('[fixBlankPage] ERROR: Page is undefined! Cannot proceed.');
506+
throw new Error('[fixBlankPage] Page is undefined - metamaskWindow was not properly assigned');
507+
}
508+
509+
try {
510+
log(`[fixBlankPage] Page URL: ${page.url()}`);
511+
log('[fixBlankPage] Waiting 1 second...');
512+
await page.waitForTimeout(1000);
513+
514+
for (let times = 0; times < 5; times++) {
515+
log(`[fixBlankPage] Attempt ${times + 1}/5: Checking for onboarding app...`);
516+
517+
const appCount = await page.locator(onboardingWelcomePageElements.app).count();
518+
log(`[fixBlankPage] Onboarding app count: ${appCount}`);
519+
520+
if (appCount === 0) {
521+
log(`[fixBlankPage] Blank page detected, reloading...`);
522+
await page.reload();
523+
await module.exports.waitUntilMetamaskWindowIsStable();
524+
} else {
525+
log(`[fixBlankPage] Page is not blank, continuing...`);
526+
break;
527+
}
441528
}
529+
530+
log('[fixBlankPage] fixBlankPage completed successfully');
531+
} catch (error) {
532+
log(`[fixBlankPage] ERROR: ${error.message}`);
533+
log(`[fixBlankPage] ERROR stack: ${error.stack}`);
534+
throw error;
442535
}
443536
},
444537
async fixCriticalError(page = metamaskWindow) {

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.17",
3+
"version": "1.0.18",
44
"packageManager": "[email protected]",
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)