C# - Formular auf ext. Website automatisch ausfüllen

kubi583

Grünschnabel
Hallo,

ich möchte mir im Visual Studio 2005 mit C# ein Programm (Windows-Anwendung) schreiben, welches mir in der Anwendung selbst ein WebBrowser-Fenster öffnet und dort die entsprechenden Textfelder mit von mir aus meiner Datenbank gelieferten Daten füllt.

Mein Hauptproblem ist momentan:
Wie kann ich die Textfelder per Klick ausfüllen? (erst einmal mit beliebigen Werten)
Der Quelltext der ext. Website sieht z.B. wie folgt aus:

Code:
<label for="vname">Vorname:</label>
<input name="vname" id="vname" value="" />
<label for="nname">Nachname:</label>
<input name="nname" id="nname" value="" />


Nebenproblem: (falls jemand dazu auch eine Antwort hat)
Habe ein "WebBrowser"-Element in die Anwendung eingefügt und möchte dort jetzt die Seite öffnen. Bei den Eigenschaften kann ich unter "Url" die entsprechende Seite angeben. Wie kann ich diese aber per Button-Klick in der Anwendung ändern?
mein Quelltext sieht momentan so aus: (also nicht sehr viel)
Code:
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            
        }

private void openformular_Click_1(object sender, EventArgs e)
        {
            System.Diagnostics.Process.Start("IEXPLORE.EXE", "www.web.de");
        }

Vielen Dank im voraus für Hilfe.
 
Hi,

was meinst du mit WebBrowser-Fenster? Welcher WebBrowser soll den verwendet werden? .Net hat eine eigene WebBrowser-Komponente, die du verwenden kannst, um Webseiten zu laden und anzuzeigen. Dazu hast du auch die Möglichkeit sehr leicht über das HTML-DOM zu navigieren, Attribute zu verändern sowie Methoden aufzurufen.

Das folgende Beispiel zeigt, wie die Anmeldung auf der http://www.tutorials.de-Seite realisiert werden kann:

C#:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WebBrowserExample
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        // load url ...
        private void button1_Click(object sender, EventArgs e)
        {
            webBrowser1.Url = new Uri(textBox1.Text);
            webBrowser1.Refresh();
        }

        // login
        private void button2_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < webBrowser1.Document.Forms.Count; i++)
            {
                HtmlElement element = webBrowser1.Document.Forms[i].All["do"];

                if (element != null && element.GetAttribute("value").Equals("login"))
                {
                    webBrowser1.Document.All["vb_login_username"].SetAttribute("value", textBox2.Text);
                    webBrowser1.Document.All["vb_login_password"].SetAttribute("value", textBox3.Text);
                    webBrowser1.Document.Forms[i].InvokeMember("submit");
                }

            }

        }
    }
}

so sieht der HTML-Quellcode aus:
HTML:
<form action="http://www.tutorials.de/forum/login.php?do=login" method="post" ....>
		....
	<input type="text" class="bginput" style="font-size: 11px" name="vb_login_username" id="navbar_username" size="10" accesskey="u" tabindex="101" value="Benutzername" onfocus="if (this.value == 'Benutzername') this.value = '';" /></td>
		....
	<input type="password" class="bginput" style="font-size: 11px" name="vb_login_password" id="navbar_password" size="10" tabindex="102" /></td>
		....
	<input type="submit" class="button" value="Anmelden" tabindex="104" title="Gib zur Anmeldung deinen Benutzernamen und dein Kennwort in die dafür vorgesehenen Textfelder ein oder klicke auf die 'Registrieren'-Schaltfläche, um ein neues Benutzerkonto anzulegen." accesskey="s" /></td>
		....
	<input type="hidden" name="do" value="login" />
		....		
</form>

Gruß Konstantin
 
Zuletzt bearbeitet von einem Moderator:
Vielen Dank Konstantin!
Hat super geklappt.
Um die Werte (textBox1.Text, usw...) müssen bei mir zwar noch Anführungsstriche " " hin, aber dann klappt es perfekt.
Habe mich gerade schon über die Anwendung eingeloggt und surfe jetzt sozusagen innerhalb der Anwendung.

Also vielen Dank für die schnelle und sehr gute Antwort. :)
 
Hallo Konstantin!

Zunächst einmal ist es ein super Tuturial!

Für CheckBoxen schreibe ich dann in etwa:

C#:
webBrowser1.Document.All["accept"].SetAttribute("checked", "checked");

Das funktioniert auch.

Doch was muss ich bei einem Feld schreiben, das vom Typ 'file' ist?

(z.B.:
HTML:
<INPUT style="width:357px;" TYPE="file" NAME="file" VALUE="" size="43" class="file" onkeypress="document.uploadform.url.value='';" onkeyup="document.uploadform.url.value='';" onchange="document.uploadform.url.value='';">
)

Da funktioniert das Prinzip...

C#:
webBrowser1.Document.All["file"].SetAttribute("value", @"C:\Dokumente und Einstellungen\Sebastian\Eigene Dateien\midi_class_v17.zip");

... leider nicht.

Und ich habe noch ein Problem: Wenn der Submit-Button nicht so, wie von Dir dargestellt, sondern ein Bild ist, z.B: ein Link wie in folgender Form:

HTML:
<a href="javascript:postupload();"><IMG SRC="gui/b_send.gif" WIDTH="92" HEIGHT="29" BORDER="0" ALT=""></a>

Wie kann ich den automatisch klicken?

Danke schon einmal im Voraus!

Sebastian.
 
Zuletzt bearbeitet von einem Moderator:
Ich habe auch noch ein kleines Problem.
Wie wähle ich bei Drop-Down-Menüs die entsprechende Option aus. Hab schon ein paar Sachen getestet, aber nichts hat funktioniert.
Der entsprechende html-Code der Seite sieht wie folgt aus:
Code:
<select name="wanrede" id="wanrede" size="1">
<option selected="selected">Herr</option>
<option>Frau</option>
<option>Familie</option>
<option>Firma</option>
</select>

Hat da jemand eine Idee?
Vielen Dank im voraus.
 
Hallo,

@93Current:

Was du für einen Wert in dem Fileparameter brauchst, das hängt wohl von dem Server ab, der diesen Wert verarbeiten muss ab.
Du kannst es aber rausfinden in dem du das Ganze in deinem Browser nachspielst und mit einem Netzwerksniffer (z.B. Wireshark) aufzeichnest. Dort siehst du dann welche Werte an den Server geschickt werden.
Zu dem Problem mit dem Bild, da solltest du dir die InvokeMember-Methode von HtmlElement anschauen. Wenn du das Bildobjekt als HtmlElement in der Hand hälst, dann kannst du z.B. Click oder Submit methoden ausführen.
C#:
	webBrowser1.Document.All["mySubmitPic"].InvokeMember("Click");

@kubi583:

C#:
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            webBrowser1.Url = new Uri(@"C:\page.html");
            webBrowser1.Show();
            
        }

        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (webBrowser1.Document.All["wanrede"] != null)
            {
                HtmlElement element = webBrowser1.Document.All["wanrede"];
                // Frau
                element.All[1].SetAttribute("selected", "true");
                
            }
        }
    }

Gruß Konstantin
 
Danke Konstantin, auf den Punkt wäre ich nicht gekommen.
Habe die Anweisung in der if-Schleife noch auf eine Zeile gekürzt.

Code:
webBrowser1.Document.All["wanrede"].All[1].SetAttribute("selected", "true"); // 0=Herr 1=Frau 2=Familie 3=Firma
 
Hi,
Das folgende Beispiel zeigt, wie die Anmeldung auf der http://www.tutorials.de-Seite realisiert werden kann:

Hi,

ich bin auch gerade auf ein ähnliches Problem gestoßen und beim Suchen über das Forum hier gestolpert.
Zustätzlich sollte ich erwähnen, dass ich in C# total neu bin. Evtl. steht der Code einfach an der falschen Stelle...

Mein Programm soll irgendwann mal 2 Webbroser enthalten. In einem navigiert man manuell an die richtige Stelle und im anderen sollen dann ein paar Daten aus der ersten Seite in ein Form eingetragen werden.

Ich habe dafür mal folgenden Code ausprobiert:
Code:
        private void webBrowser1_Navigated(object sender, WebBrowserNavigatedEventArgs e)
        {
            webBrowser2.Navigate(new Uri("http://www.tutorials.de"));
        }

        private void webBrowser2_Navigated(object sender, WebBrowserNavigatedEventArgs e)
        {
            if (LoggedIn == false)
            {
                for (int i = 0; i < webBrowser2.Document.Forms.Count; i++)
                {
                    HtmlElement element = webBrowser2.Document.Forms[i].All["B1"];

                    if (element != null && element.GetAttribute("value").Equals("OK"))
                    {
                        webBrowser2.Document.All["login_id"].SetAttribute("value", "admin");
                        webBrowser2.Document.All["login_password"].SetAttribute("value", "admin");
                        webBrowser2.Document.Forms[i].InvokeMember("submit");
                    }
                }
            }
            else {             
            }
        }

Die Felder im Form stimmen zwar nicht für www.tutorials.de, aber das ist nicht das Problem.
Vielmehr lande ich gar nicht in der Schleife, weil webBrowser2.Document.Forms.Count bereits 0 enthält. Es wird also gar kein Form gefunden.

Was mache ich falsch?
Ist Navigated die falsche Stelle?

Vielen Dank schonmal für die Hilfe.
 
Hallo nochmal, Konstantin!

Hallo,

@93Current:

Was du für einen Wert in dem Fileparameter brauchst, das hängt wohl von dem Server ab, der diesen Wert verarbeiten muss ab.
Du kannst es aber rausfinden in dem du das Ganze in deinem Browser nachspielst und mit einem Netzwerksniffer (z.B. Wireshark) aufzeichnest. Dort siehst du dann welche Werte an den Server geschickt werden.
Zu dem Problem mit dem Bild, da solltest du dir die InvokeMember-Methode von HtmlElement anschauen. Wenn du das Bildobjekt als HtmlElement in der Hand hälst, dann kannst du z.B. Click oder Submit methoden ausführen.
C#:
	webBrowser1.Document.All["mySubmitPic"].InvokeMember("Click");

...

Gruß Konstantin

Danke für deine Antwort. Nachdem ich in der Zwischenzeit irgendwo gelesen habe, dass aus Sicherheitsgründen dieses File-Feld nicht automatisch gefüllt werden darf und deshalb ignoriert wird, musste ich mir für mein Projekt nun doch eine andere Lösung einfallen lassen...

Trotzdem danke!

Sebastian
 
Hallo,
ich suche seit zwei Tagen die Möglichkeit auf einem Element einen Doppelclick auszulösen.
invokemember("click") kenne ich, aber nicht für Doppelklick.

Kann mir da jemand helfen ?

Danke Dominik
 
Zurück