【问题标题】:C# - Wait for a WebBrowser to completely finish navigating and loading a website/webpageC# - 等待 WebBrowser 完全完成导航和加载网站/网页
【发布时间】:2018-11-07 16:09:20
【问题描述】:

我正在尝试通过使用 WebBrowser 在 C# 中创建 Windows 窗体应用程序来实现 Web 自动化。我目前有下面的代码导航到 Youtube 并在 Youtube 的搜索栏中输入一个字符串。

website.Navigate("www.youtube.com");

website.Document.GetElementById("search").InnerText = "Cavaliers vs Boston highlights";

但是,我在该行中得到一个 NullReferenceException

website.Document.GetElementById("search").InnerText = "骑士 vs 波士顿集锦";

我尝试在不同的网站中搜索 WebBrowser 如何确定它是否已完全加载您在 Navigate 方法中指定的网站,但到目前为止我还没有找到任何内容。

我在网上找到的是检查 WebBrowser 就绪状态的方法,但在尝试时,它甚至不会加载我创建的表单,但仍会继续执行 GetElementById 方法。

希望有人能帮我解决这个问题,从早上起就一直在努力寻找解决方案。

【问题讨论】:

  • 请注意,如果您需要的话,您可以使用 Youtube 的查询字符串直接进入搜索结果。 https://www.youtube.com/results?search_query=Cavaliers+vs+Boston+highlights
  • 这实际上很有帮助,我会记住这一点。但是,我需要能够在加载 Youtube 后做一些事情(比如点击视频等),这就是为什么我需要知道 WebBrowser 如何确定它是否已经完成加载。
  • 要操作 DOM,您需要先等待 DOM 完成加载。为此,请使用浏览器控件的DocumentCompleted 事件。正如下面的 Quirzo 所建议的那样。 webbrowser 控件 (ieframe) 的性能很差,不过使用起来也太旧了。

标签: c# browser-automation


【解决方案1】:

尝试向 WebBrowser 添加事件侦听器。 WebBrowser 有一个WebBrowser.DocumentCompleted 事件,该事件在网页完全加载时发生。

类似

public frmMain()
{
    website.DocumentCompleted += website_DocumentCompleted;
}


public void website_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{
    website.Document.GetElementById("search").InnerText = "Cavaliers vs Boston highlights"
}

其中 frmMain 是您的表单。当然也可以添加到其他地方。

【讨论】:

  • 请问这个方法需要传递哪些参数?它提到了 object 和 WebBrowserDocumentCompletedEventArgs 类型的 2 个参数,但我目前的代码中没有。这是我必须创造的新事物吗?
  • website.Navigate("www.youtube.com"); website_DocumentCompleted(); public void website_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { website.Document.GetElementById("search").InnerText = "Cavaliers vs Boston Highlights"; }
  • 我试过这样做,但我仍然得到 NullReferenceException。
  • 您可以通过双击表单设计器属性中的 DocumentCompleted 方法来自动添加该方法。因此,在设计器中右键单击 Web 浏览器,选择事件并双击 DocumentCompleted。其他方法是手动添加,例如在表单构造函数中:website.DocumentCompleted += website_DocumentCompleted; 编辑:更新答案。
  • 我尝试按照你说的做,但它仍然给我一个 NullReferenceException。
猜你喜欢
  • 2021-02-05
  • 1970-01-01
  • 2015-03-23
  • 1970-01-01
  • 2013-10-31
  • 1970-01-01
  • 1970-01-01
  • 2017-02-06
  • 1970-01-01
相关资源
最近更新 更多