【问题标题】:InvokeMember("click") webBrowser helpInvokeMember("click") webBrowser 帮助
【发布时间】:2011-02-08 21:54:22
【问题描述】:

我正在尝试通过 weBrowser 自动化网页,而我尝试单击的按钮没有 ID,只有一个值。这是它的html代码:

<td width='10%' align='center'><button class="buttonf" onclick="window.location='staticpage.php?accept=123456' ">Accept</button></td>

我不能使用GetElementById,因为按钮没有ID。 如果我这样做了

HtmlElement goButton = this.webBrowser1.Document.All["Accept"];
goButton.InvokeMember("click");

我的脚本停止显示突出显示“goButton.InvokeMember("click");”的空引用错误

如果我这样做

var inputControls = (from HtmlElement element in webBrowser1.Document.GetElementsByTagName("input") select element).ToList();
            HtmlElement submitButton = inputControls.First(x => x.Name == "Accept");

我的脚本在“HtmlElement submitButton”行出现“序列不包含匹配元素”错误 有时页面有多个接受按钮,所以我需要能够分辨出每个按钮之间的区别,或者至少能够在不破坏脚本的情况下单击一个

对此的任何帮助将不胜感激

【问题讨论】:

    标签: c# .net browser


    【解决方案1】:

    您正在尝试查找按钮标签,对吗?如果是这种情况,GetElementsByTagName("input") 可能应该是GetElementsByTagName("button")。按钮的名称也不会是 Accept,这将是 InnerText 属性。如果您不确定按钮是否存在,您最好使用FirstOrDefault 并检查返回值是否为空,因为如果没有匹配,'.First' 会崩溃并烧毁。

    至于如果有多个“接受”按钮,如何区分按钮之间的区别,我认为需要更多考虑。

    此代码未经测试,但可能更接近您的需要

    var buttonControls = (
        from HtmlElement element 
        in webBrowser1.Document.GetElementsByTagName("button") 
        select element
    ).ToList();
    
    HtmlElement submitButton = 
        buttonControls.FirstOrDefault(x => x.InnerText == "Accept");
    
    if (submitButton != null) {
        submitButton.InvokeMember("click");
    } else {
        //didn't find it
    }
    

    【讨论】:

    • 是的,代码做到了,感谢大家的帮助!现在我只需要弄清楚如何分辨每个按钮之间的区别
    【解决方案2】:

    页面中似乎没有匹配的元素。您确定按钮在当前页面上,而不是在嵌入框架中吗?

    无论如何,您都需要进行错误检查。不应有意引发 NullReferenceException。

    【讨论】:

      猜你喜欢
      • 2013-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-03
      • 2014-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多