TransWikia.com

Автоматическое заполнение input type="file" C#

Stack Overflow на русском Asked by FaNaT_96 on November 24, 2021

Недавно подключил в проект geckofx 60 вместо webbrowser, т.к. он совсем перестал адекватно работать с JS.

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

//Вставляем торрент
    async Task PopulateInputFile(GeckoHtmlElement file)
    {
        file.Focus();
        string a = Properties.Settings.Default.diskString;
        // delay the execution of SendKey to let the Choose File dialog show up
        var sendKeyTask = Task.Delay(500).ContinueWith((_) =>
        {
            // this gets executed when the dialog is visible
            SendKeys.Send(a + getTorrent + "{ENTER}");
        }, TaskScheduler.FromCurrentSynchronizationContext());

        file.Click(); // this shows up the dialog

        await sendKeyTask;

        // delay continuation to let the Choose File dialog hide
        await Task.Delay(500);
    }

    //вставляем постер
    async Task PopulateInputFile_poster(GeckoHtmlElement file_poster)
    {
        file_poster.Focus();

        // delay the execution of SendKey to let the Choose File dialog show up
        var sendKeyTask = Task.Delay(500).ContinueWith((_) =>
        {
            // this gets executed when the dialog is visible
            SendKeys.Send(Properties.Settings.Default.diskString  + "poster.jpg" + "{ENTER}");
        }, TaskScheduler.FromCurrentSynchronizationContext());

        file_poster.Click(); // this shows up the dialog

        await sendKeyTask;

        // delay continuation to let the Choose File dialog hide
        await Task.Delay(500);
    }
}

async Task Populate()
    {
        var elements = geckoWebBrowser1.Document.GetElementsByTagName("input");

        // торрент
        foreach (GeckoHtmlElement file in elements)
        {
            if (file.GetAttribute("name") == "file")
            {
                file.Focus();
                await PopulateInputFile(file);
            }
        }

        //постер
        foreach (GeckoHtmlElement file_poster in elements)
        {
            if (file_poster.GetAttribute("name") == "screen")
            {
                file_poster.Focus();
                await PopulateInputFile_poster(file_poster);
            }
}
            }

Вызываю так:

Populate().ContinueWith((_) =>
        {

        }, TaskScheduler.FromCurrentSynchronizationContext());

И если в webbrowser он работал без каких-либо нареканий, то здесь есть проблема с тем, что он не всегда фиксирует нажатие клавиши enter, в результате чего диалоговое окно остается висеть, а остальные появляются поверх него. Можно конечно, просто потом вручную нажать enter, но хотелось бы довести весь функционал до автоматизма. Отмечу, что иногда срабатывает все как надо и все поля на форме заполняются. Но это происходит редко. Чаще заполняется поле с торрентом, а остальные уже как когда.

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP