Hallo,
ich möchte mit WebView2 den Source-Code einer Webseite auslesen:
ich möchte eine Webseite mit WebView2 auslesen.
Microsoft.Web.WebView2.WinForms.WebView2 WvLinkInhalt=new Microsoft.Web.WebView2.WinForms.WebView2();
Task<string> task = InternetAsync(LStr_Link, WvLinkInhalt);
String html = task.ToString();
public static async Task<string> InternetAsync(String Url, WebView2 webView2)
{
//https://stackoverflow.com/questions/62431464/vb-net-webview2-how-can-i-get-html-source-code
string html = "";
try
{
webView2.NavigateToString(Url);
html = await webView2.ExecuteScriptAsync("document.documentElement.outerHTML");
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
return html;
}
Allerdings erhalte ich mit diesem Code keinen Rückgabewert zurück.
Vermutlich muss ich da irgendwie auf etwas warten. Wie kann ich das aber umsetzen? Ich möchte anschließend das html auswerten.
Tschau
Martin
Du solltest mal die Warnungen überprüfen.
Auch der aufrufende Code muß await
benutzen - ansonsten wird der ganze Code synchron ausgewertet.
Außerdem erscheint mir NavigateToString die falsche Methode (diese erwartet einen HTML-String, keine URL), sondern entweder die Eigenschaft Source oder CoreWebView2.Navigate.
Task<string> task = InternetAsync(LStr_Link, WvLinkInhalt);
String html = task.ToString();
Das kann Dir niemals den HTML Code liefern, weil Du das ToString auf die Task Instanz und nicht auf die Rückgabe von InternetAsync anwendest.
Hier fehlt einfach das await.
string html = await InternetAsync(LStr_Link, WvLinkInhalt);
Auch der aufrufende Code muß
await
benutzen - ansonsten wird der ganze Code synchron ausgewertet.
In dem Fall ist es Parallel bzw. Fire and Forget.
Mit dem Task wird nichts mehr gemacht; der läuft einfach im "Hintergrund" und das Resultat wird "verworfen".
Im Endeffekt ist das parallel.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
wie kann ich denn mit WebView2 einen HTML-Code syncron auslesen oder wie kann ich aus einer syncron eine asyncrone Routine aufrufen?
Ich bekomme das nicht hin.
Wenn Du nur den Source haben willst, dann nimm einfach den HttpClient; da sind auch dutzende Beispiele in den MS Docs.
WebView2 is wenn Du einen Browser nachahmen willst, zB wegen JavaScript, (Pre-)Rendering oder die UI dazu anzeigen willst (zB in WPF) etc..
Vermutlich brauchst Du zweiteres, weil Du mit dem DOM arbeitest in Deinem Code.
In beiden Fällen musst Du "einfach" async await korrekt anwenden, wie in meinem Beispiel.
string html = await InternetAsync(LStr_Link, WvLinkInhalt);
async await ist wirklich was, was Du verstehen musst. Lern es. Inverstier 20 Stunden. Du brauchst es jeden Tag. Da reicht es nicht einfach den Code zu kopieren.
Das ist wirklich mittlerweile ein Basiswissen in C#, das man wirklich leider nicht mit Copy Paste lernen kann.
Und wenn Du etwas "nicht hin kriegst", was kriegst Du nicht hin? Erklär es konkret, dann kann man auch konkret antworten. Aber mein Ziel ist es, dass Du es verstehst und dann werde ich nicht Dein Code Generator sein. Da hast nix gelernt und Dir is nich geholfen.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code