【问题标题】:C# Target HTML button by classC# 按类定位 HTML 按钮
【发布时间】:2020-12-11 20:14:17
【问题描述】:

我想点击一个没有 ID 的按钮。我使用this stackoverflow question 开始,但我似乎无法让它工作。

        //Load page 
        WebBrowser webBrowser1 = new WebBrowser();
        webBrowser1.Navigate("/login");
        while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
            System.Windows.Forms.Application.DoEvents();

        //Log in

        HtmlDocument doc = webBrowser1.Document;
        doc.GetElementById("username").SetAttribute("Value", "--");
        doc.GetElementById("password").SetAttribute("Value", "--");
        doc.GetElementById("_submit").InvokeMember("Click");


        WebBrowser webBrowser2 = new WebBrowser();
        webBrowser2.Navigate("/Start");
        while (webBrowser2.ReadyState != WebBrowserReadyState.Complete)
           System.Windows.Forms.Application.DoEvents();


        var buttons = webBrowser2.Document.GetElementsByTagName("button");
       Console.WriteLine(buttons); **//Output here: 'System.Windows.Forms.HtmlElementCollection'**
        foreach (HtmlElement button in buttons)
        {
            
            if (button.InnerText == "Filter    ")
            {
                
                button.InvokeMember("Click");
                Console.WriteLine("Clicked!"); **// This will never get writing into the console.**
            }
        }


}

HTML:

    <button class="down-arrow-btn" type="button" id="toggleFilterFieldsButton"
        title="Overige filtervelden tonen/verbergen"> ▼
</button>
<button class="filter-btn" type="submit" name="filter_action" title="Filteren"
        style="color: #7989a0"
        value="filter">Filter
</button>
<button class="herstel-btn" type="submit" name="filter_action" title="Filteren opheffen, alles tonen"
        value="reset">Herstel
</button>

在这种情况下,我想按下第二个按钮。

编辑:

第一个解决方案:

             var element = webBrowser2.Document.GetElementsByTagName("button")
        .Cast<HtmlElement>()
        Where(e => !String.IsNullOrEmpty(e.GetAttribute("name")) && e.GetAttribute("name") == "filter_action")
        .FirstOrDefault();
       

第二种解决方案:

         var elementToClick = webBrowser2.Document
        .GetElementsByTagName("button")
        .Cast<HtmlElement>()
        .FirstOrDefault(m => m.GetAttribute("className") == "filter-btn");
        elementToClick.InvokeMember("Click");
        Console.WriteLine(elementToClick);

我尝试了多种其他解决方案。但 htmlElement 始终为空。 我认为问题是由于网站非常安全。我的目标按钮对程序不可见?即使它在代码中可见。
如果我复制整个 HTML 代码(查看源代码:https:// url )并将其设为本地 .html,则可以正常工作。 (所有 3 个解决方案。)

【问题讨论】:

  • 您的比较是否可能不正确?您是否尝试过将 button.InnerText 输出到控制台以验证您是否从 GetElementsByTagName("button") 获取多个按钮以及验证您要比较的 InnerText 是否准确?
  • 这是个好主意。我测试了它,但似乎程序甚至没有到达 foreach.... 因为输出什么都没有。如果我尝试 Console.WriteLine("Test");它也不输出任何东西。
  • 好的,我做了什么:我在我的电脑(本地)上创建了一个 .HTML 文件,只粘贴了 HTML 按钮,现在我确实看到了所有 3 个按钮的名称。所以我认为登录后出现问题..有没有办法,我可以看到程序在视觉上做了什么?就像我在看着它执行一样?
  • WebBrowser2 的 URL 来自哪里?它与您在第一个 WebBrowser 控件中的登录有任何关系吗?
  • 很高兴你能成功。快乐编码:)

标签: c# html webbrowser-control


【解决方案1】:

只使用 1 个网络浏览器控件就可以了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 2014-01-27
    • 1970-01-01
    • 2014-08-19
    • 1970-01-01
    相关资源
    最近更新 更多