Microsoft Playwright — библиотека node.js с открытым кодом для автоматизации взаимодействия с браузером. Этот инструмент недавно обогнал Cypress и по загрузкам, и по звездам.
Данный список вопросов для собеседования кратко охватывает много тем на собесе, от базовых концепций до сложных кейсов.
1) Чем Playwright отличается от других инструментов браузерной автоматизации, таких как Selenium?
- Playwright поддерживает автоматическое ожидание, в отличие от Selenium.
- Скорость выполнения Playwright выше, чем у Selenium.
- В Playwright реализована нативная поддержка автоматизации.
- Кроме того, в Playwright встроен механизм скриншотов и видео с экрана во время выполнения тестов.
2) Какие браузеры поддерживаются в Playwright?
Microsoft Playwright поддерживает браузеры Chromium, Firefox и Safari.
3) Как установить Playwright?
Для установки требуется установка нода Playwright. При помощи менеджера пакетов :
npm init playwright@latest
4) Ключевые особенности Playwright?
Перечислены ниже:
- Поддерживает все нужные браузеры.
- Может выполнять скрипты как в headless-режиме, так и в режиме UI.
- Playwright поддерживает функцию автоматического ожидания (auto-wait), которая ожидает готовности элементов перед тем как с ними взаимодействовать Это уменьшает необходимость явно прописывать время ожиданий в скриптах.
- В Playwright встроены возможности для записи скриншотов и видео, которые помогают в отладке.
- Настройка очень простая, что экономит время и усилия.
- Playwright позволяет перехватывать и изменять сетевые запросы, что позволяет создавать расширенные сценарии тестирования с имитацией различных условий.
5) Какие типы тестирования поддерживает Playwright?
Playwright поддерживает функциональное тестирование, сквозное тестирование и тестирование API.
6) Опишите предназначение файла конфигурации в Playwright Framework?
В Playwright файл конфигурации управляет и настраивает поведение скриптов. Файл конфигурации содержит несколько параметров и опций для настройки среды выполнения, длительности таймаутов, браузеров, настройки скриншотов и т. д.
7) Какие общие стратегии локаторов существуют в Playwright?
Playwright поддерживает следующие локаторы:
- По Id, идентификатору
- Text, тексту
- By Text Content (По содержанию текста)
page.locator({ text: 'exact text' })
4. По Xpath
5. CSS-селектор
6. По роли
page.getByRole('button', { name: submit })
7. По метке (label)
8. По плейсхолдеру
9. По AltText
page.getByAltText('AQH')
10. По названию (тайтлу)
//HTML <span title='AutomationQAHub'>AQH Learning</span> //Playwright Locator await expect(page.getByTitle('AutomationQAHub')).toHaveText('AQH Learning');
8) Объясните понятие «селектор»
Селекторами называются строки или параметры, используемые для создания локаторов.
Playwright поддерживает селекторы CSS, селекторы XPath и селекторы текста:
page.locator(selector[, options]) //selector page.locator('css=button'). //CSS Selector page.locator('//div[@id="confirmation"]') //Xpath Selector
9) Какие языки поддерживает Playwright?
Playwright поддерживает JavaScript, TypeScript, Java, C# и Python.
10) Как записывать и воспроизводить скрипты в Playwright?
Playwright поставляется с инструментом записи тестов под названием ‘Playwright Codegen’. С его помощью можно записывать скрипты с базовыми ассертами и использовать их в наших тестовых скриптах.
Команда запуска Codegen:
npx playwright codegen URL
11) В чем разница между fill() и type()?
Метод Fill() очищает существующее значение, а затем вводит строку за один раз. В отличие от этого, метод type() просто вводит строку по одному символу.
12) Какой таймаут по умолчанию для страницы в Playwright?
По умолчанию таймаут для каждого теста Playwright составляет 30 секунд. Если действие не будет завершено в течение 30 секунд, Playwright выдаст ошибку таймаута. Однако этот таймаут можно изменить, указав свое значение таймаута, при вызове определенных методов.
await page.click('button#submit', { timeout: 5000 });
13) Какой таймаут по умолчанию для ассертов в Playwright?
Для ассертов (утверждений) Playwright таймаут по умолчанию равен 5 секундам. Мы можем не учитывать этот таймаут, установив глобальный таймаут в главном файле конфигурации Playwright.
expect : { timeout: 30 * 1000, }
Кроме того, есть возможность настроить таймаут для каждого теста отдельно.
await expect(navigationMenu.CollapseMenu).toBeVisible({timeout:5000})
14) Как верифицировать URL-адрес в Playwright?
Проверить точность совпадения с помощью ассерта expect с функцией toHaveURL():
await expect(page).toHaveURL('https://www.automationqahub.com/playwright');
2. Проверить частичное совпадение:
await expect(page).toHaveURL(/playwright/);
3. С регулярными выражениями:
await expect(page).toHaveURL(new RegExp('/playwright$'));
15) Как имитировать клики в Playwright?
Простой щелчок (кликнуть мышкой):
page.locator('locator').click()
2. Двойной щелчок:
page.locator('locator').dblclick()
3. Правой кнопкой мыши:
page.locator('locator').click(button='right')
16) Что такое мягкие утверждения?
В отличие от жестких утверждений, мягкие утверждения (soft assertions) не прерывают выполнение тестового сценария немедленно при сбое. Выполнение теста продолжается даже в случае если утверждение оказалось неверным. В конце выполнения тест будет помечен как неудачный (красный).
await expect.soft(firstname).toHaveValue('AQH');
В конце, чтобы собрать все упавшие места, используется test. info().errors для проверки отсутствия/наличия ошибок.
expect(test.info().errors).toHaveLength(0)
17) В чем разница между innerText() и TextContent() в Playwright?
Метод innerText() может получить только видимый текст любого веб-элемента, а метод TextContent() может получить и скрытый текст.
18) В чем разница между locator() и locateAll()?
В отличие от Selenium, в Playwright есть единственный метод locator(‘locator’), который используется для поиска и возврата первого совпадающего элемента в DOM.
page.locator('locator')
Находим все совпадающие элементы в DOM и возвращаем список элементов.
page.locator('locator').all()
19) Какие команды используются для выбора выпадающего списка с помощью Playwright?
Доступны три варианта:
await page.selectOption('select#dropdownId', { label: 'OptionText' }); //SelectByVisisbleText await page.selectOption('select#dropdownId', { index: 1 }); //SelectByIndex await page.selectOption('select#dropdownId', 'OptionValue'); //SelectByValue
20) Как определить местоположение элемента с помощью составных селекторов?
Можем использовать условие OR, чтобы проверить веб-элемент, который соответствует либо локатору1, либо локатору2.
await expect.soft(page.locator('locator1').or(page.locator('locator2'))).toContainText(team);
Другой подход — использование оператора запятой. ,
await expect.soft(page.locator('button:has-text("Log in"), button:has-text("Sign in")')).toBeVisible();
21) Каково назначение метода waitForFunction в Playwright и как он используется?
Функция waitForFunction() используется для приостановки выполнения до тех пор, пока заданная функция не вернет истинное значение. Например:
await page.waitForFunction(() => window.innerWidth < 1000);
22) Объясните WaitFor() в Playwright.
WaitFor() — это функция в Playwright, которая используется для ожидания определенных условий, таких как visible, stable, enable и attached.
23) Как выполнить прокрутку в Playwright?
await page.evaluate(() => { window.scrollTo(0, document.body.scrollHeight); });
await page.locator('locator').scroll_into_view_if_needed()
24) Как повторно выполнить неудачные тест-кейсы в Playwright?
Изменить параметры конфигурации в файле playwright.config.js.
const config = { // Give failing tests 2 retry attempts retries: 2, };
Альтернативный вариант — из командной строки:
npx playwright test --retries=2
25) Назовите самые частые исключения в Playwright
Например:
- Ошибка таймаута: Выбрасывается, когда определенная операция завершается по истечению времени. Например, ожидание появления элемента на странице с помощью waitForSelector выбросит TimeoutError, если элемент не появится в течение указанного таймаута.
- ElementHandleError: Когда возникает проблема при взаимодействии с хэндлом элемента в DOM. Это может произойти, если элемент не виден, не кликабелен или если операция не может быть выполнена.
- NetworkError: Сетевой сбой возникает при ошибках, связанных с сетью, таких как неудачные сетевые запросы или невозможность подключения к ресурсу.
- ContextClosedError: Эта ошибка возникает при попытке работать с закрытым контекстом браузера.
- StrictModeViolation Error: Эта ошибка возникает, когда наш локатор находит более одного элемента.
26) Как сохранить скриншот в нужное место?
await page.screenshot({path:'screenshot.png'})
Будет сделан скриншот и сохранен, на уровне проекта.
27) Как сделать частичный скриншот с помощью Playwright?
Чтобы сделать частичный скриншот или скриншот, относящийся к конкретному веб-элементу, используем метод locator.screenshot():
await page.locator('#textbox').screenshot({path:'PartialScreenshot.png'})
28) Что такое контекст браузера?
«Контекст браузера» означает изолированную среду (окружение) внутри экземпляра браузера. Контекст браузера помогает создать несколько независимых экземпляров браузера, каждый из которых имеет свой собственный набор страниц, куки и хранилище. Это полезно для управления различными состояниями или сценариями, параллельного выполнения и сетевой изоляции.
// Launch a browser instance const browser = await chromium.launch(); // Create two browser contexts const context1 = await browser.newContext(); const context2 = await browser.newContext(); // Create pages in each context const page1 = await context1.newPage(); const page2 = await context2.newPage(); // Navigate to different URLs in each page await page1.goto('https://example.com'); await page2.goto('https://example.org'); })();
Выше мы создали 2 контекста браузера и разные страницы в каждом из них. Обе страницы открывают разные URL-адреса. Мы можем выполнять разные наборы действий в этих контекстах.
29) Как автоматизировать всплывающие уведомления?
В Playwright всплывающие уведомления можно автоматизировать с помощью обработчика события page.on(‘dialog’). Он позволяет перехватывать и обрабатывать различные типы диалогов, включая диалоги оповещения, подтверждения и подсказки.
page.on(dialog,dialog =>dialog.accept()) //To Accept the alert
page.on(dialog,dialog =>dialog.dismiss()) //To Dismiss the alert
30) Как запускать тесты параллельно?
По умолчанию Playwright выполняет тестовые файлы (скрипты) в параллельном режиме, но при этом обрабатывает тест-кейсы внутри этих файлов последовательно.
Например, если у вас есть 3 тестовых скрипта, каждый из которых содержит 2 тест-кейса; тогда все 3 тестовых скрипта будут выполняться в параллельном режиме, а тесты-кейсы внутри каждого файла будут выполняться последовательно.
31) Как выполнить тесты из одного тестового файла в параллельном режиме?
test.describe.configure({mode:'parallel'})
Этот код включает параллельное выполнение всех тестов в одном файле.
32) А в последовательном?
test.describe.configure({mode:'serial'})
Serial — настройка по умолчанию в каждом файле. Мы можем переопределить ее с помощью режима ‘parallel’, чтобы выполнять тест-кейсы параллельно.
33) Как загрузить (скачать) файл с помощью Playwright.
Для поддержки событий загрузки в плейсхолдере предусмотрен обработчик событий page.waitForEvent(‘download’).
await page.locator('locator').click() const[download] =await Promise.all([ await page.waitForEvent('download') ]) console.log(`Download started: ${download.suggestedFilename()}`); const path =download.suggestedFilename(); await download.saveAs(path)
При нажатии на ссылку/кнопку запускается событие загрузки, которое обрабатывается с помощью обработчика события page.waitForEvent(‘download’). Как только событие загрузки получено, мы сохраняем файл по указанному пути и записываем информацию в журнал.
34) Как прикрепить файл в HTML-репорте?
В TestInfo содержится информация о текущем запущенном тесте. Она доступна для тестовых функций, хуков и фикстур масштаба теста. TestInfo предоставляет утилиты для управления выполнением теста: прикрепление файлов, обновление таймаута теста, определение того какой тест запущен в данный момент и был ли он повторно запущен, и т.д. Чтобы прикрепить загруженный файл к репорту, используйте приведенный ниже код.
await testInfo.attach('downloaded file', { path: path });
35) Как сгенерировать отчет Allure/HTML и поделиться им в Playwright?
В этой статье (англ.) я подробно объяснил, как сгенерировать и поделиться репортом HTML/Allure, со сжатием.
36) Как обрабатывать оповещения в Playwright?
page.on('dialog', async dialog => { // Verify type of dialog expect(dialog.type()).toContain('alert') });
Приведенный выше код проверяет наличие оповещения в DOM. Чтобы проверить текст окна оповещения — следующий код:
// verify message of alert expect(dialog.message()).toContain('Please select atleast one pillar phase.');
Принять предупреждение:
//click on alert ok button await dialog.accept();
37) Что лучше, Playwright или Cypress?
У каждого инструмента есть плюсы и минусы. Выбор инструмента зависит от требований и ограничений проекта. Однако в целом по скорости Playwright видимо лучший, или приближается к этому.
38) Может ли Playwright автоматизировать приложения для Windows?
Да, но только созданные в Electron и написанные на JS. Тогда Playwright может автоматизировать такие настольные приложения на различных платформах, включая Windows, MacOS и Linux, с помощью пакета nut js.
39) Как загрузить файл в Playwright?
Для загрузки файла (на сервер, от пользователя) в Playwright используется команда setInputFile(). Если мы хотим загрузить несколько файлов, мы можем использовать метод setInputFiles().
await page.locator('#Button').setInputFiles('myfile.pdf'); await page.locator('#Button').setInputFiles(['file1.pdf', 'file2.pdf']);
40) Как закрыть страницу/вкладку или браузер в Playwright?
//To Close Page or Tab page.close() - Used to close individual page // To close Browser browser.close()
Тем временем скорость загрузки YouTube на стационарных ПК в РФ может снизиться на 40-70%