2009-03-18 19 views
3

Wenn Sie die IE-Instanz über MSHTML steuern, wie können Sie die Dialogfelder zum Öffnen/Speichern für Nicht-HTML-Inhalte unterdrücken?Internet Explorer-Automatisierung: Wie kann der Dialog zum Öffnen/Speichern unterdrückt werden?

Ich brauche Daten von einem anderen System und importieren Sie es in unser. Aufgrund von Budgetbeschränkungen kann auf der anderen Seite für einige Zeit keine Entwicklung (z. B. WS) durchgeführt werden, so dass meine einzige Option im Moment das Verschrotten von Webseiten ist.

Die Remote-Site ist ASP.NET-basiert, so dass einfache HTML-Anfragen nicht funktionieren - zu viel JS.

Ich schrieb eine einfache C# -Anwendung, die MSHTML und SHDocView verwendet, um eine IE-Instanz zu steuern. So weit, so gut: Ich kann Login durchführen, zur gewünschten Seite navigieren, benötigte Felder ausfüllen und absenden.

Dann begegne ich ein paar Probleme:

Erstens ist dieser Bericht in einem neuen Fenster geöffnet wird. Ich vermute, dass ich auch an dieses Fenster anhängen kann, indem ich IE-Fenster im System aufzähle.

Zweitens ist problematischer, dass der Bericht selbst CSV-Datei ist und den Dialog Öffnen/Speichern auslöst. Ich möchte es vermeiden und IE die Datei an den angegebenen Speicherort speichern ODER ich bin in Ordnung mit dem programmatischen Klicken auch auf Dialogschaltflächen (wie?)

Ich bin eigentlich völlig Nicht-Windows-Typ (Unix/J2EE), und hoffe, dass jemand mit besserem Wissen mir einen Hinweis gibt, wie man diese Aufgaben erledigt.

Danke! http://msdn.microsoft.com/en-ca/library/aa770041.aspx

Kontrolle der Arten von Inhalten, die heruntergeladen werden und was das WebBrowser-Steuerelement tut mit ihnen, sobald sie heruntergeladen werden:

UPDATE

Ich habe ein viel versprechende Dokument auf MSDN gefunden. Sie können beispielsweise verhindern, dass Videos wiedergegeben werden, Skripts ausgeführt werden oder neue Fenster geöffnet werden, wenn Benutzer auf Verknüpfungen klicken, oder verhindern, dass Microsoft ActiveX-Steuerelemente heruntergeladen oder ausgeführt werden.

langsam durch das Lesen ...

UPDATE 2: IT ARBEIT MADE, Art ...

Schließlich habe ich es funktioniert, aber in einem hässlichen Art und Weise. Im Wesentlichen registriere ich einen Handler "vor dem Navigieren". Wenn dann im Handler die URL mit meiner Zieldatei übereinstimmt, lehne ich die Navigation ab, merke mir aber die URL und verwende die WebClient-Klasse, um direkt auf diese temporäre URL zuzugreifen und sie herunterzuladen.

ich hier den gesamten Code nicht kopiert werden kann, enthält es eine Menge Müll, aber hier sind die wesentlichen Teile:

Installation Handler:

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

Recording URL und dann herunterladen Cancelling (also Speichern verhindert Dialog erscheint):

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; 
    } 

Und in dem anrufenden Code mit Hilfe der gefundenen URL zum direkten Download:

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

     Thread.Sleep(10000); 

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

(Treiber ist ein einfacher Wrapper über IE Instanz = _IE)

Hoffnung, dass jemand hilft.

Antwort

0

Der einfachste Weg, dies zu tun, wäre, den MIME-Typ für CSV-Dateien auf dem System anzupassen, das den Download durchführt. IE versucht, die Datei wegen der Aktion zu downloaden, die mit CSV-Dateien verknüpft ist.

Ich denke, Sie können dies in Windows Explorer ändern, indem Sie zu Extras - Ordneroptionen - Dateitypen gehen. Wenn Sie CSV-Dateien mit Internet Explorer verknüpfen, wird die CSV-Datei in IE geöffnet. An diesem Punkt sollten Sie IE-Automatisierung verwenden können, um das aktuelle geöffnete Dokument in einer Datei zu speichern.

+0

Ich kann das Remote-System in keiner Weise ändern. Kann ich die IE-Einstellungen programmgesteuert für die Dauer des Prozesses ändern (dh nicht die Benutzereinstellungen beeinflussen)? –

+0

Sie müssen das Remote-System nicht ändern. Sie müssen die Einstellungen für den MIME-Typ auf dem System ändern, das das Scraping ausführt. –

+0

Entschuldigung, habe deine erste Aussage falsch gelesen. Wie kann ich die Einstellung von IE in meiner App ändern? Ich möchte sie nicht dauerhaft ändern, da der Benutzer (BA) ziemlich viele Berichte herunterlädt, und einige von ihnen sind in CSV. –

0

Sie können nicht vollständig kontrollieren, wie sich der Browser verhält, da der Endbenutzer seinen Browser so einstellen kann, dass er immer eine Datei mit einem bestimmten Inhaltstyp öffnet.

Verwandte Themen