Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Fehler bei Zugriff auf Homepagelemente über Webbrowsercontrol
Shinobi
myCSharp.de - Member



Dabei seit:
Beiträge: 14

Themenstarter:

Fehler bei Zugriff auf Homepagelemente über Webbrowsercontrol

beantworten | zitieren | melden

Hi Leute,
ich sitze nun schon geschlagene 10 Stunden, auf 3 Tage verteilt, an dem Problem und finde einfach keine Lösung.
Die allgegenwärtige Googlesuche habe ich schon bemüht doch damit komm ich kein Stück weiter, vorallem wird dort auf VB verwiesen. Auch hier im Forum habe ich schon gesucht, doch wurd auch hier nicht fündig.
Folgender Hintergrund:
Ich versuche mit dem Webbrowsercontrol eine Webseite zu laden und die darin vorhandenen Textareas/Textboxen/Radiobuttons mit Inhalt zu füllen.
Bei dem Versuch mittels:

webBrowser.Document.All["name_der_textbox"].InnerText = "Irgendein Inhalt";

einen String in das Feld zu bekommen, gibt es folgenden Fehler:
Zitat
System.InvalidCastException wurde nicht von Benutzercode behandelt.
Message=Die angegebene Umwandlung ist ungültig.
Source=System.Windows.Forms
StackTrace:
bei
System.Windows.Forms.UnsafeNativeMethods.IHTMLDocument2.GetLocation()
bei System.Windows.Forms.WebBrowser.get_Document()
bei Yopi4Win_GUI.Form1.bgWorker_CommentReview_DoWork(Object
sender, DoWorkEventArgs e) in C:\Users\Shinobi\Documents\Visual
Studio 2010\Projects\*******\Form1.cs:Zeile 495.
bei System.ComponentModel.BackgroundWorker.OnDoWork(DoWorkEventArgs e)
bei
System.ComponentModel.BackgroundWorker.WorkerThreadStart(Object
argument)
InnerException:

Das Browsercontrol fülle ich vorher mit einer Helferklasse:

webBrowser.DocumentText = helper.GetHtml(string.Format(reviewPage, "404999"));

public string GetHtml(string Url)
{
request = (HttpWebRequest)HttpWebRequest.Create(Url);
request.CookieContainer = cookieContainer;
request.Method = "GET";
request.UserAgent = UserAgent;

response = (HttpWebResponse)request.GetResponse();
reader = new StreamReader(response.GetResponseStream());
string html = reader.ReadToEnd();
reader.Close();
response.Close();

return html;
}

Die Klasse funktioniert einwandfrei, daran liegt es nicht. Die Seite wird angezeigt, nur beim Zugriff danach kommt der Fehler.
Weder Google, noch msdn brachten mich bisher weiter, daher hoffe ich nun auf eure Hilfe.

Grüße
private Nachricht | Beiträge des Benutzers
blutiger_anfänger
myCSharp.de - Member



Dabei seit:
Beiträge: 293
Herkunft: Meerbusch, NRW

beantworten | zitieren | melden

Auf diese Art und Weise, wird auch nur einmal der Quelltext geladen und angezeigt. Wenn du aktiv weitersurfen willst, dann rufe den Quelltext per webBrowser.Navigate Methode auf oder fange die Link-Klicks ab und laden den neuen Quelltext wieder über die GetHtml Methode.

Viele Grüße,
Raffi
Wenn ich nicht hier bin, findest du mich auf code-bude.net.
private Nachricht | Beiträge des Benutzers
Shinobi
myCSharp.de - Member



Dabei seit:
Beiträge: 14

Themenstarter:

beantworten | zitieren | melden

Habs grad mal mit webbrowser.Navigate(url) versucht, doch auch hier folgt der selbe Fehler, nachdem die Seite fertig geladen hat und versucht wird auf das HtmlElement zuzugreifen.

EDIT: Aktiv weitersurfen ist nicht notwendig, das übernimmt das Programm
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Shinobi am .
private Nachricht | Beiträge des Benutzers
blutiger_anfänger
myCSharp.de - Member



Dabei seit:
Beiträge: 293
Herkunft: Meerbusch, NRW

beantworten | zitieren | melden

Ohne zu wissen, welche Seite das ist, die rummuckt - sprich ohne einen Blick in den Code - wird es schwer zu helfen.
Wenn ich nicht hier bin, findest du mich auf code-bude.net.
private Nachricht | Beiträge des Benutzers
Shinobi
myCSharp.de - Member



Dabei seit:
Beiträge: 14

Themenstarter:

beantworten | zitieren | melden

Durch einige Tests, die ich grade durchgeführt habe, ist es vollkommen egal, welche Seite.
Mein Ziel ist jedenfalls www.yopi.de

Hier der Code mit dem ich auf die Homepage zugreife und versuche Zugriff zu erhalten:

IsPageComplete = false;
            webBrowser.Navigate(string.Format(reviewPage, "404999"));
         //   webBrowser.DocumentText = helper.GetHtml(string.Format(reviewPage, "404999")); Voriger Versuch

            //Waiting until the browser has loaded the page completelly
            while (!IsPageComplete)
            { }

            webBrowser.Document.All["rating_comment"].InnerText = "hallo";

Das Ganze läuft in einem Backgroundworker ab, da nach einem erfolgreichen Test eine Schleife um den Code hier gelegt wird.
Dies ist bisher der vollständige Code des BGWs, mehr macht er nicht.
Die letzte Zeile löst dabei den Fehler aus. IsPageComplete wird in dem Event "Document_Completed" auf true gesetzt.
Hier noch die passende Konstante:

const string reviewPage = "http://www.yopi.de/rev/";
private Nachricht | Beiträge des Benutzers
MarsStein
myCSharp.de - Experte

Avatar #avatar-3191.gif


Dabei seit:
Beiträge: 3.170
Herkunft: Trier -> München

beantworten | zitieren | melden

Hallo,
Zitat
Das Ganze läuft in einem Backgroundworker ab
Dann vermute ich das Problem beim threadübergreifenden Zugriff auf das GUI, da webBrowser1 dem GUI-Thread gehört und nicht dem BGW.

Siehe [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke)

Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
private Nachricht | Beiträge des Benutzers
Shinobi
myCSharp.de - Member



Dabei seit:
Beiträge: 14

Themenstarter:

beantworten | zitieren | melden

Daran dachte ich auch schon, allerdings wird in 2 anderen Backgroundworkern jeweils Seiten angesteuert, Quelltext ausgelesen und analysiert. Der einzige Unterschied ist jetzt, dass ich nicht den Code analysiere sondern auf Elemente zugreife.
Dargestellt wird bei den anderen BGWs ebenfalls alles, der Zugriff und Zuweisung besteht also hier schon und verursacht keine Probleme.

Kanns an sowas banalem liegen wie einfach nur den Zugriff auf Elemente innerhalb des Controls?
private Nachricht | Beiträge des Benutzers
MarsStein
myCSharp.de - Experte

Avatar #avatar-3191.gif


Dabei seit:
Beiträge: 3.170
Herkunft: Trier -> München

beantworten | zitieren | melden

Hallo,
Zitat
allerdings wird in 2 anderen Backgroundworkern jeweils Seiten angesteuert, Quelltext ausgelesen und analysiert.
Benutzen die auch das WebBrowser-Control?
Zitat
Kanns an sowas banalem liegen wie einfach nur den Zugriff auf Elemente innerhalb des Controls?
Ja - weil das Control eben dem GUI-Thread gehört.

Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
private Nachricht | Beiträge des Benutzers
Shinobi
myCSharp.de - Member



Dabei seit:
Beiträge: 14

Themenstarter:

beantworten | zitieren | melden

Zitat von MarsStein
Hallo,
Zitat
allerdings wird in 2 anderen Backgroundworkern jeweils Seiten angesteuert, Quelltext ausgelesen und analysiert.
Benutzen die auch das WebBrowser-Control?
Japs, geben dem Webbrowsercontrol den Quelltext und die Webseite wird auch ordnungsgemäß angezeigt
Zitat
Kanns an sowas banalem liegen wie einfach nur den Zugriff auf Elemente innerhalb des Controls?
Ja - weil das Control eben dem GUI-Thread gehört.
Gut, das war jetzt blöd ausgedrückt. Ich arbeite mit C# nun schon seit über 3 Jahren...doch dass es in diesem einen Fall nicht funktioniert wundert mich...
Gruß, MarsStein

Ich werde nachher nach der Arbeit mal testen, wie ich die Eingabe und das Abschicken im BGW_ProgressChanged verarbeiten kann. Den Link habsch mir zu Gemüte geführt, nur gibt sich gerade keine Möglichkeit zum Testen.
Doch falls der Vorgang nun zu lange benötigt, ist ein extra Thread dafür ja auch unnötig, wenn die wichtigen Bearbeitungen/Berechnungen wieder im GUI-Thread laufen, oder seh ich das falsch?

Gruß Gino
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Shinobi am .
private Nachricht | Beiträge des Benutzers