C# 从控制台应用程序中单击html按钮

C# 从控制台应用程序中单击html按钮,c#,.net,windows,console-application,C#,.net,Windows,Console Application,我正在构建一个控制台应用程序,从中获取页面的html,并使用HtmlAgilityPack对其进行解析。修改此页面上的表单的某些值后,我希望通过单击同一页面上的提交按钮来提交表单。我能够使用按钮的ID属性获取按钮,但无法通过编程方式单击它。 那我该怎么做呢?基本上,我想在填写详细信息后提交表单,因此有没有办法通过控制台应用程序实现这一点。您不能从控制台应用程序发布HTML文档。 获取文档意味着您解析了HTML文本,但没有链接到运行页面的Web服务器,该服务器将侦听您的回发 您唯一的方法是在控制台

我正在构建一个控制台应用程序,从中获取页面的html,并使用HtmlAgilityPack对其进行解析。修改此页面上的表单的某些值后,我希望通过单击同一页面上的提交按钮来提交表单。我能够使用按钮的ID属性获取按钮,但无法通过编程方式单击它。
那我该怎么做呢?基本上,我想在填写详细信息后提交表单,因此有没有办法通过控制台应用程序实现这一点。

您不能从控制台应用程序发布HTML文档。 获取文档意味着您解析了HTML文本,但没有链接到运行页面的Web服务器,该服务器将侦听您的回发

您唯一的方法是在控制台应用程序上运行WebBrowser,导航到您的页面,一旦导航发生,检索文档文本,根据需要解析它,然后通过WebBrowser调用按钮上的Click方法

以下是一个小示例:

class Program
{
    private static WebBrowser wb1 = new WebBrowser();

    [STAThread]
    static void Main(string[] args)
    {
        runBrowserThread(new Uri("http://www.google.it"));
    }

    private static void runBrowserThread(Uri url)
    {
        var th = new Thread(() => {
            var br = new WebBrowser();
            br.DocumentCompleted += Br_DocumentCompleted; ;
            br.Navigate(url);
            Application.Run();
        });
        th.SetApartmentState(ApartmentState.STA);
        th.Start();
    }

    private static void Br_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        //Retrieve string content of document
        var document = ((WebBrowser)sender).Document;
        var documentAsIHtmlDocument3 = (mshtml.IHTMLDocument3)document.DomDocument;
        var content = documentAsIHtmlDocument3.documentElement.innerHTML;

        //Parse content with html agility pack or whatever

        //Click on button
        wb1.Document.GetElementById("myId").InvokeMember("click");

        Application.ExitThread();
    }
}
考虑到我没有测试它,但应该是一个起点。此外,如果你有一个复杂的页面,你可能不想依赖于Internet Explorer(默认WebBuffer)来加载你的页面,但是可能考虑使用GeckoFX来使用Firefox,在这种情况下,你必须以与IE对应的方式有点不同的方式来编写HTML检索部分。
如果您想试用此示例,请记住包含System.Windows.Forms和Microsoft.mshtml。您不能从控制台应用程序发布HTML文档。 获取文档意味着您解析了HTML文本,但没有链接到运行页面的Web服务器,该服务器将侦听您的回发

您唯一的方法是在控制台应用程序上运行WebBrowser,导航到您的页面,一旦导航发生,检索文档文本,根据需要解析它,然后通过WebBrowser调用按钮上的Click方法

以下是一个小示例:

class Program
{
    private static WebBrowser wb1 = new WebBrowser();

    [STAThread]
    static void Main(string[] args)
    {
        runBrowserThread(new Uri("http://www.google.it"));
    }

    private static void runBrowserThread(Uri url)
    {
        var th = new Thread(() => {
            var br = new WebBrowser();
            br.DocumentCompleted += Br_DocumentCompleted; ;
            br.Navigate(url);
            Application.Run();
        });
        th.SetApartmentState(ApartmentState.STA);
        th.Start();
    }

    private static void Br_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        //Retrieve string content of document
        var document = ((WebBrowser)sender).Document;
        var documentAsIHtmlDocument3 = (mshtml.IHTMLDocument3)document.DomDocument;
        var content = documentAsIHtmlDocument3.documentElement.innerHTML;

        //Parse content with html agility pack or whatever

        //Click on button
        wb1.Document.GetElementById("myId").InvokeMember("click");

        Application.ExitThread();
    }
}
考虑到我没有测试它,但应该是一个起点。此外,如果你有一个复杂的页面,你可能不想依赖于Internet Explorer(默认WebBuffer)来加载你的页面,但是可能考虑使用GeckoFX来使用Firefox,在这种情况下,你必须以与IE对应的方式有点不同的方式来编写HTML检索部分。

如果您想尝试此示例,请记住包括System.Windows.Forms和Microsoft.mshtml

这里似乎有您的问题:@PhucTaiLe:我不这么认为。(如果你想说你的链接应该回答OP的问题)对不起,我的意思是链接是回答你的问题:)@PhucTaiLe我的问题完全不同,我不是在制作脚本,也不是直接粘贴到控制台,我在控制台应用程序中获取HTML,并希望在填写表单后从那里执行按钮单击操作。如果我不能执行单击操作,那么解决方法是什么?您不必使用WebBrowser。我不熟悉HtmlAgilityPack,但我相信这是可能的。另一种可能是使用Internet Explorer。您可以使用Internet Explorer,而无需像HtmlAgilityPack那样的窗口。既然您现在正在使用WebBrowser,我想现在提供替代方案已经太迟了。您的问题似乎是:@PhucTaiLe:我不这么认为。(如果你想说你的链接应该回答OP的问题)对不起,我的意思是链接是回答你的问题:)@PhucTaiLe我的问题完全不同,我不是在制作脚本,也不是直接粘贴到控制台,我在控制台应用程序中获取HTML,并希望在填写表单后从那里执行按钮单击操作。如果我不能执行单击操作,那么解决方法是什么?您不必使用WebBrowser。我不熟悉HtmlAgilityPack,但我相信这是可能的。另一种可能是使用Internet Explorer。您可以使用Internet Explorer,而无需像HtmlAgilityPack那样的窗口。由于您现在正在使用WebBrowser,我认为提供替代方案为时已晚。我尝试了它,它引发了以下异常:-System.Windows.Forms.dll中出现了类型为“System.Threading.ThreadStateException”的未处理异常。其他信息:ActiveX控件无法实例化“8856f961-340a-11d0-a96b-00c04fd705a2”,因为当前线程不在单线程单元中@伊曼纽尔·盖蒂:哦,当然,不管怎样,这个古老的甜蜜问题。。。我用working(和tested,这次是:P)代码更新了答案。你可以在这个答案@vidit mathuro中找到更多关于这个问题的信息。很明显,你不知道如何从控制台应用程序发布HTML文档,但这并不能证明这是不可能的。可以在IE窗口而不是WebBrowser窗口中使用Internet Explorer导航到页面。请给我一个证据,证明这是可能的,只需使用控制台和简单的WebRequests即可。另外,默认的WebBrowser在内部使用Internet Explorer,因此我不知道您在说什么about@EmanueleGhetti我已经测试了你的代码,效果很好。非常感谢。我是新手,所以请原谅这可能是一个补救问题。我需要点击网页上的一个按钮。我发现,除非我首先使用
MessageBox.show(content)显示内容,否则.GetElementsById()不会返回任何元素在我执行此操作之前,页面似乎不会加载。这不是一个可接受的解决方案,因为我需要无人值守的操作。有什么建议吗?谢谢。我尝试了它,但它引发了以下异常:-System.Windows.Forms.dll中发生了类型为“System.Threading.ThreadStateException”的未处理异常。其他信息:ActiveX控件“8856f961-340a-11d0-a96b-00c04fd705a2”无法实例化,因为当前线程不在单线程公寓@伊曼纽尔·盖蒂:哦,当然,不管怎样,这个古老的甜蜜问题。。。我更新了