C# 如何使用C中的Geckofx选择本地文件并将其上载到网站?
我在winform应用程序中使用Geckofx在网站上填写表单。其中一个控件是“选择文件”按钮,用于选择和上载本地文件。我想通过完全通过代码来实现这一过程的自动化 我通过代码点击了这个按钮:C# 如何使用C中的Geckofx选择本地文件并将其上载到网站?,c#,file-upload,addeventlistener,gecko,geckofx,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.DOM.GeckoButtonElement button = new Gecko.DOM.GeckoButtonElement(doc.GetElementsByClassName("choose_files_btn").First().DomObject);
button.Click();
因此,会自动打开一个文件对话框,但我想自动选择文件部件并单击“确定”。我试图检查网页,看看是否可以将本地文件的路径分配给Gecko元素,但找不到任何类似的内容
我还考虑过处理打开文件对话框的事件,但在Gecko中找不到任何事件处理程序。我找到了Gecko.LauncherDialog.Download事件处理程序,它用于处理使用Geckofx浏览器下载文件的操作。但使用Geckofx浏览器上传文件时并没有这样的事件处理程序,如果有,而且我错过了,请告诉我
如果我编写一个事件处理程序,它将捕获每个打开的文件对话框事件,但我不知道这是否可能,那么也许我可以使用一个事件处理程序,而不是Gecko的事件处理程序,而是系统的事件处理程序。这里有一个解决方案,可以在不显示文件上载对话框的情况下上载:
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
以下是一个解决方案,可以在不显示文件上载对话框的情况下进行上载:
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
非常感谢你!我刚刚测试了它,它按预期工作。我不认为这是一个可行的解决方案了。Mozilla对它的描述让它看起来不值得依赖。我怀疑GeckoFx60已经放弃了对它的支持。遗憾的是,我没有任何建议@BlasterGod你能不能包括一些你用过的库版本?Anarki,除了60以上的版本外,所有版本都可以使用。我想看到版本60的解决方案,非常感谢您!我刚刚测试了它,它按预期工作。我不认为这是一个可行的解决方案了。Mozilla对它的描述让它看起来不值得依赖。我怀疑GeckoFx60已经放弃了对它的支持。遗憾的是,我没有任何建议@BlasterGod你能不能包括一些你用过的库版本?Anarki,除了60以上的版本外,所有版本都可以使用。我希望看到版本60及以上的解决方案