【问题标题】:Disable FileDownload Popup in Screen Scraping (using Webbrowser control)在屏幕抓取中禁用 FileDownload 弹出窗口(使用 Webbrowser 控件)
【发布时间】:2018-04-03 16:35:59
【问题描述】:

问题:我正在寻找绕过 FileDownload 弹出窗口并自动下载文件的方法。

实施细节
在我的 Windows 应用程序中,我使用 Webbrowser 组件来创建一个屏幕抓取应用程序。 我的 webBrowser1 使用一个视图呈现,该视图包含一个包含锚元素的 td 列(在其他 td 列中)的表(实际页面中使用的 Gridview)。单击锚点将从 SharePoint 下载相关文件。
一个样本:

<td><a href="javascript:__doPostBack('ctl00$PlaceHolderMain$TOC$ctl00','DownloadFile$0')">File 1</a></td>

为了自动下载,在我的 Windows 窗体中,我确实有一个“下载”按钮,在该按钮中尝试下载表中的第一个文件(最终将下载所有文档)。

我的挑战是下载文件,因为它显示在 FileDowload 弹出窗口中。
有没有办法禁用此弹出窗口并自动将文件下载到某个文件夹中。我知道它试图模仿 IE 功能。 我的下载代码如下:

private void btnDownload_Click(object sender, EventArgs e)
        {
            webBrowser1.Document.InvokeScript("__doPostBack", new string[] { "ctl00$PlaceHolderMain$TOC$ctl00", "DownloadFile$0"});

        } 

我尝试了各种方法。一种这样的方法是使用“urlmon.dll”并使用它的 URLDownloadToFile 方法。但看起来由于 URL 不是正常的 URL,它仍然不断提供 FileDownload 弹出窗口。

我尝试的另一种方法是使用“user32.dll”自动点击并使用 SendKeys 发送 {TAB} 和 {Enter} 键,但我无法获得此弹出窗口的句柄。

IntPtr hwnd = FindWindow("#32770", "File Download");
        IntPtr a5 = FindWindow("#32770 (Dialog)", "File Download");
        IntPtr nullptr = (IntPtr)0;
        if (hwnd != nullptr)
        {
            SetActiveWindow(hwnd);
            SendKeys.SendWait("{TAB}");
            //SendKeys.SendWait("%S");
        }

【问题讨论】:

  • 听起来你是正确的道路。您是否尝试过在 Visual Studio 中使用 Spy++ 来查看句柄的外观以及该窗口的外观?很多时候,Windows 都隐藏在 Windows 内部,如果您没有引用正确的,它就不起作用。
  • 您可能认为您拥有正确的窗口,但有时实际正确的窗口是您拥有的句柄的子窗口等。
  • 谢谢亚历山大,我会试一试的!如果您看到其他实现相同目标的好选择(如果有),请告诉我。我还尝试了按照下面的链接禁用 IE 浏览器中的某些属性的建议,但看起来其中一些选项在 IE 中不再可用。 IE 被删除,因为它更多的是安全问题。链接:superuser.com/questions/246553/…

标签: c# webbrowser-control screen-scraping


【解决方案1】:

//下载事件开始或下载按钮后点击文件下载弹出 // 将出现在 webbrowser 控件中。输入以下代码

            Thread now = new Thread(() =>
            {
                Thread.Sleep(2000); 
                // string nu = GetActiveWindowTitle();
                SendKeys.SendWait("{Tab}");
                SendKeys.SendWait("{Tab}");
                SendKeys.SendWait("{Tab}");
                SendKeys.SendWait("{Enter}"); 
                Thread.Sleep(4000); 
                // now create filename path
                string filepath=@"c:\download\thisdownloadfilehere.pdf"
                SendKeys.SendWait(filepath); 
                SendKeys.SendWait("{Tab}");
                SendKeys.SendWait("{Tab}");
                SendKeys.SendWait("{Tab}");
                SendKeys.SendWait("{Enter}");

            });
            now.Start(); 

【讨论】:

  • 在字符串 filepath=……之后添加。它缺少一个分号;
猜你喜欢
  • 1970-01-01
  • 2011-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-03
  • 1970-01-01
相关资源
最近更新 更多