diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..75e854d --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +node_modules/ +/test-results/ +/playwright-report/ +/playwright/.cache/ diff --git a/.node-version b/.node-version new file mode 100644 index 0000000..b460d6f --- /dev/null +++ b/.node-version @@ -0,0 +1 @@ +18.12.1 diff --git a/e2e/example.spec.ts b/e2e/example.spec.ts new file mode 100644 index 0000000..16df838 --- /dev/null +++ b/e2e/example.spec.ts @@ -0,0 +1,20 @@ +import { test, expect } from '@playwright/test'; + +test('homepage has title and links to intro page', async ({ page }) => { + await page.goto('https://playwright.dev/'); + + // Expect a title "to contain" a substring. + await expect(page).toHaveTitle(/Playwright/); + + // create a locator + const getStarted = page.getByRole('link', { name: 'Get started' }); + + // Expect an attribute "to be strictly equal" to the value. + await expect(getStarted).toHaveAttribute('href', '/docs/intro'); + + // Click the get started link. + await getStarted.click(); + + // Expects the URL to contain intro. + await expect(page).toHaveURL(/.*intro/); +}); diff --git a/e2e/localhost.spec.ts b/e2e/localhost.spec.ts new file mode 100644 index 0000000..17ddf64 --- /dev/null +++ b/e2e/localhost.spec.ts @@ -0,0 +1,8 @@ +import { test, expect } from '@playwright/test'; + +test('test', async ({ page }) => { + await page.goto('http://localhost:8000/'); + await page.goto('http://localhost:8000/tasks'); + await page.getByRole('link', { name: '123' }).click(); + await page.getByRole('link', { name: 'Back' }).click(); +}); \ No newline at end of file diff --git a/e2e/localhost_django_admin.spec.ts b/e2e/localhost_django_admin.spec.ts new file mode 100644 index 0000000..398be6d --- /dev/null +++ b/e2e/localhost_django_admin.spec.ts @@ -0,0 +1,12 @@ +import { test, expect } from '@playwright/test'; + +test('test', async ({ page }) => { + await page.goto('http://localhost:8000/admin/login/?next=/admin/'); + await page.getByLabel('ユーザー名:').click(); + await page.getByLabel('ユーザー名:').fill('admin'); + await page.getByLabel('ユーザー名:').press('Tab'); + await page.getByLabel('パスワード:').fill('pass'); + await page.getByRole('button', { name: 'ログイン' }).click(); + await page.getByRole('link', { name: 'Tasks' }).click(); + await page.getByRole('link', { name: '123' }).click(); +}); \ No newline at end of file diff --git a/e2e/localhost_django_admin_with_load_storage.spec.ts b/e2e/localhost_django_admin_with_load_storage.spec.ts new file mode 100644 index 0000000..9ce2c98 --- /dev/null +++ b/e2e/localhost_django_admin_with_load_storage.spec.ts @@ -0,0 +1,18 @@ +import { test, expect } from '@playwright/test'; +import path from 'path'; // 追加 + +test.use({ + // 差し替え + // storageState: 'secret.json' + storageState: path.join(__dirname, 'secret.json') +}); + +test('test', async ({ page }) => { + await page.goto('http://localhost:8000/admin/'); + await page.getByRole('link', { name: 'Tasks' }).click(); + await page.getByText('変更する task を選択 task を追加 操作: --------- 選択された tasks の削除 実行 1個の内ひとつも選択されていません 内容 Upd').click(); + await page.locator('input[name="_selected_action"]').check(); + await page.getByRole('combobox', { name: '操作:' }).selectOption('delete_selected'); + await page.getByRole('button', { name: '実行' }).click(); + await page.getByRole('link', { name: '戻る' }).click(); +}); \ No newline at end of file diff --git a/e2e/localhost_sleep.spec.ts b/e2e/localhost_sleep.spec.ts new file mode 100644 index 0000000..17ddf64 --- /dev/null +++ b/e2e/localhost_sleep.spec.ts @@ -0,0 +1,8 @@ +import { test, expect } from '@playwright/test'; + +test('test', async ({ page }) => { + await page.goto('http://localhost:8000/'); + await page.goto('http://localhost:8000/tasks'); + await page.getByRole('link', { name: '123' }).click(); + await page.getByRole('link', { name: 'Back' }).click(); +}); \ No newline at end of file diff --git a/e2e/secret.json b/e2e/secret.json new file mode 100644 index 0000000..a8edcd2 --- /dev/null +++ b/e2e/secret.json @@ -0,0 +1,25 @@ +{ + "cookies": [ + { + "name": "csrftoken", + "value": "HWgAoaHgFP2vqyVzU0nVE8lHgOAEhnD0", + "domain": "localhost", + "path": "/", + "expires": 1704112164.422583, + "httpOnly": false, + "secure": false, + "sameSite": "Lax" + }, + { + "name": "sessionid", + "value": "z8nhd1j1s56jn0af84g5b8uskosy0gj0", + "domain": "localhost", + "path": "/", + "expires": 1673872159.310954, + "httpOnly": true, + "secure": false, + "sameSite": "Lax" + } + ], + "origins": [] +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..f45d063 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,74 @@ +{ + "name": "learn_playwright", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "learn_playwright", + "version": "1.0.0", + "license": "ISC", + "devDependencies": { + "@playwright/test": "^1.29.1" + } + }, + "node_modules/@playwright/test": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.29.1.tgz", + "integrity": "sha512-iQxk2DX5U9wOGV3+/Jh9OHPsw5H3mleUL2S4BgQuwtlAfK3PnKvn38m4Rg9zIViGHVW24opSm99HQm/UFLEy6w==", + "dev": true, + "dependencies": { + "@types/node": "*", + "playwright-core": "1.29.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@types/node": { + "version": "18.11.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", + "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", + "dev": true + }, + "node_modules/playwright-core": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.29.1.tgz", + "integrity": "sha512-20Ai3d+lMkWpI9YZYlxk8gxatfgax5STW8GaMozAHwigLiyiKQrdkt7gaoT9UQR8FIVDg6qVXs9IoZUQrDjIIg==", + "dev": true, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=14" + } + } + }, + "dependencies": { + "@playwright/test": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.29.1.tgz", + "integrity": "sha512-iQxk2DX5U9wOGV3+/Jh9OHPsw5H3mleUL2S4BgQuwtlAfK3PnKvn38m4Rg9zIViGHVW24opSm99HQm/UFLEy6w==", + "dev": true, + "requires": { + "@types/node": "*", + "playwright-core": "1.29.1" + } + }, + "@types/node": { + "version": "18.11.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", + "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", + "dev": true + }, + "playwright-core": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.29.1.tgz", + "integrity": "sha512-20Ai3d+lMkWpI9YZYlxk8gxatfgax5STW8GaMozAHwigLiyiKQrdkt7gaoT9UQR8FIVDg6qVXs9IoZUQrDjIIg==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..ea222c5 --- /dev/null +++ b/package.json @@ -0,0 +1,13 @@ +{ + "name": "learn_playwright", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": {}, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "@playwright/test": "^1.29.1" + } +} diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 0000000..99e9d79 --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,109 @@ +import type { PlaywrightTestConfig } from '@playwright/test'; +import { devices } from '@playwright/test'; + +/** + * Read environment variables from file. + * https://github.com/motdotla/dotenv + */ +// require('dotenv').config(); + +/** + * See https://playwright.dev/docs/test-configuration. + */ +const config: PlaywrightTestConfig = { + testDir: './e2e', + /* Maximum time one test can run for. */ + timeout: 30 * 1000, + expect: { + /** + * Maximum time expect() should wait for the condition to be met. + * For example in `await expect(locator).toHaveText();` + */ + timeout: 5000 + }, + /* Run tests in files in parallel */ + fullyParallel: true, + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + /* Retry on CI only */ + retries: process.env.CI ? 2 : 0, + /* Opt out of parallel tests on CI. */ + workers: process.env.CI ? 1 : undefined, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: 'html', + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + /* Maximum time each action such as `click()` can take. Defaults to 0 (no limit). */ + actionTimeout: 0, + /* Base URL to use in actions like `await page.goto('/')`. */ + // baseURL: 'http://localhost:3000', + + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: 'on-first-retry', + }, + + /* Configure projects for major browsers */ + projects: [ + { + name: 'chromium', + // name: 'Google Chrome', + use: { + // channel: 'chromium', + ...devices['Desktop Chrome'], + }, + }, + + // { + // name: 'firefox', + // use: { + // ...devices['Desktop Firefox'], + // }, + // }, + + // { + // name: 'webkit', + // use: { + // ...devices['Desktop Safari'], + // }, + // }, + + /* Test against mobile viewports. */ + // { + // name: 'Mobile Chrome', + // use: { + // ...devices['Pixel 5'], + // }, + // }, + // { + // name: 'Mobile Safari', + // use: { + // ...devices['iPhone 12'], + // }, + // }, + + /* Test against branded browsers. */ + // { + // name: 'Microsoft Edge', + // use: { + // channel: 'msedge', + // }, + // }, + // { + // name: 'Google Chrome', + // use: { + // channel: 'chrome', + // }, + // }, + ], + + /* Folder for test artifacts such as screenshots, videos, traces, etc. */ + // outputDir: 'test-results/', + + /* Run your local dev server before starting the tests */ + // webServer: { + // command: 'npm run start', + // port: 3000, + // }, +}; + +export default config;