如何在Playwright-API框架中为多角色配置专属的setWorldConstructor
针对你的Playwright-Typescript+Cucumber API自动化框架,要实现不同角色(买家/卖家/代理)的专属Cookie传递,可以通过以下方式修改代码:
1. 调整环境变量配置
在你的环境配置文件(如.env)中,为每个角色单独配置Cookie:
BUYER_COOKIE="buyer专属的Cookie内容" SELLER_COOKIE="seller专属的Cookie内容" AGENT_COOKIE="agent专属的Cookie内容"
2. 修改ScenarioWorld类,支持角色参数
更新world.ts,让初始化请求上下文时可以接收角色参数,并根据角色加载对应Cookie:
import playwright, {APIRequestContext} from "playwright"; import { World,IWorldOptions,setWorldConstructor } from "@cucumber/cucumber"; import { GlobalAPIResponseVariables, GlobalConfig } from "../../env/global"; import { env } from "../../env/parseEnv"; export type Api = { request: APIRequestContext } // 定义角色与Cookie的映射 const ROLE_COOKIES: Record<string, string> = { buyer: env('BUYER_COOKIE'), seller: env('SELLER_COOKIE'), agent: env('AGENT_COOKIE') }; export class ScenarioWorld extends World{ constructor(options: IWorldOptions){ super(options); this.globalAPIResponseVariables ={} this.globalConfig = options.parameters as GlobalConfig } globalConfig : GlobalConfig globalAPIResponseVariables:GlobalAPIResponseVariables api!: Api // 调整init方法,接收角色参数 async init(role: string): Promise<Api>{ const request = await this.newRequest(role) this.api = {request } return this.api } // 修改newRequest,根据角色获取对应Cookie private newRequest = async (role: string): Promise<APIRequestContext> =>{ // 校验角色是否存在 const cookie = ROLE_COOKIES[role]; if (!cookie) { throw new Error(`未配置角色【${role}】对应的Cookie,请检查环境变量`); } const request = await playwright.request.newContext({ extraHTTPHeaders : { 'Content-type':'application/json;charset=UTF-8', "Cookie": cookie } }) return request } } setWorldConstructor(ScenarioWorld)
3. 在Cucumber步骤中指定角色
在你的步骤定义文件中,根据场景需求传入对应角色,初始化请求上下文:
方式1:固定角色的步骤
import { Given } from '@cucumber/cucumber'; Given('买家初始化API请求上下文', async function () { await this.init('buyer'); }); Given('卖家初始化API请求上下文', async function () { await this.init('seller'); }); Given('代理初始化API请求上下文', async function () { await this.init('agent'); });
方式2:动态角色参数(更灵活)
import { Given } from '@cucumber/cucumber'; Given('{string}初始化API请求上下文', async function (role: string) { await this.init(role.toLowerCase()); // 统一转为小写,避免大小写问题 });
对应的.feature文件步骤可以写成:
Feature: 多角色API测试 Scenario: 买家查询订单 Given 买家初始化API请求上下文 When 买家调用查询订单接口 Then 返回订单列表 Scenario: 卖家管理商品 Given 卖家初始化API请求上下文 When 卖家调用创建商品接口 Then 商品创建成功
关键说明
- 每个场景开始前,通过
init(role)创建对应角色的请求上下文,后续所有API请求都会自动携带该角色的Cookie - 若新增角色,只需在
.env中添加对应Cookie,并在ROLE_COOKIES映射中新增条目即可,无需修改核心逻辑
内容的提问来源于stack exchange,提问作者samrac
相关产品推荐
相关产品推荐

