Webbrowser点击具有OnClick属性的链接 [英] Webbrowser click on link with OnClick attribute
问题描述
假设我有以下HTML:
< div id =active_server>
< div class =clearfix>
< a href =#onclick =return Index.submit_login('server_nlp1');>
< span class =world_button_active>服务器NL P1< / span>
< / a>
< a href =#onclick =return Index.submit_login('server_nlp2');>
< span class =world_button_active>服务器NL P2< / span>
< / a>
< / div>
< / div>
现在假设我想模拟点击服务器NL P2。我知道我必须得到的HTML。所以首先得到div像这样:
HtmlElement active_server = webBrowser1.Document.GetElementById(active_server)。GetElementsByTagName div)[0];但是我的问题如下:
链接点击包含在该链接内部
p>如何循环遍历元素和搜索Onclick
wich链接我必须点击(注意,onclick的变量,所以我不能做索引和点击或类似的东西,我真的需要比较onclick或文本在span)
我是这种类型的编程的新手。 p>
编辑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>休闲< / 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-headingid =show_all_server>
< a href =#onclick =$('#show_all_server')。hide(); $('#inactive_server_list')。show(); return false> Toon alle hadlden< / a> ;
< / p>
< / div>
解决方案我的猜测: code> 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(root.hildren中的var child)
{
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(FindBrowser1 .WB.Document.Body,Server NL P1,ref link))
{
link.InvokeMember(click,null);
}
$ b我只是用下面的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>休闲< / 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);
}
Let's say that I've got the following 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>
Now let's say that i want to simulate an click on server NL P2. I know that I've got to get the HTML. so first i get the div like this:
HtmlElement active_server = webBrowser1.Document.GetElementById("active_server").GetElementsByTagName("div")[0];
But then is my question as follow:
How do i loop through the elements and search in the
Onclick
wich link I've got to click ( note, the onclick's are variable, so i can't do an index and click or something like that. I really need to compare the onclick or the text in the span)I'm very new to this type of programming.
EDIT 1 I don't really know on what place the element is because it can change ( sometimes there are more servers, and i've got to find the right server...)
EDIT 2
The HTML looks like this:
<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>
解决方案My guess: you're trying to find what
A
link to click by the text, contained in the innerSPAN
of that link.Try this:
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]
If you're sure the string you're looking for (e.g, "Server NL P1") is unique, you can just use
webBrowser1.WB.Document.Body
as theroot
for search:HtmlElement link = null; if (FindLinkToClick(webBrowser1.WB.Document.Body, "Server NL P1", ref link)) { link.InvokeMember("click", null); }
[EDITED]
I just tested it with the below HTML and it works. Note
<a href="#" onclick="alert('clicked!')">
, I do see that "clicked!" alert.<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>
I call it like this:
HtmlElement link = null; if (FindLinkToClick(this.webBrowser1.Document.Body, "Wereld 33", ref link)) link.InvokeMember("click", null);
[UPDATE]
The code works unmodified with the link your provided. Maybe, you need to make sure the document is fully loaded, like this:
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"); }
这篇关于Webbrowser点击具有OnClick属性的链接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!