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

时间:2019-05-15 23:12:43

标签: c# file-upload addeventlistener gecko geckofx

我在Winform应用程序中使用Geckofx填写网站上的表单。控件之一是“选择文件”按钮,它使您可以选择和上传本地文件。我想通过完全通过代码来完成此过程。

我设法通过代码单击了此按钮:

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 个答案:

答案 0 :(得分:1)

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

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