ERLEDIGT
NEIN
NEIN
ANTWORTEN
7
7
ZUGRIFFE
1216
1216
EMPFEHLEN
-
Hallo Leute,
und zwar möchte ich eine spezielle Seite mit C# bedienen. Dazu hab ich ne Windows Form angelegt, mit Textfeldern und nem Button. Ich hab mich im Internet schlau gemacht, und paar Snippets gefunden die ich dann passend umgeschrieben habe. Folgender Code bewirkt beim Button-Click (button1) dass die Seite geladen wird, und Button2 bewirkt dass man sich automatisch in die Seite einloggt (also Username, Passwort werden eingetragen, und dann wird automatisch auf "login" geklickt).
Code :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 32 33 34 35 36 37 38 39 40 41 42 43 44 45
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 Automator { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { webBrowser1.Url = new Uri("http://www2.dasservice.at/"); webBrowser1.Refresh(); } private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { if (e.Url == webBrowser1.Url) { } } private void button2_Click(object sender, EventArgs e) { webBrowser1.Document.All["TEXTBOX_Benutzer"].SetAttribute("value", "USERNAME"); webBrowser1.Document.All["TEXTBOX_Kennwort"].SetAttribute("value", "PASSWORT"); webBrowser1.Document.GetElementById("IMAGEBUTTON_Login").InvokeMember("click"); } private void button3_Click(object sender, EventArgs e) { webBrowser1.Document.GetElementById("BUTTON_ReparaturAnlegen").InvokeMember("click"); } } }
nun ist es aber so, dass nach dem login wieder auf einen button geklickt werden soll, Automatisch natürlich. Nachdem dann dieser Button (auf der Homepage) geklickt wurde, sollten Textformen ausgefüllt werden und wieder ein Button geklickt werden (auf der Homepage). Und so geht es weiter. Alles automatisch. Wenn ich aber jetzt folgenden code
Code :1
webBrowser1.Document.GetElementById("BUTTON_ReparaturAnlegen").InvokeMember("click");
einfach Anhänge beim Button2-Code, dann bekomm ich ne Fehlermeldung. Ist auch klar, da ja der login noch nicht vollzogen ist, sprich die Seite noch nicht fertig geladen ist. Wie kann ich also warten bis die Seite nach dem login fertig geladen ist, damit ich dann weitere Aktionen ausführen lassen kann? Ich hab was gelesen vom Website.Completed Event, allerdings ist mir nicht ganz schlüssig wie ich dieses Event in den Button2-Code einbinde. Ich hoffe ihr versteht was ich meine?!
Vielen Dank.
-
12.07.10 08:58 #2
- Registriert seit
- Jul 2004
- Ort
- Deutschland
- Beiträge
- 95
Hi dartox,
wenn ich das richtig versehe willst du dich an des DocumentCompleted event ran hängen. Das machst du am einfachsten so:
Code :1 2 3 4 5 6 7 8
this.webBrowser1.DocumentCompleted += new System.Windows.Forms.WebBrowserDocumentCompletedEventHandler(this.webBrowser1_DocumentCompleted); //... private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { }
Du meldest dich einfach am event an und sobald die Seite fertig geladen ist wird automatisch die Methode "webBrowser1_DocumentCompleted" aufgerufen.
Grüsse
-
Vielen Dank erstmal.
Also es funktioniert jetzt dass ich einen weiteren Button voll Automatisch klicken lassen kann. Sprich ich ruf die Seite mit Button1 auf, mit Button2 log ich mich automatisch ein und dann klickt mein Programm noch auf einen weiteren Button, nachdem es gewartet hat bis die Seite fertig geladen ist. Allerdings will ich dieses Prozedere weiter führen, sprich nach dem login und dem Buttonklick (auf der Homepage) soll ein weiterer Button (auf der Homepage) gedrückt werden, natürlich nachdem die Seite erst fertig geladen wurde, und dann noch ein Button, und noch einer, usw.
Mein code sieht jetzt so aus:
Code :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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
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 Automator { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { webBrowser1.Url = new Uri("http://www2.dasservice.at/"); webBrowser1.Refresh(); } private void button2_Click(object sender, EventArgs e) { webBrowser1.Document.All["TEXTBOX_Benutzer"].SetAttribute("value", "xxx"); webBrowser1.Document.All["TEXTBOX_Kennwort"].SetAttribute("value", "xxx"); webBrowser1.Document.GetElementById("IMAGEBUTTON_Login").InvokeMember("click"); this.webBrowser1.DocumentCompleted += new System.Windows.Forms.WebBrowserDocumentCompletedEventHandler(this.webBrowser1_DocumentCompleted); } private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { if (e.Url == webBrowser1.Url) { webBrowser1.Document.GetElementById("BUTTON_ReparaturAnlegen").InvokeMember("click"); this.webBrowser1.DocumentCompleted += new System.Windows.Forms.WebBrowserDocumentCompletedEventHandler(this.webBrowser2_DocumentCompleted); } } private void webBrowser2_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { if (e.Url == webBrowser1.Url) { webBrowser1.Document.GetElementById("BUTTON_Reparatursuche").InvokeMember("click"); this.webBrowser1.DocumentCompleted += new System.Windows.Forms.WebBrowserDocumentCompletedEventHandler(this.webBrowser3_DocumentCompleted); } } private void webBrowser3_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { if (e.Url == webBrowser1.Url) { webBrowser1.Document.GetElementById("BUTTON_AlleReparaturen").InvokeMember("click"); this.webBrowser1.DocumentCompleted += new System.Windows.Forms.WebBrowserDocumentCompletedEventHandler(this.webBrowser3_DocumentCompleted); } } } }
Wie kann man das bewerkstelligen? weil wenn ich den code den du mir gesagt hast, also
Code :1 2 3 4 5 6 7 8
private void webBrowser2_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { if (e.Url == webBrowser1.Url) { webBrowser1.Document.GetElementById("BUTTON_Reparatursuche").InvokeMember("click"); this.webBrowser1.DocumentCompleted += new System.Windows.Forms.WebBrowserDocumentCompletedEventHandler(this.webBrowser3_DocumentCompleted); } }
einfach fortsetze, so bleibt er dennoch beim button-klick nach dem login stehen, und macht nicht weiter?!
danke.
lg
-
15.07.10 11:02 #4
- Registriert seit
- Jul 2004
- Ort
- Deutschland
- Beiträge
- 95
Hallo dartox,
ich würde dir empfehlen deine Events ab dem Programstart anzumelden.
Code csharp:1 2 3 4 5 6 7
public Form1() { InitializeComponent(); this.webBrowser1.DocumentCompleted += new System.Windows.Forms.WebBrowserDocumentCompletedEventHandler(this.webBrowser1_DocumentCompleted); this.webBrowser1.DocumentCompleted += new System.Windows.Forms.WebBrowserDocumentCompletedEventHandler(this.webBrowser3_DocumentCompleted); /// usw.... }
Es geht zwar auch so wie du es gemacht ahst, aber ich weiß nicht wie das genau abläuft wenn du den Button (Automatisiert) klickst und danach erst das Event anmeldest.
Es würde theroretisch auch ein Event reichen. Dieses wird ja immer aufgerufen sobald die Seite fertig geladen hat. Dann setzt du dir am besten definierte Zustände nach jedem Buttonclick (z.B. über ein Enum) und kannst in der Methode: "webBrowser1_DocumentCompleted" in einem Switchcase die nächste Aktion festlegen. Bin grad auf Arbeit und kann leider kein Codebeispiel auf die schnelle machen, aber wenn nötig kann ich heut abend mal was basteln
Natürlich nicht vergessen die Events auch wieder abzumelden wenn du das Programm beendest oder die Form schließt.
Grüsse
-
hallo, danke für die antwort.
ich würde dich wirklich bitten ein beispiel programm zu erstellen da ich momentan garnichts mehr verstehe. aber nur wenn es nicht zuviel arbeit bereitet!
ich muss ja nach jedem code (also nach jedem click auf der homepage) ja in das DocumentCompleted-Event springen, damit ich weiter machen kann mit dem nächsten klick auf der homepage, oder?!
-
15.07.10 23:05 #6
- Registriert seit
- Jul 2004
- Ort
- Deutschland
- Beiträge
- 95
Hallo,
Richtig. Nach jedem click wird ja folglich die HP neu geladen. Wenn das beendet ist landest du immer in ein und dem selben Completed Event. Von daher nicht sinnvoll für jeden Click ein extra Event anzumelden.ich muss ja nach jedem code (also nach jedem click auf der homepage) ja in das DocumentCompleted-Event springen, damit ich weiter machen kann mit dem nächsten klick auf der homepage, oder?!
Hier mal ein Beispiel wie man es machen könnte. Muss aber gleich sagen das ich das nicht getestet habe. Es kann sein das das InvokeMember das DocCompleted Event nicht feuert. Dann einfach mal nach jedem Invoke ein Refresh aufrufen. Wie gesagt konnte das jetzt nicht testen.
Code csharp: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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
public partial class Form1 : Form { BUTTON_STATE _currentState; // hier werden die status definiert enum BUTTON_STATE { Loaded, Login, CreateRepair, AllRepairs, SearchRepair } public Form1() { InitializeComponent(); // am DocCompleted event anmelden this.webBrowser1.DocumentCompleted += new System.Windows.Forms.WebBrowserDocumentCompletedEventHandler(this.webBrowser1_DocumentCompleted); } private void button1_Click(object sender, EventArgs e) { // den momentanen staus setzen _currentState = BUTTON_STATE.Loaded; // die url laden webBrowser1.Url = new Uri("http://www2.dasservice.at/"); webBrowser1.Refresh(); } private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { switch (_currentState) { case BUTTON_STATE.Loaded: // als erstes wieder den nächsten status setzen _currentState = BUTTON_STATE.Login; webBrowser1.Document.All["TEXTBOX_Benutzer"].SetAttribute("value", "xxx"); webBrowser1.Document.All["TEXTBOX_Kennwort"].SetAttribute("value", "xxx"); webBrowser1.Document.GetElementById("IMAGEBUTTON_Login").InvokeMember("click"); break; case BUTTON_STATE.Login: _currentState = BUTTON_STATE.CreateRepair; webBrowser1.Document.GetElementById("BUTTON_ReparaturAnlegen").InvokeMember("click"); break; case BUTTON_STATE.CreateRepair: _currentState = BUTTON_STATE.AllRepairs; webBrowser1.Document.GetElementById("BUTTON_AlleReparaturen").InvokeMember("click"); break; case BUTTON_STATE.AllRepairs: _currentState = BUTTON_STATE.SearchRepair; webBrowser1.Document.GetElementById("BUTTON_Reparatursuche").InvokeMember("click"); break; } } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { // event wieder abmelden ( nur für den fall das die form aber nicht die app geschlossen wird) this.webBrowser1.DocumentCompleted -= new System.Windows.Forms.WebBrowserDocumentCompletedEventHandler(this.webBrowser1_DocumentCompleted); } }
Grüsse
-
wow.... du bist mein held, es funktioniert perfekt! vielen dank!!
dankeschön. allerdings hab ich noch eine kleine frage. und zwar ist das jetzt mit richtigen buttons kein problem (das klicken), aber es gibt auf dieser seite die ich gerne automatisieren möchte auch andere "buttons", ich glaube javascript buttons bei denen ich nicht richtig durchblicke. ich habe mal so eine seite von der homepage auf nen free-webspace-anbieter gestellt, um es dir zeigen zu können.
-> http://csharptestbeispiel.110mb.com/Das%20Service.htm
z.b. dieser "Einen neuen Reparaturfall erstellen"-Button. dieser hat keine ID sodass ich nicht GetElementByID verwenden kann... weißt du was ich meine?
PS: von einer anderen seite müsste ich werte auslesen, und auf diese werte dann entsprechend reagieren mit dem herumgeklicke auf der oben genannten seite. ich brauche von der einer bestimmten seite 3 werte, die ganz klassisch in ner tabelle stehen. in der linken spalte steht immer die gleiche "überschrift", auf der rechten seite dann die entsprechenden werte die immer anders sind. wie ist es möglich etwas aus ner tabelle (html) auszulesen, und in ne variable zu übergeben?Geändert von dartox (16.07.10 um 00:34 Uhr)
-
16.07.10 09:10 #8
- Registriert seit
- Jul 2004
- Ort
- Deutschland
- Beiträge
- 95
Hallo,
danke aber das war nicht der Rede wert
Wenn du Javascript auf der HP benutzt gibt es möglichkeiten die JavaScript Funktion direkt aufzurufen. Ich glaube das geht mit ASP. Hab ich jetzt selbst noch nie gemacht, nur mal von gehört.
http://www.google.de/url?sa=t&source...qCj3pvfnMKKiwA
oder
http://www.deger-it.de/JavaScriptEvalInC.aspx
Dr. Google kann viel helfen
Grüsse
Ähnliche Themen
-
vb Programm per Handy bedienen
Von Arijane im Forum .NET CaféAntworten: 1Letzter Beitrag: 09.02.10, 13:21 -
Scrollbalken mit Maus bedienen
Von Faller im Forum C/C++Antworten: 2Letzter Beitrag: 01.08.07, 14:35 -
[vb6] Listboxen mit Tastatur bedienen
Von sra im Forum Visual Basic 6.0Antworten: 1Letzter Beitrag: 15.11.04, 21:27 -
Mit VB.NET ein Programm bedienen
Von Tortilla im Forum .NET ArchivAntworten: 6Letzter Beitrag: 08.08.04, 16:21 -
Webseite mit VB bedienen
Von skee im Forum Visual Basic 6.0Antworten: 2Letzter Beitrag: 21.10.03, 13:22





Zitieren
Login





