Laden...

Fehler bei Zugriff auf Homepagelemente über Webbrowsercontrol

Erstellt von Shinobi vor 13 Jahren Letzter Beitrag vor 13 Jahren 3.807 Views
S
Shinobi Themenstarter:in
14 Beiträge seit 2008
vor 13 Jahren
Fehler bei Zugriff auf Homepagelemente über Webbrowsercontrol

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:

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

B
293 Beiträge seit 2008
vor 13 Jahren

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.

S
Shinobi Themenstarter:in
14 Beiträge seit 2008
vor 13 Jahren

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

B
293 Beiträge seit 2008
vor 13 Jahren

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.

S
Shinobi Themenstarter:in
14 Beiträge seit 2008
vor 13 Jahren

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/";
3.170 Beiträge seit 2006
vor 13 Jahren

Hallo,

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

S
Shinobi Themenstarter:in
14 Beiträge seit 2008
vor 13 Jahren

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?

3.170 Beiträge seit 2006
vor 13 Jahren

Hallo,

allerdings wird in 2 anderen Backgroundworkern jeweils Seiten angesteuert, Quelltext ausgelesen und analysiert.

Benutzen die auch das WebBrowser-Control?

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

S
Shinobi Themenstarter:in
14 Beiträge seit 2008
vor 13 Jahren

Hallo,

allerdings wird in 2 anderen Backgroundworkern jeweils Seiten angesteuert, Quelltext ausgelesen und analysiert.
Benutzen die auch das WebBrowser-Control?

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

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