嗨(我是 palywright 的新手),
我需要/想要在剧作家中找到一种方法,通过 pageObjectModel 在使用 keycloak 的应用程序中登录,但我不知道如何。
我找到了一种没有 pageObject 的方法,在第一次测试中登录并将身份验证保存在 process.env.STORAGE 中,然后在 file.spec.js 中的其余测试中使用 test.use({storageState: auth_storage_path});
注意:keycloak 有效(对不起这个基本信息)
- 用户未登录 -> visit.baseUrl,将您重定向到 keycloak authPage
- 用户已经登录 -> visit.baseUrl 直接转到 bareUrl。(所以主页中没有登录按钮等)
//tests_with_auth_store.spec.js
const {test, expect} = require('@playwright/test');
const auth_storage_path = 'storage_auth.json';
const baseUrl = 'https://myBaseUrl_xyz.com';
test('mylogin', async ({page, context}) => {
const usernameId = '[id="username"]';
const passwordId = '[id="password"]';
const idLogin = '[id="login-button"]';
const usernameValue = '*****';
const passwordValue = '*****';
//login:
await page.goto(baseUrl);
await page.fill(usernameId, usernameValue);
await page.fill(passwordId, passwordValue);
await Promise.all([
page.waitForNavigation(/*{ baseUrl: baseUrl }*/),
page.click(idLogin)
]);
process.env.STORAGE = null;
const storage = await context.storageState({ path: auth_storage_path });
process.env.STORAGE = JSON.stringify(storage);
JSON.parse(process.env.STORAGE);
});
test.describe("testDescription login via pageObjectModel", () => {
test.use({storageState: auth_storage_path});
test('i- firstTest whatever ', async ({page}) => {
await page.goto(baseUrl);
......
....
});
test('ii- secondTest whatever ', async ({page}) => {
await page.goto(baseUrl);
......
....
});
});
这工作正常,所有测试都在 test.use({storageState: auth_storage_path}); 可以直接跳转到baseUrl。问题是我找不到将 test('login') 封装到剧作家 pageObject 的方法(在 cypress 中,我们在 commands.js 中的简单 func 中完成了它并将身份验证保存到 cookie 中)
我的 login-page.js 演示:
// login-page.js
const { expect, test} = require('@playwright/test');
const baseUrl = 'https://myBaseUrl_xyz.com';
const auth_storage_path = 'storage_auth.json';
exports.LoginPage = class LoginPage {
/**
* @param {import('@playwright/test').Page} page
*/
constructor(page) {
this.page = page;
}
async login() {
process.env.STORAGE = null;
const baseUrl = 'https://myBaseUrl_xyz';
await this.page.goto(baseUrl);
await this.page.fill('[id="username"]', '*****');
await this.page.fill('[id="password"]', '*****');
await Promise.all([
this.page.waitForNavigation(/*{ baseUrl: baseUrl }*/),
this.page.click('[id="fc-login-button"]')
]);
const storage = await this.page.context().storageState({path: auth_storage_path});
process.env.STORAGE = JSON.stringify(storage);
JSON.parse(process.env.STORAGE);
}
// async gotoBaseUrl() {
// test.use({storageState: auth_storage_path});
// return this.page.goto(baseUrl);
// }
}
从 tests_with_auth_store_viaPage.spec.js 调用登录页面
// tests_with_auth_store_viaPage.spec.js
const {test, expect} = require('@playwright/test');
const { LoginPage } = require('../login/login-page');
const auth_storage_path = 'storage_auth.json';
const baseUrl = 'https://myBaseUrl_xyz.com';
test('login', async ({page}) => {
const loginPage = new LoginPage(page);
await loginPage.login();
});
test.describe("testDEscription tests with save login into json", () => {
test.use({storageState: auth_storage_path});
test('i- firstTest whatever', async ({page}) => {
await page.goto(baseUrl);
......
....
});
但是这里 test('i-firstTest 不管什么') page.goto(baseUrl) 不会跳转到 baseUrl 而是跳转到 keycloak auth page :(。
Eventhoug test('login') 是登录并创建 storage_auth.json。所以我做错了什么,也许我需要像 loginPage.gotoBaseUrl() 这样的东西,但它也不起作用。
到目前为止,我正在编写其余所有测试,包括始终是第一个测试('mylogin),但我确信有一种方法可以通过 pageObject
问候