Перейти к основному содержимому

Поддержка WebDriver BiDi протокола

· 3 мин. чтения

В testplane@8.27.0 добавлена поддержка WebDriver BiDi протокола (будущий единый стандарт для автоматизации браузеров).

WebDriver BiDi (Bidirectional) — это новый протокол кросс-браузерной автоматизации, который сочетает в себе лучшее из существующих протоколов: W3C WebDriver и Chrome DevTools Protocol (CDP) (подробнее о них можно почитать в нашей статье). По сути новый протокол расширяет существующий W3C Webdriver протокол и добавляет в него новые кросс-браузерные команды, которые заменяют CDP протокол (не является кросс-браузерным). Старые webdriver-команды работают как и раньше по http, а новые команды обеспечивают двунаправленную коммуникацию между клиентом и браузером по websocket соединению.

Новый протокол на данный момент поддержан следующими браузерами: Chrome, Firefox, Edge. В safari поддержки пока нет. Следить за поддерживаемыми браузерами можно на этой странице.

Список команд BiDi протокола доступен на этой странице.

Как использовать?

warning

В Testplane поддержка BiDi протокола доступна в браузерах начиная с версии: chrome@128 и firefox@129.

Для использования BiDi протокола необходимо:

  • установить testplane@8.27.0 или старше;
  • указать капабилити webSocketUrl: true в поле desiredCapabilities для необходимого браузера (в следующей мажорной версии будет выставляться по умолчанию);
  • запустить тесты.

Что можно сделать с помощью нового протокола?

Отслеживание и перехват сетевых запросов/ответов

  1. Можно замокать запрос к testplane.io и вернуть свой ответ:
it("should mock testplane.io", async ({ browser }) => {
await browser.networkAddIntercept({ phases: ["beforeRequestSent"] });

browser.on("network.beforeRequestSent", networkRequest => {
browser.networkProvideResponse({
request: networkRequest.request.request,
body: {
type: "string",
value: "hello world",
},
});
});

await browser.url("https://testplane.io");
});
  1. Перехватим все запросы к ресурсу testplane.io и отобразим список всех загружаемых урлов:
it("should log all loaded urls", async ({ browser }) => {
browser.on("network.responseCompleted", networkResponse =>
console.log("got response from url:", networkResponse.response.url),
);

await browser.url("https://testplane.io");
});

Отображение логов в браузере

it("should show browser console logs", async ({ browser }) => {
browser.on("log.entryAdded", entryAdded => console.log(JSON.stringify(entryAdded, null, 4)));

await browser.execute(() => console.log("Hello Bidi"));
});

Снятие скриншота всей страницы

import * as fs from "node:fs";

it("should screen full page", async ({ browser }) => {
await browser.url("https://www.npmjs.com/");

const tree = await browser.browsingContextGetTree({});
const file = await browser.browsingContextCaptureScreenshot({
context: tree.contexts[0].context,
origin: "document",
});

fs.writeFileSync("screenshot.png", Buffer.from(file.data, "base64"));
});

Заключение

Хотя протокол BiDi все еще находится в Editor's Draft, но уже очевидно, что за этим протоколом будущее. Так например браузер firefox уже объявил о том, что прекращает поддержку CDP протокола с версии 129.

Поддержка протокола BiDi позволяет нашим пользователям:

  • использовать больше возможностей для автоматизации тестов, которых не было в WebDriver протоколе;
  • возможность отказаться от использования Puppeteer (используются под капотом для поддержки CDP протокола), который по нашему опыту приводит к множеству проблем в тестах;
  • идти в ногу со временем и уже начинать привыкать к будущему единому стандарту.

Переходите на новую версию Testplane и приносите фидбек. В случае обнаружения проблем приходите в issue github — мы вам обязательно поможем!