class RequestCommon {
readonly request: APIRequestContext;
readonly browser: Browser;
constructor (request: APIRequestContext, browser: Browser) {
this.request = request;
this.browser = browser;
}
public async getCookies (): Promise {
const browserContext = await this.browser.newContext();
return (await browserContext.storageState()).cookies;
}
public async post (url: string, options?: PostOptions): Promise {
const csrfToken = await this.getCsrfToken();
return this.request.post(`${baseUrl.default}${url}`, {
ignoreHTTPSErrors: true,
...options,
headers: {
'content-type': 'application/json',
...options?.headers
}
});
}
}
封装一个类通过传入的 fixtures 控制,确保发送请求的request,和browser都是当前页面下的,以避免对于多浏览器跑不同用户场景下的cookies不同导致权限不同
使用方法:
test('验证导出告警成功', async ({page, request, browser}) => {
const requestCommonInstance = new RequestCommon(request, browser);
const res = await requestCommonInstance.post('xxxUrl', { data })
}
优化ts类型约束及提示,通过自定义泛型工具获取函数第二个参数类型
export type GetSecondArgs二、用户鉴权相关: 第一步= T extends (_: any, arg: infer R) => any ? R : any; // post请求配置参数 获取APIRequestContext里的post函数类型的第二个配置参数 type PostOptions = GetSecondArgs ;
const config: PlaywrightTestConfig = {
globalSetup: require.resolve('./global-setup/index.ts')
}
第二步
在当前目录global-setup/index.ts文件中
import { chromium } from '@playwright/test';
import { LoginPageModel } from '../modules/login/models';
export default async function globalSetup () {
// 不打开浏览器走一遍
const browser = await chromium.launch({
headless: true
});
// 忽略https不安全报错
const page = await browser.newPage({
ignoreHTTPSErrors: true
});
const loginInstance = new LoginPageModel(page);
await loginInstance.gotoLogin();
await loginInstance.login();
await loginInstance.assertLoginSuccess();
// 走完一遍登录流程后保存状态到adminStorageState.json文件中
// Save signed-in state to 'adminStorageState.json'.
await page.context().storageState({ path: 'adminStorageState.json' });
await browser.close();
}
第三步
在页面中使用即可做到保存用户状态
import { test } from '@playwright/test';
test.use({ storageState: 'adminStorageState.json' });
暑期编程PK赛
得CSDN机械键盘等精美礼品!


