我在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的事件处理程序,如果我编写了一个事件处理程序,它将捕获每个打开的文件对话框事件,但是我不知道那是否可能。
答案 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