Я использую Playwright не для тестирования, а для автоматической загрузки документов на сайт, при этом у меня нет доступа к базе данных сайта. У меня возникла проблема с выделением части кода в отдельные методы. Мне нужно организовать код в разные методы так, чтобы выполнение продолжалось при переходе между ними. Например, такой фрагмент кода: <br/> <br/> <pre><code class="cs">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();</code></pre>
Чтобы отключить автоматическое закрытие браузера при выходе из функции в Playwright, вам нужно убедиться, что ваш браузер и страницы остаются открытыми после выполнения функций. В Playwright вы можете управлять жизненным циклом браузера и страницы с помощью структурирования вашего кода. Основные моменты, которые следует учитывать:
1. **Создайте асинхронные функции:** Оберните ваш код в асинхронные функции, чтобы вы могли использовать `await` для ожидания выполнения каждой операции.
2. **Не закрывайте браузер:** Убедитесь, что вы не вызываете метод `browser.CloseAsync()` или `context.CloseAsync()` после завершения выполнения ваших функций, если не хотите закрыть браузер.
3. **Используйте глобальные переменные (с осторожностью):** Если необходимо, вы можете передать контекст или страницу в функции через параметры, чтобы они были доступны в разных методах.
Вот пример, как можно ему следовать:
```csharp
class DocumentUploader
{
private IBrowser browser;
private IPage page;
public DocumentUploader(IBrowser browser, IPage page)
{
this.browser = browser;
this.page = page;
}
public async Task UploadDocument(int currentSheetRow)
{
await CreateRegistry();
// Другие методы могут быть вызваны здесь
}
private async Task CreateRegistry()
{
await page.GetByRole(AriaRole.Button, new() { Name = "Создать реестр" }).ClickAsync();
await SelectKitCategory();
await FillContractDetails();
await page.GetByRole(AriaRole.Button, new() { Name = "Создать", Exact = true }).ClickAsync();
await page.GetByText("Редактировать").ClickAsync();
// Продолжение...
}
private async Task SelectKitCategory()
{
await page.GetByLabel("Категория комплекта", new() { Exact = true }).ClickAsync();
string strKitCategory = templateSheet.GetCell(currentSheetRow, (int)ExcellTemplateTableSheet.ColumnType.kitCategory);
await page.GetByText(strKitCategory).ClickAsync();
// Другие действия
}
private async Task FillContractDetails()
{
string worcksDescription = templateSheet.GetCell(currentSheetRow, (int)ExcellTemplateTableSheet.ColumnType.descriptionOfWorks);
await page.GetByLabel("Описание работ").FillAsync(worcksDescription);
await page.GetByText("Сохранить").ClickAsync();
// Другие действия
}
}
```
В данном примере сконструирован класс `DocumentUploader`, который принимает экземпляры `IBrowser` и `IPage`. Метод `UploadDocument` управляет общим процессом загрузки документа, а другие методы становятся более специализированными и могут быть вызваны по мере необходимости.
Обратите внимание, что контекст и страницы остаются открытыми, до тех пор пока вы не вызовете метод закрытия, что позволяет вам работать с ними в разных методах вашего класса.
Также убедитесь, что вы правильно обрабатываете ошибки и завершаете ваши действия, чтобы избежать закрытия браузера неожиданно или в случае возникновения исключений.
Привет! <br/> <br/> Не очень понял трактовку твоего вопроса <blockquote>Я просто не могу выделить части кода в отдельные методы. Мне нужно чтобы мой код размещался в разных методах...</blockquote> <br/> <br/> Если ты хочешь сделать распределение твоего кода по разным методам таким образом, чтобы сессия браузера смогла выполняться дальше при переходе между методами, то как минимум стоит сделать инициализацию браузера и страницы глобальными. <br/> <br/> Вот, например, так: <br/> <br/> <pre><code class="cs">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();
}</code></pre> <br/> <br/> Если важно сохранять не только браузер, но и сессию пользователя, можешь использовать persistent context: <br/> <br/> <pre><code class="cs">async Task InitializePersistentContextAsync()
{
var playwright = await Playwright.CreateAsync();
var browser = await playwright.Chromium.LaunchPersistentContextAsync("PATH", new BrowserTypeLaunchPersistentContextOptions { Headless = false });
page = browser.Pages.First();
}</code></pre>