【问题标题】:How to choose and upload a local file to a website using Geckofx in C#?如何在 C# 中使用 Geckofx 选择本地文件并将其上传到网站?
【发布时间】:2019-05-15 23:12:43
【问题描述】:

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

【问题讨论】:

    标签: c# file-upload addeventlistener gecko geckofx


    【解决方案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
    

    【讨论】:

    • 非常感谢!我刚刚对其进行了测试,它按预期工作。
    • 我认为这不再是一个可行的解决方案。 Mozilla 对MozSetFileNameArray() 的描述使它看起来不值得依赖。基于this question,我怀疑 GeckoFx60 已放弃支持。可悲的是,我没有任何建议。 @BlasterGod 您能否包含一些您可以使用的库版本?
    • Anarki,这适用于所有版本,但不幸的是 60 向上。我希望看到 60 及更高版本的解决方案
    • 这不适用于 v 60。请问还有其他解决方案吗?
    • @Anarki 我在this answer找到了 GeckoFx60 的解决方案
    猜你喜欢
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 2011-04-12
    • 2011-03-27
    • 2015-06-03
    • 1970-01-01
    • 2020-02-01
    • 1970-01-01
    相关资源
    最近更新 更多