如何在 C# 中使用 Geckofx 选择本地文件并将其上传到网站?

How to choose and upload a local file to a website using Geckofx in C#?

我在我的 winform 应用程序中使用 Geckofx 来填写网站上的表格。其中一个控件是按钮 "Choose Files",它允许您 select 并上传本地文件。我想通过代码完全执行此操作来自动执行此过程。

我通过代码成功点击了这个按钮:

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

因此,文件对话框会自动打开,但我想自动执行文件选择部分并单击 'OK'。我尝试检查网页以查找是否可以将我的本地文件的路径分配给某个 Gecko 元素,但找不到任何此类元素。

我也想过处理打开文件对话框的事件,但在 Gecko 中找不到任何事件处理程序。我找到了 Gecko.LauncherDialog.Download 事件处理程序,它用于处理使用 Geckofx 浏览器下载文件。但是使用 Geckofx 浏览器上传文件没有这样的事件处理程序,如果有并且我错过了,请告诉我。

也许我可以使用一个不是来自 Gecko 而是来自 System 的事件处理程序,如果我编写一个事件处理程序来捕获每个打开的文件对话框事件,但我不知道这是否可行。

这是一个解决方案,可以在不显示文件上传对话框的情况下上传:

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