假设我有以下HTML:
<div id="active_server">
<div class="clearfix">
<a href="#" onclick="return Index.submit_login('server_nlp1');">
<span class="world_button_active">Server NL P1</span>
</a>
<a href="#" onclick="return Index.submit_login('server_nlp2');">
<span class="world_button_active">Server NL P2</span>
</a>
</div>
</div>
现在让我们说我想模拟服务器NL P2上的点击。我知道我必须得到HTML。所以首先我得到这样的div:
HtmlElement active_server = webBrowser1.Document.GetElementById("active_server").GetElementsByTagName("div")[0];
但接下来是我的问题:
如何遍历元素并搜索我必须点击的Onclick
链接(注意,onclick是可变的,所以我不能做索引和点击或类似的东西。我真的需要比较onclick或跨度中的文本
我对这种编程很陌生。
编辑1 我真的不知道该元素的位置,因为它可以改变(有时候有更多的服务器,我必须找到合适的服务器......)
编辑2
HTML看起来像这样:
<div id="active_server">
<p class="pseudo-heading">Op welke wereld wil je je aanmelden?</p>
<div class="clearfix">
<a href="#" onclick="return Index.submit_login('server_nl33');">
<span class="world_button_active">Wereld 33</span>
</a>
<a href="#" onclick="return Index.submit_login('server_nlp1');">
<span class="world_button_active">Casual</span>
</a>
</div>
<div class="clearfix">
<a href="#" onclick="return Index.submit_login('server_nl34');">
<span class="world_button_inactive">Wereld 34</span>
</a>
</div>
<p class="pseudo-heading" id="show_all_server">
<a href="#" onclick="$('#show_all_server').hide();$('#inactive_server_list').show();return false">Toon alle werelden</a>
</p>
</div>
答案 0 :(得分:4)
我的猜测:您正在尝试查找要在该链接的内部A
中包含的文字点击的SPAN
链接。
试试这个:
HtmlElement active_server = webBrowser1.Document.GetElementById("active_server").GetElementsByTagName("div")[0];
HtmlElement link = null;
if (FindLinkToClick(active_server, "Server NL P1", ref link)
{
link.InvokeMember("click", null);
}
// FindLinkToClick
bool FindLinkToClick(HtmlElement root, string text, ref HtmlElement found)
{
foreach (var child in root.Children)
{
var element = (HtmlElement)child;
if (element.InnerText == text)
{
found = element.Parent;
return true;
}
if (FindLinkToClick(element, text, ref found))
return true;
}
return false;
}
<强> [EDITED] 强>
如果您确定要查找的字符串(例如“Server NL P1”)是唯一的,则可以使用webBrowser1.WB.Document.Body
作为root
进行搜索:
HtmlElement link = null;
if (FindLinkToClick(webBrowser1.WB.Document.Body, "Server NL P1", ref link))
{
link.InvokeMember("click", null);
}
<强> [EDITED] 强>
我刚用下面的HTML测试它,它的工作原理。注意<a href="#" onclick="alert('clicked!')">
,我确实看到“点击了!”警报。
<div id="active_server">
<p class="pseudo-heading">Op welke wereld wil je je aanmelden?</p>
<div class="clearfix">
<a href="#" onclick="alert('clicked!')">
<span class="world_button_active">Wereld 33</span>
</a>
<a href="#" onclick="return Index.submit_login('server_nlp1');">
<span class="world_button_active">Casual</span>
</a>
</div>
<div class="clearfix">
<a href="#" onclick="return Index.submit_login('server_nl34');">
<span class="world_button_inactive">Wereld 34</span>
</a>
</div>
</div>
我称之为:
HtmlElement link = null;
if (FindLinkToClick(this.webBrowser1.Document.Body, "Wereld 33", ref link))
link.InvokeMember("click", null);
<强> [UPDATE] 强>
代码可以使用您提供的链接进行修改。也许,您需要确保文档已完全加载,如下所示:
bool _loaded = false;
public Form1()
{
InitializeComponent();
this.WB.DocumentCompleted += WB_DocumentCompleted;
}
void WB_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if (_loaded)
return;
_loaded = true;
HtmlElement link = null;
if (FindLinkToClick(this.WB.Document.Body, "Wereld 33", ref link))
{
link.InvokeMember("click", null);
}
}
void Form1_Load(object sender, EventArgs e)
{
this.WB.Navigate(@"http://scriptsenprogs.nl/twmc.html");
}
答案 1 :(得分:3)
webBrowser1.DocumentCompleted += (s, e) =>
{
HtmlElement active_server = webBrowser1.Document.GetElementById("active_server").GetElementsByTagName("div")[0];
var a = active_server.GetElementsByTagName("a")[0];
a.InvokeMember("click", null);
};