浏览器单击具有OnClick属性的链接

本文关键字:属性 链接 OnClick 单击 浏览器 | 更新日期: 2023-09-27 18:27:10

假设我得到了以下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>

现在让我们假设我想模拟一个点击服务器NLP2。我知道我必须得到HTML。所以首先我得到这样的div:

HtmlElement active_server = webBrowser1.Document.GetElementById("active_server").GetElementsByTagName("div")[0];

但我的问题如下:

我如何循环浏览元素并在Onclick中搜索我必须点击的链接(注意,onclick是可变的,所以我不能做索引和点击之类的事情。我真的需要比较onclick或span中的文本)

我对这种编程很陌生。

编辑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>

浏览器单击具有OnClick属性的链接

我的猜测是:您正试图通过文本找到要单击的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;
}

[编辑]

如果您确定要查找的字符串(例如"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);
}

[编辑]

我刚刚用下面的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);

[更新]

该代码与您提供的链接一起工作,不做任何修改。也许,您需要确保文档已完全加载,如下图所示:

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");
}
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);
};