4643
This commit is contained in:
16
e2e/.vscode/tasks.json
vendored
Normal file
16
e2e/.vscode/tasks.json
vendored
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"version": "2.0.0",
|
||||||
|
"tasks": [
|
||||||
|
{
|
||||||
|
"type": "npm",
|
||||||
|
"script": "open",
|
||||||
|
"problemMatcher": [],
|
||||||
|
"label": "npm: open",
|
||||||
|
"detail": "./node_modules/.bin/cypress open",
|
||||||
|
"group": {
|
||||||
|
"kind": "build",
|
||||||
|
"isDefault": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -1,4 +1,76 @@
|
|||||||
|
|
||||||
|
Password breach warning error mitigation:
|
||||||
|
|
||||||
|
To suppress Chrome's "password exposed in breach" warning during Cypress tests with intentional weak test passwords, **disable Chrome's password leak detection features via browser launch flags**. This is the cleanest, most reliable solution for test environments.
|
||||||
|
|
||||||
|
### ✅ Recommended Fix (Cypress Config)
|
||||||
|
Add this to your Cypress configuration to disable the relevant Chrome features:
|
||||||
|
|
||||||
|
#### For Cypress v10+ (`cypress.config.js`):
|
||||||
|
```javascript
|
||||||
|
const { defineConfig } = require('cypress');
|
||||||
|
|
||||||
|
module.exports = defineConfig({
|
||||||
|
e2e: {
|
||||||
|
setupNodeEvents(on, config) {
|
||||||
|
on('before:browser:launch', (browser, launchOptions) => {
|
||||||
|
if (browser.name === 'chrome') {
|
||||||
|
// Disable password breach warnings + related features
|
||||||
|
launchOptions.args.push(
|
||||||
|
'--disable-features=PasswordLeakDetection,PasswordManagerLeakDetection,PasswordCheck,InsecureCredentialsWarning'
|
||||||
|
);
|
||||||
|
// Optional: Disable password manager entirely if warnings persist
|
||||||
|
// launchOptions.args.push('--disable-blink-features=PasswordManager');
|
||||||
|
}
|
||||||
|
return launchOptions;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
#### For Cypress ≤ v9 (`cypress/plugins/index.js`):
|
||||||
|
```javascript
|
||||||
|
module.exports = (on, config) => {
|
||||||
|
on('before:browser:launch', (browser, launchOptions) => {
|
||||||
|
if (browser.name === 'chrome') {
|
||||||
|
launchOptions.args.push(
|
||||||
|
'--disable-features=PasswordLeakDetection,PasswordManagerLeakDetection,PasswordCheck,InsecureCredentialsWarning'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return launchOptions;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
### 🔑 Why this works:
|
||||||
|
- `PasswordLeakDetection` / `PasswordManagerLeakDetection`: Blocks breach-checking logic
|
||||||
|
- `PasswordCheck`: Disables Chrome's "Password Checkup" feature
|
||||||
|
- `InsecureCredentialsWarning`: Suppresses "insecure password" UI warnings (critical for obvious passwords like "Accounting")
|
||||||
|
- Flags are **non-intrusive**—they don’t alter your app’s behavior or test logic
|
||||||
|
- Works in both headed and headless Chrome modes
|
||||||
|
- Zero maintenance vs. fragile DOM-interaction workarounds
|
||||||
|
|
||||||
|
### ⚠️ Important Notes:
|
||||||
|
1. **Test passwords remain intentionally weak**—this solution *only* silences Chrome's UI warning.
|
||||||
|
🔒 *Never use these passwords outside isolated test environments.*
|
||||||
|
2. If warnings persist:
|
||||||
|
- Update Chrome flags based on your Chrome version (check `chrome://version` → "Command Line")
|
||||||
|
- Temporarily add `--disable-blink-features=PasswordManager` (disables entire password manager; use only if tests don’t rely on autofill)
|
||||||
|
3. **Do NOT**:
|
||||||
|
- Try clicking away the warning in tests (flaky, slows tests, fragile selector)
|
||||||
|
- Disable Safe Browsing globally (`--safebrowsing-disable-auto-update`)—overly broad security risk
|
||||||
|
- Modify system Chrome settings (Cypress uses isolated profiles)
|
||||||
|
|
||||||
|
### 💡 Pro Tip:
|
||||||
|
For future-proofing, consider generating **unique strong passwords per test run** (e.g., `Accounting_${Date.now()}`) and resetting them between tests. This avoids breach warnings *and* aligns with security best practices—but the flag solution above is perfect for your current constraint of fixed sample passwords. 😊
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=-=-=-=-=-=-=-=-=-=-=-=-
|
||||||
From the olden times years ago:
|
From the olden times years ago:
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -14,22 +14,34 @@ describe("SMOKE SETUP", () => {
|
|||||||
.then((res) => {
|
.then((res) => {
|
||||||
cy.request({
|
cy.request({
|
||||||
method: "POST",
|
method: "POST",
|
||||||
url: `${Cypress.env("apiBaseUrl")}trial/seed`,
|
url: `${Cypress.env("apiBaseUrl")}license/permanently-erase-all-data`,
|
||||||
auth: {
|
auth: {
|
||||||
bearer: res.data.token
|
bearer: res.data.token
|
||||||
}, ///small/-7/true
|
},
|
||||||
body: {
|
headers: {
|
||||||
seedLevel: "small",
|
"Content-Type": "application/json"
|
||||||
timeZoneOffset: -7,
|
},
|
||||||
e2e: true
|
body: JSON.stringify("I understand")
|
||||||
}
|
}).then(() => {
|
||||||
})
|
cy.request({
|
||||||
.its("body")
|
method: "POST",
|
||||||
.then((resjob) => {
|
url: `${Cypress.env("apiBaseUrl")}trial/seed`,
|
||||||
cy.log(`resjob is: ${JSON.stringify(resjob)}`);
|
auth: {
|
||||||
// expect(resjob.body).to.have.property('jobId');
|
bearer: res.data.token
|
||||||
confirmJobDone(resjob.jobId, res.data.token);
|
}, ///small/-7/true
|
||||||
});
|
body: {
|
||||||
|
seedLevel: "small",
|
||||||
|
timeZoneOffset: -7,
|
||||||
|
e2e: true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.its("body")
|
||||||
|
.then((resjob) => {
|
||||||
|
cy.log(`resjob is: ${JSON.stringify(resjob)}`);
|
||||||
|
// expect(resjob.body).to.have.property('jobId');
|
||||||
|
confirmJobDone(resjob.jobId, res.data.token);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
//-----------------------------------------------------
|
//-----------------------------------------------------
|
||||||
});
|
});
|
||||||
@@ -49,3 +61,56 @@ function confirmJobDone(jobId, authToken) {
|
|||||||
confirmJobDone(jobId, authToken);
|
confirmJobDone(jobId, authToken);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//===============================================
|
||||||
|
// describe("SMOKE SETUP", () => {
|
||||||
|
// it("Generates test data without issue", () => {
|
||||||
|
// cy.request({
|
||||||
|
// url: `${Cypress.env("apiBaseUrl")}auth`,
|
||||||
|
// method: "POST",
|
||||||
|
// body: {
|
||||||
|
// login: Cypress.env("admin").login,
|
||||||
|
// password: Cypress.env("admin").password
|
||||||
|
// }
|
||||||
|
// })
|
||||||
|
// .its("body")
|
||||||
|
// .then((res) => {
|
||||||
|
// cy.request({
|
||||||
|
// method: "POST",
|
||||||
|
// url: `${Cypress.env("apiBaseUrl")}trial/seed`,
|
||||||
|
// auth: {
|
||||||
|
// bearer: res.data.token
|
||||||
|
// }, ///small/-7/true
|
||||||
|
// body: {
|
||||||
|
// seedLevel: "small",
|
||||||
|
// timeZoneOffset: -7,
|
||||||
|
// e2e: true
|
||||||
|
// }
|
||||||
|
// })
|
||||||
|
// .its("body")
|
||||||
|
// .then((resjob) => {
|
||||||
|
// cy.log(`resjob is: ${JSON.stringify(resjob)}`);
|
||||||
|
// // expect(resjob.body).to.have.property('jobId');
|
||||||
|
// confirmJobDone(resjob.jobId, res.data.token);
|
||||||
|
// });
|
||||||
|
// });
|
||||||
|
// //-----------------------------------------------------
|
||||||
|
// });
|
||||||
|
// });
|
||||||
|
// function confirmJobDone(jobId, authToken) {
|
||||||
|
// cy.request({
|
||||||
|
// method: "GET",
|
||||||
|
// url: `${Cypress.env("apiBaseUrl")}job-operations/status/${jobId}`,
|
||||||
|
// auth: {
|
||||||
|
// bearer: authToken
|
||||||
|
// }
|
||||||
|
// }).then((resp) => {
|
||||||
|
// //3 means job done
|
||||||
|
// if (resp.body.data == 3) return;
|
||||||
|
// // else recurse
|
||||||
|
// cy.wait(1000);
|
||||||
|
// confirmJobDone(jobId, authToken);
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ describe("SMOKE NAV", () => {
|
|||||||
|
|
||||||
cy.get("[data-cy=navicon]").click();
|
cy.get("[data-cy=navicon]").click();
|
||||||
cy.get("[data-cy=home]").click();
|
cy.get("[data-cy=home]").click();
|
||||||
cy.get("[data-cy='nav/home-dashboard']").click();
|
cy.get("[data-cy='nav/home-dashboard']").click();//26fail Timed out retrying after 5000ms: Expected to find element: [data-cy='nav/home-dashboard'], but never found it.
|
||||||
cy.get("[data-cy=generalerror]").should("not.exist");
|
cy.get("[data-cy=generalerror]").should("not.exist");
|
||||||
|
|
||||||
cy.get("[data-cy=navicon]").click();
|
cy.get("[data-cy=navicon]").click();
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ describe("Workorder creation", () => {
|
|||||||
cy.ayChooseGZPickList("projectId", "e2e");
|
cy.ayChooseGZPickList("projectId", "e2e");
|
||||||
cy.get("[data-cy='serviceDate:date']").type(dayjs().format("YYYY-MM-DD"));
|
cy.get("[data-cy='serviceDate:date']").type(dayjs().format("YYYY-MM-DD"));
|
||||||
cy.get("[data-cy='serviceDate:time']").type(dayjs().format("HH:mm"));
|
cy.get("[data-cy='serviceDate:time']").type(dayjs().format("HH:mm"));
|
||||||
cy.get("[data-cy=customerContactName]").type(`Jayne Smith`);
|
cy.get("[data-cy=customerContactName]").type(`Jayne Smith`);//26fail Timed out retrying after 5000ms: Expected to find element: [data-cy=customerContactName], but never found it.
|
||||||
cy.get("[data-cy=customerReferenceNumber]").type(
|
cy.get("[data-cy=customerReferenceNumber]").type(
|
||||||
`cref-${Cypress.config("cyid")}`
|
`cref-${Cypress.config("cyid")}`
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user