C# 如何以编程方式在第三人称上提交特定ID的表单';s网站

C# 如何以编程方式在第三人称上提交特定ID的表单';s网站,c#,html,forms,C#,Html,Forms,在网站上:有用于登录的表单: <form method="post" action="http://www.e-korepetycje.net/zaloguj" id="login-box"> <fieldset> <ul> <li><input type="text" name="login" placeholder="Login or email"></li> <

在网站上:有用于登录的表单:

<form method="post" action="http://www.e-korepetycje.net/zaloguj" id="login-box">
   <fieldset>
      <ul>
         <li><input type="text" name="login" placeholder="Login or email"></li>
         <li><input type="password" name="passwd" placeholder="Password"></li>
         <li><input type="submit" value="Log in"></li>
      </ul>
   </fieldset>
</form>
输出 更新2 我还尝试:

var inputField =  wb.Document.GetElementsByTagName("text")["login"];

但它返回
null

以编程方式与网站(从C应用程序)交互的最简单方法是使用
WebBrowser
控件:

WebBrowser wb = new System.Windows.Forms.WebBrowser();
wb.Navigate(" http://www.e-korepetycje.net/");
现在该站点已加载到嵌入式web浏览器(基于IE)。您可以注入一些JavaScript代码来执行此任务,但从C#也很容易。文档下载和DOM解析完成后,您可以查找表单(使用其ID)。将所有后续代码放入
wb.Document.DocumentCompleted
事件处理程序中(如果愿意,也可以等待
wb.Document.DocumentStatus
属性)

然后在其中找到提交按钮:

var submitButton = form
    .Descendants()
    .First(x => x.TagName == "input" && x.GetAttribute("type") == "submit");
然后模拟单击:

我使用了一个小的helper函数来迭代
HtmlElement
的所有子元素:

public static IEnumerable<HtmlElement> Descendants(this HtmlElement root)
{
    foreach (HtmlElement child in root.Children)
    {
        yield return child;

        if (!child.CanHaveChildren)
            continue;

        foreach (var subChild in Descendants(child))
            yield return child;
    }
}
请注意,同样的技巧也可用于填写表格:

var inputField = form
    .Descendants()
    .First(x => x.GetAttribute("name") == "login");

inputField.SetAttribute("value", "login name to post");

当然,所有这些代码都可以被广泛使用…

您可以创建一个windows窗体,向其添加控件,然后将url设置为网站。将url加载到浏览器控件后,您可以使用方法访问属性以调用脚本(填充用户ID和密码并提交表单)

@DeeMac都不是,它是控制台应用程序。这个网站不是我的,我想在上面填写这个表格,然后按代码提交。好的,我明白了。这个问题具有很大的误导性——首先,我假设您希望使用C#来执行一些通常由JS处理的客户端功能。我本以为这是一个向服务器发出web请求并传递相关凭据的案例,在这种情况下-这不正是该答案所暗示的吗?@DeeMac该答案(在其他主题中)没有从表单
action=”中阐明在何处使用
action
http://www.e-korepetycje.net/zaloguj"
也没有澄清以下内容:
字符串strPost=“username=”+username+”&password=“+password+”&firstname=“+firstname+”&lastname=“+lastname是表单中输入字段的名称等。问题是,答案的作者没有发布其代码所引用的HTML,因此它不是自解释的代码。我相信Adriano已经给了您一个完整的答案。我可以问一下(纯粹出于好奇)你在用这个做什么/为什么这么做吗?@Yoda文档为空,因为下载和DOM解析尚未完成。在DocumentCompleted事件中添加您的代码(用于搜索和填写表单)(更新答案以澄清问题)。@yoda这是一个自定义扩展方法(我包含了代码)。若要这样使用它,您必须将其放在另一个静态类中,否则只需重构以删除“this”。谢谢。您可以在OP上查看更新吗?当文档完成后,我要求该表单的子体并打印它们的数量,其中有0个。这是已完成的wb\U文档的第三行。
var submitButton = form
    .Descendants()
    .First(x => x.TagName == "input" && x.GetAttribute("type") == "submit");
submitButton.RaiseEvent("click");
public static IEnumerable<HtmlElement> Descendants(this HtmlElement root)
{
    foreach (HtmlElement child in root.Children)
    {
        yield return child;

        if (!child.CanHaveChildren)
            continue;

        foreach (var subChild in Descendants(child))
            yield return child;
    }
}
document.forms["login-box"].submit();
var inputField = form
    .Descendants()
    .First(x => x.GetAttribute("name") == "login");

inputField.SetAttribute("value", "login name to post");