Autor Beitrag
Gobbles
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Sa 05.01.13 21:59 
Guten abend zusammen,

ich habe vor mittels dem WebBrowser auf eine Seite zu steuern.
(Links anklicken Textfelder ausfüllen Buttons drücken...)

meine Funktion zur Navigation:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
private void doKlickNavigation(string strLink)
        {
            HtmlWindow frame = webBrowser1.Document.Window.Frames[0]; // 0=Navigations-Frame
            HtmlElementCollection allLinks = webBrowser1.Document.Window.Frames[0].Document.GetElementsByTagName("A");
            foreach (System.Windows.Forms.HtmlElement html in allLinks)
            {
                if (html.InnerText == strLink)
                {
                    html.InvokeMember("click");
                }
            }

        }


Sowie meine Funktion zum Ausfüllen der Textfelder + Absendebutton betätigen:

ausblenden C#-Quelltext
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:
        private void doKlickSb(string anzahl, string art)
        {
            HtmlElementCollection ele = webBrowser1.Document.Window.Frames[1].Document.GetElementsByTagName("INPUT");
            bool doKlick = false;
            bool enteranzahl = false;
            foreach (HtmlElement el in ele)
            {
                if (doKlick == true)
                {
                    el.InvokeMember("click");
                    doKlick = false;
                }
                if (enteranzahl == true)
                {
                    el.SetAttribute("value", anzahl);
                    doKlick = true;
                    enteranzahl = false;
                }
                if (el.GetAttribute("value").Equals(art))
                {
                    enteranzahl = true;
                }

            }
        }


Hier musste ich ein wenig Tricksen, da es auf der Seite mehrere Buttons mit den selben namen etc gibt und diese sich in keinerlei hinsicht unterscheiden.
Aus dem Quellcode herraus sind es 3 INPUT Tags infolge von dennen ich leider nur den ersten abfragen kann, da dieser sich im Value-wert von den anderen abhebt. Daher wird hier zunächst der erste geprüft. Anschliessend im nächsten INPUT-Tag das textfeld ausgefüllt und zu guter letzt kommt der Button-klick im dritten INPUT-Tag.
Alles in allem Funktioniert es soweit auch. Wenn ich manuell auf den Link klicke und im Mainframe die richtige Seite angezeigt wird und nun meine Funktion aufrufe. Sowie meine erste Funktion auch den korrekten Link anklickt.

Nun zu meinem Problem in Kombination will es nicht.
Mein Code hierfür sieht wie folgt aus:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
 private void doBuild(){
         doKlickNavigation("Aufklärung");
         while (webBrowser1.ReadyState != WebBrowserReadyState.Complete){}
   doKlickSb("300","sb");
}

diese Funktion wird aktuell noch zum Testen via einem Button auf der Form aufgerufen.
Den Fehler meine ich auch schon gefunden zu haben weiß jedoch nicht wie ich diesen beheben könnte.
Und zwar Klicke ich meinen Test-Button 2mal, so macht es genau das was es tun sollte. Beim Debuggen ist mir
aufgefallen das die Zeile: doKlickNavigation("Aufkärung"); zwar ausgeführt wird jedoch der Effekt das der MainFrame sich ändert erst nach ablaufen der vollen Funktion doBuild() wirksam wird.

Würde mich freun wenn mir hierbei jemand helfen könnte.

MfG Gobbles
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 3995
Erhaltene Danke: 820

Win7
C++, C# (VS 2015/17)
BeitragVerfasst: So 06.01.13 11:51 
Hallo Gobbles,

mittels der while-Schleife blockierst du ja auch den ganzen GUI-Thread und daher werden die GUI-Änderungen erst nach dem Verlassen deiner Methode sichtbar (da dann wieder zurück in die Application.Run() gesprungen wird).

Das sinnvollste ist, du verwendest das WebBrowser.DocumentCompleted-Ereignis, um darauf zu warten, daß sich der WebBrowser.ReadyState geändert hat.