【发布时间】: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