La simulation de navigation dans internet explorer avec Interop.SHDocVw

Par fois le besoin de simuler un internaute (clic souris ,remplir input ,choisir radioBox/CheckBox…) dans un site et de récupérer le résultat, est la dernière solution qui vous reste. dans mon cas, j’ai été obligé de faire ça, afin d’avoir extraire une information depuis un site Web (dans l’absence d’un web service dédié ) .Voila je partage avec vous ce que j’ai trouvé :

Class Internet Explorer Simulation :

 public class IESimulatorClass
    {
        public string Url { get; set; }
        public SHDocVw.InternetExplorer IE { get; private set; }
        public Process IEProcess { get; set; }
        public bool IsReadyToGetData { get; set; }
        #region StartIE Simulator
        public IESimulatorClass(string _url)
        {
            Url = _url;
            IE = GetIEIntance();
            if (IE == null)
                return;

            IE.Width = IE.Height = 800;
            IE.Visible = true;//false
            IE.DocumentComplete += IE_DocumentComplete;
        }

        void IE_DocumentComplete(object pDisp, ref object URL)
        {
            IsReadyToGetData = true;
        }

        private SHDocVw.InternetExplorer GetIEIntance()
        {
            SHDocVw.ShellWindowsClass shellwindows = new SHDocVw.ShellWindowsClass();
            SHDocVw.InternetExplorer IE;
            for (int i = 1; i <= shellwindows.Count; i++)
            {
                IE = (SHDocVw.InternetExplorer)shellwindows.Item(i);
                if (IE != null)
                {
                    if (IE.LocationURL.Contains(Url))
                    {
                        foreach (System.Diagnostics.Process p in System.Diagnostics.Process.GetProcesses())
                        {
                            if (p.MainWindowHandle != new System.IntPtr(IE.HWND))
                            continue;
                                IEProcess = p;
                                break;
                        }
                        return IE;
                    }
                }
            }
            return StartIEInstanceProcess();
        }
     
        private SHDocVw.InternetExplorer StartIEInstanceProcess()
        {
            IEProcess = StartIEProcess();
            SHDocVw.ShellWindows foundBrowsers = new SHDocVw.ShellWindowsClass();
            foreach (SHDocVw.InternetExplorer Browser in foundBrowsers)
            {
                if (new System.IntPtr(Browser.HWND) != (IEProcess.MainWindowHandle))
                    continue;

                IE = Browser;
                break;
            }
            return IE;
        }

        private static System.Diagnostics.Process StartIEProcess()
        {
            Process newProcess = new Process();
            newProcess.StartInfo.CreateNoWindow = true;
           // newProcess.StartInfo.UseShellExecute = false;
            newProcess.StartInfo.FileName = @"C:\Program Files\Internet Explorer\iexplore.exe";;
            newProcess.StartInfo.Arguments = "-new -nohome";
            newProcess.Start();
            System.Threading.Thread.Sleep(3000);//attendre que le process demarrer
            return newProcess;
        }
        #endregion

        #region GetData

        public void GoToUrl(string url)
        {
            IsReadyToGetData = false;
            object obj = string.Empty;
            if (IE != null)
                IE.Navigate(url, ref obj, ref  obj, ref  obj, ref obj);
            else
                return;
            WaitTobeReady();
        }

        public bool IsNavigated(string url)
        {
            if (IE != null)
                return IE.LocationURL.Contains(url);
            return false;
        }
        public void SetHTMLInputValue(string id, string value)
        {
           // mshtml.HTMLInputElementClass input =GetInputElement(id);
              mshtml.IHTMLElement input=  GetElementById(id);
            if (input == null)
                return;
          //  input.value = value;
            input.setAttribute("value", value);
         
        }
        public void ClickHTMLButton(string btnId)
        {
            IsReadyToGetData = false;
         //   mshtml.HTMLInputElementClass input = GetInputElement(btnId);
            mshtml.IHTMLElement input = GetElementById(btnId);
            if (input == null)
                return;
            input.click();
            WaitTobeReady();
        }
        public void SetRadiobox(string id)
        {
            IsReadyToGetData = false;
            //   mshtml.HTMLInputElementClass input = GetInputElement(btnId);
            mshtml.IHTMLElement input = GetElementById(id);
            if (input == null)
                return;
            input.click();
           // WaitTobeReady();
        }

 
        public mshtml.IHTMLElement GetElementById(string id)
        {
            mshtml.HTMLDocument document = ((mshtml.HTMLDocument)IE.Document);
            mshtml.IHTMLElement element = document.getElementById(id);
            return element;
        }

        private mshtml.HTMLInputElementClass GetInputElement(string id)
        {
            return (mshtml.HTMLInputElementClass)GetElementById(id);
        }

       

        private void WaitTobeReady()
        {
            while (!IsReadyToGetData)
            {
                System.Threading.Thread.Sleep(1000);
            }
        }

        #endregion

    }

Et pour tester j’ai pris l’exemple de s'authentifier à http://chat.developpez.com/

class Program
{

        [STAThread]
        static void Main()
        {
            signintoDeveloppezChat();        
        }

        public static void signintoDeveloppezChat()
        {
            string DeveloppezChatUrl = @"http://chat.developpez.com/";
           
            IESimulatorClass ie = new IESimulatorClass(DeveloppezChatUrl);
            try
            {
                ie.GoToUrl(DeveloppezChatUrl);
                if (ie.IsNavigated(DeveloppezChatUrl))
                {
                    ie.SetHTMLInputValue("identPseudo", "azstar");//identifiant
                    ie.SetHTMLInputValue("identMdp", "*******");//mot de passe
                    ie.SetRadiobox("salonConnexion0");//choisir le salon "Développement Web"
                    ie.ClickHTMLButton("identAction");
                }
            }
            catch (Exception e)
            {
                throw e;
            }
        }
}

Edit : j’espère que j'ai donné un code claire et je suis toute a fait la pour expliquer mon code et je suis à l’écoute pour toute suggestion pour l’améliorer.

Voir source

Laisser un commentaire