我对Playwright非常陌生。由于我的测试套件,我需要在运行每个测试之前登录到我的应用程序。在一个简单的规范文件中,我可以简单地调用test.beforeEach
。我的问题是:我需要在每次测试前登录每个规格文件.
test.describe('Test', () => {
//I need to make the code inside this beforeEach a exported
//function to call inside the before each of every spec file I have
test.beforeEach(async ({ page }) => {
await page.goto('/login');
await page.click('text=Log in with Google account');
await page.fill('id=identifierId', LoginAutomationCredentials.USER);
await page.click('button[jsname="LgbsSe"]');
await page.fill('input[type="password"]', LoginAutomationCredentials.PASSWORD);
await page.click('button[jsname="LgbsSe"]');
const otp = authenticator.generateToken(LoginAutomationCredentials.TOKEN);
await page.fill('id=totpPin', otp);
await page.click('button[jsname="LgbsSe"]');
});
it('Some description', async ({ page }) => {
await page.goto('/foo');
const dateFilter = await page.inputValue('input[placeholder="2011/03/02"]');
expect(dateFilter).toBe('2021/12/07');
});
});
我试着简单地把代码变成一个函数,放在一个单独的.ts文件中,然后导入它,但是我认为上下文是必要的,这可能是每个使用playwright的测试人员都知道并经常使用的,但是,我没有找到任何关于这个主题的东西。
我怎样才能避免复制beforeEach
的整个代码并将其粘贴到我所有的spec文件中?我怎样才能使它成为一个函数并随时调用它?
3条答案
按热度按时间irtuqstp1#
使用固定装置。
fixture.js:
然后在测试中:
jvlzgdj92#
Fixtures是正确的方法,但有一个更好的选择,而不是在你想登录时必须记住使用
login
而不是page
。首先,我在
playwright/src/index.ts
中设置了项目的所有固定装置:我还确保
playwright/tsconfig.json
包含以下内容:现在每个测试都将自动以
default-user@example.com
的身份登录,但是如果您需要一个测试以不同的用户身份登录,那么您需要在该测试文件中做的就是:1l5u6lss3#
我认为全局设置和拆卸可能是测试前登录的最佳解决方案。
下面是一个草图,根据文档(未经测试),显示了这在您的代码中可能是什么样子。
global-setup.ts
:playwright.config.ts
:tests/foo.spec.js
:现在,在最初的Playwright示例中,他们的
globalSetup
函数写入存储状态:但是您的代码没有这样做,您可能需要在
globalSetup
函数的最后一行这样做,然后调用await browser.close()
来保存这些令牌,并在一个浏览器会话和下一个会话之间携带这些令牌。他们从
const { baseURL, storageState } = config.projects[0].use;
中提取这个storageState
字符串,这样就不需要在多个地方硬编码。一旦你让它工作并且你已经写了你的
state.json
文件,如果令牌仍然有效,你可能想跳过运行未来的登录。你可以通过对global-setup.ts
做如下修改来做到这一点:最有可能的是,
state.json
应该添加到项目的.gitignore
中。