1

次の 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 またはスパン内のテキスト)

私はこのタイプのプログラミングに非常に慣れていません。

EDIT 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>
4

2 に答える 2

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

[編集]

探している文字列 (例: "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");
}
于 2013-08-19T16:12:47.090 に答える
2
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);
};
于 2013-08-11T21:51:22.240 に答える