Accéder au contenu html d'une page comportant des frames

Contenu du snippet

Pour Visual Studio 2005 Beta...

Dans une application Windows Forms, avec un contrôle WebBrowser (anciennement AxWebBrowser1), ce petit bout de code permet de récupérer le code HTML de pages qui comportent des Frames.

Le contrôle WebBrowser ne permet pas de faire cette opération, ou alors je n'ai pas réussi à trouver la bonne manip'...

J'ai donc utilisé, en parallèle, un objet de type InetClass (Internet Transfer).

A voir si c'est applicable dans les versions moins récentes de Visual C#.

Source / Exemple :


using InetCtlsObjects;
using mshtml;
using System;
using System.Windows.Forms;

namespace MonEspaceDeNom
{

  public class FenetreWebBrowser : System.Windows.Forms.Form
  {

    // Attributs privés
    private string url;
    private string strFrame;
    private InetClass monInet;

    // Généré par Visual Studio 2005 Beta
    private WebBrowser monWebBrowser;
    // private AxWebBrowser1 monAxWebBrowser1 pour les versions précédentes
    private System.ComponentModel.IContainer components;

    public FenetreWebBrowser()
    {

      //
      // Requis pour la prise en charge du Concepteur Windows Forms
      //
      InitializeComponent();

      //
      // TODO : ajoutez le code du constructeur après l'appel à InitializeComponent
      //
      monInet  = new InetClass();
      monInet.AccessType = AccessConstants.icDirect;
      monInet.Protocol = ProtocolConstants.icHTTP;
    
      // Supprime les messages d'erreur de scripts...
      monWebBrowser.ScriptErrorsSuppressed = true;
      // monAxWebBrowser1.Silent = true pour les versions antérieures

    }

    /// <summary>
    /// Nettoyage des ressources utilisées.
    /// </summary>
    protected override void Dispose( bool disposing )
    {
      if( disposing )
      {
        if (components != null) 
        {
          components.Dispose();
        }
      }
      base.Dispose( disposing );
    }

#region Windows Form Designer generated code
    /// <summary>
    /// Méthode requise pour la prise en charge du concepteur - ne modifiez pas
    /// le contenu de cette méthode avec l'éditeur de code.
    /// </summary>
    private void InitializeComponent()
    {
      this.components = new System.ComponentModel.Container();
      this.monWebBrowser = new System.Windows.Forms.WebBrowser();
      this.SuspendLayout();

// 
// monWebBrowser
// 
      this.monWebBrowser.Location = new System.Drawing.Point(0, -2);
      this.monWebBrowser.Name = "monWebBrowser";
      this.monWebBrowser.Size = new System.Drawing.Size(843, 645);
      this.monWebBrowser.TabIndex = 1;
      this.monWebBrowser.Navigating += new System.Windows.Forms.WebBrowserNavigatingEventHandler(this.monWebBrowser _Navigating);

// 
// FenetreWebBrowser
//
      this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
      this.ClientSize = new System.Drawing.Size(844, 644);
      this.Controls.Add(this.monWebBrowser);
      this.Load += new System.EventHandler(this.FenetreWebBrowser_Load);
      this.Name = "FenetreWebBrowser";
      this.Text = "FenetreWebBrowser";
      this.ResumeLayout(false);

    }

#endregion

/// <summary>
/// Point d'entrée principal de l'application.
/// </summary>

    [STAThread]
    static void Main() 
    {
      Application.Run( new FenetreWebBrowser() );
    }

    private void DistriGameWB_Load(object sender, System.EventArgs e)
    {

      // Variables inutiles dans la version 2005, mais indispensables dans les versions antérieures
      object o = url;
      object param = System.Reflection.Missing.Value;

      // Connection au site
      url = "http://www.un_site_avec_des_frames.com/";
      monBrowser.Navigate( url );
      // monAxWebBrowser1.navigate( ref o, ref param ) pour les versions précédentes

    }

    private void monWebBrowser_Navigating(object sender, WebBrowserNavigatingEventArgs e)
    {

      if (e.TargetFrameName == "NomDeLaFramePourLaquelleOnSouhaiteAvoirLeContenu")
      {
        strFrame = (string)monInet.OpenURL( e.Url, DataTypeConstants.icString );
      }

    }

  }

}

Conclusion :


En espérant que ce code vous aidera.

Ca fait plusieurs semaines (voire mois) que je cherche sur tous les forums une solution 100% C#. A défaut, j'avais utilisé VB6 pour faire ce petit bout de code (car VB6 permet d'accéder au innerHTML des frames). Sans succès.

En désespoir de cause, j'ai essayé cette solution... Ca a l'air de fonctionner, tout au moins pour mes propres besoins. Quelques adaptations seront peut-être nécessaires pour vous...

Dans le code ci-dessus, la navigation se fait sur l'événement Load de la fenêtre. Il est bien sûr possible de le déporter sur clic d'un bouton, ou tout autre méthode.

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.