ðPlaywright-mcp ã䜿ã£ãE2Eãã¹ãã¹ã¯ãªããã®äœæã詊ããŠã¿ã
ããã«ã¡ã¯ïŒã¢ã«ãã°ã©ã ã§QAãšã³ãžãã¢ãããŠããåèã§ãïŒ
æè¿AIã®é²åãç®èŠãŸãããç»åçæãšãã³ãŒããæžãAIãšãäœã«ã§ãAI䜿ããããã«ãªã£ãŠããŠãæè¡ã®é²æ©ãåãŸããå¢ãã ãªã£ãŠæããŠãã仿¥ãã®é ã§ãã
çªç¶ã§ãããç§ãæ åœããŠããæ¥åãšããŠãE2Eãã¹ãã®èªååããããŸãã
åŒç€Ÿã§ã®E2Eãã¹ãã®èªååã¯ãMagicPodãšPlaywrightãå©çšããŠããã䜵çšããŠãã¹ãã®èªååãé²ããŠããç¶æ³ã§ãã
éçºã®ã¡ã³ããŒã§ã¯ãæ§ã ãªAIãé§äœ¿ããŠéçºæ¥åã®å¹çåãè¡ã£ãŠããŸãããQAã¡ã³ããŒã§ãAIãå©çšããŠãã¹ãèªååã®å·¥æ°ãåæžããåãçµã¿ãè¡ã£ãŠãããããšèããŠããŸãã
ä»åã¯ãPlaywright-mcpãšCursorã䜿ã£ãŠãE2Eãã¹ããèªåã§çæããæ¹æ³ã®æ€èšŒãè¡ã£ãã®ã§ããã¡ããã玹ä»ããããšæããŸãïŒ
1.Playwrightãšã¯ïŒ
ãŸãã¯Playwrightã«ã€ããŠã§ãã
Playwrightã¯ãMicrosoftãéçºãããã©ãŠã¶èªååããŒã«ã§ããŠã§ãã¢ããªã±ãŒã·ã§ã³ã®E2Eãã¹ãïŒEnd-to-Endãã¹ãïŒãç°¡åã«è¡ããããã«ããŠãããããŒã«ã§ãã
ChromeãFirefoxãWebKitïŒSafariã®ãšã³ãžã³ïŒããµããŒãããŠããã®ã§ãã¯ãã¹ãã©ãŠã¶ãã¹ããäžåºŠã«ããªããã®ãç¹åŸŽã§ãã
2.Playwright-mcpã«ã€ããŠ
Playwright-mcpãšã¯
ä»åã®æ¬é¡ãšãªããPlaywright-mcpã«ã€ããŠã§ãã
Playwright-mcpã¯ãPlaywrightã®ãæŽãªãèªååããç®æãããŒã«ã§ããŠãAIã䜿ã£ãŠPlaywrightãã¹ãã¹ã¯ãªãããèªåã§çæããŠããããã®ã§ãã
Playwrightã¯ãã¹ãã®èªååèªäœãè¡ãããŒã«ã§ãããPlaywright-mcpã¯Playwrightã®ã³ãŒããèªåã§äœæããŠãããããŒã«ãšãã£ãæãã§ãã
äž»ãªç¹åŸŽ
å ¬åŒããã®åŒçšã§ããããããã£ãç¹åŸŽããããŸãã
- é«éãã€è»œé: ãã¯ã»ã«ããŒã¹ã®å ¥åã§ã¯ãªããPlaywright ã®ã¢ã¯ã»ã·ããªã㣠ããªãŒã䜿çšããŸãã
- LLM 察å¿: ããžã§ã³ ã¢ãã«ã¯å¿ èŠãªããçŽç²ã«æ§é åããŒã¿äžã§åäœããŸãã
- 決å®è«çãªããŒã«ã®é©çš: ã¹ã¯ãªãŒã³ã·ã§ããããŒã¹ã®ã¢ãããŒãã§ããããææ§ããåé¿ããŸãã
ãŠãŒã¹ã±ãŒã¹
ãã¡ããå
¬åŒããã®åŒçšã§ãã
ä»åã玹ä»ããã±ãŒã¹ã ãšLLMæåã®èªåãã¹ããšãããšããã«åœãŠã¯ãŸããŸãã
- ãŠã§ãããã²ãŒã·ã§ã³ãšãã©ãŒã å ¥å
- æ§é åã³ã³ãã³ãããã®ããŒã¿æœåº
- LLMäž»å°ã®èªåãã¹ã
- ãšãŒãžã§ã³ãåãæ±çšãã©ãŠã¶ã€ã³ã¿ã©ã¯ã·ã§ã³
3.Cursorã«ã€ããŠ
Cursorãšã¯
Cursorã«ã€ããŠããç°¡åã«ã玹ä»ããŸãã
Cursorã¯ãAnysphereãéçºããAIæ©èœãæèŒããã³ãŒããšãã£ã¿ã§ãã
MicrosoftãæäŸããŠããVisual Studio CodeïŒVS CodeïŒãããŒã¹ãšããŠãããVSCodeã©ã€ã¯ãªæäœæã§äœ¿çšããããšãã§ããŸãã
Cursorèªäœã¯AIã¢ãã«ãæèŒããŠã¯ããããå€éšã®AIã¢ãã«ãšé£æºããAI掻çšã§ããã³ãŒãã£ã³ã°ç°å¢ãæäŸããŠããŸãã
æéäœç³»
Cursorã¯ç¡æãã©ã³ãšææãã©ã³ããããç¡æãã©ã³ã ãšãªã¯ãšã¹ãæ°ã«å¶éãã€ããŸãã
| ãã©ã³å | æé¡æé | äž»ãªæ©èœã»å¶é |
|---|---|---|
| Hobby | ç¡æ | ã»Proãã©ã³ã®2é±éç¡æãã©ã€ã¢ã« ã»æ2,000åã®ã³ãŒãè£å® ã»æ50åã®äœéãã¬ãã¢ã ãªã¯ãšã¹ã ã»ããŠã³ããŒãæ©èœ ã»ãã©ã€ãã·ãŒã¢ãŒãå¯Ÿå¿ |
| Pro | $20/æ | ã»Hobbyã®å
šæ©èœ ã»æ500åã®é«éãã¬ãã¢ã ãªã¯ãšã¹ã ã»ç¡å¶éã®äœéãã¬ãã¢ã ãªã¯ãšã¹ã ã»ç¡å¶éã®ã³ãŒãè£å® ã»Cursor Tabæ©èœïŒåŒ·åãªãªãŒãã³ã³ããªãŒãïŒ |
| Business | $40/ãŠãŒã¶ãŒ/æ | ã»Proã®å
šæ©èœ ã»çµç¹å šäœã§ã®ãã©ã€ãã·ãŒã¢ãŒãé©çš ã»ããŒã ã®äžæ¬è«æ± ã»å©çšç¶æ³ã確èªã§ãã管çè åãããã·ã¥ããŒã ã»SAML/OIDC SSOå¯Ÿå¿ |
4.Playwright-mcp à Cursorã§E2Eãã¹ãã®äœæ
ããããã¯ãPlaywright-mcpãšCursorã飿ºããæ¹æ³ãšãå®éã«ç°¡åãªãã¹ãã·ããªãªã®çæãè¡ã£ãŠã¿ãã®ã§ãã玹ä»ããŸãã
Playwright-mcpãšCursorã®èšå®
Playwright-mcpãCursorã®ã€ã³ã¹ããŒã«æ¹æ³ã«ã€ããŠã¯ã岿ããŸãã
ãã¡ãã§ã¯ãCursorã§ã®Playwright-mcpã®èšå®æ¹æ³ã«ã€ããŠãã玹ä»ããŸãã
-
Cursorã§å³äžã®èšå®ã¢ã€ã³ã³ãæŒäžããCursor SettingsãéããŸãã
-
MCP > ã+ Add new global MCP serverããã¿ã³ãæŒäžããŸãã
-
mcp.jsonã«ä»¥äžã®ã³ãŒããèšèŒãä¿åããŸãã
{ "mcpServers": { "playwright": { "command": "npx", "args": [ "@playwright/mcp@latest" ] } } } -
äžã®ç»åã®ããã«ãplaywrightã®å·Šæšªãç·è²ã«ãªãã°é£æºå®äºã§ãã

ããã³ããã§E2Eãã¹ãäœæ
èšå®ãå®äºããããããããPlaywright-mcpã䜿ã£ãŠE2Eãã¹ããäœæããŠãããŸãïŒ
ð¡ ä»åã®E2Eãã¹ãäœæã§ã¯ãCursorã¯Proãã©ã³ã䜿çšããç¶æ
ãåæãšããŠããŸã
ä»åã¯ãåŒç€ŸãæäŸããŠããKANNAã®ãã¹ãç°å¢ã§ãç°¡åãªãã¹ãã±ãŒã¹ãPlaywrightã®ã³ãŒããšããŠèµ·ãããŠã¿ãããšæããŸãã
ãã¹ãã±ãŒã¹
- ãªãŒããŒæš©éã®ã¢ã«ãŠã³ãã§ãã°ã€ã³
- ããŒã ç»é¢ã§ãã°ã€ã³ã§ããããšãã¢ãµãŒã·ã§ã³ãã
- æ¡ä»¶ãäœæãã
- æ¡ä»¶ãäœæãããããšãã¢ãµãŒã·ã§ã³
- æ¡ä»¶æ
å ±ãç·šéãã
- æ¡ä»¶ãæŽæ°ãããããšãã¢ãµãŒã·ã§ã³
â» a ã§ããããæäœã«å¯ŸããæåŸ çµæããã¹ããšããŠç¢ºèªããŸã
AIãšå¯Ÿè©±ïŒPage ObjectïŒãã¹ãäžæ¬äœæç·šïŒ
1.ãã¹ãç°å¢ãžé·ç§»
ãŸãã¯ãã¹ãç°å¢ã«é·ç§»ããŠã¿ãŸãã
Playwrightã®ãã¹ãå®è¡ã³ãã³ãã§âheadedã®ãªãã·ã§ã³ãã€ããŠå®è¡ããæãPlaywright Test for VSCodeã®Pick Locatorã䜿çšããå Žåãšåæ§ã«ãã©ãŠã¶ãç«ã¡äžãããŸããã

2.ãã¹ãã±ãŒã¹ãããã³ãããšããŠæž¡ã
ãã£ããã§ããã以äžã®ãããªããã³ãããæž¡ããŠã¿ãŸããã
ããã§ãã©ãã ãçè§£ããŠãããã®ãâŠ
ãããã³ããã
以äžã®ãã¹ãã±ãŒã¹ãå®è¡ããtest.spec.tsãšããŠä¿åããŠãã ããã
**ãã¹ãã±ãŒã¹**
1. ãªãŒããŒæš©éã®ã¢ã«ãŠã³ãã§ãã°ã€ã³
1. ããŒã ç»é¢ã§ãã°ã€ã³ã§ããããšãã¢ãµãŒã·ã§ã³ãã
2. æ¡ä»¶ãäœæãã
1. æ¡ä»¶ãäœæãããããšãã¢ãµãŒã·ã§ã³
3. æ¡ä»¶æ
å ±ãç·šéãã
1. æ¡ä»¶ãæŽæ°ãããããšãã¢ãµãŒã·ã§ã³
ã«ãŒã«
ã»ããŒãžããšã«Page Object Modelã§ããŒãžã¯ã©ã¹ãäœæããŠãã ãããïŒPOMã¯æ¢åã®ãªããžããªãåèã«ããŠãã ããïŒ
ã»1,2,3ã§ããããtest.stepãåããŠãã ãã
ã»ãªãŒããŒæš©éã®ã¢ã«ãŠã³ãã¯account.tsã®ownerAllOptionsã®ãã°ã€ã³æ
å ±ã䜿çšããŠãã ããã
ã»ãã±ãŒã¿ãŒãååŸããå Žåã¯ã以äžã®åªå
é äœã«æ²¿ã£ãã¡ãœããã䜿çšããŠãã ããã
ã1.getByRole()
ã2.ãã®ã»ãã®getBy~()
ã3.locator()
ã4.ãã®ä»
ãåçã

ãªããžããªã®æ§é ãææ¡ããŠãæ¢åã®POMãåèã«ããŠã³ãŒãçæããŠãããŠãŸããã
âã®ãããªspecãã¡ã€ã«ãäœæããŠãããŸããã
test.spec.ts
import { test, expect } from '@playwright/test';
import { accounts } from '../data/account';
import { LoginPage } from '../pages/loginPage';
import { ProjectsPage } from '../pages/projectsPage';
import { ProjectCreatePage } from '../pages/projectCreatePage';
import { ProjectDetailPage } from '../pages/projectDetail/projectDetailPage';
test('ãªãŒããŒæš©éã§ã®æ¡ä»¶äœæãšç·šéãã¹ã', async ({ page }) => {
const loginPage = new LoginPage(page);
const projectsPage = new ProjectsPage(page);
const projectCreatePage = new ProjectCreatePage(page);
// ãã¹ãããŒã¿
const projectName = `ãã¹ãæ¡ä»¶_${new Date().getTime()}`;
const updatedProjectName = `æŽæ°_${projectName}`;
await test.step('ãªãŒããŒæš©éã§ãã°ã€ã³', async () => {
await loginPage.goTo();
await loginPage.logIn(accounts.ownerAllOptions.email, accounts.ownerAllOptions.password);
// ããŒã ç»é¢ïŒæ¡ä»¶äžèЧïŒã«é·ç§»ããããšã確èª
await expect(page).toHaveURL(/.*\/projects/);
await expect(projectsPage.projectListTable).toBeVisible();
});
await test.step('æ¡ä»¶ãäœæ', async () => {
// æ¡ä»¶äœæããŒãžã«é·ç§»
await page.getByRole('button', { name: 'æ¡ä»¶ãäœæ' }).click();
// æ¡ä»¶æ
å ±ãå
¥åããŠäœæ
await projectCreatePage.projectNameInput.fill(projectName);
await projectCreatePage.sideCreateBtn.click();
// æ¡ä»¶ãäœæãããããšã確èª
await projectsPage.quickSearchProject(projectName);
await expect(page.getByRole('rowheader', { name: projectName })).toBeVisible();
});
await test.step('æ¡ä»¶æ
å ±ãç·šé', async () => {
// æ¡ä»¶è©³çްç»é¢ã«é·ç§»
const projectDetailPage = await projectsPage.gotoProjectDetail(page, projectName);
// æ¡ä»¶åãæŽæ°
await projectDetailPage.projectNameEditLink.click();
await projectDetailPage.projectNameInput.fill(updatedProjectName);
await page.getByRole('button', { name: 'ä¿å' }).click();
// æŽæ°ãåæ ãããããšã確èª
await expect(projectDetailPage.headerProjectName).toHaveText(updatedProjectName);
});
});
3.ãã¹ãã宿œããŠã¿ã
ãããã³ããã
${ãã¹ãç°å¢}ã ãã§äœæãããã¹ããå®è¡ããŠãã ãã
ãåçã

ãã¹ãã倱æããŸããã
ã©ãããããã°ã€ã³åŸã®ç»é¢é·ç§»å ã®æåŸ å€ãæ¡ä»¶äžèЧããŒãžãšããŠããããã§ãã
å®éã¯ãã®ããŒãžã¯ååšããããã°ã€ã³åŸã¯ãããããŒãžã«é·ç§»ããããšãæåŸ å€ãšããŠããã®ã§ãæåŸ çµæãä¿®æ£ããããã³ãããæããŠã¿ãŸãã
ãããã³ããã
ãã°ã€ã³åŸã¯ãæ¡ä»¶äžèЧç»é¢ã§ã¯ãªããããããŒãžã«é·ç§»ããããšãæåŸ
å€ãšããŠãã ããã
ãåçã

å®éã®ãããããŒãžäžã«ã¯ååšããªããããã·ã¥ããŒããã®æååãæã€ãã±ãŒã¿ãŒãæåŸ å€ãšããŠããŸããŸããã
ãã£ãããšããããã³ãããæž¡ãã ãã ãšãå®ç§ã«åããã¹ãã¹ã¯ãªãããäžçºã§äœæããã®ã¯é£ããããã§ãã
ãã¹ã倱ææã®ã¹ã¯ãªãŒã³ã·ã§ãã

AIãšå¯Ÿè©±ïŒPage Object/ãã¹ãåå²äœæç·šïŒ
å ã»ã©ãŸã§ã¯ããã¹ãã±ãŒã¹ãããã³ãããšããŠæž¡ããŠãäžæ°ã«ãã¹ãã¹ã¯ãªãããäœæããããšããŸããããããŸããããªãã£ãã®ã§ã¡ãã£ãšããæ¹ãå€ããŠå°ããã®ç²åºŠã§æ€èšŒããŠã¿ãŸãã
åããŒãžã«é·ç§»ããŠããã®Page ObjectãäœæããŠãããããã«ããŠã¿ãŸãã
1.ãã¹ãç°å¢ãžé·ç§»
åãããã«ãã¹ãç°å¢ã«é·ç§»ããŸãã
ãããã³ããã
@https://${ãã¹ãç°å¢ã®ãã¡ã€ã³}/signin ã«ã¢ã¯ã»ã¹ããŠãã ãã
ãåçã
ãã°ã€ã³ããŒãžã«é·ç§»ããŸããã
ãŸããããŒãžå
ã®èŠçŽ ã«ã€ããŠãèšåããŠãããŠããŸãã

2.Page Objectã®äœæ
ããŒãžå ã«è¡šç€ºãããŠããèŠçŽ ãçŸ åããŠãããã®ã§ããã±ãŒã¿ãŒããŸãšããŠååŸãããŠã¿ãŸããã
ãããã³ããã
ãã®ããŒãžã®ããŒãžãªããžã§ã¯ããäœæããŠãã ãã
ãåçã
以äžã®ãããªPageã¯ã©ã¹ãäœæããŠãããŸããã
ãã±ãŒã¿ãŒãå®éã®ç»é¢ã§äœ¿ãããã®ãååŸã§ããŠããŠãã¡ãœãããæ¯èŒçç°¡åãªãã®ã§ããæ±çšçã«äœ¿ãããã®ãçšæããŠãããŠããŸããã
import { Locator, Page } from '@playwright/test';
/** ãã°ã€ã³ç»é¢ã®ããŒãžãªããžã§ã¯ã */
export class LoginPage {
readonly page: Page;
/** ã¡ãŒã«ã¢ãã¬ã¹å
¥åæ¬ */
readonly emailField: Locator;
/** ãã¹ã¯ãŒãå
¥åæ¬ */
readonly passwordField: Locator;
/** ãã°ã€ã³ãã¿ã³ */
readonly loginBtn: Locator;
/** ãã¹ã¯ãŒããå¿ããæ¹ãªã³ã¯ */
readonly forgotPasswordLink: Locator;
/** å€éšã¢ã«ãŠã³ãã§ãã°ã€ã³ãªã³ã¯ */
readonly externalLoginLink: Locator;
/** æ°èŠã¢ã«ãŠã³ãç»é²ãªã³ã¯ */
readonly signupLink: Locator;
/** ãã°ã€ã³ã§ãå°ãã®æ¹ãªã³ã¯ */
readonly helpLink: Locator;
/** äŒç€ŸæŠèŠãªã³ã¯ */
readonly companyInfoLink: Locator;
/** ãåãåãããªã³ã¯ */
readonly contactLink: Locator;
constructor(page: Page) {
this.page = page;
this.emailField = page.getByPlaceholder('mail@example.com');
this.passwordField = page.getByPlaceholder('8æå以äžåè§è±æ°å');
this.loginBtn = page.getByRole('button', { name: 'ãã°ã€ã³ãã', exact: true });
this.forgotPasswordLink = page.getByRole('link', { name: 'ãã¹ã¯ãŒããå¿ããæ¹' });
this.externalLoginLink = page.getByRole('link', { name: 'å€éšã¢ã«ãŠã³ãã§ãã°ã€ã³' });
this.signupLink = page.getByRole('link', { name: 'æ°èŠã¢ã«ãŠã³ãç»é²ïŒç¡æïŒ' });
this.helpLink = page.getByRole('link', { name: 'ãã°ã€ã³ã§ãå°ãã®æ¹' });
this.companyInfoLink = page.getByRole('link', { name: 'äŒç€ŸæŠèŠ' });
this.contactLink = page.getByRole('link', { name: 'ãåãåãã' });
}
/**
* ãã°ã€ã³ç»é¢ã«é·ç§»ãã
*/
async goTo() {
await this.page.goto('/signin');
}
/**
* ã¡ãŒã«ã¢ãã¬ã¹ãšãã¹ã¯ãŒããå
¥åãããã°ã€ã³ãã
* @param email ã¡ãŒã«ã¢ãã¬ã¹
* @param password ãã¹ã¯ãŒã
*/
async logIn(email: string, password: string) {
await this.emailField.fill(email);
await this.passwordField.fill(password);
await this.loginBtn.click();
}
/**
* ãã¹ã¯ãŒããªã»ããããŒãžã«é·ç§»ãã
*/
async goToPasswordReset() {
await this.forgotPasswordLink.click();
}
/**
* å€éšã¢ã«ãŠã³ããã°ã€ã³ããŒãžã«é·ç§»ãã
*/
async goToExternalLogin() {
await this.externalLoginLink.click();
}
/**
* æ°èŠã¢ã«ãŠã³ãç»é²ããŒãžã«é·ç§»ãã
*/
async goToSignup() {
await this.signupLink.click();
}
/**
* ãã«ãããŒãžã«é·ç§»ãã
*/
async goToHelp() {
await this.helpLink.click();
}
}
3.ãã¹ããã±ãŒã¹ãããã³ãããšããŠæž¡ã
å ã»ã©ããç°¡åãªã±ãŒã¹ã§ã以äžã®ãããªã·ããªãªãæ³å®ããŠããã³ãããæž¡ããŠã¿ãŸããã
- ãã°ã€ã³ããŒãžã«é·ç§»
- äŒç€ŸæŠèŠã«é·ç§»
ãããã³ããã
äŒç€ŸæŠèŠã«é·ç§»ãããã¹ãã·ããªãªãäœæããŠ
ãåçã
import { test, expect } from '@playwright/test';
import { LoginPage } from '../../pages/loginPage';
test.describe('ãã°ã€ã³ããŒãžããã®äŒç€ŸæŠèŠé·ç§»ãã¹ã', () => {
let loginPage: LoginPage;
test.beforeEach(async ({ page }) => {
loginPage = new LoginPage(page);
await loginPage.goTo();
});
test('äŒç€ŸæŠèŠããŒãžã«æ£åžžã«é·ç§»ã§ãã', async ({ page, context }) => {
// æ°ããã¿ãã§ã®é·ç§»ãåŸ
ã¡åãã Promise ãäœæ
const popupPromise = page.waitForEvent('popup');
// äŒç€ŸæŠèŠãªã³ã¯ãã¯ãªãã¯
await loginPage.companyInfoLink.click();
let targetPage: any;
try {
// æ°ããã¿ããéãããã®ãåŸ
ã€ïŒ1ç§ã§ã¿ã€ã ã¢ãŠãïŒ
targetPage = await popupPromise.then(
(popup) => popup,
() => page,
);
} catch {
// ã¿ã€ã ã¢ãŠãããå Žåã¯çŸåšã®ããŒãžã䜿çš
targetPage = page;
}
// ããŒãžã®èªã¿èŸŒã¿ãåŸ
ã€
await targetPage.waitForLoadState();
// URLãæ£ããããšã確èª
expect(targetPage.url()).toBe('https://aldagram.com/');
// ããŒãžã¿ã€ãã«ã確èª
expect(await targetPage.title()).toBe('æ ªåŒäŒç€Ÿã¢ã«ãã°ã©ã ');
// äŒç€Ÿã®æåšå°æ
å ±ã衚瀺ãããŠããããšã確èª
await expect(targetPage.getByText('æ±äº¬éœæž¯åºè浊1äžç®1-1')).toBeVisible();
await expect(targetPage.getByText('æµæŸçºãã«ãã£ã³ã°11é')).toBeVisible();
});
test('äŒç€ŸæŠèŠãªã³ã¯ã衚瀺ãããŠãã', async () => {
// äŒç€ŸæŠèŠãªã³ã¯ã衚瀺ãããŠããããšã確èª
await expect(loginPage.companyInfoLink).toBeVisible();
// ãªã³ã¯ã®ããã¹ããæ£ããããšã確èª
await expect(loginPage.companyInfoLink).toHaveText('äŒç€ŸæŠèŠ');
});
});

4.ãã¹ã宿œ
ãããã³ããã
ãã¹ãã${ãã¹ãç°å¢}ã ãã§å®è¡ããŠãã ããã
ãŸãããã©ãŠã¶ãç«ã¡äžããã¢ãŒãã§å®è¡ããŠãã ãã
ãçµæã
以äžã®ãããªãšã©ãŒãåºãŸããã
ã©ãããæ°èŠã¿ãã§éãããããšãæåŸ å€ãšããŠããããã§ãããå®éã¯åã¿ãã§ç»é¢é·ç§»ããããã§ããã
Running 2 tests using 2 workers
[1/2] [xxxx] ⺠tests/signIn/companyInfo.spec.ts:31:7 ⺠ãã°ã€ã³ããŒãžããã®äŒç€ŸæŠèŠé·ç§»ãã¹ã ⺠äŒç€Ÿ
[2/2] [xxxx] ⺠tests/signIn/companyInfo.spec.ts:12:7 ⺠ãã°ã€ã³ããŒãžããã®äŒç€ŸæŠèŠ
1) [xxxx] ⺠tests/signIn/companyInfo.spec.ts:12:7 ⺠ãã°ã€ã³ããŒãžããã®äŒç€ŸæŠèŠé·ç§»ãã¹ã ⺠äŒç€ŸæŠèŠããŒãžã«æ£åžžã«é·ç§»ã§ãã âââ
TimeoutError: page.waitForEvent: Timeout 10000ms exceeded while waiting for event "popup"
=========================== logs ===========================
waiting for event "popup"
============================================================
15 |
16 | // æ°ããã¿ãã§éãããããšã確èª
> 17 | const newPage = await page.waitForEvent('popup');
| ^
18 | await newPage.waitForLoadState();
19 |
20 | // URLãæ£ããããšã確èª
at /Users/chibakoji/Desktop/work/kanna-playwright/tests/signIn/companyInfo.spec.ts:17:32
5.ã¹ã¯ãªããã®ä¿®æ£ãšåå®è¡
å ã»ã©ã®ã¹ã¯ãªããã§ã¯ãšã©ãŒã«ãªã£ãŠããŸã£ãã®ã§ãããããã§çµãããªãã®ãPlaywright-mcpã§ãã
èªåçã«ããšã©ãŒå å®¹ãææ¡ããŠèªåã§ã¹ã¯ãªãããä¿®æ£ããŠãããŸããïŒ
ä¿®æ£ãããã¹ãã±ãŒã¹ãåå®è¡ããä»åºŠã¯æåã§ãïŒ

ã ãã¶é·ãéã®ãã§ãããããªããšãåããã®ãããã³ããã ãã§äœæã§ããŸããã
5.ãŸãšã
æ€èšŒçµæ
ç°¡åã«æ€èšŒçµæããŸãšããŸãã
- Playwright-mcpã䜿ãããšã§ãPlaywrightã®ç¥èŠããªããŠããããçšåºŠç°¡åãªãã¹ãã±ãŒã¹ã§ããã°ãã¹ãã¹ã¯ãªãããå®è£ ããããšãã§ãã
- ãã¹ãã±ãŒã¹ãäžçºã§å®è£ ãããããšã¯é£ãã
- ããŒãžã¯ã©ã¹ã®ãã±ãŒã¿ãŒã®ååŸãã¡ãœããã®äœæãªã©ã®åå°äœæããããäžå®ã¯ä»»ããããšãã§ãã
çµè«
ãŸã E2Eèªåãã¹ãã¹ã¯ãªããäœæã®è£å©çãªé åãã§ãªãã§ãããåããŠã®ãã¹ãäœæãããŒãžã¯ã©ã¹ã®çæãšãã£ãéšåçãªç®æã§ã¯å©çšäŸ¡å€ããããšæããŸãïŒ
ãŸã ãŸã ãããŸããŸãªããã³ããã§æ€èšŒããäœå°ããããšæããŸãããPlaywright-mcpãä»åŸã¢ããããŒããããŠããããšæããŸãã®ã§ãä»åŸãåŒãç¶ãAI掻çšããE2Eãã¹ãèªååã«åãçµãã§ãããããšæããŸãïŒ
ãã£ãšã¢ã«ãã°ã©ã ãšã³ãžãã¢çµç¹ãç¥ããã人ããã²äžèšã®æ å ±ããã§ãã¯ããŠã¿ãŠãã ããïŒ
æ ªåŒäŒç€Ÿã¢ã«ãã°ã©ã ã®Tech Blogã§ãã äžçäžã®ãã³ãã¹ã¯ã¯ãŒã¯æ¥çã«ãããçŸå Žã®çç£æ§ã¢ãããå®çŸããçŸå ŽDXãµãŒãã¹ãKANNAããéçºããŠããŸãã æ¡çšæ å ±ã¯ãã¡ã: herp.careers/v1/aldagram0508/
Discussion