Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Webbrowser单击带有OnClick属性的链接_C#_Onclick_Click_Webbrowser Control - Fatal编程技术网

C# Webbrowser单击带有OnClick属性的链接

C# Webbrowser单击带有OnClick属性的链接,c#,onclick,click,webbrowser-control,C#,Onclick,Click,Webbrowser Control,假设我得到了以下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>

假设我得到了以下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>
但我的问题如下:

如何循环元素并在Onclick中搜索链接我必须单击note,Onclick是可变的,所以我不能进行索引和单击之类的操作。我真的需要比较一下onclick和span中的文本

我对这种编程非常陌生

编辑1 我真的不知道元素在什么地方,因为它可能会改变有时有更多的服务器,我必须找到正确的服务器

编辑2

HTML如下所示:

HtmlElement active_server = webBrowser1.Document.GetElementById("active_server").GetElementsByTagName("div")[0];
<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>
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");
}

我的猜测是:您试图通过包含在该链接的内部跨度中的文本来查找要单击的链接

试试这个:

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;
}
[已编辑]

如果确定要查找的字符串(例如,服务器NL P1)是唯一的,则可以使用webBrowser1.WB.Document.Body作为搜索根:

HtmlElement link = null;
if (FindLinkToClick(webBrowser1.WB.Document.Body, "Server NL P1", ref link))
{
  link.InvokeMember("click", null);
}
[已编辑]

我刚刚用下面的HTML对它进行了测试,它可以正常工作。注意,我确实看到了点击!警惕

<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 active_server = webBrowser1.Document.GetElementById("active_server").GetElementsByTagName("div")[0];
<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>
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");
}

我的猜测是:您试图通过包含在该链接的内部跨度中的文本来查找要单击的链接

试试这个:

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;
}
[已编辑]

如果确定要查找的字符串(例如,服务器NL P1)是唯一的,则可以使用webBrowser1.WB.Document.Body作为搜索根:

HtmlElement link = null;
if (FindLinkToClick(webBrowser1.WB.Document.Body, "Server NL P1", ref link))
{
  link.InvokeMember("click", null);
}
[已编辑]

我刚刚用下面的HTML对它进行了测试,它可以正常工作。注意,我确实看到了点击!警惕

<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 active_server = webBrowser1.Document.GetElementById("active_server").GetElementsByTagName("div")[0];
<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>
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");
}

对不起,我不清楚。我真的不知道元素在什么地方,因为它可能会改变有时有更多的服务器,我必须找到正确的服务器。。。因此,这对特定问题不起作用。请找到要单击的正确链接。不过还是要谢谢你;对不起,我不清楚。我真的不知道元素在什么地方,因为它可能会改变有时有更多的服务器,我必须找到正确的服务器。。。因此,这对特定问题不起作用。请找到要单击的正确链接。不过还是要谢谢你;嗯,看起来不错。。。但我得到一个对象引用错误active\u服务器为空。。。我唯一能想到的是,div是在用户名/密码出现后用JScript生成的。。。这会造成问题吗-顺便说一句-感谢您思考/提出答案:DNo问题,根据您的输入,这是我所能帮助的。我们无法将此转换为交互式调试会话。希望我给了你一个好的切入点。是的,我想你是对的。。。我已经清理了,但仍然是空问题。。。明天我会把头撞在墙上,当我找到答案时,我会把它贴上去,这样其他人可能会幸运。我会把这个问题留待几天,以防万一。。。但我认为赏金会归你所有;不管怎样,谢谢你们,祝你们有一个愉快的编码日。别担心,很高兴它为你们解决了问题:注意,代码真正依赖于:1跨度中的文本是唯一的,2跨度是元素的直接子元素。感谢headup;据我所知,那不是问题。如果是这样的话,我想多亏了你和你的代码,我现在就可以解决这个问题了;嗯,看起来不错。。。但我得到一个对象引用错误active\u服务器为空。。。我唯一能想到的是,div是在用户名/密码出现后用JScript生成的。。。这会造成问题吗-顺便说一句-感谢您思考/提出答案:DNo问题,根据您的输入,这是我所能帮助的。我们无法将此转换为交互式调试会话。希望我给了你一个好的切入点。是的,我想你是对的。。。我已经清理了,但仍然是空问题。。。明天我会把头撞在墙上,当我找到答案时,我会把它贴上去,这样其他人可能会幸运。我会把这个问题留待几天,以防万一。。。但我认为赏金会归你所有;不管怎样,谢谢你们,祝你们有一个愉快的编码日。别担心,很高兴它为你们解决了问题:注意,代码真正依赖于:1跨度中的文本是唯一的,2跨度是元素的直接子元素。感谢headup;据我所知,那不是问题。如果是这样的话,我想多亏了你和你的代码,我现在就可以解决这个问题了;P