string url ="http://www.im286.com/thread-8387090-1-1.html"
SHDocVw.ShellWindows shellWindows = new SHDocVw.ShellWindowsClass();
                    object objFlags = 1;
                    object objTargetFrameName = "";
                    object objPostData = "";
                    object objHeaders = "";
                    SHDocVw.InternetExplorer webBrowser1 = (SHDocVw.InternetExplorer)shellWindows.Item(shellWindows.Count - 1);
                    webBrowser1.Navigate(url, ref objFlags, ref objTargetFrameName, ref objPostData, ref objHeaders);
                    mshtml.IHTMLDocument2 htmlDoc = webBrowser1.Document as mshtml.IHTMLDocument2;
                    mshtml.IHTMLElementCollection inputs;
                    inputs = (mshtml.IHTMLElementCollection)htmlDoc.all.tags("textarea");
                    mshtml.IHTMLElement element = (mshtml.IHTMLElement)inputs.item("fastpostmessage", 0);
                    mshtml.IHTMLInputElement inputElement = (mshtml.IHTMLInputElement)element;
                    inputElement.value = "填充信息";测试的时候,目标页面打开了,但是运行到最后一行出错,提示:未将对象引用设置到对象的实例。
目标页面的信息填写框的代码:<textarea rows="5" cols="80" name="message" id="fastpostmessage" onKeyDown="seditor_ctlent(event, 'fastpostvalidate($(\'fastpostform\'))');" tabindex="4" class="txtarea"></textarea>
<p><button type="submit" name="replysubmit" id="fastpostsubmit" value="replysubmit" tabindex="5">发表回复</button>如何才能查找到 id为fastpostmessage 这个文本框,然后输入值在点确定按钮呢?按钮id为fastpostsubmit

解决方案 »

  1.   

    找了一天还是没有搞定,停在用c#控制ie这块了
      

  2.   

    document.All[ "fastpostmessage"].GetAttribute( "value ")
      

  3.   


    其实过程很简单,我现在遇到的难题就是在如何向打开的页面内填充内容,把这个问题解决了,东西就做好了
    namespace 落伍回帖机
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }        private void button1_Click(object sender, EventArgs e)
            {
                //开始工作
                String web = "http://www.im286.com/";
                String url = textBox1.Text; //目标板块地址
                String regstr = textBox2.Text; //正则
                Int32 xhcs = 5; //循环次数5次
                Int32 htjg = 60;//回帖间隔60秒
                Int32 mljg = 10; //每轮间隔10分钟
                String posttext = textBox5.Text;//回帖内容            if (url == "")
                {
                    MessageBox.Show("目标板块地址有问题", "错误");
                    return;
                }
                if (regstr == "")
                {
                    MessageBox.Show("正则必须填写", "错误");
                    return;
                }            for (Int32 i = 1; i <= xhcs; i++)
                {
                    String html = getHtml(url);//得到源码           
                    String lists = regurl(html, regstr);//得到帖子列表
                    String[] arr = lists.Split(',');
                    foreach (String k in arr.Skip(3)) //跳过置顶帖子
                    {
                    webBrowser.Visible = true;
                    //webBrowser.Navigate(web + k.ToString(), false);
                    webBrowser.Navigate("http://www.im286.com/thread-8393716-1-1.html", false);                
                    while (webBrowser.ReadyState != WebBrowserReadyState.Complete)
                     {
                         //MessageBox.Show("网页还没加载完");
                     }
                     
                     //网页加载完毕,回帖
                                        
                    }           }        }        /// <summary>
            /// 获取指定网页的源文件
            /// </summary>
            /// <param name="url">网页url</param>
            /// <returns>网页源码</returns>
            private string getHtml(string url)
            {
                try
                {
                    WebClient myWebClient = new WebClient();
                    byte[] myDataBuffer = myWebClient.DownloadData(url);
                    return Encoding.Default.GetString(myDataBuffer);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    throw;
                }
            }
            /// <summary>
            /// 提取列表地址
            /// </summary>
            /// <param name="str">源码</param>
            /// <param name="reg1">正则</param>
            /// <returns>返回帖子地址</returns>
            public String regurl(string str, string reg1)
            {
                Regex reg = new Regex(reg1, RegexOptions.IgnoreCase);
                MatchCollection mc = reg.Matches(str);
                String list = String.Empty;
                foreach (Match m in mc)
                {
                    list = list + m.Value + ",";
                }
                return list;
            }        private void button2_Click(object sender, EventArgs e)
            {
                //停止工作
            }    }
    }
      

  4.   

    8楼,因为他要用这种方法取得验证码。
    其实验证码可以在访问的同时直接读取的,
    当然,前提是在保持当前的session或cookie的前提下。
      

  5.   

    关键代码我已经写出来了,已经可以做到自动回帖了 for (Int32 i = 1; i <= xhcs; i++)
                {                String html = getHtml(url);//得到源码           
                    String lists = regurl(html, regstr);//得到帖子列表
                    label10.Text = "得到帖子列表,准备回帖...";
                    String[] arr = lists.Split(',');
                    foreach (String k in arr.Skip(3)) //跳过置顶帖子
                    {
                        webBrowser.Visible = true;
                        webBrowser.Navigate(web + k.ToString(), false);
                        // webBrowser.Navigate("http://www.im286.com/thread-8393716-1-1.html", false);//这里一定要flase才行         
                        while (webBrowser.ReadyState != WebBrowserReadyState.Complete)
                        {
                            //MessageBox.Show("网页还没加载完");
                            label10.Text = "正在打开目标网页...";
                        }
                        //网页加载完毕,回帖
                        HtmlDocument htmlDoc = webBrowser.Document;
                        HtmlElement input = htmlDoc.All["fastpostmessage"];
                        HtmlElement submit = htmlDoc.All["fastpostsubmit"];
                        if (input != null)
                        {
                            //MessageBox.Show("找到控件了");
                            input.InnerHtml = posttext;
                            submit.InvokeMember("click");
                            DateTime sj = DateTime.Now;
                            label10.Text = sj + " 发布成功了";
                            Thread.Sleep(htjg);//回1帖以后暂停时间
                        }
                        else
                        {
                            //没有找到文本输入框
                            MessageBox.Show("没有找到文本输入框,可能的原因为:\n\n1、你没有登录或者ie没有保存登录状态;\n\n2、你登录的帐号在当前设置板块没有回帖权限。");
                            //return;
                            label10.Text = "发布失败,请检查原因";
                            return;
                        }                }
                    label10.Text = " 一轮发完了,正在进行" + mljg + "间隔,无需操作";
                    Thread.Sleep(mljg * 60 * 1000);//每一轮完成后暂停时间
                }
      

  6.   

    用网页去控制是不可靠的,因为网页这里有很多因素会令你的程序停在哪里,例如当时一个网页因为某些元素而没法修改状态为文档下载完,你可以用webclinet,或HttpWebRequest去完成,有很多的验证码等或网页状态都是靠cookies去维持状态的,在服务器端叫做Session,在客户端就叫做Cookie,你要记得去取得cookies并在下次再请求时传上之前的cookie,还要把浏览的一些相关参数也传递上,在服务器端是没办法判断你是程序提交的还是浏览器提交的,建议你看一下HTTP协议的相关,之后拦截一下浏览器提交数据的协议,就可以用程序完全模拟了