@ViX_EL
Разработчик C++

Как отключить автоматическое завершение работы браузера при выходе из функции в Playwright?

Я использую playwright не для тестирования, мне нужно автоматически загружать документы на сайт, доступа к бд сайта нет. Я просто не могу выделить части кода в отдельные методы. Мне нужно чтобы мой код размещался в разных методах и его выполнение продолжалось при переходе между этими методами. Например такой кусок кода:

await page.GetByRole(AriaRole.Button, new() { Name = "Создать реестр" }).ClickAsync();
await page.GetByLabel("Категория комплекта", new() { Exact = true }).ClickAsync();
string strKitCategory = templateSheet.GetCell(currentSheetRow, (int)ExcellTemplateTableSheet.ColumnType.kitCategory);
await page.GetByText(strKitCategory).ClickAsync();
await page.GetByLabel("Комплект РЧ").ClickAsync();
string rChKit = templateSheet.GetCell(currentSheetRow, (int)ExcellTemplateTableSheet.ColumnType.RCHKit);
await page.GetByLabel("Комплект РЧ").FillAsync(rChKit);
await page.GetByText(rChKit).ClickAsync();
await page.GetByLabel("Договор").ClickAsync();
await page.GetByText(templateSheet.GetCell(currentSheetRow, (int)ExcellTemplateTableSheet.ColumnType.contract)).ClickAsync();
string worcksDescription = templateSheet.GetCell(currentSheetRow, (int)ExcellTemplateTableSheet.ColumnType.descriptionOfWorks);
await page.GetByLabel("Описание работ").FillAsync(worcksDescription);
await page.GetByRole(AriaRole.Button, new() { Name = "Создать", Exact = true }).ClickAsync();
await page.GetByText("Редактировать").ClickAsync();
await page.GetByRole(AriaRole.Textbox, new() { Name = "Название реестра" }).FillAsync(currentRegistryNumber);
await page.GetByText("Сохранить").ClickAsync();
  • Вопрос задан
  • 53 просмотра
Решения вопроса 1
grantur5707
@grantur5707
Full Stack Web Developer
Привет!

Не очень понял трактовку твоего вопроса
Я просто не могу выделить части кода в отдельные методы. Мне нужно чтобы мой код размещался в разных методах...


Если ты хочешь сделать распределение твоего кода по разным методам таким образом, чтобы сессия браузера смогла выполняться дальше при переходе между методами, то как минимум стоит сделать инициализацию браузера и страницы глобальными.

Вот, например, так:

IBrowser browser;
IPage page;

async Task InitializeBrowserAsync()
{
    var playwright = await Playwright.CreateAsync();
    browser = await playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions { Headless = false });
    page = await browser.NewPageAsync();
}

async Task CreateRegistryAsync()
{
    await page.GetByRole(AriaRole.Button, new() { Name = "Создать реестр" }).ClickAsync();
    string strKitCategory = templateSheet.GetCell(currentSheetRow, (int)ExcellTemplateTableSheet.ColumnType.kitCategory);
    await page.GetByText(strKitCategory).ClickAsync();
}

async Task FillDetailsAsync()
{
    string rChKit = templateSheet.GetCell(currentSheetRow, (int)ExcellTemplateTableSheet.ColumnType.RCHKit);
    await page.GetByLabel("Комплект РЧ").FillAsync(rChKit);
    await page.GetByText(rChKit).ClickAsync();
}

async Task SubmitRegistryAsync()
{
    string worcksDescription = templateSheet.GetCell(currentSheetRow, (int)ExcellTemplateTableSheet.ColumnType.descriptionOfWorks);
    await page.GetByLabel("Описание работ").FillAsync(worcksDescription);
    await page.GetByRole(AriaRole.Button, new() { Name = "Создать", Exact = true }).ClickAsync();
}

async Task MainAsync()
{
    await InitializeBrowserAsync();
    await CreateRegistryAsync();
    await FillDetailsAsync();
    await SubmitRegistryAsync();
}


Если важно сохранять не только браузер, но и сессию пользователя, можешь использовать persistent context:

async Task InitializePersistentContextAsync()
{
    var playwright = await Playwright.CreateAsync();
    var browser = await playwright.Chromium.LaunchPersistentContextAsync("PATH", new BrowserTypeLaunchPersistentContextOptions { Headless = false });
    page = browser.Pages.First();
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы