我正在尝试在我的框架中集成cucumber和剧作家。当我尝试在一个功能中运行不同的功能或多个场景时,如果一个场景正在登录一个网站,则另一个场景和功能将被注销。我试着像在剧作家中那样将状态存储在storageState中,但不知何故,它在黄瓜中不起作用。我的设置文件:
import { Before, After, BeforeAll, AfterAll, Status, setDefaultTimeout } from '@cucumber/cucumber';
import { OurWorld } from "./custom-world";
import config from './config';
import { AllPagesObject } from './src/pages/all-pages-object';
import {chromium, firefox, webkit,} from 'playwright';
import { FullConfig } from '@playwright/test';
const fs = require("fs");
setDefaultTimeout(config.defaultTimeout);
BeforeAll(async function (this: OurWorld) {
const commonBrowserOptions = {
headless: config.runHeadless,
slowMo: 50,
};
switch (config.browser) {
case 'firefox':
global.browser = await firefox.launch(commonBrowserOptions);
break;
case 'webkit':
global.browser = await webkit.launch(commonBrowserOptions);
break;
default:
global.browser = await chromium.launch(commonBrowserOptions);
}
});
Before(async function () { //this: OurWorld
if(fs.existsSync('./storageState.json')){
this.context = await global.browser.newContext({storageState: "./storageState.json"});
console.log(this.context);
this.page = await this.context.newPage();
this.pagesObj = new AllPagesObject(this.page, this.context);
} else {
this.context = await global.browser.newContext();
this.page = await this.context.newPage();
this.pagesObj = new AllPagesObject(this.page, this.context);
await this.page.goto("https://beta.bluetape.com/");
await this.page.locator('[data-testid="login"]').fill("katsiaryna+atest@bluetape.com");
await this.page.locator('"Continue"').click();
await this.page.locator('[data-testid="password"]').fill("A1234567");
await this.page.locator('"Log In"').click();
await this.page.waitForLoadState('networkidle');
await this.page.context().storageState({path: "./storageState.json" as string});
}
});
// Cleanup after each scenario
After(async function (this: OurWorld) {
});
AfterAll(async function () {
await this.page.close();
await this.context.close();
await global.browser.close();
});
我尝试过这种方法:在before功能中,我检查是否有storageState文件。如果我有一个-i从中加载状态。如果我没有-i登录并将状态保存到storageState中。但在运行每个功能时,甚至在单个功能中的每个场景中,cucumber都会打开浏览器的一个新实例,测试失败,因为它没有登录。任何关于如何在黄瓜+剧作家中管理cookie和测试之间状态的建议都将不胜感激。黄瓜+剧作家在测试之间具有单一状态的工作示例将更好(
我的问题是,当我在调试模式下运行测试时,没有存储cookies。没有调试,一切都很好。
当cuking每个场景都是一个独立的单一测试时,从头开始并练习特定的行为。场景的设计不是为了以任何顺序运行,也不是为了让一个场景为另一个场景设置东西。
所以。。。
- 每个场景都将登录并在完成时终止会话
- 一个场景的任何数据设置都将在该场景完成时删除
所有这些都是为了确保您不会在一个场景中执行导致另一个场景出现错误的操作。这是所有测试框架的标准做法。
您不应该试图在测试之间管理cookie和状态,而应该为每个单独的场景设置和删除cookie和状态。