Разработка транзакции для STM-агента Lite (Playwright)
Предисловие
Для разработки кода транзакции для STM-агента установите Python 3.13.0. Также потребуются следующие зависимости:
| Зависимость | Версия |
|---|---|
| Playwright | 1.53.0 |
Для удобства работы с инструментом Playwright рекомендуется установить среду разработки PyCharm или любую другую, поддерживающую работу с Python.
Генерация кода
Работа с Playwright Codegen
Создайте файл с расширением .py, для сохранения сгенерированного кода.
Для генерации кода для STM-агента используйте встроенный в Playwright инструмент Codegen. Чтобы воспользоваться инструментом, необходимо открыть командную строку в среде разработки и ввести следующую команду:
playwright codegen *сайт*
После выполнения команды откроется Chromium и Playwright Inspector.В Chromium выполняются действия, которые необходимо записать в STM-агент. Для остановки записи используется кнопка Record, выделенная на скриншоте:

После остановки записи скопируйте код из Playwright Inspector в ранее созданный Python файл.

Редактирование кода
Замена импорта
Для корректного вызова STM-агента замените импорт:
import re
from playwright.sync_api import Playwright, sync_playwright, expectна:
import asyncio
from async_stm_agent_sdk import transaction_contextРедактирование функции
Замените синхронную функцию:
def run(playwright: Playwright) -> None:на асинхронную:
async def tr_stm_run():
async with transaction_context() as (page, step, expect, log, logger, random, sleep):Весь внутренний код должен быть сдвинут на один уровень табуляции.
Также замените запуск функции в конце кода с:
with sync_playwright() as playwright:
run(playwright)на:
asyncio.run(tr_stm_run())Удаление вызова браузера
Для работы STM-агента, в отличии от Playwright, не требуется явный вызов и закрытие браузера, поэтому удалите из кода следующие строки:
browser = playwright.chromium.launch(headless=False)
context = browser.new_context()
page = context.new_page()
...
# ---------------------
context.close()
browser.close()На данном этапе должен получиться, примерно, следующий код, без упоминания Playwright:
import asyncio
from async_stm_agent_sdk import transaction_context
async def tr_stm_run():
async with transaction_context() as (page, step, expect, log, logger, random, sleep):
page.goto("https://primo-rpa.ru/")
page.get_by_role("button", name="Закрыть диалоговое окно").click()
page.get_by_text("Современное решение для интеллектуальной обработки любых документов. Работает в ").click()
page.locator("#rec1121802201").get_by_role("button", name="Запросить демо").click()
page.get_by_role("dialog").locator("label").filter(has_text="Даю согласие на обработку своих персональных данных").locator("div").first.click()
asyncio.run(tr_stm_run())Добавление шагов
После очистки кода от упоминания Playwright, вы можете приступить к разбивке вашего кода на шаги. Для этого внутри кода транзакции вызовите асинхронную функцию:
async with step(step_name="*имя шага*"):Если нужно добавить запись в лог конкретного шага, вызовите сразу две функции:
async with step(step_name="*имя шага*"):
async with log("*запись в лог*"):После этого поместите код, выполняемый внутри этого, внутрь функции, сместив его на один уровень табуляции, относительно последней функции.
Для каждого действия добавьте “await”.
Пример получившегося шага:
async with step(step_name="visit_primo_rpa_ru"):
async with log("visit_primo-rpa.ru"):
await page.goto("https://primo-rpa.ru/")Отредактируйте весь оставшийся код.
В результате редактирования должен получиться следующий код:
import asyncio
from async_stm_agent_sdk import transaction_context
async def tr_stm_run():
async with transaction_context() as (page, step, expect, log, logger, random, sleep):
async with step(step_name="visit_primo_rpa_ru"):
async with log("visit_primo-rpa.ru"):
await page.goto("https://primo-rpa.ru/")
async with step(step_name="close_window"):
async with log("close_window"):
await page.get_by_role("button", name="Закрыть диалоговое окно").click()
async with step(step_name="first_click"):
async with log("first_click"):
await page.get_by_text("Современное решение для интеллектуальной обработки любых документов. Работает в ").click()
async with step(step_name="request_demo"):
async with log("request_demo"):
await page.locator("#rec1121802201").get_by_role("button", name="Запросить демо").click()
async with step(step_name="personal_data"):
async with log("personal_data"):
await page.get_by_role("dialog").locator("label").filter(has_text="Даю согласие на обработку своих персональных данных").locator("div").first.click()
asyncio.run(tr_stm_run())