Internet Explorer Automation: как отключить диалог открытия / сохранения? - PullRequest
4 голосов
/ 18 марта 2009

При управлении экземпляром IE через MSHTML, как подавить диалоги открытия / сохранения для содержимого, отличного от HTML?

Мне нужно получить данные из другой системы и импортировать их в нашу. Из-за бюджетных ограничений никакое развитие (например, WS) не может быть выполнено на другой стороне в течение некоторого времени, поэтому мой единственный вариант на данный момент - это очистка от веб-страниц.

Удаленный сайт основан на ASP.NET, поэтому простые запросы HTML не будут работать - слишком много JS.

Я написал простое приложение на C #, которое использует MSHTML и SHDocView для управления экземпляром IE. Пока все хорошо: я могу войти в систему, перейти на нужную страницу, заполнить необходимые поля и отправить.

Тогда я сталкиваюсь с парой проблем:

Во-первых, отчет открывается в другом окне. Я подозреваю, что могу присоединиться и к этому окну, перечисляя окна IE в системе.

Во-вторых, более хлопотно то, что сам отчет представляет собой файл CSV и вызывает диалог открытия / сохранения. Я хотел бы избежать этого и заставить IE сохранить файл в заданном месте ИЛИ Я в порядке с программным нажатием диалоговых кнопок тоже (как?)

Я вообще-то не пользователь Windows (unix / J2EE) и надеюсь, что кто-то с большими знаниями подскажет мне, как выполнять эти задачи.

Спасибо!

UPDATE

Я нашел многообещающий документ на MSDN: http://msdn.microsoft.com/en-ca/library/aa770041.aspx

Управление типами загружаемого контента и действиями WebBrowser Control после загрузки. Например, вы можете запретить воспроизведение видео, запуск сценариев или открытие новых окон, когда пользователи нажимают на ссылки, или запретить загрузку или выполнение элементов управления Microsoft ActiveX.

Медленно читая ...

ОБНОВЛЕНИЕ 2: СДЕЛАНО, РАБОТАЕТ, ВИД ... ... 1035 *

Наконец-то я заставил это работать, но безобразно. По сути, я регистрирую обработчик «до навигации», затем в обработчике, если URL-адрес совпадает с моим целевым файлом, я отменяю навигацию, но запоминаю URL-адрес и использую класс WebClient для доступа и загрузки этого временного URL-адреса напрямую.

Я не могу скопировать весь код здесь, он содержит много мусора, но вот основные части:

Установка обработчика:

_IE2.FileDownload += new DWebBrowserEvents2_FileDownloadEventHandler(IE2_FileDownload);
_IE.BeforeNavigate2 += new DWebBrowserEvents2_BeforeNavigate2EventHandler(IE_OnBeforeNavigate2);

Запись URL, а затем отмена загрузки (что препятствует появлению диалогового окна «Сохранить»):

public string downloadUrl;

void IE_OnBeforeNavigate2(Object ob1, ref Object URL, ref Object Flags, ref Object Name, ref Object da, ref Object Head, ref bool Cancel)
{
    Console.WriteLine("Before Navigate2 "+URL);

    if (URL.ToString().EndsWith(".csv"))
    {
        Console.WriteLine("CSV file");
        downloadUrl = URL.ToString();
    }

    Cancel = false;
}

void IE2_FileDownload(bool activeDocument, ref bool cancel)
{
    Console.WriteLine("FileDownload, downloading "+downloadUrl+" instead");
    cancel = true;
}

    void IE_OnNewWindow2(ref Object o, ref bool cancel)
    {
        Console.WriteLine("OnNewWindow2");

        _IE2 = new SHDocVw.InternetExplorer();
        _IE2.BeforeNavigate2 += new DWebBrowserEvents2_BeforeNavigate2EventHandler(IE_OnBeforeNavigate2);
        _IE2.Visible = true;
        o = _IE2;

        _IE2.FileDownload += new DWebBrowserEvents2_FileDownloadEventHandler(IE2_FileDownload);

        _IE2.Silent = true;

        cancel = false;
        return;
    }

А в коде вызова используйте найденный URL для прямой загрузки:

        ...
        driver.ClickButton(".*_btnRunReport");
        driver.WaitForComplete();

        Thread.Sleep(10000);

        WebClient Client = new WebClient();
        Client.DownloadFile(driver.downloadUrl, "C:\\affinity.dump");

(драйвер - это простая оболочка над экземпляром IE = _IE)

Надеюсь, это кому-нибудь поможет.

Ответы [ 2 ]

0 голосов
/ 18 марта 2009

Вы не можете полностью контролировать поведение браузера, потому что конечный пользователь может настроить свой браузер так, чтобы он всегда открывал файл с определенным типом содержимого.

0 голосов
/ 18 марта 2009

Самый простой способ сделать это - настроить тип MIME для файлов CSV в системе, которая выполняет загрузку. IE пытается загрузить файл из-за действия, связанного с файлами .CSV.

Я думаю, что вы можете изменить это в Windows Explorer, перейдя в Инструменты-Параметры папки-Типы файлов. Если вы связываете файлы CSV с Internet Explorer, тогда файл CSV откроется в IE. На этом этапе вы сможете использовать автоматизацию IE для сохранения текущего открытого документа в файл.

...