@qlover/create-app 0.7.15 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/dist/configs/_common/.gitignore.template +6 -0
- package/dist/configs/_common/.prettierignore +17 -5
- package/dist/configs/_common/.vscode/settings.json +6 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/dist/templates/next-app/.env.template +1 -1
- package/dist/templates/next-app/README.en.md +0 -1
- package/dist/templates/next-app/README.md +0 -1
- package/dist/templates/next-app/config/Identifier/api.ts +5 -5
- package/dist/templates/next-app/config/Identifier/common/admint.table.ts +69 -0
- package/dist/templates/next-app/config/Identifier/common/common.ts +76 -0
- package/dist/templates/next-app/config/Identifier/common/index.ts +3 -0
- package/dist/templates/next-app/config/Identifier/{validator.ts → common/validators.ts} +5 -5
- package/dist/templates/next-app/config/Identifier/index.ts +2 -12
- package/dist/templates/next-app/config/Identifier/pages/index.ts +6 -0
- package/dist/templates/next-app/config/Identifier/pages/page.admin.home.ts +27 -0
- package/dist/templates/next-app/config/Identifier/pages/page.admin.locales.ts +266 -0
- package/dist/templates/next-app/config/Identifier/pages/page.admin.user.ts +293 -0
- package/dist/templates/{react-app/config/Identifier → next-app/config/Identifier/pages}/page.home.ts +15 -22
- package/dist/templates/next-app/config/Identifier/{page.login.ts → pages/page.login.ts} +28 -34
- package/dist/templates/next-app/config/Identifier/{page.register.ts → pages/page.register.ts} +30 -29
- package/dist/templates/next-app/config/adminNavs.ts +19 -0
- package/dist/templates/next-app/config/common.ts +22 -13
- package/dist/templates/next-app/config/i18n/HomeI18n.ts +5 -5
- package/dist/templates/next-app/config/i18n/admin18n.ts +61 -19
- package/dist/templates/next-app/config/i18n/i18nConfig.ts +2 -0
- package/dist/templates/next-app/config/i18n/i18nKeyScheam.ts +36 -0
- package/dist/templates/next-app/config/i18n/loginI18n.ts +22 -22
- package/dist/templates/next-app/config/i18n/register18n.ts +23 -24
- package/dist/templates/next-app/docs/en/index.md +0 -1
- package/dist/templates/next-app/docs/en/project-structure.md +0 -1
- package/dist/templates/next-app/docs/zh/index.md +0 -1
- package/dist/templates/next-app/docs/zh/project-structure.md +0 -1
- package/dist/templates/next-app/make/generateLocales.ts +19 -12
- package/dist/templates/next-app/migrations/schema/LocalesSchema.ts +15 -0
- package/dist/templates/next-app/migrations/sql/1694244000000.sql +11 -0
- package/dist/templates/next-app/package.json +7 -3
- package/dist/templates/next-app/public/locales/en.json +172 -207
- package/dist/templates/next-app/public/locales/zh.json +172 -207
- package/dist/templates/next-app/src/app/[locale]/admin/locales/page.tsx +153 -0
- package/dist/templates/next-app/src/app/[locale]/admin/users/page.tsx +48 -50
- package/dist/templates/next-app/src/app/[locale]/login/LoginForm.tsx +2 -2
- package/dist/templates/next-app/src/app/api/admin/locales/create/route.ts +34 -0
- package/dist/templates/next-app/src/app/api/admin/locales/import/route.ts +40 -0
- package/dist/templates/next-app/src/app/api/admin/locales/route.ts +42 -0
- package/dist/templates/next-app/src/app/api/admin/locales/update/route.ts +32 -0
- package/dist/templates/next-app/src/app/api/locales/json/route.ts +44 -0
- package/dist/templates/next-app/src/base/cases/AdminPageManager.ts +1 -13
- package/dist/templates/next-app/src/base/cases/Datetime.ts +18 -0
- package/dist/templates/next-app/src/base/cases/DialogErrorPlugin.ts +12 -6
- package/dist/templates/next-app/src/base/cases/ResourceState.ts +17 -0
- package/dist/templates/next-app/src/base/cases/TranslateI18nInterface.ts +25 -0
- package/dist/templates/next-app/src/base/cases/ZodColumnBuilder.ts +200 -0
- package/dist/templates/next-app/src/base/port/ZodBuilderInterface.ts +8 -0
- package/dist/templates/next-app/src/base/services/AdminLocalesService.ts +20 -0
- package/dist/templates/next-app/src/base/services/AdminPageEvent.ts +26 -0
- package/dist/templates/next-app/src/base/services/AdminPageScheduler.ts +42 -0
- package/dist/templates/next-app/src/base/services/ResourceService.ts +122 -0
- package/dist/templates/next-app/src/base/services/adminApi/AdminLocalesApi.ts +104 -0
- package/dist/templates/next-app/src/base/services/adminApi/AdminUserApi.ts +38 -5
- package/dist/templates/next-app/src/base/services/appApi/AppApiPlugin.ts +1 -1
- package/dist/templates/next-app/src/i18n/request.ts +30 -1
- package/dist/templates/next-app/src/server/PageParams.ts +2 -10
- package/dist/templates/next-app/src/server/port/DBBridgeInterface.ts +5 -0
- package/dist/templates/next-app/src/server/port/DBTableInterface.ts +2 -0
- package/dist/templates/next-app/src/server/port/LocalesRepositoryInterface.ts +43 -0
- package/dist/templates/next-app/src/server/repositorys/LocalesRepository.ts +197 -0
- package/dist/templates/next-app/src/server/services/ApiLocaleService.ts +122 -0
- package/dist/templates/next-app/src/server/sqlBridges/SupabaseBridge.ts +60 -11
- package/dist/templates/next-app/src/server/validators/ExtendedExecutorError.ts +6 -0
- package/dist/templates/next-app/src/server/validators/LocalesValidator.ts +131 -0
- package/dist/templates/next-app/src/server/validators/LoginValidator.ts +2 -5
- package/dist/templates/next-app/src/server/validators/PaginationValidator.ts +32 -16
- package/dist/templates/next-app/src/styles/css/antd-themes/pagination/_default.css +2 -1
- package/dist/templates/next-app/src/styles/css/antd-themes/pagination/dark.css +28 -29
- package/dist/templates/next-app/src/styles/css/antd-themes/pagination/pink.css +2 -1
- package/dist/templates/next-app/src/uikit/components/AdminLayout.tsx +17 -3
- package/dist/templates/next-app/src/uikit/components/BaseHeader.tsx +5 -4
- package/dist/templates/next-app/src/uikit/components/BaseLayout.tsx +5 -4
- package/dist/templates/next-app/src/uikit/components/BootstrapsProvider.tsx +3 -2
- package/dist/templates/next-app/src/uikit/components/ComboProvider.tsx +1 -1
- package/dist/templates/next-app/src/uikit/components/EditableCell.tsx +118 -0
- package/dist/templates/next-app/src/uikit/components/LogoutButton.tsx +5 -6
- package/dist/templates/next-app/src/uikit/components/ThemeSwitcher.tsx +1 -1
- package/dist/templates/next-app/src/uikit/components/With.tsx +2 -2
- package/dist/templates/next-app/src/uikit/components/localesImportButton/LocalesImportButton.tsx +62 -0
- package/dist/templates/next-app/src/uikit/components/localesImportButton/LocalesImportEvent.ts +28 -0
- package/dist/templates/next-app/src/uikit/components/localesImportButton/import.module.css +6 -0
- package/dist/templates/next-app/src/uikit/hook/useI18nInterface.ts +8 -14
- package/dist/templates/next-app/src/uikit/hook/useWarnTranslations.ts +25 -0
- package/dist/templates/react-app/.prettierignore +17 -0
- package/dist/templates/react-app/README.en.md +71 -54
- package/dist/templates/react-app/README.md +35 -18
- package/dist/templates/react-app/__tests__/__mocks__/BootstrapTest.ts +14 -0
- package/dist/templates/react-app/__tests__/__mocks__/MockAppConfit.ts +1 -1
- package/dist/templates/react-app/__tests__/__mocks__/MockDialogHandler.ts +2 -2
- package/dist/templates/react-app/__tests__/__mocks__/MockLogger.ts +1 -1
- package/dist/templates/react-app/__tests__/__mocks__/components/TestApp.tsx +45 -0
- package/dist/templates/react-app/__tests__/__mocks__/components/TestBootstrapsProvider.tsx +34 -0
- package/dist/templates/react-app/__tests__/__mocks__/components/TestRouter.tsx +46 -0
- package/dist/templates/react-app/__tests__/__mocks__/components/index.ts +12 -0
- package/dist/templates/react-app/__tests__/__mocks__/createMockGlobals.ts +1 -2
- package/dist/templates/react-app/__tests__/__mocks__/testIOC/TestIOC.ts +51 -0
- package/dist/templates/react-app/__tests__/__mocks__/testIOC/TestIOCRegister.ts +69 -0
- package/dist/templates/react-app/__tests__/setup/index.ts +1 -51
- package/dist/templates/react-app/__tests__/setup/setupGlobal.ts +51 -0
- package/dist/templates/react-app/__tests__/src/App.structure.test.tsx +115 -0
- package/dist/templates/react-app/__tests__/src/base/cases/AppConfig.test.ts +2 -2
- package/dist/templates/react-app/__tests__/src/base/cases/AppError.test.ts +1 -1
- package/dist/templates/react-app/__tests__/src/base/cases/DialogHandler.test.ts +3 -5
- package/dist/templates/react-app/__tests__/src/base/cases/I18nKeyErrorPlugin.test.ts +13 -2
- package/dist/templates/react-app/__tests__/src/base/cases/InversifyContainer.test.ts +1 -1
- package/dist/templates/react-app/__tests__/src/base/cases/PublicAssetsPath.test.ts +1 -1
- package/dist/templates/react-app/__tests__/src/base/cases/RequestLogger.test.ts +5 -5
- package/dist/templates/react-app/__tests__/src/base/cases/RequestStatusCatcher.test.ts +1 -2
- package/dist/templates/react-app/__tests__/src/base/cases/RouterLoader.test.ts +25 -15
- package/dist/templates/react-app/__tests__/src/base/services/I18nService.test.ts +29 -15
- package/dist/templates/react-app/__tests__/src/core/IOC.test.ts +19 -9
- package/dist/templates/react-app/__tests__/src/core/bootstraps/BootstrapClient.test.ts +153 -0
- package/dist/templates/react-app/__tests__/src/core/bootstraps/BootstrapsApp.test.ts +9 -7
- package/dist/templates/react-app/__tests__/src/main.integration.test.tsx +4 -5
- package/dist/templates/react-app/__tests__/src/main.test.tsx +4 -4
- package/dist/templates/react-app/__tests__/src/uikit/components/BaseHeader.test.tsx +68 -59
- package/dist/templates/react-app/config/IOCIdentifier.ts +8 -8
- package/dist/templates/react-app/config/Identifier/{common.error.ts → common/common.error.ts} +5 -5
- package/dist/templates/react-app/config/Identifier/{common.ts → common/common.ts} +9 -9
- package/dist/templates/react-app/config/Identifier/common/index.ts +2 -0
- package/dist/templates/react-app/config/Identifier/index.ts +1 -9
- package/dist/templates/react-app/config/Identifier/pages/index.ts +8 -0
- package/dist/templates/react-app/config/Identifier/{page.about.ts → pages/page.about.ts} +34 -26
- package/dist/templates/react-app/config/Identifier/{page.executor.ts → pages/page.executor.ts} +47 -39
- package/dist/templates/{next-app/config/Identifier → react-app/config/Identifier/pages}/page.home.ts +24 -23
- package/dist/templates/react-app/config/Identifier/pages/page.identifiter.ts +102 -0
- package/dist/templates/react-app/config/Identifier/{page.jsonStorage.ts → pages/page.jsonStorage.ts} +18 -11
- package/dist/templates/react-app/config/Identifier/{page.login.ts → pages/page.login.ts} +37 -27
- package/dist/templates/react-app/config/Identifier/{page.register.ts → pages/page.register.ts} +37 -25
- package/dist/templates/react-app/config/Identifier/{page.request.ts → pages/page.request.ts} +34 -44
- package/dist/templates/react-app/config/app.router.ts +66 -69
- package/dist/templates/react-app/config/i18n/PageI18nInterface.ts +51 -0
- package/dist/templates/react-app/config/i18n/aboutI18n.ts +42 -0
- package/dist/templates/react-app/config/i18n/executorI18n.ts +51 -0
- package/dist/templates/react-app/config/i18n/homeI18n.ts +24 -0
- package/dist/templates/react-app/config/i18n/i18nConfig.ts +30 -0
- package/dist/templates/react-app/config/i18n/identifiter18n.ts +30 -0
- package/dist/templates/react-app/config/i18n/jsonStorage18n.ts +27 -0
- package/dist/templates/react-app/config/i18n/login18n.ts +42 -0
- package/dist/templates/react-app/config/i18n/notFoundI18n.ts +34 -0
- package/dist/templates/react-app/config/i18n/register18n.ts +40 -0
- package/dist/templates/react-app/config/i18n/request18n.ts +41 -0
- package/dist/templates/react-app/config/theme.ts +14 -4
- package/dist/templates/react-app/docs/en/bootstrap.md +1670 -341
- package/dist/templates/react-app/docs/en/development-guide.md +1021 -345
- package/dist/templates/react-app/docs/en/env.md +1132 -278
- package/dist/templates/react-app/docs/en/i18n.md +858 -147
- package/dist/templates/react-app/docs/en/index.md +733 -104
- package/dist/templates/react-app/docs/en/ioc.md +1228 -287
- package/dist/templates/react-app/docs/en/playwright/e2e-tests.md +321 -0
- package/dist/templates/react-app/docs/en/playwright/index.md +19 -0
- package/dist/templates/react-app/docs/en/playwright/installation-summary.md +332 -0
- package/dist/templates/react-app/docs/en/playwright/overview.md +222 -0
- package/dist/templates/react-app/docs/en/playwright/quickstart.md +325 -0
- package/dist/templates/react-app/docs/en/playwright/reorganization-notes.md +340 -0
- package/dist/templates/react-app/docs/en/playwright/setup-complete.md +290 -0
- package/dist/templates/react-app/docs/en/playwright/testing-guide.md +565 -0
- package/dist/templates/react-app/docs/en/store.md +1194 -184
- package/dist/templates/react-app/docs/en/why-no-globals.md +797 -0
- package/dist/templates/react-app/docs/zh/bootstrap.md +1670 -341
- package/dist/templates/react-app/docs/zh/development-guide.md +1021 -345
- package/dist/templates/react-app/docs/zh/env.md +1132 -275
- package/dist/templates/react-app/docs/zh/i18n.md +858 -147
- package/dist/templates/react-app/docs/zh/index.md +717 -104
- package/dist/templates/react-app/docs/zh/ioc.md +1229 -287
- package/dist/templates/react-app/docs/zh/playwright/e2e-tests.md +321 -0
- package/dist/templates/react-app/docs/zh/playwright/index.md +19 -0
- package/dist/templates/react-app/docs/zh/playwright/installation-summary.md +332 -0
- package/dist/templates/react-app/docs/zh/playwright/overview.md +222 -0
- package/dist/templates/react-app/docs/zh/playwright/quickstart.md +325 -0
- package/dist/templates/react-app/docs/zh/playwright/reorganization-notes.md +340 -0
- package/dist/templates/react-app/docs/zh/playwright/setup-complete.md +290 -0
- package/dist/templates/react-app/docs/zh/playwright/testing-guide.md +565 -0
- package/dist/templates/react-app/docs/zh/store.md +1192 -184
- package/dist/templates/react-app/docs/zh/why-no-globals.md +797 -0
- package/dist/templates/react-app/e2e/App.spec.ts +319 -0
- package/dist/templates/react-app/e2e/fixtures/base.fixture.ts +40 -0
- package/dist/templates/react-app/e2e/main.spec.ts +20 -0
- package/dist/templates/react-app/e2e/utils/test-helpers.ts +19 -0
- package/dist/templates/react-app/eslint.config.mjs +247 -0
- package/dist/templates/react-app/makes/eslint-utils.mjs +195 -0
- package/dist/templates/react-app/makes/generateTs2LocalesOptions.ts +26 -0
- package/dist/templates/react-app/package.json +31 -3
- package/dist/templates/react-app/playwright.config.ts +79 -0
- package/dist/templates/react-app/public/locales/en/common.json +190 -179
- package/dist/templates/react-app/public/locales/zh/common.json +190 -179
- package/dist/templates/react-app/src/App.tsx +15 -42
- package/dist/templates/react-app/src/base/apis/AiApi.ts +5 -5
- package/dist/templates/react-app/src/base/apis/feApi/FeApi.ts +1 -1
- package/dist/templates/react-app/src/base/apis/feApi/FeApiAdapter.ts +1 -1
- package/dist/templates/react-app/src/base/apis/feApi/FeApiBootstarp.ts +8 -8
- package/dist/templates/react-app/src/base/apis/feApi/FeApiType.ts +1 -1
- package/dist/templates/react-app/src/base/apis/userApi/UserApi.ts +6 -6
- package/dist/templates/react-app/src/base/apis/userApi/UserApiAdapter.ts +1 -1
- package/dist/templates/react-app/src/base/apis/userApi/UserApiBootstarp.ts +12 -14
- package/dist/templates/react-app/src/base/apis/userApi/UserApiType.ts +1 -1
- package/dist/templates/react-app/src/base/cases/DialogHandler.ts +5 -2
- package/dist/templates/react-app/src/base/cases/I18nKeyErrorPlugin.ts +3 -3
- package/dist/templates/react-app/src/base/cases/InversifyContainer.ts +3 -3
- package/dist/templates/react-app/src/base/cases/RequestLanguages.ts +2 -2
- package/dist/templates/react-app/src/base/cases/RequestLogger.ts +4 -4
- package/dist/templates/react-app/src/base/cases/RequestStatusCatcher.ts +1 -1
- package/dist/templates/react-app/src/base/cases/ResourceState.ts +23 -0
- package/dist/templates/react-app/src/base/cases/RouterLoader.ts +4 -4
- package/dist/templates/react-app/src/base/cases/TranslateI18nInterface.ts +26 -0
- package/dist/templates/react-app/src/base/port/ExecutorPageBridgeInterface.ts +2 -3
- package/dist/templates/react-app/src/base/port/I18nServiceInterface.ts +1 -1
- package/dist/templates/react-app/src/base/port/IOCInterface.ts +36 -0
- package/dist/templates/react-app/src/base/port/JSONStoragePageBridgeInterface.ts +2 -1
- package/dist/templates/react-app/src/base/port/ProcesserExecutorInterface.ts +1 -1
- package/dist/templates/react-app/src/base/port/RequestPageBridgeInterface.ts +2 -2
- package/dist/templates/react-app/src/base/port/RouteServiceInterface.ts +9 -5
- package/dist/templates/react-app/src/base/port/UserServiceInterface.ts +1 -1
- package/dist/templates/react-app/src/base/services/I18nService.ts +29 -29
- package/dist/templates/react-app/src/base/services/IdentifierService.ts +143 -0
- package/dist/templates/react-app/src/base/services/ProcesserExecutor.ts +3 -3
- package/dist/templates/react-app/src/base/services/RouteService.ts +27 -8
- package/dist/templates/react-app/src/base/services/UserService.ts +8 -8
- package/dist/templates/react-app/src/base/types/Page.ts +14 -2
- package/dist/templates/react-app/src/base/types/global.d.ts +1 -1
- package/dist/templates/react-app/src/core/IOC.ts +5 -46
- package/dist/templates/react-app/src/core/bootstraps/{BootstrapApp.ts → BootstrapClient.ts} +44 -17
- package/dist/templates/react-app/src/core/bootstraps/BootstrapsRegistry.ts +14 -7
- package/dist/templates/react-app/src/core/bootstraps/IocIdentifierTest.ts +1 -1
- package/dist/templates/react-app/src/core/bootstraps/PrintBootstrap.ts +1 -1
- package/dist/templates/react-app/src/core/clientIoc/ClientIOC.ts +40 -0
- package/dist/templates/react-app/src/core/{IocRegisterImpl.ts → clientIoc/ClientIOCRegister.ts} +35 -24
- package/dist/templates/react-app/src/core/globals.ts +9 -9
- package/dist/templates/react-app/src/main.tsx +4 -4
- package/dist/templates/react-app/src/pages/404.tsx +6 -3
- package/dist/templates/react-app/src/pages/500.tsx +5 -2
- package/dist/templates/react-app/src/pages/NoRouteFound.tsx +5 -0
- package/dist/templates/react-app/src/pages/auth/Layout.tsx +9 -6
- package/dist/templates/react-app/src/pages/auth/LoginPage.tsx +46 -56
- package/dist/templates/react-app/src/pages/auth/RegisterPage.tsx +46 -58
- package/dist/templates/react-app/src/pages/base/AboutPage.tsx +35 -40
- package/dist/templates/react-app/src/pages/base/ExecutorPage.tsx +51 -51
- package/dist/templates/react-app/src/pages/base/HomePage.tsx +14 -15
- package/dist/templates/react-app/src/pages/base/IdentifierPage.tsx +70 -11
- package/dist/templates/react-app/src/pages/base/JSONStoragePage.tsx +24 -25
- package/dist/templates/react-app/src/pages/base/Layout.tsx +2 -2
- package/dist/templates/react-app/src/pages/base/RedirectPathname.tsx +3 -2
- package/dist/templates/react-app/src/pages/base/RequestPage.tsx +41 -59
- package/dist/templates/react-app/src/styles/css/antd-themes/{_default.css → _common/_default.css} +85 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/{dark.css → _common/dark.css} +99 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/_common/index.css +3 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/{pink.css → _common/pink.css} +86 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/index.css +4 -3
- package/dist/templates/react-app/src/styles/css/antd-themes/menu/_default.css +108 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/menu/dark.css +67 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/menu/index.css +3 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/menu/pink.css +67 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/pagination/_default.css +34 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/pagination/dark.css +31 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/pagination/index.css +3 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/pagination/pink.css +36 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/table/_default.css +44 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/table/dark.css +43 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/table/index.css +3 -0
- package/dist/templates/react-app/src/styles/css/antd-themes/table/pink.css +43 -0
- package/dist/templates/react-app/src/styles/css/page.css +4 -3
- package/dist/templates/react-app/src/styles/css/themes/_default.css +1 -0
- package/dist/templates/react-app/src/styles/css/themes/dark.css +1 -0
- package/dist/templates/react-app/src/styles/css/themes/pink.css +1 -0
- package/dist/templates/react-app/src/styles/css/zIndex.css +1 -1
- package/dist/templates/react-app/src/uikit/bridges/ExecutorPageBridge.ts +3 -3
- package/dist/templates/react-app/src/uikit/bridges/JSONStoragePageBridge.ts +2 -2
- package/dist/templates/react-app/src/uikit/bridges/NavigateBridge.ts +1 -1
- package/dist/templates/react-app/src/uikit/bridges/RequestPageBridge.ts +3 -3
- package/dist/templates/react-app/src/uikit/components/AppRouterProvider.tsx +35 -0
- package/dist/templates/react-app/src/uikit/components/BaseHeader.tsx +15 -11
- package/dist/templates/react-app/src/uikit/components/BaseRouteProvider.tsx +14 -11
- package/dist/templates/react-app/src/uikit/components/BaseRouteSeo.tsx +18 -0
- package/dist/templates/react-app/src/uikit/components/BootstrapsProvider.tsx +13 -0
- package/dist/templates/react-app/src/uikit/components/ClientSeo.tsx +62 -0
- package/dist/templates/react-app/src/uikit/components/ComboProvider.tsx +38 -0
- package/dist/templates/react-app/src/uikit/components/LanguageSwitcher.tsx +48 -27
- package/dist/templates/react-app/src/uikit/components/Loading.tsx +4 -2
- package/dist/templates/react-app/src/uikit/components/LocaleLink.tsx +4 -5
- package/dist/templates/react-app/src/uikit/components/LogoutButton.tsx +34 -11
- package/dist/templates/react-app/src/uikit/components/ProcessExecutorProvider.tsx +9 -5
- package/dist/templates/react-app/src/uikit/components/RouterRenderComponent.tsx +6 -3
- package/dist/templates/react-app/src/uikit/components/ThemeSwitcher.tsx +97 -40
- package/dist/templates/react-app/src/uikit/components/UserAuthProvider.tsx +5 -5
- package/dist/templates/react-app/src/uikit/components/With.tsx +17 -0
- package/dist/templates/react-app/src/uikit/contexts/BaseRouteContext.ts +17 -11
- package/dist/templates/react-app/src/uikit/contexts/IOCContext.ts +13 -0
- package/dist/templates/react-app/src/uikit/hooks/useAppTranslation.ts +26 -0
- package/dist/templates/react-app/src/uikit/hooks/useI18nGuard.ts +8 -11
- package/dist/templates/react-app/src/uikit/hooks/useI18nInterface.ts +25 -0
- package/dist/templates/react-app/src/uikit/hooks/useIOC.ts +35 -0
- package/dist/templates/react-app/src/uikit/hooks/useNavigateBridge.ts +3 -3
- package/dist/templates/react-app/src/uikit/hooks/useStrictEffect.ts +0 -1
- package/dist/templates/react-app/tsconfig.e2e.json +21 -0
- package/dist/templates/react-app/tsconfig.json +8 -1
- package/dist/templates/react-app/tsconfig.node.json +1 -1
- package/dist/templates/react-app/tsconfig.test.json +3 -1
- package/dist/templates/react-app/vite.config.ts +50 -34
- package/package.json +2 -1
- package/dist/configs/react-app/eslint.config.js +0 -94
- package/dist/templates/next-app/config/Identifier/common.error.ts +0 -41
- package/dist/templates/next-app/config/Identifier/common.ts +0 -69
- package/dist/templates/next-app/config/Identifier/page.about.ts +0 -181
- package/dist/templates/next-app/config/Identifier/page.admin.ts +0 -48
- package/dist/templates/next-app/config/Identifier/page.executor.ts +0 -272
- package/dist/templates/next-app/config/Identifier/page.identifiter.ts +0 -39
- package/dist/templates/next-app/config/Identifier/page.jsonStorage.ts +0 -72
- package/dist/templates/next-app/config/Identifier/page.request.ts +0 -182
- package/dist/templates/next-app/src/base/cases/ChatAction.ts +0 -21
- package/dist/templates/next-app/src/base/cases/FocusBarAction.ts +0 -36
- package/dist/templates/next-app/src/base/cases/RequestState.ts +0 -20
- package/dist/templates/next-app/src/base/port/AdminPageInterface.ts +0 -85
- package/dist/templates/next-app/src/base/port/AsyncStateInterface.ts +0 -7
- package/dist/templates/next-app/src/base/services/AdminUserService.ts +0 -45
- package/dist/templates/next-app/src/uikit/components/ChatRoot.tsx +0 -17
- package/dist/templates/next-app/src/uikit/components/chat/ChatActionInterface.ts +0 -30
- package/dist/templates/next-app/src/uikit/components/chat/ChatFocusBar.tsx +0 -65
- package/dist/templates/next-app/src/uikit/components/chat/ChatMessages.tsx +0 -59
- package/dist/templates/next-app/src/uikit/components/chat/ChatWrap.tsx +0 -28
- package/dist/templates/next-app/src/uikit/components/chat/FocusBarActionInterface.ts +0 -19
- package/dist/templates/next-app/src/uikit/hook/useMountedClient.ts +0 -17
- package/dist/templates/next-app/src/uikit/hook/useStore.ts +0 -15
- package/dist/templates/react-app/__tests__/__mocks__/I18nService.ts +0 -13
- package/dist/templates/react-app/__tests__/src/App.test.tsx +0 -139
- package/dist/templates/react-app/config/Identifier/page.identifiter.ts +0 -39
- package/dist/templates/react-app/config/i18n.ts +0 -15
- package/dist/templates/react-app/docs/en/project-structure.md +0 -434
- package/dist/templates/react-app/docs/zh/project-structure.md +0 -434
- package/dist/templates/react-app/src/base/cases/RequestState.ts +0 -20
- package/dist/templates/react-app/src/base/port/AsyncStateInterface.ts +0 -7
- package/dist/templates/react-app/src/uikit/hooks/useDocumentTitle.ts +0 -15
- package/dist/templates/react-app/src/uikit/hooks/useStore.ts +0 -15
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
# Playwright E2E Testing Guide
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
This project includes comprehensive end-to-end (E2E) testing using [Playwright](https://playwright.dev/), a modern testing framework that enables reliable testing across all modern browsers.
|
|
6
|
+
|
|
7
|
+
## Features
|
|
8
|
+
|
|
9
|
+
- ✅ Multi-browser testing (Chromium, Firefox, WebKit)
|
|
10
|
+
- ✅ Mobile browser simulation
|
|
11
|
+
- ✅ Page Object Model (POM) architecture
|
|
12
|
+
- ✅ Comprehensive test coverage
|
|
13
|
+
- ✅ Automatic screenshots and videos on failure
|
|
14
|
+
- ✅ CI/CD integration with GitHub Actions
|
|
15
|
+
- ✅ Accessibility testing
|
|
16
|
+
- ✅ Performance testing
|
|
17
|
+
- ✅ i18n testing
|
|
18
|
+
|
|
19
|
+
## Quick Start
|
|
20
|
+
|
|
21
|
+
### Installation
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
# Fix npm permissions if needed
|
|
25
|
+
sudo chown -R $(id -u):$(id -g) "$HOME/.npm"
|
|
26
|
+
|
|
27
|
+
# Install Playwright
|
|
28
|
+
npm install -D @playwright/test playwright
|
|
29
|
+
|
|
30
|
+
# Install browsers
|
|
31
|
+
npx playwright install
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### Run Tests
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
# Run all tests
|
|
38
|
+
npm run test:e2e
|
|
39
|
+
|
|
40
|
+
# Interactive UI mode (recommended)
|
|
41
|
+
npm run test:e2e:ui
|
|
42
|
+
|
|
43
|
+
# Debug mode
|
|
44
|
+
npm run test:e2e:debug
|
|
45
|
+
|
|
46
|
+
# View report
|
|
47
|
+
npm run test:e2e:report
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Test Structure
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
e2e/
|
|
54
|
+
├── fixtures/ # Custom test fixtures
|
|
55
|
+
├── pages/ # Page Object Models
|
|
56
|
+
├── tests/ # Test specifications
|
|
57
|
+
│ ├── home.spec.ts
|
|
58
|
+
│ ├── navigation.spec.ts
|
|
59
|
+
│ ├── auth.spec.ts
|
|
60
|
+
│ ├── i18n.spec.ts
|
|
61
|
+
│ ├── accessibility.spec.ts
|
|
62
|
+
│ └── performance.spec.ts
|
|
63
|
+
└── utils/ # Test helpers
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Test Categories
|
|
67
|
+
|
|
68
|
+
### Functional Tests
|
|
69
|
+
|
|
70
|
+
- **Home Page Tests**: Page rendering, navigation menu, responsive design
|
|
71
|
+
- **Navigation Tests**: Routing, 404 handling, browser navigation
|
|
72
|
+
- **Authentication Tests**: Login/register forms, validation
|
|
73
|
+
|
|
74
|
+
### Quality Tests
|
|
75
|
+
|
|
76
|
+
- **i18n Tests**: Locale switching, translation coverage
|
|
77
|
+
- **Accessibility Tests**: ARIA roles, keyboard navigation, screen reader support
|
|
78
|
+
- **Performance Tests**: Load times, bundle size, memory leaks
|
|
79
|
+
|
|
80
|
+
## Writing Tests
|
|
81
|
+
|
|
82
|
+
### Basic Test Example
|
|
83
|
+
|
|
84
|
+
```typescript
|
|
85
|
+
import { test, expect } from '@playwright/test';
|
|
86
|
+
|
|
87
|
+
test('example test', async ({ page }) => {
|
|
88
|
+
await page.goto('/');
|
|
89
|
+
await expect(page.locator('h1')).toBeVisible();
|
|
90
|
+
});
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Using Page Objects
|
|
94
|
+
|
|
95
|
+
```typescript
|
|
96
|
+
import { HomePage } from '../pages/HomePage';
|
|
97
|
+
|
|
98
|
+
test('home page test', async ({ page }) => {
|
|
99
|
+
const homePage = new HomePage(page);
|
|
100
|
+
await homePage.navigate('zh');
|
|
101
|
+
await expect(homePage.mainContent).toBeVisible();
|
|
102
|
+
});
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Configuration
|
|
106
|
+
|
|
107
|
+
Configuration file: `playwright.config.ts`
|
|
108
|
+
|
|
109
|
+
Key settings:
|
|
110
|
+
|
|
111
|
+
- Base URL: `http://localhost:3200`
|
|
112
|
+
- Browsers: Chromium, Firefox, WebKit, Mobile
|
|
113
|
+
- Auto-start dev server
|
|
114
|
+
- Screenshot/video on failure
|
|
115
|
+
- Trace on retry
|
|
116
|
+
|
|
117
|
+
## CI/CD Integration
|
|
118
|
+
|
|
119
|
+
GitHub Actions workflow: `.github/workflows/playwright.yml`
|
|
120
|
+
|
|
121
|
+
Features:
|
|
122
|
+
|
|
123
|
+
- Runs on push/PR
|
|
124
|
+
- Tests across multiple browsers
|
|
125
|
+
- Uploads test reports as artifacts
|
|
126
|
+
- Parallel execution
|
|
127
|
+
|
|
128
|
+
## Best Practices
|
|
129
|
+
|
|
130
|
+
1. Use semantic selectors (`getByRole`, `getByLabel`)
|
|
131
|
+
2. Leverage auto-waiting instead of fixed delays
|
|
132
|
+
3. Keep tests independent and isolated
|
|
133
|
+
4. Use Page Object Models for reusability
|
|
134
|
+
5. Test user journeys, not implementation
|
|
135
|
+
6. Include accessibility in every test
|
|
136
|
+
7. Monitor performance metrics
|
|
137
|
+
|
|
138
|
+
## Debugging
|
|
139
|
+
|
|
140
|
+
### UI Mode (Recommended)
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
npm run test:e2e:ui
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
Features:
|
|
147
|
+
|
|
148
|
+
- Time travel debugging
|
|
149
|
+
- DOM snapshots
|
|
150
|
+
- Network logs
|
|
151
|
+
- Trace viewer
|
|
152
|
+
|
|
153
|
+
### Debug Mode
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
npm run test:e2e:debug
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
Use Playwright Inspector to:
|
|
160
|
+
|
|
161
|
+
- Step through tests
|
|
162
|
+
- Inspect selectors
|
|
163
|
+
- Edit locators
|
|
164
|
+
|
|
165
|
+
### Trace Viewer
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
npx playwright show-trace test-results/path/to/trace.zip
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
## VS Code Integration
|
|
172
|
+
|
|
173
|
+
Install the [Playwright Test for VS Code](https://marketplace.visualstudio.com/items?itemName=ms-playwright.playwright) extension for:
|
|
174
|
+
|
|
175
|
+
- Running tests from editor
|
|
176
|
+
- Setting breakpoints
|
|
177
|
+
- Viewing results inline
|
|
178
|
+
- Recording tests
|
|
179
|
+
|
|
180
|
+
## Troubleshooting
|
|
181
|
+
|
|
182
|
+
### Tests Timeout
|
|
183
|
+
|
|
184
|
+
- Increase timeout in config
|
|
185
|
+
- Check dev server is running
|
|
186
|
+
- Verify network connectivity
|
|
187
|
+
|
|
188
|
+
### Element Not Found
|
|
189
|
+
|
|
190
|
+
- Use Playwright Inspector to debug selectors
|
|
191
|
+
- Check if element is in frame/shadow DOM
|
|
192
|
+
- Verify element exists in DOM
|
|
193
|
+
|
|
194
|
+
### Flaky Tests
|
|
195
|
+
|
|
196
|
+
- Use auto-waiting instead of fixed delays
|
|
197
|
+
- Ensure proper cleanup between tests
|
|
198
|
+
- Check for race conditions
|
|
199
|
+
|
|
200
|
+
## Resources
|
|
201
|
+
|
|
202
|
+
### Project Documentation
|
|
203
|
+
|
|
204
|
+
- [Playwright Documentation Hub](./playwright/README.md) - Central hub for all Playwright docs
|
|
205
|
+
- [Quick Start Guide](./playwright/quickstart.md) - Get started quickly
|
|
206
|
+
- [Detailed Testing Guide](./playwright/testing-guide.md) - Complete reference
|
|
207
|
+
- [Setup Complete Guide](./playwright/setup-complete.md) - Configuration and troubleshooting
|
|
208
|
+
- [Installation Summary](./playwright/installation-summary.md) - Installation details
|
|
209
|
+
- [E2E Tests Documentation](./playwright/e2e-tests.md) - E2E test code documentation
|
|
210
|
+
|
|
211
|
+
### External Resources
|
|
212
|
+
|
|
213
|
+
- [Playwright Official Docs](https://playwright.dev/)
|
|
214
|
+
- [API Reference](https://playwright.dev/docs/api/class-playwright)
|
|
215
|
+
|
|
216
|
+
## Next Steps
|
|
217
|
+
|
|
218
|
+
1. Review `e2e/example.spec.ts`
|
|
219
|
+
2. Run tests with `npm run test:e2e:ui`
|
|
220
|
+
3. Write custom tests for your features
|
|
221
|
+
4. Integrate into CI/CD pipeline
|
|
222
|
+
5. Monitor test results and coverage
|
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
# Playwright E2E Testing - Quick Start Guide
|
|
2
|
+
|
|
3
|
+
## 🎯 快速开始
|
|
4
|
+
|
|
5
|
+
### 1. 安装依赖
|
|
6
|
+
|
|
7
|
+
首先,修复 npm 权限问题(如果存在):
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
sudo chown -R $(id -u):$(id -g) "$HOME/.npm"
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
然后安装 Playwright:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm install -D @playwright/test playwright
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
安装浏览器驱动:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npx playwright install
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### 2. 运行第一个测试
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
# 运行示例测试
|
|
29
|
+
npm run test:e2e -- e2e/example.spec.ts
|
|
30
|
+
|
|
31
|
+
# 或者使用 UI 模式(推荐用于开发)
|
|
32
|
+
npm run test:e2e:ui
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### 3. 查看测试报告
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
npm run test:e2e:report
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## 📋 可用的测试脚本
|
|
42
|
+
|
|
43
|
+
| 命令 | 说明 |
|
|
44
|
+
| --------------------------- | ------------------------------ |
|
|
45
|
+
| `npm run test:e2e` | 运行所有 E2E 测试 |
|
|
46
|
+
| `npm run test:e2e:ui` | 在 UI 模式下运行(交互式) |
|
|
47
|
+
| `npm run test:e2e:headed` | 在有头模式下运行(可见浏览器) |
|
|
48
|
+
| `npm run test:e2e:debug` | 在调试模式下运行 |
|
|
49
|
+
| `npm run test:e2e:chromium` | 仅在 Chrome 上运行 |
|
|
50
|
+
| `npm run test:e2e:firefox` | 仅在 Firefox 上运行 |
|
|
51
|
+
| `npm run test:e2e:webkit` | 仅在 Safari/WebKit 上运行 |
|
|
52
|
+
| `npm run test:e2e:report` | 查看测试报告 |
|
|
53
|
+
|
|
54
|
+
## 📚 测试文件说明
|
|
55
|
+
|
|
56
|
+
### 已创建的测试套件
|
|
57
|
+
|
|
58
|
+
1. **`example.spec.ts`** - 验证 Playwright 设置的示例测试
|
|
59
|
+
2. **`home.spec.ts`** - 首页功能测试
|
|
60
|
+
3. **`navigation.spec.ts`** - 导航和路由测试
|
|
61
|
+
4. **`auth.spec.ts`** - 认证流程测试
|
|
62
|
+
5. **`i18n.spec.ts`** - 国际化测试
|
|
63
|
+
6. **`accessibility.spec.ts`** - 可访问性测试
|
|
64
|
+
7. **`performance.spec.ts`** - 性能测试
|
|
65
|
+
|
|
66
|
+
### Page Object Models
|
|
67
|
+
|
|
68
|
+
已创建的页面对象模型(位于 `e2e/pages/`):
|
|
69
|
+
|
|
70
|
+
- `BasePage.ts` - 基础页面类
|
|
71
|
+
- `HomePage.ts` - 首页
|
|
72
|
+
- `LoginPage.ts` - 登录页面
|
|
73
|
+
|
|
74
|
+
## 🔧 常用操作
|
|
75
|
+
|
|
76
|
+
### 运行特定测试文件
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
npx playwright test e2e/tests/home.spec.ts
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### 运行特定测试用例
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
npx playwright test -g "should load and display home page"
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### 仅运行失败的测试
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
npx playwright test --last-failed
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### 更新快照
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
npx playwright test --update-snapshots
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### 生成代码
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
npx playwright codegen http://localhost:3200
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
这将打开浏览器并记录你的操作,自动生成测试代码!
|
|
107
|
+
|
|
108
|
+
## 🐛 调试技巧
|
|
109
|
+
|
|
110
|
+
### 1. 使用 UI 模式(推荐)
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
npm run test:e2e:ui
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
UI 模式提供:
|
|
117
|
+
|
|
118
|
+
- 可视化测试执行
|
|
119
|
+
- 时间旅行调试
|
|
120
|
+
- DOM 快照
|
|
121
|
+
- 网络日志
|
|
122
|
+
|
|
123
|
+
### 2. 使用调试模式
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
npm run test:e2e:debug
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
这会打开 Playwright Inspector,允许你:
|
|
130
|
+
|
|
131
|
+
- 单步执行测试
|
|
132
|
+
- 查看选择器
|
|
133
|
+
- 编辑定位器
|
|
134
|
+
|
|
135
|
+
### 3. 在测试中添加断点
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
test('debug example', async ({ page }) => {
|
|
139
|
+
await page.goto('/');
|
|
140
|
+
await page.pause(); // 添加这一行来暂停执行
|
|
141
|
+
// ... 其他测试代码
|
|
142
|
+
});
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### 4. 查看 Trace
|
|
146
|
+
|
|
147
|
+
如果测试失败,会自动生成 trace 文件:
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
npx playwright show-trace test-results/.../trace.zip
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
## 💡 编写测试的最佳实践
|
|
154
|
+
|
|
155
|
+
### 1. 使用 Page Object Model
|
|
156
|
+
|
|
157
|
+
```typescript
|
|
158
|
+
import { HomePage } from '../pages/HomePage';
|
|
159
|
+
|
|
160
|
+
test('example', async ({ page }) => {
|
|
161
|
+
const homePage = new HomePage(page);
|
|
162
|
+
await homePage.navigate('zh');
|
|
163
|
+
await expect(homePage.mainContent).toBeVisible();
|
|
164
|
+
});
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### 2. 使用语义化选择器
|
|
168
|
+
|
|
169
|
+
```typescript
|
|
170
|
+
// ✅ 好的做法
|
|
171
|
+
await page.getByRole('button', { name: '登录' });
|
|
172
|
+
await page.getByLabel('用户名');
|
|
173
|
+
await page.getByTestId('submit-button');
|
|
174
|
+
|
|
175
|
+
// ❌ 避免
|
|
176
|
+
await page.locator('.btn-primary');
|
|
177
|
+
await page.locator('#username');
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### 3. 等待元素而不是固定延迟
|
|
181
|
+
|
|
182
|
+
```typescript
|
|
183
|
+
// ✅ 好的做法
|
|
184
|
+
await page.waitForSelector('[data-testid="content"]');
|
|
185
|
+
await expect(page.locator('.result')).toBeVisible();
|
|
186
|
+
|
|
187
|
+
// ❌ 避免
|
|
188
|
+
await page.waitForTimeout(3000);
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### 4. 保持测试独立
|
|
192
|
+
|
|
193
|
+
```typescript
|
|
194
|
+
test.describe('Feature Tests', () => {
|
|
195
|
+
test.beforeEach(async ({ page }) => {
|
|
196
|
+
// 每个测试前重置状态
|
|
197
|
+
await page.goto('/');
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
test('test 1', async ({ page }) => {
|
|
201
|
+
// 这个测试不依赖其他测试
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
test('test 2', async ({ page }) => {
|
|
205
|
+
// 这个测试也不依赖其他测试
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
## 🎨 自定义配置
|
|
211
|
+
|
|
212
|
+
### 修改基础 URL
|
|
213
|
+
|
|
214
|
+
在 `playwright.config.ts` 中:
|
|
215
|
+
|
|
216
|
+
```typescript
|
|
217
|
+
use: {
|
|
218
|
+
baseURL: 'http://localhost:3000', // 修改为你的端口
|
|
219
|
+
}
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
或使用环境变量:
|
|
223
|
+
|
|
224
|
+
```bash
|
|
225
|
+
PLAYWRIGHT_BASE_URL=http://localhost:3000 npm run test:e2e
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
### 添加新的浏览器配置
|
|
229
|
+
|
|
230
|
+
在 `playwright.config.ts` 的 `projects` 数组中添加:
|
|
231
|
+
|
|
232
|
+
```typescript
|
|
233
|
+
{
|
|
234
|
+
name: 'Mobile Safari',
|
|
235
|
+
use: { ...devices['iPhone 12'] }
|
|
236
|
+
}
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
### 配置超时时间
|
|
240
|
+
|
|
241
|
+
```typescript
|
|
242
|
+
// 全局超时
|
|
243
|
+
test.setTimeout(60000); // 60 秒
|
|
244
|
+
|
|
245
|
+
// 单个测试
|
|
246
|
+
test('slow test', async ({ page }) => {
|
|
247
|
+
test.setTimeout(120000); // 120 秒
|
|
248
|
+
// ... 测试代码
|
|
249
|
+
});
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
## 📊 CI/CD 集成
|
|
253
|
+
|
|
254
|
+
项目已包含 GitHub Actions 配置文件(`.github/workflows/playwright.yml`)。
|
|
255
|
+
|
|
256
|
+
推送代码到 GitHub 后,测试会自动运行。
|
|
257
|
+
|
|
258
|
+
## 🆘 常见问题
|
|
259
|
+
|
|
260
|
+
### Q: 测试超时
|
|
261
|
+
|
|
262
|
+
**A:** 增加 `playwright.config.ts` 中的 `timeout` 设置,或检查开发服务器是否正常运行。
|
|
263
|
+
|
|
264
|
+
### Q: 找不到元素
|
|
265
|
+
|
|
266
|
+
**A:** 使用 Playwright Inspector 检查选择器:
|
|
267
|
+
|
|
268
|
+
```bash
|
|
269
|
+
npm run test:e2e:debug
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
### Q: 测试不稳定(flaky)
|
|
273
|
+
|
|
274
|
+
**A:**
|
|
275
|
+
|
|
276
|
+
- 使用自动等待而非固定延迟
|
|
277
|
+
- 使用 `waitForLoadState('networkidle')`
|
|
278
|
+
- 检查是否有竞态条件
|
|
279
|
+
|
|
280
|
+
### Q: 浏览器安装失败
|
|
281
|
+
|
|
282
|
+
**A:**
|
|
283
|
+
|
|
284
|
+
```bash
|
|
285
|
+
# 强制重新安装
|
|
286
|
+
npx playwright install --force
|
|
287
|
+
|
|
288
|
+
# Linux 上安装依赖
|
|
289
|
+
npx playwright install-deps
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
## 📖 更多资源
|
|
293
|
+
|
|
294
|
+
- [详细测试指南](./testing-guide.md)
|
|
295
|
+
- [设置完成文档](./setup-complete.md)
|
|
296
|
+
- [安装摘要](./installation-summary.md)
|
|
297
|
+
- [Playwright 官方文档](https://playwright.dev/)
|
|
298
|
+
- [Playwright 最佳实践](https://playwright.dev/docs/best-practices)
|
|
299
|
+
- [Playwright API 参考](https://playwright.dev/docs/api/class-playwright)
|
|
300
|
+
|
|
301
|
+
## ✅ 验证安装
|
|
302
|
+
|
|
303
|
+
运行以下命令验证一切正常:
|
|
304
|
+
|
|
305
|
+
```bash
|
|
306
|
+
# 1. 运行示例测试
|
|
307
|
+
npm run test:e2e -- e2e/example.spec.ts
|
|
308
|
+
|
|
309
|
+
# 2. 如果成功,尝试运行所有测试
|
|
310
|
+
npm run test:e2e
|
|
311
|
+
|
|
312
|
+
# 3. 查看报告
|
|
313
|
+
npm run test:e2e:report
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
如果所有测试都通过了,恭喜!你已经成功设置了 Playwright E2E 测试!🎉
|
|
317
|
+
|
|
318
|
+
## 🚀 下一步
|
|
319
|
+
|
|
320
|
+
1. 查看 `e2e/example.spec.ts` 了解基本测试结构
|
|
321
|
+
2. 阅读 [详细测试指南](./testing-guide.md) 了解更多信息
|
|
322
|
+
3. 使用 `npm run test:e2e:ui` 以交互方式探索测试
|
|
323
|
+
4. 根据你的应用需求编写自定义测试
|
|
324
|
+
|
|
325
|
+
祝测试愉快!
|