🔥 Важное для QA-специалистов! 🔥
В QaRocks ты найдешь туториалы, задачи и полезные книги, которых нет в открытом доступе. Уже более 18.000 подписчиков – будь среди нас! Заходи к нам в телеграм канал QaRocks
Основываясь на моем недавнем опыте участия в собеседовании в компании Playwright, я хочу поделиться рядом вопросов, которые задавали на собеседовании в этой компании.
1. Скопируйте все ссылки, расположенные в нижнем колонтитуле сайта https://www.wikipedia.org/, и перейдите по третьей ссылке
import { test, expect } from '@playwright/test';
test('Get all footer links and click on 3rd link', async ({ page }) => {
// Step 1: Navigate to Wikipedia
await page.goto('https://www.wikipedia.org/');
// Step 2: Locate footer links
const footerLinks = page.locator('//a[@class="other-project-link"]');
// Step 3: Get the count of links
const linkcount = await footerLinks.count();
console.log(`Total footer links: ${linkCount}`);
// checking linkcount is greater than or equal to 3
expect(linkcount).toBeGreaterThanOrEqual(3);
// click on the 3rd link
await footerLinks.nth(2).click();
2. Как вы решаете проблему нестабильных тестов в Playwright?
Сначала я выявляю root cause сбоя с помощью Trace Viewer, скриншотов и видеозаписей. Проверяю, с чем связана проблема: с задержками сети, тестовыми данными, неверным локатором или сбоем в CI/CD.
- Использование автоожидания (Auto-waiting). Я задействую встроенное автоожидание Playwright, используя стандартные локаторы и assertions, такие как page.getByRole() , page.getByLabel(), page.getByText() , page.locator(), page.getByAltText(), page.getByTestId().
- Независимость тестов. Я всегда делаю тесты изолированными и независимыми друг от друга, чтобы избежать падений при параллельном запуске.
- Настройка Retries. В качестве дополнительной меры я настраиваю автоматический повторный запуск (retries) упавших тестов.
3.Расскажите, как устроена среда автоматизации Playwright
playwright-automation/
│
├── playwright.config.ts
├── package.json
├── tsconfig.json
├── .env
├── .gitignore
│
├── tests/
│ ├── auth/
│ │ └── login.spec.ts
│ ├── smoke/
│ │ └── smoke.spec.ts
│ ├── regression/
│ │ └── checkout.spec.ts
│ └── api/
│ └── user.api.spec.ts
│
├── pages/
│ ├── login.page.ts
│ ├── dashboard.page.ts
│ └── checkout.page.ts
│
├── fixtures/
│ └── testFixtures.ts
│
├── utils/
│ ├── testData.ts
│ ├── helpers.ts
│ └── apiUtils.ts
│
├── test-data/
│ ├── users.json
│ └── orders.json
│
├── reports/
│ └── html-report/
│
├── screenshots/
├── videos/
├── traces/
│
└── ci/
└── github-actions.yml
4. Как работать с оповещениями в Playwright?
// Accept dialog
page.on('dialog', async dialog => {
console.log(dialog.message());
await dialog.accept();
});
await page.click('#show-alert');
//Dismiss dialog
page.on('dialog', async dialog => {
if (dialog.type() === 'confirm') {
await dialog.dismiss(); // or dialog.accept()
}
});
// prompt dialog
page.on('dialog', async dialog => {
if (dialog.type() === 'prompt') {
await dialog.accept('Playwright Test');
}
});
// Validate alert text
page.on('dialog', async dialog => {
expect(dialog.message()).toContain('Are you sure');
await dialog.accept();
});
5. Как организовать параллельное тестирование в Playwright?
Есть два способа реализовать параллельное тестирование:
1. Я могу настроить параллельное тестирование с помощью параметра workers в файле config.ts в фреймворке Playwright:
import { defineConfig } from '@playwright/test';
export default defineConfig({
workers: 4 ,
retries: 2 ,
trace: 'retain-on-failure',
});
2. Запуск тестов параллельно внутри одного файла:
test.describe.parallel('Checkout tests', () => {
test('Add to cart', async ({ page }) => {});
test('Remove from cart', async ({ page }) => {});
});
6. Что такое фикстура? Создаёте ли вы фикстуры для собственных нужд? Если да, то можете ли вы описать, к какому типу они относятся и как вы их называете в своём фреймворке?
Фикстура в Playwright — это переиспользуемый механизм настройки (setup) и очистки (teardown), который предоставляет тестам специфичный контекст или данные. Она помогает в:
- Сокращении дублирующегося кода настройки
- Обеспечении изоляции тестов
- Управлении жизненным циклом (before → test → after)
- Да, я активно создаю пользовательские (custom) фикстуры под потребности проекта.
// fixtures/auth.fixture.ts
import { test as base } from '@playwright/test';
export const test = base.extend({
authPage: async ({ browser }, use) => {
const context = await browser.newContext({
storageState: 'auth.json',
});
const page = await context.newPage();
await use(page);
await context.close();
},
});
import { test } from '../fixtures/auth.fixture';
test('Dashboard test', async ({ authPage }) => {
await authPage.goto('/dashboard');
});
7. Как вы управляете тестовыми данными в зависимости от окружения?
Я управляю тестовыми данными для каждого окружения путем вынесения данных вовне, их параметризации через конфигурацию и изоляции динамических данных с помощью API.
1. Конфигурация на основе окружения. Использую .env-файлы для каждого окружения:
.env.qa.env.uat.env.prod-like
2. Разделение тестовых данных и логики тестов.
test-data/ ├── qa/ │ └── users.json ├── uat/ │ └── users.json
3. Динамические тестовые данные через API (Best Practice).
Для безопасного параллельного выполнения тестов:
- Создание данных перед тестом
- Очистка данных после теста
const user = await apiUtils.createUser();
8. Получить все ссылки пунктов меню https://www.wikipedia.org/ и вывести их в консоль
import { test, expect } from '@playwright/test';
test('Get all footer links and click on 3rd link', async ({ page }) => {
// Step 1: Navigate to Wikipedia
await page.goto('https://www.wikipedia.org/');
// // Locate menu (language) links
const menuLinks = page.locator('.central-featured-lang a');
const count = await menuLinks.count();
console.log("Total links present:" ${count});
// Loop and print text + URL
for(int i=0; i< count; i++ ) {
const text = await menuLinks.nth(i).innerText();
const href = await menuLinks.nth(i).getAttribute('href');
console.log("${text}"+"------"+"${href}");
Перевод статьи «Most Asked Interview Questions for Playwright».