Cet article explique comment générer dynamiquement du code HTML à l'aide de la classe WebBrowser de System.Windows.Forms ou de l'interface HTMLDocument de l'assembly Microsoft HTML Object Library.
L'utilisateur a d'abord essayé d'utiliser la classe System.Windows.Forms.WebBrowser, mais a rencontré des limitations pour obtenir le code HTML rendu. J'ai eu le même problème en essayant d'accéder au code via l'interface mshtml.HTMLDocument.
Les utilisateurs ont exclu ces méthodes et recherché des alternatives, explorant l'utilisation des propriétés du navigateur Web pour obtenir les données requises, mais reconnaissant les lacunes de cette approche.
La solution proposée combine la classe WebBrowser et la programmation async/await pour interroger efficacement les modifications dans l'instantané HTML actuel de la page tout en vérifiant la propriété WebBrowser.IsBusy. Les considérations clés incluent :
Le code suivant illustre la méthode LoadDynamicPage de la solution encapsulée :
<code class="language-csharp">async Task<string> LoadDynamicPage(string url, CancellationToken token) { // 导航和DocumentCompleted事件处理 var tcs = new TaskCompletionSource<bool>(); WebBrowserDocumentCompletedEventHandler handler = (s, arg) => tcs.TrySetResult(true); using (token.Register(() => tcs.TrySetCanceled(), useSynchronizationContext: true)) { this.webBrowser.DocumentCompleted += handler; try { this.webBrowser.Navigate(url); await tcs.Task; // 等待DocumentCompleted } finally { this.webBrowser.DocumentCompleted -= handler; } } // 获取根元素 var documentElement = this.webBrowser.Document.GetElementsByTagName("html")[0]; // 异步轮询当前HTML更改 var html = documentElement.OuterHtml; while (true) { // 异步等待 await Task.Delay(500, token); // 如果WebBrowser繁忙,则继续轮询 if (this.webBrowser.IsBusy) continue; var htmlNow = documentElement.OuterHtml; if (html == htmlNow) break; // 未检测到更改,结束轮询循环 html = htmlNow; } // 认为页面已完全渲染 token.ThrowIfCancellationRequested(); return html; }</code>
Pour activer le rendu HTML5 dans Internet Explorer 10 et supérieur, utilisez les commandes de fonctionnalités du navigateur présentées ci-dessous :
<code class="language-csharp">private static void SetFeatureBrowserEmulation() { if (LicenseManager.UsageMode != LicenseUsageMode.Runtime) return; var appName = System.IO.Path.GetFileName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName); Registry.SetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION", appName, 10000, RegistryValueKind.DWord); }</code>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!