commit 120ae7d3f9e60891d9b0063798f3eb916fb4b7da Author: zycha Date: Thu Apr 30 17:11:08 2026 +0800 first commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..45e53d8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/** +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..d5cc1a5 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,57 @@ +{ + "name": "playwright-demo", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "playwright-demo", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "playwright": "^1.58.2" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/playwright": { + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.2.tgz", + "integrity": "sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==", + "dependencies": { + "playwright-core": "1.58.2" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.2.tgz", + "integrity": "sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..d011bbc --- /dev/null +++ b/package.json @@ -0,0 +1,15 @@ +{ + "name": "playwright-demo", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "playwright": "^1.58.2" + } +} diff --git a/state.json b/state.json new file mode 100644 index 0000000..a324ceb --- /dev/null +++ b/state.json @@ -0,0 +1,305 @@ +{ + "cookies": [ + { + "name": "HWWAFSESTIME", + "value": "1774419940130", + "domain": "gitcode.com", + "path": "/", + "expires": -1, + "httpOnly": false, + "secure": false, + "sameSite": "Lax" + }, + { + "name": "HWWAFSESID", + "value": "f39e37c842c521d4de", + "domain": "gitcode.com", + "path": "/", + "expires": -1, + "httpOnly": false, + "secure": false, + "sameSite": "Lax" + }, + { + "name": "uuid_tt_dd", + "value": "10_37463587150-1774419940380-162871", + "domain": ".gitcode.com", + "path": "/", + "expires": 1808979939.061817, + "httpOnly": false, + "secure": true, + "sameSite": "Lax" + }, + { + "name": "c_gitcode_fref", + "value": "-", + "domain": ".gitcode.com", + "path": "/", + "expires": 1777012060.090405, + "httpOnly": false, + "secure": true, + "sameSite": "Lax" + }, + { + "name": "c_gitcode_um", + "value": "-", + "domain": ".gitcode.com", + "path": "/", + "expires": 1777012060.090433, + "httpOnly": false, + "secure": true, + "sameSite": "Lax" + }, + { + "name": "gitcode_first_time", + "value": "2026-03-25%2014:25:42", + "domain": ".gitcode.com", + "path": "/", + "expires": 1808979942.323148, + "httpOnly": false, + "secure": false, + "sameSite": "Lax" + }, + { + "name": "gitcode_theme", + "value": "white", + "domain": ".gitcode.com", + "path": "/", + "expires": 1805955942, + "httpOnly": false, + "secure": true, + "sameSite": "Lax" + }, + { + "name": "_fr_ssid", + "value": "ab56d024f13e4273b7ff867394c489d1", + "domain": ".gitcode.com", + "path": "/", + "expires": 1774421861, + "httpOnly": false, + "secure": false, + "sameSite": "Lax" + }, + { + "name": "_frid", + "value": "7966419d19a240bd83fe93a73245eb86", + "domain": ".gitcode.com", + "path": "/", + "expires": 1805955942, + "httpOnly": false, + "secure": false, + "sameSite": "Lax" + }, + { + "name": "HWWAFSESTIME", + "value": "1774419941996", + "domain": "web-api.gitcode.com", + "path": "/", + "expires": -1, + "httpOnly": false, + "secure": false, + "sameSite": "Lax" + }, + { + "name": "HWWAFSESID", + "value": "277f2214dd1fa399a20", + "domain": "web-api.gitcode.com", + "path": "/", + "expires": -1, + "httpOnly": false, + "secure": false, + "sameSite": "Lax" + }, + { + "name": "BENSESSCC_TAG", + "value": "10_37463587150-1774419940380-162871", + "domain": "web-api.gitcode.com", + "path": "/", + "expires": -1, + "httpOnly": false, + "secure": false, + "sameSite": "Lax" + }, + { + "name": "pageSize", + "value": "{%22global-pager%22:10}", + "domain": ".gitcode.com", + "path": "/", + "expires": -1, + "httpOnly": false, + "secure": false, + "sameSite": "Lax" + }, + { + "name": "HMACCOUNT_BFESS", + "value": "A48891AE78CC51F7", + "domain": ".hm.baidu.com", + "path": "/", + "expires": 1808979943.943573, + "httpOnly": false, + "secure": true, + "sameSite": "None" + }, + { + "name": "Hm_lvt_62047c952451105d57bab2c4af9ce85b", + "value": "1774419944", + "domain": ".gitcode.com", + "path": "/", + "expires": 1805956064, + "httpOnly": false, + "secure": false, + "sameSite": "Lax" + }, + { + "name": "HMACCOUNT", + "value": "A48891AE78CC51F7", + "domain": ".gitcode.com", + "path": "/", + "expires": -1, + "httpOnly": false, + "secure": false, + "sameSite": "Lax" + }, + { + "name": "UnsafeGitCodeUserName", + "value": "fzxlzy", + "domain": ".gitcode.com", + "path": "/", + "expires": 1774420664.902348, + "httpOnly": false, + "secure": true, + "sameSite": "Lax" + }, + { + "name": "c_gitcode_rid", + "value": "1774420061408_829937", + "domain": ".gitcode.com", + "path": "/", + "expires": 1777012060.090301, + "httpOnly": false, + "secure": true, + "sameSite": "Lax" + }, + { + "name": "gitcode_wechat_from", + "value": "", + "domain": ".gitcode.com", + "path": "/", + "expires": 1774420074.826777, + "httpOnly": true, + "secure": true, + "sameSite": "Lax" + }, + { + "name": "GITCODE_ACCESS_TOKEN", + "value": "eyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiI2NzllMjA3OWFiYjZiNDcxNjE4YzBmNzQiLCJzdWIiOiJmenhsenkiLCJhdXRob3JpdGllcyI6W10sIm9iamVjdElkIjoiNjljMzgwNjE3OGExN2I0MTZmODhlZDc1IiwiaWF0IjoxNzc0NDIwMDY1LCJleHAiOjE3NzQ1MDY0NjV9.DxMWFpOgf6xY6ykCNWf1WYzpBIkzlM1rjm1mX4jC5QDQCUfnUJfUoGcn6gIH2sJHNs5eElOUd1hlQSfEm-fOag", + "domain": ".gitcode.com", + "path": "/", + "expires": 1789972064.598955, + "httpOnly": true, + "secure": true, + "sameSite": "Lax" + }, + { + "name": "GITCODE_REFRESH_TOKEN", + "value": "eyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiI2NzllMjA3OWFiYjZiNDcxNjE4YzBmNzQiLCJzdWIiOiJmenhsenkiLCJhdXRob3JpdGllcyI6W10sIm9iamVjdElkIjoiNjljMzgwNjE3OGExN2I0MTZmODhlZDc1IiwiaWF0IjoxNzc0NDIwMDY1LCJleHAiOjE3Nzk2MDQwNjV9.CRsXs5tgO48SNxLz5mSFZYv86MkZ9R-heDnFKmCDpla37gmhLXRTUl01ryaoJtL-Qo8FWEXyErzCN5D4jtFhrw", + "domain": ".gitcode.com", + "path": "/", + "expires": 1789972064.598989, + "httpOnly": true, + "secure": true, + "sameSite": "Lax" + }, + { + "name": "GitCodeUserName", + "value": "fzxlzy", + "domain": ".gitcode.com", + "path": "/", + "expires": 1789972064.9033, + "httpOnly": true, + "secure": true, + "sameSite": "Lax" + }, + { + "name": "Hm_lpvt_62047c952451105d57bab2c4af9ce85b", + "value": "1774420065", + "domain": ".gitcode.com", + "path": "/", + "expires": -1, + "httpOnly": false, + "secure": false, + "sameSite": "Lax" + } + ], + "origins": [ + { + "origin": "https://gitcode.com", + "localStorage": [ + { + "name": "user-custom-theme-data", + "value": "{\"devui-global-bg\":\"var(--theme-global-bg)\",\"devui-glass-morphism-bg\":\"rgba(245, 246, 248, 0.9)\",\"devui-global-bg-normal\":\"#ffffff\",\"devui-base-bg\":\"var(--theme-default-bg)\",\"devui-base-bg-dark\":\"#252b3a\",\"devui-brand\":\"var(--theme-ui-brand)\",\"devui-brand-foil\":\"var(--theme-brand-foil)\",\"devui-brand-hover\":\"#7693f5\",\"devui-brand-active\":\"#526ecc\",\"devui-brand-active-focus\":\"#344899\",\"devui-contrast\":\"var(--theme-contrast)\",\"devui-text\":\"var(--theme-text)\",\"devui-text-weak\":\"var(--theme-aide-text)\",\"devui-aide-text\":\"var(--theme-aide-text)\",\"devui-aide-text-hover\":\"#252b3a\",\"devui-aide-text-stress\":\"#575d6c\",\"devui-placeholder\":\"var(--theme-placeholder)\",\"devui-light-text\":\"var(--theme-light-text)\",\"devui-dark-text\":\"#252b3a\",\"devui-link\":\"var(--theme-link)\",\"devui-link-active\":\"#526ecc\",\"devui-link-light\":\"var(--theme-link-light)\",\"devui-link-light-active\":\"#beccfa\",\"devui-line\":\"var(--theme-line-split)\",\"devui-dividing-line\":\"var(--theme-dividing-line)\",\"devui-block\":\"var(--theme-block)\",\"devui-area\":\"var(--theme-area)\",\"devui-danger\":\"var(--theme-danger)\",\"devui-warning\":\"var(--theme-warning)\",\"devui-waiting\":\"#beccfa\",\"devui-success\":\"var(--theme-success)\",\"devui-info\":\"var(--theme-info)\",\"devui-initial\":\"#e9edfa\",\"devui-unavailable\":\"#f5f5f5\",\"devui-shadow\":\"var(--theme-shadow)\",\"devui-light-shadow\":\"rgba(37, 43, 58, 0.12)\",\"devui-connected-overlay-shadow\":\"rgba(37, 43, 58, 0.16)\",\"devui-feedback-overlay-shadow\":\"rgba(37, 43, 58, 0.2)\",\"devui-icon-text\":\"var(--theme-aide-text)\",\"devui-icon-bg\":\"var(--theme-icon-bg)\",\"devui-icon-fill\":\"var(--theme-icon-fill)\",\"devui-icon-fill-weak\":\"var(--theme-icon-fill-weak)\",\"devui-icon-fill-hover\":\"var(--theme-icon-fill-hover)\",\"devui-icon-fill-active\":\"#252b3a\",\"devui-icon-fill-active-hover\":\"#252b3a\",\"devui-shape-icon-fill\":\"var(--theme-shape-icon-fill)\",\"devui-shape-icon-fill-active\":\"#babbc0\",\"devui-shape-icon-fill-hover\":\"var(--theme-shape-icon-fill-hover)\",\"devui-shape-icon-fill-disabled\":\"var(--theme-shape-icon-fill-disabled)\",\"devui-form-control-line\":\"var(--theme-line-border)\",\"devui-form-control-bg\":\"var(--theme-default-bg)\",\"devui-form-control-line-hover\":\"var(--theme-form-control-line-hover)\",\"devui-form-control-line-active\":\"var(--theme-form-control-line-active)\",\"devui-form-control-interactive-outline\":\"rgba(94,124,224,0.08)\",\"devui-form-control-line-active-hover\":\"#344899\",\"devui-list-item-active-bg\":\"var(--theme-overlay-hover-bg)\",\"devui-list-item-active-text\":\"var(--theme-list-item-active-text)\",\"devui-list-item-active-hover-bg\":\"#f2f5fc\",\"devui-list-item-hover-bg\":\"var(--theme-overlay-hover-bg)\",\"devui-list-item-hover-text\":\"var(--theme-list-item-hover-text)\",\"devui-list-item-selected-bg\":\"var(--theme-list-item-selected-bg)\",\"devui-list-item-strip-bg\":\"#f2f5fc\",\"devui-disabled-bg\":\"var(--theme-disabled-bg)\",\"devui-disabled-line\":\"var(--theme-disabled-line)\",\"devui-disabled-text\":\"var(--theme-disable-text)\",\"devui-primary-disabled\":\"var(--theme-btn-primary-disabled)\",\"devui-icon-fill-active-disabled\":\"#beccfa\",\"devui-label-bg\":\"var(--theme-label-bg)\",\"devui-connected-overlay-bg\":\"var(--theme-default-bg)\",\"devui-connected-overlay-line\":\"#526ecc\",\"devui-fullscreen-overlay-bg\":\"var(--theme-fullscreen-overlay-bg)\",\"devui-feedback-overlay-bg\":\"var(--theme-feedback-overlay-bg)\",\"devui-feedback-overlay-text\":\"#dfe1e6\",\"devui-embed-search-bg\":\"#f2f2f3\",\"devui-embed-search-bg-hover\":\"#eef0f5\",\"devui-float-block-shadow\":\"rgba(94, 124, 224, 0.3)\",\"devui-highlight-overlay\":\"rgba(255, 255, 255, 0.8)\",\"devui-range-item-hover-bg\":\"var(--theme-range-item-hover-bg)\",\"devui-primary\":\"var(--theme-btn-primary)\",\"devui-primary-hover\":\"var(--theme-btn-primary-hover)\",\"devui-primary-active\":\"var(--theme-btn-primary-active)\",\"devui-contrast-hover\":\"var(--theme-contrast-hover)\",\"devui-contrast-active\":\"var(--theme-contrast-active)\",\"devui-danger-line\":\"var(--theme-danger-line)\",\"devui-danger-bg\":\"var(--theme-danger-bg)\",\"devui-warning-line\":\"var(--theme-warning-line)\",\"devui-warning-bg\":\"var(--theme-warning-bg)\",\"devui-info-line\":\"var(--theme-info-line)\",\"devui-info-bg\":\"var(--theme-info-bg)\",\"devui-success-line\":\"var(--theme-success-line)\",\"devui-success-bg\":\"var(--theme-success-bg)\",\"devui-primary-line\":\"#5e7ce0\",\"devui-primary-bg\":\"#f2f5fc\",\"devui-default-line\":\"#5e7ce0\",\"devui-default-bg\":\"var(--theme-default-ui-bg)\",\"devui-font-size\":\"14px\",\"devui-font-size-card-title\":\"16px\",\"devui-font-size-page-title\":\"16px\",\"devui-font-size-modal-title\":\"18px\",\"devui-font-size-price\":\"20px\",\"devui-font-size-data-overview\":\"24px\",\"devui-font-size-icon\":\"16px\",\"devui-font-size-sm\":\"12px\",\"devui-font-size-md\":\"14px\",\"devui-font-size-lg\":\"14px\",\"devui-font-title-weight\":\"bold\",\"devui-font-content-weight\":\"normal\",\"devui-line-height-base\":\"1.5\",\"devui-border-radius\":\"4px\",\"devui-border-radius-feedback\":\"4px\",\"devui-border-radius-card\":\"4px\",\"devui-border-radius-full\":\"100px\",\"devui-shadow-length-base\":\"0 2px 6px 0\",\"devui-shadow-length-slide-left\":\"-2px 0 8px 0\",\"devui-shadow-length-slide-right\":\"2px 0 8px 0\",\"devui-shadow-length-connected-overlay\":\"0 2px 12px 0\",\"devui-shadow-length-hover\":\"0 4px 16px 0\",\"devui-shadow-length-feedback-overlay\":\"0 8px 16px 0\",\"devui-shadow-length-fullscreen-overlay\":\"0 10px 24px 0\",\"devui-animation-ease-in-smooth\":\"cubic-bezier(0.645, 0.045, 0.355, 1)\",\"devui-animation-duration-slow\":\"300ms\",\"devui-animation-duration-base\":\"200ms\",\"devui-animation-duration-fast\":\"100ms\",\"devui-animation-ease-in\":\"cubic-bezier(0.5, 0, 0.84, 0.25)\",\"devui-animation-ease-out\":\"cubic-bezier(0.16, 0.75, 0.5, 1)\",\"devui-animation-ease-in-out\":\"cubic-bezier(0.5, 0.05, 0.5, 0.95)\",\"devui-animation-ease-in-out-smooth\":\"cubic-bezier(0.645, 0.045, 0.355, 1)\",\"devui-animation-linear\":\"cubic-bezier(0, 0, 1, 1)\",\"devui-z-index-full-page-overlay\":\"1080\",\"devui-z-index-pop-up\":\"1060\",\"devui-z-index-dropdown\":1070,\"devui-z-index-modal\":\"1050\",\"devui-z-index-drawer\":\"1040\",\"devui-z-index-framework\":\"1000\",\"devui-menu-item\":\"var(--theme-menu-item)\",\"devui-menu-item-sub\":\"#6C6C6C\",\"devui-menu-item-hover\":\"var(--theme-menu-item-hover)\",\"devui-menu-disabled\":\"#919191\",\"devui-icon-active-color\":\"#ffffff\",\"devui-gray-form-control-bg\":\"var(--theme-table-header-bg)\",\"devui-gray-form-control-hover-bg\":\"var(--theme-table-body-bg-hover)\",\"devui-icon-disabled-color\":\"var(--theme-icon-disabled-color)\",\"devui-btn-common-bg\":\"var(--theme-btn-default)\",\"devui-btn-common-bg-hover\":\"var(--theme-btn-default-hover)\",\"devui-btn-common-border-color\":\"var(--theme-btn-default-border)\",\"devui-btn-common-border-color-hover\":\"var(--devui-btn-common-border-color-hover)\",\"devui-btn-common-border-disabled\":\"var(--theme-btn-default-border-disabled)\",\"devui-link-disabled\":\"var(--theme-link-disabled)\",\"devui-icon-hover-bg\":\"var(--theme-icon-hover)\",\"devui-icon-active-bg\":\"var(--theme-icon-active)\",\"devui-connected-overlay-b\":\"var(--theme-overlay-bg)\",\"devui-danger-text\":\"var(--theme-danger-text)\",\"devui-warning-text\":\"var(--theme-warning-text)\",\"devui-success-text\":\"var(--theme-success-text)\",\"devui-nav-expand-bg\":\"#fbfbfc\",\"devui-btn-common-color-hover\":\"#252B3A\",\"devui-btn-common-bg-active\":\"#BDBDBD\",\"devui-btn-common-color-active\":\"#252B3A\",\"devui-btn-common-border-color-active\":\"transparent\"}" + }, + { + "name": "validator_email", + "value": "valid" + }, + { + "name": "userInfo", + "value": "{\"access_token\":\"eyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiI2NzllMjA3OWFiYjZiNDcxNjE4YzBmNzQiLCJzdWIiOiJmenhsenkiLCJhdXRob3JpdGllcyI6W10sIm9iamVjdElkIjoiNjljMzgwNjE3OGExN2I0MTZmODhlZDc1IiwiaWF0IjoxNzc0NDIwMDY1LCJleHAiOjE3NzQ1MDY0NjV9.DxMWFpOgf6xY6ykCNWf1WYzpBIkzlM1rjm1mX4jC5QDQCUfnUJfUoGcn6gIH2sJHNs5eElOUd1hlQSfEm-fOag\",\"refresh_token\":\"eyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiI2NzllMjA3OWFiYjZiNDcxNjE4YzBmNzQiLCJzdWIiOiJmenhsenkiLCJhdXRob3JpdGllcyI6W10sIm9iamVjdElkIjoiNjljMzgwNjE3OGExN2I0MTZmODhlZDc1IiwiaWF0IjoxNzc0NDIwMDY1LCJleHAiOjE3Nzk2MDQwNjV9.CRsXs5tgO48SNxLz5mSFZYv86MkZ9R-heDnFKmCDpla37gmhLXRTUl01ryaoJtL-Qo8FWEXyErzCN5D4jtFhrw\",\"xauth_token\":\"\",\"id\":\"679e2079abb6b471618c0f74\",\"object_id\":\"679e2079abb6b471618c0f74\",\"username\":\"fzxlzy\",\"nickname\":\"哇丶\",\"avatar\":\"https://cdn-img.gitcode.com/ab/ab/763aba9bdd0022303702c4539fcdc6908e865b2da78b995d5f0c1619b8b058fe.png\",\"email\":\"810528574@qq.com\",\"domain_id\":\"d90bdf01e8264138a87a92cc82237ba4\",\"arts_id\":3943132,\"iam_id\":\"b56de14a53a74479984b00cc040466bf\",\"login_id\":\"69c3806178a17b416f88ed75\",\"status\":0,\"audit_status\":10,\"has_password\":true,\"create_time\":\"2025-02-01T13:24:09.000+00:00\",\"mfa_enable\":false,\"user_status_enum\":\"SUCCESS\",\"is_new\":false,\"mobile\":\"156****9816\",\"score\":1211,\"growth\":113,\"level\":3,\"next_level\":0,\"need_tips\":false,\"style_tips\":\"prompt_red_dot\"}" + }, + { + "name": "xauth_token", + "value": "" + }, + { + "name": "quickAppLoginReportParams", + "value": "{}" + }, + { + "name": "refresh_token", + "value": "eyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiI2NzllMjA3OWFiYjZiNDcxNjE4YzBmNzQiLCJzdWIiOiJmenhsenkiLCJhdXRob3JpdGllcyI6W10sIm9iamVjdElkIjoiNjljMzgwNjE3OGExN2I0MTZmODhlZDc1IiwiaWF0IjoxNzc0NDIwMDY1LCJleHAiOjE3Nzk2MDQwNjV9.CRsXs5tgO48SNxLz5mSFZYv86MkZ9R-heDnFKmCDpla37gmhLXRTUl01ryaoJtL-Qo8FWEXyErzCN5D4jtFhrw" + }, + { + "name": "user-custom-theme", + "value": "gitcode-theme" + }, + { + "name": "UDESK_on_force_chat", + "value": "" + }, + { + "name": "asideDefaultWidth", + "value": "240" + }, + { + "name": "Hm_lvt_62047c952451105d57bab2c4af9ce85b", + "value": "1805956064634|1774419944" + }, + { + "name": "UDESK_on_go_chat", + "value": "" + }, + { + "name": "orgGuideStatus", + "value": "new" + }, + { + "name": "asideSetShowLittle", + "value": "false" + }, + { + "name": "access_token", + "value": "eyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiI2NzllMjA3OWFiYjZiNDcxNjE4YzBmNzQiLCJzdWIiOiJmenhsenkiLCJhdXRob3JpdGllcyI6W10sIm9iamVjdElkIjoiNjljMzgwNjE3OGExN2I0MTZmODhlZDc1IiwiaWF0IjoxNzc0NDIwMDY1LCJleHAiOjE3NzQ1MDY0NjV9.DxMWFpOgf6xY6ykCNWf1WYzpBIkzlM1rjm1mX4jC5QDQCUfnUJfUoGcn6gIH2sJHNs5eElOUd1hlQSfEm-fOag" + }, + { + "name": "debug", + "value": "undefined" + }, + { + "name": "lastLoginMethod", + "value": "password" + } + ] + } + ] +} \ No newline at end of file diff --git a/test.js b/test.js new file mode 100644 index 0000000..02caf0d --- /dev/null +++ b/test.js @@ -0,0 +1,213 @@ +const { chromium } = require('playwright'); +const fs = require('fs'); + +(async () => { + const browser = await chromium.launch({ + headless: true // 👈 Windows建议先开界面调试 + }); + + + // 👇 关键就在这里 + let context = null + if (fs.existsSync('state.json')) { + console.log('✅ state.json 存在'); + context = await browser.newContext({ + storageState: 'state.json', + locale: "zh-CN" + }); + } else { + console.log('❌ state.json 不存在'); + context = await browser.newContext({ + locale: "zh-CN" + }) + } + const page = await context.newPage(); + await page.goto('https://gitcode.com/setting/points'); + await page.waitForTimeout(5000); + const isLogin = await page.locator('.g-user-avatar').isVisible(); + if (isLogin) { + console.log('✅ 已登录'); + runTasks(page) + } else { + console.log('❌ 未登录'); + await page.getByText('密码登录').click(); + await page.getByPlaceholder('请填写手机号/用户名/邮箱').fill('15623979816'); + await page.getByPlaceholder('请填写密码').fill('Zzy1995115'); + await page.getByText('登录或注册完成代表你同意').click(); + await page.getByText('我同意将账号、组织、仓库等信息提供给AtomGit进行 ').click(); + await page.locator('button:has-text("登 录")').click(); + await page.waitForTimeout(1000); + await context.storageState({ path: 'state.json' }); + runTasks(page) + } +})(); + +async function runTasks(page) { + console.log('✅ 开始寻找每日任务'); + const tasks = await page.locator('.novice-task-item-box').all(); + console.log('✅ 共找到' + tasks.length + '个每日任务'); + for (const task of tasks) { + const title = await task.locator('.task-card-title__label-text').innerText(); + if (title.includes("更新项目")) { + const taskStat = await taskIsCompleted(task) + if (!taskStat) { + await doUpdateProject(page) + } + } else if (title.includes("每日分享")) { + const taskStat = await taskIsCompleted(task) + if (!taskStat) { + await dailyShare(task, page) + } + } else if (title.includes("每日签到")) { + const taskStat = await taskIsCompleted(task) + if (!taskStat) { + await dailyCheckInTask(task, page) + } + } else if (title.includes("查看热门")) { + const taskStat = await taskIsCompleted(task) + if (!taskStat) { + await dailyViewTrending(task, page) + } + } else if (title.includes("每日Star")) { + const taskStat = await taskIsCompleted(task) + if (!taskStat) { + await dailyViewStar(task, page) + } + } + } + await page.waitForTimeout(2000); + await page.reload({ waitUntil: "domcontentloaded" }); + await page.waitForTimeout(2000); + await page.locator('button.pickup-btn:has-text("一键领取")').click(); + +} + +async function taskIsCompleted(task) { + const taskEnd = await task.locator('button:has-text("领取奖励")').count() > 0 + if (taskEnd) { + task.locator('button:has-text("领取奖励")').click() + return true + } + const isCompleted = await task.locator('.completed').count() > 0 + if (isCompleted) { + console.log('✅ 已完成,跳过'); + return true + } + return false +} + +async function doUpdateProject(page) { + console.log('👉 执行项目更新'); + const context = page.context(); + const newPage = await context.newPage(); + await newPage.goto('https://gitcode.com/fzxlzy/test/edit/main/testjpgp11'); + // 你可以自己补逻辑 + const frame = newPage.frameLocator('#codeartside'); + + // 1️⃣ 点击编辑器 + await frame.locator('.monaco-editor').click({ + position: { x: 200, y: 100 } + }); + + // 2️⃣ 把光标移动到末尾(关键!) + await newPage.keyboard.press('Control+End'); + + // 3️⃣ 追加内容 + await newPage.keyboard.type(`\n测试图片生成功能 +11 +22 +33`, { delay: 50 }); + // 等按钮出现 + await newPage.locator('button:has-text("提交修改")').click(); + await page.waitForTimeout(1000); + const submitButton = newPage.locator('button:has-text("提交修改")').nth(1); // 0 是页面按钮,1 是弹框按钮 + await submitButton.click(); + await newPage.waitForTimeout(500); + await newPage.close(); +} + +async function dailyShare(task, page) { + // 等待新页面打开 + const [newPage] = await Promise.all([ + page.context().waitForEvent('page'), // 等待新页面事件 + task.locator('.toComplete').click() + ]); + + // 点击第一个 + await newPage.waitForTimeout(1000); + await newPage.locator('.immediately-invite-btn').nth(0).click(); + await newPage.waitForTimeout(2000); + await newPage.close(); + +} + +async function dailyCheckInTask(task, page) { + await page.waitForTimeout(1000); + task.locator('button:has-text("签到")').click() + await page.waitForTimeout(1000); +} + +async function dailyViewTrending(task, page) { + // 等待新页面打开 + const [newPage] = await Promise.all([ + page.context().waitForEvent('page'), // 等待新页面事件 + task.locator('.toComplete').click() + ]) + await newPage.waitForSelector('.hot-selection .recommend-card'); + // 获取第一个热门项目卡片 + const firstHotProjectCard = await newPage.$('.hot-selection .recommend-card'); + await newPage.waitForTimeout(1000); + // 点击它 + const [newPage2] = await Promise.all([ + newPage.context().waitForEvent('page'), // 等待新页面事件 + await firstHotProjectCard.click() + ]) + await newPage2.waitForTimeout(2000); + newPage2.close() + newPage.close() +} + +async function dailyViewStar(task, page) { + // 等待新页面打开 + const [newPage] = await Promise.all([ + page.context().waitForEvent('page'), // 等待新页面事件 + task.locator('.toComplete').click() + ]) + // 等待元素出现在 DOM(不要用 visible,容易超时) + await newPage.waitForSelector('.hot-selection-list a.recommend-card', { state: 'attached' }); + const cards = newPage.locator('.hot-selection-list a.recommend-card'); + const count = await cards.count(); + + console.log("热门项目数量:", count); + + if (count === 0) { + throw new Error("没有找到热门项目"); + } + await newPage.waitForTimeout(2000); + // 随机选一个 + const index = Math.floor(Math.random() * count); + console.log("随机选择 index:", index); + // 点击并捕获新 tab + const [newPage2] = await Promise.all([ + newPage.context().waitForEvent('page'), + cards.nth(index).click() + ]); + // 等待 Star 按钮出现 + const starBtn = newPage2.locator('#repo-header-tab .status-btn').filter({ hasText: 'Star' }).nth(1); + await newPage2.waitForTimeout(2000); + await starBtn.waitFor({ state: 'visible' }); + // 判断是否已 Starred + const text = await starBtn.innerText(); + await newPage2.waitForTimeout(2000); + if (text.includes('Starred')) { + // 已经 Starred -> 先取消 + await starBtn.click(); + + // 等待变回 Star + await newPage2.waitForTimeout(500); + } + await starBtn.click(); + await newPage2.waitForTimeout(2000); + newPage2.close() + newPage.close() +} \ No newline at end of file