Mat*_*ght 3 c# null elements webbrowser-control winforms
我希望标题足够清楚,但我会尝试解释......
我正在使用C#Winforms(dotnet 4.5).
问题是我正在创建一个WebBrowser控件并尝试设置内容wb.DocumentText.但是当我尝试循环遍历元素时,它表示文档为空(null)
这是我的代码:
WebBrowser wb = new WebBrowser();
wb.DocumentText = leMessage;
HtmlElementCollection elems = wb.Document.GetElementsByTagName("a");
foreach (HtmlElement elem in elems)
{
// Do Some Stuff
}
Run Code Online (Sandbox Code Playgroud)
leMessage 持有HTML简报消息,其中有一些标签.
我已经尝试了这个:wb.Document.Body.InnerHtml = leMessage;但是这也不起作用......
我错过了什么或做错了什么?
WebBrowser.DocumentText是异步的.您需要先处理DocumentComplete才能访问DOM,并继续处理Windows消息.这是一个完整的网络报废示例,async/await用于保持方便的线性代码流.只需改变导航部分:
await NavigateAsync(ct, () => this.webBrowser.DocumentText = leMessage), timeout);
HtmlElementCollection elems = wb.Document.GetElementsByTagName("a");
Run Code Online (Sandbox Code Playgroud)
这样你就可以循环完成.简而言之:
using System;
using System.Diagnostics;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WinformsApp2
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
const string leMessage = "<a href='http://example.com'>Go there</a>";
private async void MainForm_Load(object sender, EventArgs e)
{
var wb = new WebBrowser();
TaskCompletionSource<bool> tcs = null;
WebBrowserDocumentCompletedEventHandler documentCompletedHandler = (sender2, e2) => tcs.TrySetResult(true);
for (int i = 0; i < 3; i++)
{
tcs = new TaskCompletionSource<bool>();
wb.DocumentCompleted += documentCompletedHandler;
try {
wb.DocumentText = leMessage;
await tcs.Task;
}
finally {
wb.DocumentCompleted -= documentCompletedHandler;
}
HtmlElementCollection elems = wb.Document.GetElementsByTagName("a");
foreach (HtmlElement elem in elems)
{
Debug.Print(elem.OuterHtml);
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)