Самые популярные вопросы на собеседовании для Playwright

🔥 Важное для 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.

  1. Использование автоожидания (Auto-waiting). Я задействую встроенное автоожидание Playwright, используя стандартные локаторы и assertions, такие как page.getByRole() , page.getByLabel(), page.getByText() , page.locator(), page.getByAltText(), page.getByTestId().
  2. Независимость тестов. Я всегда делаю тесты изолированными и независимыми друг от друга, чтобы избежать падений при параллельном запуске.
  3. Настройка 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».

🔥 Какой была ваша первая зарплата в QA и как вы искали первую работу? 

Мега обсуждение в нашем телеграм-канале о поиске первой работы. Обмен опытом и мнения.

Читать в телеграм

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *