当前位置: 首页 > 知识库问答 >
问题:

如何在第三者网站上程序化提交特定ID的表格

韩景辉
2023-03-14
<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>

我看过这个话题,但最受欢迎的答案只是一些代码,它并没有引用问题中贴出的HTML,也没有什么HTML,所以很难理解

我用过雷佩蒂的回答。这里得到异常var inputField=descendents(form).first(x=>x.getAttribute(“name”)==“login”);序列不包含指定的元素(invalidoperationexception)。

使用系统;使用System.Collections.Generic;使用System.ComponentModel;使用System.Data;使用System.Drawing;使用System.LINQ;使用System.Text;使用System.Threading.Tasks;使用System.Windows.Forms;

命名空间WindowsFormsApplication1{public分部类Form1:Form{public Form1(){InitializeComponent();WebBrowser wb=new System.Windows.Forms.WebBrowser();wb.DocumentCompleted+=WB_DocumentCompleted;wb.Navigate(“http://www.e-KorepetyCJE.net/”);Console.WriteLine(“After Navigate”);}公共静态IEnumerable后代(HtmlElement根){foreach(root.Children中的HtmlElement子){

            if (!child.CanHaveChildren)
                continue;

            foreach (var subChild in Descendants(child))
                yield return child;
        }
    }

    static void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) {

        WebBrowser wb = ((WebBrowser)sender);
        if (e.Url.AbsolutePath == (sender as WebBrowser).Url.AbsolutePath) {
            Console.WriteLine("COMPLETED");
            //HtmlElementCollection elems = wb.Document.GetElementsByTagName("HTML");
            //Console.WriteLine(elems[0].OuterHtml);
            var form = wb.Document.GetElementById("login-box");
            Console.WriteLine(Descendants(form).Count());


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

            inputField = Descendants(form).First(x => x.GetAttribute("name") == "passwd");
            inputField.SetAttribute("value", "passwd");

            var submitButton = Descendants(form).First(x => x.TagName == "input" && x.GetAttribute("type") == "submit");
            submitButton.RaiseEvent("click");
        }


    }
}
}
After navigate
'WindowsFormsApplication1.vshost.exe' (CLR v4.0.30319: WindowsFormsApplication1.vshost.exe): Loaded 'C:\Windows\assembly\GAC\Microsoft.mshtml\7.0.3300.0__b03f5f7f11d50a3a\Microsoft.mshtml.dll'. Module was built without symbols.
COMPLETED
'WindowsFormsApplication1.vshost.exe' (CLR v4.0.30319: WindowsFormsApplication1.vshost.exe): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Core.resources\v4.0_4.0.0.0_pl_b77a5c561934e089\System.Core.resources.dll'. Module was built without symbols.
A first chance exception of type 'System.InvalidOperationException' occurred in System.Core.dll
12
'WindowsFormsApplication1.vshost.exe' (CLR v4.0.30319: WindowsFormsApplication1.vshost.exe): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Configuration\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.

我也试过:

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

但它返回null

共有1个答案

叶冥夜
2023-03-14

以编程方式与网站(从C#应用程序)IMO交互的最简单方法是使用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 form = wb.Document.GetElementById("login-box");

然后在其中找到submit按钮:

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

顺便说一句,如果您想要注入JavaScript代码,它只需要这样(当然,您需要更多的代码来使用document.createElement()创建脚本函数,并使用document.invokescript()调用它):

document.forms["login-box"].submit();

请注意,同样的技术也可以应用于填写表单:

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

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

当然,所有这些代码都可以泛化到可以重用的程度...

 类似资料:
  • 我正在构建一个移动Web应用程序,它从我构建的Symfony2应用程序中获取信息。用户必须提交一个表单才能查看信息,但是当我通过AJAX提交表单时,处理它的控制器看不到正在提交的表单。 移动应用程序是用Cordova构建的,因此表单来源于静态HTML表单。一旦通过AJAX提交,AJAX将返回所需的数据。然而,表单提交很好,这让AJAX发挥了神奇的作用,但是Symfony2没有看到表单被提交。我对

  • 问题内容: 我想知道一种如何使用ajax或curl在外部站点(PHP)的多个页面上自动填充多个表单(使用)。 例如,一个站点有一个表单,可将您带到提交表单的时间,而还有另一种表单也需要填写和提交。我想从我的本地服务器自动填写两个表格。我该如何做到? 问题答案: 最简单的方法是使用油脂类(https://addons.mozilla.org/en- US/firefox/addon/greasemo

  • 问题内容: 我想知道是否有某种方法可以在运行某个应用程序之前强制将某些特定进程ID运用于Linux。我需要提前知道进程ID。 问题答案: 实际上,有一种方法可以做到这一点。由于设置了CONFIG_CHECKPOINT_RESTORE的内核3.3(在大多数发行版中已设置),因此存在/ proc / sys / kernel / ns_last_pid,其中包含内核生成的最后一个pid。因此,如果要为

  • Edge:(Mozilla/5.0(Windows NT 6.1;Win64;x64)AppleWebKit/537.36(KHTML,like Gecko)Chrome/83.0.4103.97 Safari/537.36 EDG/83.0.478.45) 其中4个浏览器的共同点是Chrome和Safari关键字接受FireFox,但android上的FireFox在userAgent字符串中显

  • 我已经使用create react app构建了一个静态react网站,并使用git和github在netlify中部署了它。事实证明,我现在必须在我的网站上做一个小小的改变。我应该怎么做才能使更改反映在已部署的站点上。我在github中提交了更改,但更改没有显示在实时部署的url中。

  • 本文向大家介绍Git 在特定日期提交,包括了Git 在特定日期提交的使用技巧和注意事项,需要的朋友参考一下 示例 该--date参数设置作者日期。例如,此日期将出现在的标准输出中git log。 还要强制提交日期: date参数接受GNU date支持的灵活格式,例如: 当日期未指定时间时,将使用当前时间,仅日期将被覆盖。