如何在C# WebBrowser中模拟“在新窗口中打开链接”?

4
我刚刚发现,要模拟点击操作,可以调用element.InvokeMember("click"),其中element是一个HtmlElement。但实际上我需要的是在新窗口中打开链接,而不是在默认浏览器中打开,而是在我程序中创建的另一个WebBrowser中打开。有时候只需通过调用element.GetAttribute("href")获取href属性,然后导航到返回的URL即可,但某些挑剔的网页无法通过这种方式工作,我猜想这与cookie和会话有关。

好的,这个问题可以用其他方法解决:如果我能够克隆WebBrowser的内容,我就可以在克隆上跟随链接。我也可以重新加载当前的URL,但对于某些情况来说可能会很混乱。也许有一种方法可以克隆整个东西,使其处于相同的状态。 - Juan
2个回答

1

System.Windows.Forms.WebBrowser是一个非常受限制的控件,其中最大的问题之一就是多标签支持。它根本不支持。

我花费了大量时间尝试使其正常工作,但并没有取得足够的成功,因此建议您改用第三方控件。

解决方法:订阅页面上每个<a>的单击事件(或您需要的某些),并手动创建一个新窗口。例如,请参见dotBrowser中的实现方式:1 2

foreach (HtmlElement tag in webBrowser.Document.All)
{
    tag.Id = String.Empty;
    switch (tag.TagName.ToUpper())
    {
        case "A":
        {
            tag.MouseUp += new HtmlElementEventHandler(link_MouseUp);
            break;
        }
    }
}

private void link_MouseUp(object sender, HtmlElementEventArgs e)
{
    mshtml.HTMLAnchorElementClass a = (mshtml.HTMLAnchorElementClass)((HtmlElement)sender).DomElement;
    switch (e.MouseButtonsPressed)
    {
        case MouseButtons.Left:
        {
            // open new tab
            break;
        }
        case MouseButtons.Right:
        {
            // open context menu
            break;
        }
    }
}

但是,“//打开新标签页”行中的代码将是什么呢?因为那里实际上是在新窗口中打开链接。 - Juan
@jsoldi: 点击上面的链接#2。在你的情况下 - 可以创建一个接受字符串(url)的构造函数,用于创建一个新的表单。该表单将创建一个新的WebBrowser并将其导航到该url。 - abatishchev
问题在于有些页面使用了cookie等东西,这样我就不能只复制链接并在新窗口中打开它。那是我以前的做法,直到我发现在eBay上,复制“下一页”链接的href(会将我发送到结果的下一页)然后在新窗口中导航到它总是会让我停留在第一页。不知道为什么。我怀疑这与会话和cookie有关。 - Juan

1

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