Feedback

C# - Webbrowser Navigate and Wait Seconds

Veröffentlicht von am 4/9/2017
(0 Bewertungen)
Hallo an alle,

wenn man z.B. einen Browserbot programmiert, würde man öffters mal gern, eine bestimmte Zeit warten nach dem man eine Url aufgerufen hat.

Dafür habe ich mir eine kleine Klasse erstellt, die ich gern mit euch teile :-)

Usings:
- using System;
- using System.Windows.Forms;

Der Aufruf kann dann so aussehen:
	private void button1_Click(object sender, EventArgs e)
{
Navigate.Wait(webBrowser1, "https://dotnet-snippets.de/", 5.5);
Navigate.Done += afterWaitDoSomething;
}
private void afterWaitDoSomething()
{
MessageBox.Show("Hello World");
}
    static class Navigate
    {
        public delegate void NavigateDoneEvent();
        public static event NavigateDoneEvent Done;

        private static Timer wait;

        public static void Wait(WebBrowser Browser, string Url, double Seconds)
        {
            Browser.Navigate(Url);

            wait = new Timer();
            wait.Interval = Convert.ToInt32(Seconds * 1000);

            wait.Tick += (s, args) =>
            {
                if (Done != null) Done();
                wait.Enabled = false;
            };

            wait.Enabled = true;
        }
    }

5 Kommentare zum Snippet

Koopakiller schrieb am 4/9/2017:
Wo ist es denn wichtig wirklich eine gewisse Zeit abzuwarten und nicht bis wirklich alles geladen wurde? Das Problem das ich sehe ist, dass bei sehr langsamen Verbindungen x Sekunden nicht reichen werden. Daher gibt es auch das WebBrowser.Navigated Event.

Davon abgesehen noch ein paar (stilistische) Tipps:
1. Parameter werden üblicherweise am Anfang klein geschrieben.
2. Da der Timer static ist, kannst du die Klasse nicht mehrfach parallel benutzen ohne Nebenwirkungen zu riskieren. Der Umbau in Instanz-Member wäre hier vielleicht ganz praktisch.
3. Die Sekunden würde ich an deiner Stelle direkt in Millisekunden übergeben. Es ist ein Quasi-Standard, dass das so gemacht wird. Alternative: TimeSpan
4. Man kann zwar eigene Delegaten erstellen, aber seitdem es die generischen Action- und Func-Varianten gibt, ist das praktisch nicht mehr notwendig.
Tobi82 schrieb am 4/9/2017:
Es ist z.B. wichtig wenn es auf der Seite eine Bot Erkennung gibt, die eine bestimmte Anzahl von Klicks in der Minute zulässt und dich dann sperrt wenn du zu oft klickst ... oder wenn auf der Seite irgendwas nur alle 5 Sekunden möglich ist usw. also Anwendungsmöglichkeiten finden sich viele aber du hast wohl noch nie in Browsergames gecheatet sonst würde dir da auch einiges einfallen xD

Zum Rest sag ich mal - kann man machen muss man aber nicht.

Ob die Seite fertig geladen hat kann man ja zusätzlich prüfen da hast schon recht aber das kann sich ja jeder selbst zusammen basteln.

Allgemein ist das für mich ein Hobby und kein Beruf also sei bitte etwas nachlässiger - ich behaupte ja auch nicht das meine Snippets perfekt sind.
Koopakiller schrieb am 4/9/2017:
Gut, mit Online Games habe ich nicht wirklich was zu tun. Da kann sowas sicher praktisch sein. Drauf gekommen bin ich durch die sehr irreführenden Benennungen vom Delegaten und der Klasse.

Was den Rest betrifft: Wenn man ordentlich programmiert, macht man sich auf lange Sicht das Leben leichter. Ich habe min. 200h an meinen privaten Projekten verschwendet, weil ich anfangs nicht ordentlich arbeitete.

Wenn man das ganze (wie ich) beruflich macht, bekommt das dann sicher nochmal eine andere Bedeutung. Von daher: Sind nur Tipps/Ratschläge/Hinweise für dich und andere.
Tobi82 schrieb am 4/10/2017:
Also das ein Browser ein DocumentCompleted Event hat weiß ich, da kann ich dich beruhigen, dafür ist das Snippet auch in keinster Weiße gedacht / gemacht.

Die Benennung klang für mich logisch, erst navigier ich, dann wart ich und wenn alles fertig ist reagier ich (Navigate / Wait / Done). Wie hättest du es denn genannt?

Kritik ist bei mir immer willkommen und Verbesserungsvorschläge ebenso, ich lern mega gern jeden Tag was neues dazu, das macht für mich den Reiz am programmieren aus aber wenn du mir dann mit Groß und Kleinschreibung der Parameter kommst, dann ist das meckern auf hohem Niveau find ich.

Gut es mag so in den Konventionen stehen aber das sind Richtlinien und keine Pflichten, da ich nicht im Team programmiere denk ich das es reine Geschmacksache ist.

Dein Punkt 4 klingt jedoch sehr interessant, das schau ich mir jetzt mal an, hab in der Richtung Delegaten usw. noch keine große Erfahrung.
Koopakiller schrieb am 4/10/2017:
Die Klasse hätte ich vermutlich WebBrowserHelper o.ä. genannt, da das besondere daran nach der Navigation zum Einsatz kommt. Dass du Navigate ebenfalls in der Klasse aufrufst macht das ganze Schwierig - zumal du eben nicht WebBrowser.Navigated in der Klasse benutzt. Das vergaß ich in meiner letzten Antwort zu schreiben.

So etwas wie die Groß-/Kleinschreibung ist für mich noch kein meckern auf hohem Niveau. Da kann ich (bei anderen Snippets) ganz andere Dinge finden.
Wenn du viel Code liest und dich dran gewöhnt hast was wie geschrieben wird, wird es schwierig deinen Code zu lesen. Ich musste auch zweimal hingucken was die Parameter nun wirklich sind.

Stimmt schon, es sind Konventionen. Aber Geschmackssache ist es IMO nicht. In besonderen Fällen muss man sich nicht dran halten, das kann praktisch sein. Sich aber nicht dran zu halten und es ggf. -noch schlimmer- nicht einheitlich zu machen kostet für alle beteiligten am Ende mehr Zeit. Du als der der es schreibt (wenn du die Konventionen verinnerlicht hättest). Ich als der Leser und jemand der den Code wartet.
 

Logge dich ein, um hier zu kommentieren!