我一直在尝试很多不同的解决方案wait
and async
。似乎没什么作用。我无法找到实际上完全等待页面完全加载的解决方案。所有代码都在等待一段时间,但直到页面加载完毕,我在下一个过程中收到错误。
我如何将示例代码设置为等待模式,直到Document.GetElementById("quickFind_text_0")
页面上已找到元素?
这是我的代码:
private void button7_Click(object sender, EventArgs e)
{
webBrowser1.Navigate("https://company.crm4.dynamics.com/main.aspx?app=d365default&pagetype=entitylist&etn=opportunity");
webBrowser1.Document.GetElementById("shell-container").Document.GetElementById("quickFind_text_0").SetAttribute("value", "Airbus");
webBrowser1.Document.GetElementById("shell-container").Document.GetElementById("quickFind_text_0").InnerText = "Airbus";
//Thread.Sleep(2000);
HtmlElement fbLink = webBrowser1.Document.GetElementById("shell-container").Document.GetElementById("mainContent").Document.GetElementById("quickFind_button_0"); ;
fbLink.InvokeMember("click");
}
附:我必须这样做“两次”,否则它不起作用:
webBrowser1.Document.GetElementById("shell-container").Document.GetElementById("quickFind_text_0").SetAttribute("value", "Airbus");
webBrowser1.Document.GetElementById("shell-container").Document.GetElementById("quickFind_text_0").InnerText = "Airbus";
在 VBA 中,这是有效的:
While .Busy
DoEvents
Wend
While .ReadyState <> 4
DoEvents
Wend
在 C# 中可以做同样的事情吗?
EDIT:
我的完整代码如下。由于某种原因,async/await 不起作用。
System.NullReferenceException HResult=0x80004003 消息=对象
未设置对对象实例的引用。来源=v.0.0.01
StackTrace:位于 v._0._0._01.Browser.d__7.MoveNext()
在 C:\Users\PC\source\repos\v.0.0.01\v.0.0.01\Browser.cs 中:第 69 行
这是我的代码:
using System;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace v.0._0._01
{
public static class WebBrowserExtensions
{
public static Task<Uri> DocumentCompletedAsync(this WebBrowser wb)
{
var tcs = new TaskCompletionSource<Uri>();
WebBrowserDocumentCompletedEventHandler handler = null;
handler = (_, e) =>
{
wb.DocumentCompleted -= handler;
tcs.TrySetResult(e.Url);
};
wb.DocumentCompleted += handler;
return tcs.Task;
}
}
public partial class Browser : Form
{
public Browser()
{
InitializeComponent();
}
private async void button7_Click(object sender, EventArgs e)
{
webBrowser1.Navigate("https://company.crm4.dynamics.com/main.aspx?app=d365default&pagetype=entitylist&etn=opportunity");
await webBrowser1.DocumentCompletedAsync(); // async magic
HtmlElement fbLink = webBrowser1.Document.GetElementById("shell-container").Document.GetElementById("mainContent").Document.GetElementById("quickFind_button_0"); ;
fbLink.InvokeMember("click");
}
}
}
现在我也注意到了quickFind_text_0
and quickFind_button_0
总是以相同的单词开头,但数字会像这样变化quickFind_text_1
and quickFind_button_1
or quickFind_text_2
and quickFind_button_2
。但是,通过手动单击,一切都可以使用quickFind_text_0
and quickFind_button_0
.