{"record":{"id":"8ad70ec7059d4b6b","repo":"TryGhost/Ghost","slug":"error-going-to-signin-page-no-response","errorCode":null,"errorMessage":"Error going to signin page (no response)","messagePattern":"Error going to signin page \\(no response\\)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"e2e/helpers/pages/admin/login-page.ts","lineNumber":42,"sourceCode":"        await this.passwordField.fill(password);\n        await this.signInButton.click();\n    }\n\n    async requestPasswordReset(email: string) {\n        await this.emailAddressField.waitFor({state: 'visible'});\n        await this.emailAddressField.fill(email);\n        await this.forgotButton.click();\n    }\n\n    async logout() {\n        await this.page.goto('/ghost/#/signout');\n        await this.signInButton.waitFor({state: 'visible'});\n    }\n\n    async waitForLoginPageAfterUserCreated(): Promise<void> {\n        const response = await this.goto();\n        if (!response) {\n            throw new Error('Error going to signin page (no response)');\n        }\n        if (!response.ok) {\n            throw new Error(`Error going to signin page (${response.status})`);\n        }\n    }\n}\n","sourceCodeStart":24,"sourceCodeEnd":49,"githubUrl":"https://github.com/TryGhost/Ghost/blob/47d8b0e2ad2fd4757d3bc45f46c3ac165ff8a1fe/e2e/helpers/pages/admin/login-page.ts#L24-L49","documentation":"waitForLoginPageAfterUserCreated() navigates to the signin page via goto() and treats a falsy return (no response object) as a hard failure. Playwright's page.goto returns null when navigation is interrupted or a network error occurs before any response arrives — e.g. the server is unreachable, DNS fails, or a navigation was cancelled by a redirect/timeout.","triggerScenarios":"Ghost container not yet reachable when the test navigates. baseURL DNS/routing wrong so no response is received. Navigation cancelled by a client-side redirect before response. Network condition caused request to never complete with a response.","commonSituations":"Test runs before waitForReady() completed; baseURL fixture misconfigured; Ghost crashed between setup and this step; flaky local DNS.","solutions":["Ensure the Ghost instance is healthy and waitForReady() passed before this navigation.","Use page.goto(url, {waitUntil: 'domcontentloaded'}) and wrap goto in a retry with backoff for transient network errors.","Verify baseURL resolves to the gateway port; run the URL manually."],"exampleFix":"// before\nconst response = await this.goto();\nif (!response) throw new Error('Error going to signin page (no response)');\n\n// after\nlet response = null;\nfor (let i = 0; i < 3 && !response; i++) {\n    try { response = await this.goto(); } catch {}\n    if (!response) await this.page.waitForTimeout(1000);\n}\nif (!response) throw new Error('Error going to signin page (no response after retries)');","handlingStrategy":"retry","validationCode":"async function reachable(page: Page, url: string): Promise<boolean> {\n    try {\n        const r = await page.goto(url, {waitUntil: 'domcontentloaded', timeout: 5000});\n        return !!r;\n    } catch { return false; }\n}","typeGuard":null,"tryCatchPattern":"let response = null;\nfor (let i = 0; i < 3 && !response; i++) {\n    try { response = await this.goto(); } catch { /* keep retrying */ }\n    if (!response) await this.page.waitForTimeout(1000);\n}\nif (!response) throw new Error('Error going to signin page (no response)');","preventionTips":["Ensure Ghost is healthy (waitForReady) before navigating to the admin.","Use waitUntil: 'domcontentloaded' and retry transient network failures.","Verify baseURL resolves to the gateway port."],"tags":["playwright","e2e","navigation","network","flaky"],"backgroundTag":null,"analyzedSha":"47d8b0e2ad2fd4757d3bc45f46c3ac165ff8a1fe","analyzedAt":"2026-08-13T01:25:26.651Z","schemaVersion":2},"datasetVersion":"2026-08-13T04:17:16.726Z"}