Skip to main content
 首页 » 编程设计

c#之Webbrowser 单击具有 OnClick 属性的链接

2024年01月28日26davidwang456

假设我有以下 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 或 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> 

请您参考如下方法:

我的猜测:您正在尝试查找 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"); 
}