Seiten
Zuletzt im Ohr
Zuletzt im Sinn
Archiv
- März 2010 (5)
- Februar 2010 (3)
- Dezember 2009 (2)
- November 2009 (3)
- Oktober 2009 (17)
- September 2009 (7)
- August 2009 (7)
- Juli 2009 (3)
- Juni 2009 (2)
- Mai 2009 (4)
- April 2009 (1)
- März 2009 (3)
- Februar 2009 (11)
- Januar 2009 (14)
- Dezember 2008 (6)
- November 2008 (9)
- Oktober 2008 (6)
- September 2008 (9)
Tagcloud
Partner/Links
- gb-pix.de - Gästebuchbilder, Jappy, MySpace…
- Gratis SMS - Kostenlos ohne Anmeldung SMS verschicken
- icq-tools - Viele Tools für ICQ!
- Kostenlose Browsergames - Kostenlose Browsergames
- Servervoice Blog - Servervoice Blog
- Wordpress Theme
Network
C# – Automatischer Login mit dem Webbrowser-Control
…Arbeiten mit dem Webbrowser.Document
Da ich schon öfters gefragt wurde, wie man Logins auf Webseiten mit Hilfe von C# automatisieren kann, möchte ich euch heute Anhand von www.arcor.de zeigen, wie man den Login Prozess automatisiert.
Wem die Schritt-für-Schritt Erklärung zu lang ist, kann auch einfach bis zum Ende des Posts scrollen und sich dort das DemoProjekt herunterladen.
Zuerst öffnen wir das Visual Studio und erstellen eine neue Windows Forms-Anwendung. Ich habe der Applikation hier den Namen AutoLogin gegeben.
Danach fügen wir dem Form über den Designer einen Button und ein Webbrowser-Control hinzu. Das Ergebnis sollte nun wie folgt aussehen.
Im nächsten Schritt konfigurieren wir das Webbrowser-Control. Über den Eigenschaften-Dialog stellen wir den Wert ScriptErrorsSuppressed auf true. Nun fügen wir dem Webbrowser-Control noch den DocumentCompleted und dem Button den Click Eventhandler hinzu.
Die Codeansicht eures Forms sollte nun in etwa wie folgt aussehen.
[sourcecode language="csharp"] using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace AutoLogin
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void buttonLogin_Click(object sender, EventArgs e)
{
}
private void webBrowserLogin_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
}
}
}
[/sourcecode]
Da wir uns ja auf arcor.de einloggen wollten hinterlegen wir dem Button nun die Methode um die Homepage von Arcor im Webbrowser aufzurufen.
Klickt man nun auf den Button wird die Homepage im Browser aufgerufen. Sobald die Seite komplett geladen ist, greift der DocumentCompleted Eventhandler.
Dort überprüfen wir dann auch, ob die richtige Seite geladen wurde. (Im Moment eigentlich unnötig, für spätere Verwendung aber sicherlich sinnvoll, wenn zum Beispiel mehrere Homepages/Services automatisiert werden sollen.)
Wenn ihr das getan habt, sollte euer Code in etwa so aussehen.
[sourcecode language="csharp"]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace AutoLogin
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void buttonLogin_Click(object sender, EventArgs e)
{
webBrowserLogin.Navigate("http://www.arcor.de/");
}
private void webBrowserLogin_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if (webBrowserLogin.Url.ToString() == "http://www.arcor.de/")
{
}
}
}
}[/sourcecode]
Nun kommt der einzige etwas “aufwendigere” Schritt. Wir wollen nun, dass unser Programm die Felder des Logins automatisch ausfällt und danach auf “einloggen” klickt.
Hier für müssen wir jedoch zuerst herausfinden, wie die einzelnen Felder im HTML-Code der Seite heißen, um sie dann später mit unserem Programm ansteuern zu können.
Ich habe dafür Firefox verwendet, da man dort mehr Möglichkeiten hat den Quellcode einer Seite zu analysieren.
Nach dem Laden der Arcor-Seite im Firefox habe ich das LoginFormular markiert und mir per Rechtsklick den “ausgewählten Quelltext” anzeigen lassen (siehe Bilder).
Dank Firefox befinden wir uns nun schon an der richtigen Stelle im Quelltext. Wir suchen nun nach den Namen, oder IDs der beiden Input-Felder (Benutzername, Passwort) und dem Button für den Login.
Im Beispiel Arcors sind folgende Teile des Quelltextes relevant.
(siehe Bild rechts – anklicken zum Vergrößern)
Mit Hilfe dieser neuen Erkentnisse steuern wir die Elemente nun mit unserem Programm an und befüllen die Felder.
Hierzu durchlaufen wir mit einer foreach-Schleife ein Array aller HTML-Elemente, die gerade im Webbrowser-Control angezeigt werden und überprüfen ob die Eigenschaften des aktuellen Elements auf die von uns soeben herausgefunden Werte zutreffen.
Ist dem so, “befüllen” wir das Element.
In einem zweiten Durchlauf suchen wir nach dem Button. Dies dient rein zur Absicherung. (Würde der Button in dem Array mit den HTML-Elementen zu früh auftauchen, so würden wir ja quasi den Login auslösen, bevor die Felder ausgefüllt sind.)
Das ganze sieht dann am Ende in etwa so aus.
[sourcecode language="csharp"]
private void webBrowserLogin_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if (webBrowserLogin.Url.ToString() == "http://www.arcor.de/")
{
foreach (HtmlElement elem in webBrowserLogin.Document.All)
{
if (elem.Name == "user_name") // Name des HTMLinputs
{
elem.InnerText = "name"; // euer Benutzername
}
if (elem.Name == "password") // Name des HTMLinputs
{
elem.InnerText = "pwd"; // euer Passwort
}
}
foreach (HtmlElement elem in webBrowserLogin.Document.All)
{
if (elem.GetAttribute("value") == "Login")
{
elem.InvokeMember("Click");
}
}
}
}
[/sourcecode]
Das war’s eigentlich auch schon. Nun könnt ihr euer Projekt einfach mal starten (F5-Taste) und wenn ihr alles richtig gemacht habt, dann sollte sich das Webbrowser-Control, nach einem Klick auf den Button, von alleine auf Arcor.de anmelden.
Das DemoProjekt könnt ihr hier downloaden.
Solltet ihr noch Fragen, oder Probleme haben, dann lasst mir einfach einen Kommentar da!
Demnächst kommt übrigens auch noch ein zweiter Artikel zu dem Thema Logins auf Webseiten, dann jedoch etwas komplexer, nur über HTTP-Requests und ohne das Webbrowser-Control.
Zum zweiten Artikel – (C# – Login auf Webseiten per HttpWebRequest und HttpWebResponse)
Bis bald,
euer Raffi
Ähnliche Artikel:
Hallo!

Kategorien
- Der tägliche Senf… (77)
- Informatik (81)
- C# & .net Framework (15)
- Cheat Sheets (4)
- HTML, PHP, etc. (5)
- Neuigkeiten (27)
- Software-Projekte (34)
- Tipps & Tricks (29)
- Musik (4)
- Downloads (3)
- Hörbar – Raffis Musiktipp (4)
- Videoclips (4)
- Schule (11)
Kalendar
| M | D | M | D | F | S | S |
|---|---|---|---|---|---|---|
| « Feb | Apr » | |||||
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 | 31 | |||||
Counter
| Besucherstatistik | |
| Besucher gesamt: | 113.294 |
| Besucher heute: | 129 |
| Besucher gestern: | 320 |
| Max. Besucher pro Tag: | 629 |
| gerade online: | 1 |
| max. online: | 89 |
| Seitenaufrufe gesamt: | 285.528 |
| Seitenaufrufe diese Seite: | 4.263 |
| Counterstart: | 13.10.2008 |
Meta
Am meisten kommentiert
Neue Artikel
- Update: Webmusix 1.3.6
- C# – Webbrowser Control: Popups blocken
- Generierung von FullFeeds = Contentklau?
- Cebit 2010 – ein kurzer Rückblick
- Umzug abgeschlossen – neuer Webspace, neues Glück?
- Hörbar – Raffis Musiktipp #4
- Da tut sich was…
- Update: Webmusix 1.3.5
- MultiVZ Tools – der Untergang Teil 2
- MultiVZ Tools tot? Abuse von VZnet bekommen…
Neue Kommentare
- CONeal: Hey Raffi, erstmal vielen Dank für das Tutorial. Es hat mich auf jeden Fall schon mal weiter gebracht. Ich...
- Micha: Na dann wünsche ich euch mal viel Erfolg! Es grüßt, der Micha!
- Raffi: Youtube Pipes ist doch aber nur für Mashups?! (Zumindest sehe ich keine Möglichkeit Fullfeeds aus ShortFeeds...
- caschy: Aber ja, mach et und mail mich an, wenn es soweit ist
- caschy: Yahoo Pipes?
net-blog.net © 2008-2010




13 Benutzer kommentierten "C# – Automatischer Login mit dem Webbrowser-Control"
29 April 2009 um 20:27:25
erstmal danke für das tutorium,
ich steh vor einem problem bei mir geht alles aber wenn ich jetzt 2 webbrowser parallel in 2 unterschiedliche seiten einlogen will geht der 2 nicht wenn ich aber beide seiten intereinander im 1 laufen lasse geht alles
wäre nett wenn du mir villt ein beispiel geben könntest
danke
mfg
joerg
29 April 2009 um 21:39:51
Hallo Joerg,
)
ich danke dir für deinen Kommentar! (Über Feedback freut man sich immer
Normalerweise sollte das auch super mit 2 Webbrowserelementen parallel klappen. (Vor allem wenn deine Methoden richtig sind, da es hintereinander ja funktioniert….)
Hast du 2 verschiedene Eventhandler? (Für jeden Browser einen) Oder verwendest du einen Eventhandler für beide?
Was einem nämlich schnell mal passieren kann, ist dass du an folgendem Punkt vielleicht ausversehen den Namen eines Webbrowser genommen hast.:
if (webBrowserLogin.Url.ToString() == "http://www.arcor.de/"){
...
Wenn du 2 Browser hast muss die Abfrage bei einem Eventhandler natürlich “doppelt” rein.
Wenn dir das hier als Hilfe nicht gereicht haben sollte, kannst du mir den Quelltext gern auch per Email (Kontaktformular, natürlich ohne deine Passwörter für die Seiten) zukommen lassen, dann schau ich nochmal direkt drüber.
Liebe Grüße,
Raffi
07 August 2009 um 08:03:50
huhu ich hoffe ich finde hier hilfe ^^
also ich ahbe etwas ähnliches wie du geschirben aber habe ein problem…
ich möchte per klick mehere methoden aufrufen… zum beispiel die login()
private void B_Start_Click(object sender, EventArgs e)
{
Login();
in diese steht dann:
public void Login()
{
Browser.Navigate(“http://213.133.xxx.xxx/login.php”);
System.Threading.Thread.Sleep(10000);
Browser.Document.All["username"].InnerText = T_User.Text;
Browser.Document.All["password"].InnerText = T_Password.Text;
Browser.Document.All["submit"].InvokeMember(“Click”);
System.Threading.Thread.Sleep(10000);
}
so ich habe shcon extra sleeps eingebaut aber der browser mag nciht die login.php laden und stürzt damit logischer weise bei der einegabe der benutzerdaten ab …
irwie fehlt mir wohl ein befehl damit er die seite auch wirklich lädt….
ich möchte es nciht über die:
private void Browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
realisieren denn dann müsste ich da alle funktionen rein verschachteln……
hoffe du kannst mir helfen irgendwie dieses “laden” der seite zu realiesieren …
danke schomal =)
07 August 2009 um 08:59:20
Hallo xyz-Mann,
um
private void Browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)wirst du nciht herumkommen, da dieses genau den Effekt umgeht, der bei dir Auftritt. DocumentCompleted greift erst dann, wenn deine Login Seite komplett geladen und angezeigt ist.
Deine Lösung funktioniert nicht, weil du keine Zeit zum Laden der Seite lässt. Du lässt den Thread zwar 10 Sekunden “schlafen”, aber dann schläft er auch komplett – lädt also auch deine Loginseite in der Zeit nicht!
Ich hoffe du konntest mir folgen…
Liebe Grüße,
Raffi
07 August 2009 um 16:41:30
hm blöd ja ich kann dir folgen…
nur wollte ich der besseren übersicht wegen eben genau das umgehen…
es gibt also keinen weg c# zu sagen lade die seite fertig und mache dann weiter? also in einer methode…?
sonst müsste ich ja alles in die Browser_DocumentCompleted methode rein bring das wird dann so schnell unübersichtlich -.-
07 August 2009 um 17:48:40
Du könntest nach dem
Navigate("http://www.xyz.de");einen Timer starten und mit diesem in bestimmten Intervallen prüfen, ob der Webbrowser die Seite geladen hat (Stichwort: Webbrowser State).
Ob das nun übersichtlicher ist, musst du für dich selbst entscheiden.
Liebe Grüße,
Raffi
07 August 2009 um 19:38:04
klingt gut da könnte ich den timer ja auch immer so anpassen je nachdem wie schnell meine internetleitung ist =)
kannst du mir jetzt noch sagen wie man einen timer programmiert und wie man den status abfragt?
scho mal big thx für die hilfe =)
07 August 2009 um 20:13:44
Die einfach Variante wäre das Timer Control aus der Toolbox vom Visual Studio auf dein Form zu ziehen. Den Intervall gibst du in Millisekunden (Bsp. 5000 = 5Sek.) bei der Value “Interval” im Eigenschaftenfenster des Visualstudio ein.
Der Code der ausgeführt werden soll kommt in den TickEventhandler, den du ebenfalls über das Eigenschaftenfenster im Visualstudio erreichst.
Solltest du deine Programme nicht mit dem Visual Studio entwickeln, dann kannst du dir deinen Timer auch so erstellen.
private void TimerErstellen()
{
Timer marfsTimer = new Timer();
marfsTimer.Interval = 5000;
marfsTimer.Tick += new EventHandler(marfsTimer_Tick);
}
void marfsTimer_Tick(object sender, EventArgs e)
{
MessageBox.Show("Der Timer wurde soeben ausgelöst!");
}
Den Status des WebbrowserControls fragst du wiefolgt ab…
if (MarfsWebbrwoser.ReadyState)
{
MessageBox.Show("Das Dokument wurde geladen!");
}
else
{
MessageBox.Show("Das Dokument lädt noch...");
}
Bei if (webbrowser.ReadyState) … handelt es sich um eine Kurzschreibweise. ReadyState liefert einen boolschen Wert. Heißt ausgeschrieben heißt es:
if (MarfsWebbrwoser.ReadyState == true)
{
MessageBox.Show("Das Dokument wurde geladen!");
}
else
{
MessageBox.Show("Das Dokument lädt noch...");
}
Ich hoffe ich konnte dir und natürlich auch allen anderen Lesern helfen!
Liebe Grüße,
Raffi
07 August 2009 um 22:39:03
huhu irwie funzt das nicht =(
er übergeht einfach meine timer führt sie nicht aus…
problematic ist ja auch das ich alles was NACH dem timer passieren soll wieder in eine extra funktion schreiben muss -.- …
ich wollte einfach EINE methode… aber ok zu meinen prob:
private void TimerErstellen()
{
Timer marfsTimer = new Timer();
marfsTimer.Interval = 5000;
}
public void Login()
{
Browser.Navigate(”http://213.133.xxx.xxx/login.php”);
Timererstellen();
Browser.Document.All["username"].InnerText = T_User.Text;
Browser.Document.All["password"].InnerText = T_Password.Text;
Browser.Document.All["submit"].InvokeMember(”Click”);
}
so gings nicht wenn ich die methode aufgerufen habe überging er den timer…(aber wenn es so ähnlich am ende aussehen könnte wäre super… da brauch ich für alle methoden dann immer nur diesen timer aufrufen und fertig…)
andere variante
private void LoginTimer()
{
Browser.Navigate(”http://213.133.xxx.xxx/login.php”);
Timer marfsTimer = new Timer();
marfsTimer.Interval = 5000;
marfsTimer.Tick += new EventHandler(Login_Tick);
}
void Login_Tick(object sender, EventArgs e)
{
Browser.Document.All["username"].InnerText = T_User.Text;
Browser.Document.All["password"].InnerText = T_Password.Text;
Browser.Document.All["submit"].InvokeMember(”Click”);
}
ging leider auch nicht er übergeht einfach alles…. so ist es auch bisl blöd weil da brauch ich ziemlich viele timer in meinen programm =(…
es muss doch eine einfache lösung fürn son schrott geben ….. hilf mir bitte ^^
kann ich evtl deine email haben oder icq etc?! dann geht sowas schneller ^^ *g*
und nochmal danke für deine hilfe…
31 August 2009 um 10:28:45
Hallo Raffi,
ich finde deinen Artike sehr hilfreich, würde mir aber wünschen, dass du bald den 2ten Artikel verööfentlichst, da ich das nicht gerne über das WebBrowser Control mache.
5*/5*
MfG DerDeveloperInCSharp
29 September 2009 um 08:55:28
Hey Raffi,
ich finde es schade, dass du dich nicht mal meldest, bezüglich des Artikels… könntest ja hier mal kommentieren, wie der aktuelle stand der Dinge ist…
naja bis dahin… greez Sebastian
30 September 2009 um 15:17:22
Nun ist’s soweit – hier gibt’s den zweiten Artikel! >> http://www.net-blog.net/blog/index.php/2009/09/30/c-login-auf-webseiten-per-httpwebrequest-und-httpwebresponse/
12 November 2009 um 20:40:21
Vielen Dank für das Tutorial sehr hilfreich!