如何从WPF WebBrowser控件调试页面的JavaScript代码

3
我有一个WPF WebBrowser控件,我在我的wpf客户端应用程序中使用它来导航到不同的页面。它具有基本功能,如后退、前进、转到事件,调用this.webbrowser.goback()、this.webbrowser.goforward()、this.webbrowser.go()。
虽然Web应用程序在IE上运行良好,这意味着所有超过一个级别的前进和后退导航都可以正常工作。但是,在我的WPF应用程序中,对于一个页面(Billings,其中包含联系人链接,在联系人页面中我们有地址链接),超过一个级别的导航不能正常工作。当在我的地址页面上单击后退按钮时,它会跳转到联系人页面,但是在联系人页面上单击后退按钮时,它不会返回到Billings页面。
由于在IE中没有任何问题,所以我怀疑我的WPF应用程序存在问题。我在这里有几个问题。
1. webbrowser.goback()是否与IE的点击后退按钮相同?或者说,与IE相比,wpf webbrowser控件中是否会漏掉任何事件?
2. 是否有一种方法可以从WPF应用程序本身调试javascripts?
3. 是否有更好的方法从WPF应用程序调试这些场景?
4. IE是否将WPF WebBrowser导航存储在其历史记录中,还是它是一个单独的实例?
我的控件如下所示:
<WebBrowser x:Name="webBrowser" DockPanel.Dock="Bottom" Navigating="webBrowser_Navigating" Navigated="webBrowser_Navigated" LoadCompleted="webBrowser_LoadCompleted"/>

并且后台代码如下:

private void backButton_Click(object sender, RoutedEventArgs e)
    {
        // Navigate to the previous HTML document, if there is one
        if (this.webBrowser.CanGoBack)
        {
            this.webBrowser.GoBack();
        }
        else
        {
            MessageBox.Show("Cannot go back. There needs to be something in the history to go back to.");
        }
    }
    private void forwardButton_Click(object sender, RoutedEventArgs e)
    {
        // Navigate to the next HTML document, if there is one
        if (this.webBrowser.CanGoForward)
        {
            this.webBrowser.GoForward();
        }
        else
        {
            MessageBox.Show("Cannot go Forward. There needs to be something in the history to go forward to.");
        }
    }

2
这能帮到你吗 - http://blogs.perl.org/users/mark_leighton_fisher/2011/09/debugging-javascript-in-a-webbrowser-control-from-vs2010.html - Dean.DePue
迪恩的链接看起来是一个不错的解决方案。 - Glen Thomas
2个回答

4
我原本以为WebBrowser控件的导航方式和IE在WPF中被托管时一样,但结果并不是这样。
JavaScript可以调用.NET应用程序中的方法,因此JavaScript可以将调试信息写入到.NET控制台。
该类可以传递给WebBrowser中的JavaScript,以便调用.NET方法。
[ComVisible(true)]
public class ScriptManager
{
    // This method can be called from JavaScript.
    public void WriteConsole(string output)
    {
        // Call a method on the form.
        Console.WriteLine(output);
    }
}

传递给WebBrowser:

webBrowser1.ObjectForScripting = new ScriptManager();

我不知道如何使用JavaScript调用该方法,因为我从未真正使用过JavaScript,但我认为应该是这样:

$scope.LogBackNavigation = function() {
    window.external.WriteConsole("Back Navigation");
}

这可能让你看到JavaScript中正在发生的事情。


2

调试-附加到进程->脚本代码 这将加载我在VS中的所有JS文件,我可以在任何地方设置断点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接