Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.04.2016, 19:43   #1
fanat_96
Пользователь
 
Регистрация: 09.04.2016
Сообщений: 81
По умолчанию Загрузить файл в input type="file"

Здравствуйте. Как по нажатию на кнопку в поле input type="file" выбрать определенный файл? Например, по пути: D:\\1.txt
Использую компонент webbrowser

Делал так, но результата нет, он только переходит к
Код:
System.Windows.Forms.HtmlDocument doc = webBrowser1.Document;
            HtmlElement elFile = doc.GetElementById("ldf9");
            elFile.Focus();
            SendKeys.Send("D:\\1.txt" + "{ENTER}");
Файл нужно просто выбрать, без отправки формы

Код HTML:
<input type="file" id="ldF9" class="manFlFile" size="20" style="color:#FF0000;" name="file">
fanat_96 вне форума Ответить с цитированием
Старый 26.04.2016, 19:55   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Сложно.

Вряд ли так. По крайней мере не в новых версиях.

https://www.google.com/search?q=c%23...ser+input+file

В Awesomium относительно просто — там есть событие для обработки выбора файла, так что надо просто кликнуть по элементу.

А в Selenium совсем просто и без извращений.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 26.04.2016 в 19:57.
Alex11223 вне форума Ответить с цитированием
Старый 27.04.2016, 12:40   #3
fanat_96
Пользователь
 
Регистрация: 09.04.2016
Сообщений: 81
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Сложно.

Вряд ли так. По крайней мере не в новых версиях.

https://www.google.com/search?q=c%23...ser+input+file

В Awesomium относительно просто — там есть событие для обработки выбора файла, так что надо просто кликнуть по элементу.

А в Selenium совсем просто и без извращений.
Awesomium у меня не работает (потом надо студию переустановить, может из-за неё), Селениум не подходит из-за затратности по времени. А вот с webbrowser все нормально, осталось только выбор файлов сделать.

Нашел такое решение:
Код:
async Task PopulateInputFile(HtmlElement file)
        {
            file.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("D:\\1.jpg" + "{ENTER}");
            }, TaskScheduler.FromCurrentSynchronizationContext());

            file.InvokeMember("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 = webBrowser1.Document.GetElementsByTagName("input");
            foreach (HtmlElement file in elements)
            {
                if (file.GetAttribute("name") == "file")
                {
                    file.Focus();
                    await PopulateInputFile(file);
                }
            }
        }

        private void button6_Click(object sender, EventArgs e)
        {
            
            Populate().ContinueWith((_) =>
            {
                
            }, TaskScheduler.FromCurrentSynchronizationContext());
        }

Нашел Здесь, но вот большую часть кода я тупо не понимаю. Это работает, но вы можете объяснить что тут происходит? С английским у меня плохо, если что, поэтому перевести оригинальные комменты не могу.

Последний раз редактировалось fanat_96; 27.04.2016 в 12:45.
fanat_96 вне форума Ответить с цитированием
Старый 27.04.2016, 13:03   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Что в селениум затратно? Чтоб сохранялись куки и не надо было перезаходить вроде ж можно просто создать профиль в браузере и его указать.



https://www.google.com/search?q=c%23+async+await
https://www.google.com/search?q=c%23+task
https://www.youtube.com/watch?v=Hn-nysIK7ZI

Эквивалентно чему-то типа такого, только тут при вызове PopulateInputFile (без await) поток не будет ждать пока он выполнится и придется придумывать что-то для ожидания этого (установка bool флага и т.п.) или выполнять следующие действия в ContinueWith второго Delay.

Код:
void Populate()
{
    var elements = webBrowser1.Document.GetElementsByTagName("input");
    foreach (HtmlElement file in elements)
    {
        if (file.GetAttribute("name") == "file")
        {
            file.Focus();
            PopulateInputFile(file);
        }
    }
}

void PopulateInputFile(HtmlElement file)
{
    file.Focus();

    file.InvokeMember("Click");

    // delay the execution of SendKey to let the Choose File dialog show up
    Task.Delay(500).ContinueWith((t) =>
    {
        // this gets executed when the dialog is visible
        SendKeys.Send("D:\\1.jpg" + "{ENTER}");
        
        // delay continuation to let the Choose File dialog hide
        Task.Delay(500);
    }, TaskScheduler.FromCurrentSynchronizationContext());
}
Смысл в том, что (по задумке автора) надо ждать появления диалогового окна, и при этом не блокировать UI поток, иначе оно не появится пока он не разблокируется. Как более кривой вариант можно заменить на что-то типа

Код:
file.InvokeMember("Click");

for (int i = 0; i < 50; i++)
{
    Application.DoEvents();
    Thread.Sleep(10)
}

SendKeys.Send("D:\\1.jpg" + "{ENTER}");
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 27.04.2016 в 13:15.
Alex11223 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамическая генерация input type="radio" в html Тёма_) JavaScript, Ajax 6 23.09.2015 21:53
input type="hidden". Как сделать видимым? maksim_serg HTML и CSS 7 20.08.2015 11:03
Как передать значениет с <input type="text"> в тег <a href="serch.php?serch=(сюда)"> SevenXP PHP 3 22.04.2012 03:14
Передача данных с coockie в поле формы (input type="text") Olegzxc PHP 1 10.07.2011 14:36
Проблема с проверкой <input type="file"> Ang3r PHP 4 07.08.2009 20:13