Ответы пользователя по тегу C#
  • Как в webview2 Заполнить поле типа file?

    @Uncleruc1
    В WebView2 есть несколько способов автоматизировать заполнение полей типа file, но основное ограничение связано с безопасностью браузера, так как доступ к файловым полям строго ограничен и браузеры не позволяют напрямую задавать значения для этих полей через JavaScript. Ваш текущий подход с использованием SendKeys имитирует пользовательский ввод, что позволяет обходить это ограничение, но действительно может быть медленным при большом количестве полей.

    Вот несколько возможных альтернатив для ускорения процесса:

    Пакетная обработка файлов: Вместо того, чтобы обрабатывать каждое поле по одному, можно попытаться сгенерировать команды для всех полей и запустить их параллельно. Например, можно использовать параллельные задачи для вызова метода PopulateInputFile_poster сразу для нескольких полей:
    async Task PopulateMultipleFiles(Dictionary<string, string> fileMappings)
    {
        var tasks = fileMappings.Select(async kvp =>
        {
            var fileId = kvp.Key;
            var filePath = kvp.Value;
            ExecuteScript($"document.getElementById(\"{fileId}\").focus();");
    
            var sendKeyTask = Task.Delay(1000).ContinueWith((_) =>
            {
                SendKeys.Send(filePath + "{ENTER}");
            }, TaskScheduler.FromCurrentSynchronizationContext());
    
            ExecuteScript($"document.getElementById(\"{fileId}\").click();");
    
            await sendKeyTask;
            await Task.Delay(1000);
        });
    
        await Task.WhenAll(tasks);
    }
    
    var fileMappings = new Dictionary<string, string>
    {
        { "fln1", "poster.webp" },
        { "fln2", "image2.jpg" },
        // Добавьте остальные файлы
    };
    
    await PopulateMultipleFiles(fileMappings);

    WebDriver / Selenium: Хотя WebView2 более легкий и быстрый, использование Selenium с WebDriver может предоставить более гибкие возможности автоматизации, в том числе возможность работы с множеством полей через драйвер:
    IWebDriver driver = new EdgeDriver();
    IWebElement fileInput = driver.FindElement(By.Id("fln1"));
    fileInput.SendKeys("C:\\path\\to\\poster.webp");

    Это может быть быстрее для массового заполнения полей.

    Использование JavaScript и локальных API: Если у вас есть контроль над страницей, можно разработать API для загрузки файлов через JavaScript, но это требует модификации самой страницы, что не всегда возможно.

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

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