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 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/
{
[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.