【问题标题】:Webkit.Net wait for page to be fully loadedWebkit.Net 等待页面完全加载
【发布时间】:2013-01-07 11:12:44
【问题描述】:

我正在尝试使用网络浏览器制作 C# windows 窗体应用程序。

我正在使用 webkit 浏览器:Link to the browser

我将网络浏览器放入一个类文件中,因此我可以通过我将要使用的所有表单访问它。

生成网络浏览器的代码:

public static WebKit.WebKitBrowser mainBrowser = new WebKitBrowser();

我的这段代码有一些问题:

globalVars.mainBrowser.Navigate("http://www.somesite.com/");
while (globalVars.mainBrowser.IsBusy)
    {
        System.Threading.Thread.Sleep(500);
    }
globalVars.mainBrowser.Document.GetElementById("user").TextContent = "User Name";

但它不起作用。如果我在一段时间后做一个消息框,它会在可以呈现页面之前显示出来......

那么等待网站完全加载的最佳方法是什么?

更新 1

在一个独立的类文件中,我是否像这样制作 webkit 控件:

public static WebKit.WebKitBrowser mainBrowser = new WebKitBrowser();

在一个表单中,我现在得到了这段代码(感谢 Tearsdontfalls):

public void loginthen()
    {
        globalVars.mainBrowser.DocumentCompleted += mainBrowser_DocumentCompleted;
        globalVars.mainBrowser.Navigate("http://www.somesite.com/");    
    }

void mainBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    var send = sender as WebKit.WebKitBrowser;
    if (send.Url == e.Url)
    {
        MessageBox.Show("Inloggen");
        globalVars.mainBrowser.Document.GetElementById("user").TextContent = "User Name";
    }
 }

但是没有消息框出现。但是,如果我使用本地(在同一表单上)webkit 浏览器,我会得到消息框。但是用户字段没有填写。

即使是 documentCompleted 事件中的断点也不会被触发。所以看起来事件监听器不起作用......

那么为什么它不起作用?

【问题讨论】:

  • 也许文档完成事件是一个选项?
  • @Tearsdontfalls,也许吧。但是代码会是什么样子呢?因为我这样做的表格并不总是在...

标签: c# webkit


【解决方案1】:

您可以简单地在 Web 浏览器上的 Document Completed 事件上创建一个事件侦听器,或者您可以像这样动态创建它:

globalVars.mainbrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(mainbrowser_DocumentCompleted);

mainbrowser_DocumentCompleted 是 void 的名称,您可以在其中进行这样的操作(我使用了您提供的代码的名称):

void browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) {
    var send = sender as WebKit.WebKitBrowser;
    if (send.Url == e.Url) {
        globalVars.mainBrowser.Document.GetElementById("user").TextContent = "User Name";
    }
}

【讨论】:

  • 抱歉,但如果我在事件的 if 语句中执行 MessageBox,它不会显示出来......我会用更多信息更新问题......
  • 好的,我更新了代码(添加了新的 WebBrowserDocumentCompletedEventHandler(browser_DocumentCompleted) 以添加事件处理程序)。也许这可以解决问题,如果没有:您在导航/导航事件中是否有任何代码可以取消浏览?
  • 它仍然没有到达断点(我在var send = sender.... 行上设置了我在更新的问题中没有任何其他代码(然后关于网络浏览器)我有吗在浏览器之前先由 webkit 浏览器本身做一些事情???(注意,我不会在表单的任何地方显示它)
  • 你知道网络浏览器是否真的在浏览吗?你是否让网络浏览器在某处可见/添加到你的控制列表中(也许它必须可见才能工作)
  • 现在完成了,现在它触发断点...所以如果我将 webbrowser 添加到表单中,它可以工作...但是如果我执行everyting(登录)并关闭表单并打开另一个表单,网络浏览器是否仍处于登录状态?
【解决方案2】:

添加以下代码让事件在浏览器处于不可见模式时触发。

using (Bitmap bmp = new Bitmap(webKitBrowser.Width, webKitBrowser.Height))
{
    webKitBrowser.DrawToBitmap(
        bmp, 
        new Rectangle(
            webKitBrowser.Location.X, 
            webKitBrowser.Location.Y, 
            webKitBrowser.Width, 
            webKitBrowser.Height
        )
    );
}

【讨论】:

  • 感谢您回答我的问题。几年后,我手头没有具体的项目,所以我无法测试它。但也许这会在未来对某人有所帮助!
  • 当然,这就是我添加的要点。经过一些线索 n 错误后,我已经解决了这个问题。奇怪的是它不允许事件触发。我将其用作非 Windows 应用程序的一部分。
猜你喜欢
  • 2019-02-10
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多