0

Недавно подключил в проект 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, но хотелось бы довести весь функционал до автоматизма. Отмечу, что иногда срабатывает все как надо и все поля на форме заполняются. Но это происходит редко. Чаще заполняется поле с торрентом, а остальные уже как когда.

FaNaT_96
  • 643
  • 7
  • 20
  • Я вам уже задавал вопрос, когда использовали CefSharp, он тот же: на кой черт вам браузер? – EvgeniyZ Jul 22 '20 at 13:59
  • @EvgeniyZ чтобы не изобретать колесо и добавлять материалы на сайт через него. Наверное, можно как-то с помощью Post-запросов это сделать, но решил пойти по пути наименьшего сопротивления) – FaNaT_96 Jul 22 '20 at 14:08
  • 2
    Вот как раз использование браузера - это трудный и запутанный путь, хоть многим он кажется проще. Вот вы сейчас страдаете из за компонента, который не подвластен вам, написан не пойми кем и как, оно вам надо? А так бы было сразу понятно "Ага, я отправляю тут POST запрос, сервер дает мне не тот результат, наверно я что-то забыл?!" – EvgeniyZ Jul 22 '20 at 14:12
  • @EvgeniyZ я вас понял) Тогда не могли бы вы ткнуть носом в статьи или любую другую инфу по тому, как правильно эти запросы отправлять? Наверное, это будет не то же самое, когда получаешь код страницы подобным запросом... – FaNaT_96 Jul 22 '20 at 14:18
  • 3
    Тут все зависит от задачи, ведь каждый сайт работает по своему. Ну а так, могу посоветовать два своих ответа (1 и 2), их достаточно для понимания как все это устроено и как стоит работать. – EvgeniyZ Jul 22 '20 at 14:22
  • Почему SendKeys? Разве в GeckoHtmlElement нельзя просто записать данные? Например file.InnerHtml = a + getTorrent; или file.Value, или через аттрибут, смотрите, куда там путь записывается после того как вы выбрали файл. И не надо будет диалог вызывать. – aepot Jul 22 '20 at 18:04
  • Если по-простому, то выше комментарии правильные. Браузер нужен только тогда, когда вам нужно, чтобы яваскрипты работали. Для сетевого взаимодействия с сервером браузер - тяжелое излишество. – aepot Jul 22 '20 at 18:13
  • @aepot Value, в котором хранится путь к файлу, можно указать через SetAttribute, только ничего не изменится - путь не прописывается. Разве сейчас подобные манипуляции не запрещены? Я в какой-то статье видел, что раньше можно было напрямую указать данные в таком input-е, но для безопасности эту функцию убрали. А по поводу post-запросов, то сейчас сижу, ковыряюсь, но тяжко это, когда никогда с этим толком не работал) – FaNaT_96 Jul 22 '20 at 18:58
  • @FaNaT_96 безопасность такого рода - фишка браузера, который вы используете. Странно было бы подобное блокировать в headless браузере, предназначенном для управления из кода, не находите? По поводу POST запросов, покажите пример запроса, я вам нарисую код. Ну или вот пример. – aepot Jul 22 '20 at 19:00
  • @aepot Но почему-то SetAttribute не хочет устанавливать путь к файлу... По поводу Post-запросов все оказалось проще. У хостера есть API - http://api.ucoz.net/ru/manual/load/entry. Осталось только понять как его юзать, т.к. там примеры для php) – FaNaT_96 Jul 22 '20 at 19:17
  • 1
    @FaNaT_96 ну вот, обычный JSON, примеров полинтернета, как тот что я показал по ссылке, только не FormUrlContent будет у вас, а StringContent, к которой будет json текст. – aepot Jul 22 '20 at 19:30
  • 1
    А, стоп, да, именно FormUrlContent, так что пример ровно точно в вашу тему. Практически готовенькое) – aepot Jul 22 '20 at 19:39
  • @aepot Подскажите, а как быть со строчкой require 'uAPImodule.php';? Если я правильно понял из документации, использование этого файла обязательно. – FaNaT_96 Jul 22 '20 at 21:21
  • 2
    Вы не PHP код переписывайте, а делайте запрос сами, нужного типа, на нужный адрес, с нужными параметрами. – EvgeniyZ Jul 22 '20 at 21:51

0 Answers0