Как выбрать и загрузить локальный файл на сайт, используя Geckofx в C #? - PullRequest
0 голосов
/ 16 мая 2019

Я использую Geckofx в своем приложении winform, чтобы заполнить форму на веб-сайте.Одним из элементов управления является кнопка «Выбрать файлы», которая позволяет выбрать и загрузить локальный файл.Я хочу автоматизировать этот процесс, выполнив это полностью с помощью кода.

Мне удалось нажать эту кнопку с помощью кода:

Gecko.DOM.GeckoButtonElement button = new Gecko.DOM.GeckoButtonElement(doc.GetElementsByClassName("choose_files_btn").First().DomObject);
button.Click();

В результате диалоговое окно файла открывается автоматически, но я хочуавтоматизируйте файл, выбрав деталь и нажав «ОК».Я попытался проверить веб-страницу, чтобы выяснить, могу ли я назначить путь к своему локальному файлу для некоторого элемента Gecko, но не смог найти ничего подобного.

Я также думал об обработке события открытия диалогового окна файла, ноНе удалось найти обработчик событий в Gecko.Я нашел обработчик событий Gecko.LauncherDialog.Download, который используется для обработки загрузки файла с помощью браузера Geckofx.Но такого обработчика событий для загрузки файлов с помощью браузера Geckofx нет, если он есть и я его пропустил, скажите.

Может быть, я смогу использовать обработчик событий не из Gecko, а из System, если я напишу обработчик событийкоторый будет перехватывать каждое событие диалога открытия файла, но я не знаю, возможно ли это вообще.

1 Ответ

1 голос
/ 20 мая 2019

Вот решение для загрузки без отображения диалога загрузки файла:

GeckoHtmlElement el = webbrowser.DomDocument.GetElementsByTagName("input").FirstOrDefault(elz => elz.GetAttribute("type") == "file"); //inpout type file element
var fileNames = new IntPtr[1];
fileNames[0] = new Gecko.CustomMarshalers.WStringMarshaler().MarshalManagedToNative(file); //file = path to file you want to upload


var domInput = Xpcom.QueryInterface<nsIDOMHTMLInputElement>(el.DOMHtmlElement);
domInput.MozSetFileNameArray(fileNames, (uint)fileNames.Length);

Marshal.ReleaseComObject(domInput);

DomEventArgs ev = webbrowser.Document.CreateEvent("HTMLEvents");
var webEvent = new Event(webbrowser.Window.DomWindow, ev.DomEvent as nsISupports);
webEvent.InitEvent("change", true, true);
el.GetEventTarget().DispatchEvent(ev);

new Gecko.CustomMarshalers.WStringMarshaler().CleanUpNativeData(fileNames[0]); //delete everything
...