【问题标题】:WebBrowser Control c#: finding particular link and "clicking" it programmatically?WebBrowser Control c#:查找特定链接并以编程方式“单击”它?
【发布时间】:2012-08-26 23:46:00
【问题描述】:

我正在开发 csv 下载器项目,我需要下载网页上生成的 CSV 文件。并使用 html 敏捷性,我找到了包含 csv 文件链接的确切链接

<a href="/content/fo/contractvol/datafiles/OPTIDX_NIFTY_CE_31-08-2012_TO_31-08-2012.csv" target="_blank">Download file in csv format</a>

现在我想要,在我没有任何活动的情况下,应用程序必须在网页中检测到这个链接(我可以通过 Htmlagility 来完成),并且应该在网页在我的应用程序的 Web 浏览器中完全导航后下载文件。我在其中一个 SO click here 帖子中尝试了一些示例,但得到了

错误:对象引用未设置为对象的实例。

HtmlElementCollection links = webBrowser.Document.GetElementsByTagName("A");

foreach (HtmlElement link in links)  // this ex is given another SO post 
{
    if (link.InnerText.Equals("My Assigned"))
        link.InvokeMember("Click");
}

任何机构都可以建议如何做吗??

已解决:

我把HtmlElementCollection links = webBrowser.Document.GetElementsByTagName("A");改成HtmlElementCollection links = webBrowser1.Document.Links并用了

 if (link.InnerText.Contains("My Assigned"))
{
        link.InvokeMember("Click");
}

。谁有更好的解决方案?

【问题讨论】:

    标签: c# webbrowser-control


    【解决方案1】:

    InnerText 可能为空,因此构建一个保护措施,以检查是否为空:

    if ((link.InnerText != null) && (link.InnerText.Equals("My Assigned")) )
            link.InvokeMember("Click"); 
    

    【讨论】:

    • 我改成 HtmlElementCollection links = webBrowser.Document.GetElementsByTagName("A");到 HtmlElementCollection 链接 = webBrowser1.Document.Links 它工作。我是最佳实践吗??
    • 您几乎会认为 GetElementsByTagname 区分大小写。 Links 是一种替代方法,但它不仅会为您提供 Anchors (A),而且还会为您提供 LINK 和 AREA 标签,如msdn doc 中所述,在您的情况下,这是一个很好的解决方案。
    • @Vishwa TagName 指代任何特定标签的名称属性/属性,就像 TagId 指代任何标签的 ID 属性/属性一样。由于不太可能有名称为“A”的标签,因此您会收到该对象错误。看看我的回答。
    【解决方案2】:

    实际上,我会摆脱 HTMLAgility 包(它非常糟糕),然后自己去/循环浏览它。另外,不要使用innerText,因为根据您的示例,至少一个链接中似乎没有innertext。使用 .href 属性并检查 .csv 扩展名。

    link.href.EndsWith(".csv")
    

    如果每个页面上有多个 .cvs,请寻找一些 url 字符串或内部文本属性来完善它。

    此外,您的 .GetElementsByTagName("A") 不起作用的原因是 TagName 指的是任何特定 TAG 的名称属性。所以,您是说,使用 TagType name="A" 获取所有 TAG……这有意义吗?我认为有一个 .GetElementsByTag[Type] 或类似的东西,您可以使用它来基于标签类型而不是标签的名称属性。

    另外,您是如何下载 .csv 文件的?是出现“下载对话框”框还是只是在 webbrowser 控件中显示人员? (好奇你是如何处理这部分的)。

    【讨论】:

    • 您的 link.href 根本不起作用,它显示错误 1 ​​'System.Windows.Forms.HtmlElement' 不包含 'href' 的定义并且没有扩展方法 'href' 接受第一个可以找到“System.Windows.Forms.HtmlElement”类型的参数
    • @vishwa 那是因为你试图在不是锚标签的标签上做一个 .href ,即:如果在你的循环中你在一个 DIV 标签,你不能做.href 对此,您需要确保它是一个 A 标记,并且当您声明它时,不要使用 HtmlElement,因为它是一个链接,您可以为此使用适当的声明(HtmlAnchorElement 或其他名称,不记得了确切的名称,您将在智能感知中看到它)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 2019-03-08
    相关资源
    最近更新 更多