这两天写一个自动获取好友列表并访问好友空间留言的程序,到最后提交留言那里卡住了,求各位大大们帮忙! 我的方法思路如下: 
1、获取按钮的HtmlElement对象,热闹后直接调用e2.InvokeMember("Click"),此法不管用.
2、还是上面的原理,用js的方法来执行,还没试!
3、模拟按键的方法,留言的时候可以按Ctrl+Enter快捷键可以留言,我用Sendkeys.Send(^Enter)的方法也没反应,也许可能是焦点的问题,我比较迷惑!
4、最后的办法,是我最不想用的,就是获取按钮坐标,然后移动鼠标到按钮上面,再模拟鼠标单击,这种办法需要控制用户鼠标,我不喜欢。尽管如此,我还是不知道如果获取网页中按钮的坐标,以及移动光标并模拟单击。
以上就是菜鸟我的想法,请大大们过目,分析分析,并指出一种可行的方法。
附上按钮html
<button type="button" class="gb_bt" id="btnPostMsg">发表</button>

解决方案 »

  1.   

    refer:
     private void Form1_Load(object sender, EventArgs e)
            {
                this.webBrowser1.Url = new Uri("http://www.baidu.com");
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                HtmlElement searchWords = webBrowser1.Document.All["kw"];
                HtmlElement searchButton = webBrowser1.Document.All["su"];
                searchWords.SetAttribute("value", "guwei4037");
                searchButton.InvokeMember("click");
            }
      

  2.   

    1L的方法我不是说在方法一种试过了,Click和click都无效!没一点反映,再补充一点,QQ空间用了很多框架,我是遍历框架获取的e2(留言按妞)对象
      

  3.   

     private void Form1_Load(object sender, EventArgs e)
            {
                this.webBrowser1.Url = new Uri("http://user.qzone.qq.com/345822155/infocenter#!app=334&url=http%3A%2F%2Fctc.qzs.qq.com%2Fqzone%2Fmsgboard%2Fmsgbcanvas.html%23page%3D1");
            }        private void button1_Click(object sender, EventArgs e)
            {
                HtmlElement searchButton = webBrowser1.Document.Window.Frames["tgb"].Document.All["btnPostMsg"];
                searchButton.InvokeMember("click");
            }
      

  4.   

     private void Form1_Load(object sender, EventArgs e)
            {
                this.webBrowser1.Url = new Uri("http://user.qzone.qq.com/345822155/infocenter#!app=334&url=http%3A%2F%2Fctc.qzs.qq.com%2Fqzone%2Fmsgboard%2Fmsgbcanvas.html%23page%3D1");
            }        private void button1_Click(object sender, EventArgs e)
            {
                HtmlElement searchButton = webBrowser1.Document.Window.Frames["tgb"].Document.All["btnPostMsg"];
                searchButton.InvokeMember("click");
            }

    嗯 确实可以 是我太笨了,你这可以是因为当你点击按钮时整个内容都加载好了,虽然我也用了DocumentCompleted事件来判断但还是会出现 还没有填写内容的 提示,但是我文本区域前面已经赋值,揣摩了还就才发现要进行提交,是要等到那个编辑工具全部加载完成才可以,于是加了个timer循环判断,当满足条件时再提交数据。总之,程序基本完成够用了,非常感谢你!
      

  5.   

    你说的不错,要等页面都加载好了,才有效。DocumentCompleted事件判断也很对头。
      

  6.   

     private void Form1_Load(object sender, EventArgs e)
            {
                this.webBrowser1.Url = new Uri("http://user.qzone.qq.com/345822155/infocenter#!app=334&url=http%3A%2F%2Fctc.qzs.qq.com%2Fqzone%2Fmsgboard%2Fmsgbcanvas.html%23page%3D1");
            }        private void button1_Click(object sender, EventArgs e)
            {
                HtmlElement searchButton = webBrowser1.Document.Window.Frames["tgb"].Document.All["btnPostMsg"];
                searchButton.InvokeMember("click");
            }

    嗯 确实可以 是我太笨了,你这可以是因为当你点击按钮时整个内容都加载好了,虽然我也用了DocumentCompleted事件来判断但还是会出现 还没有填写内容的 提示,但是我文本区域前面已经赋值,揣摩了还就才发现要进行提交,是要等到那个编辑工具全部加载完成才可以,于是加了个timer循环判断,当满足条件时再提交数据。总之,程序基本完成够用了,非常感谢你!
    再弱弱地问一下,向这种有Id的框架可以直接根据id名获取,如果没有,像只有个class有什么好的办法?除了循环遍历!
      

  7.   

    这个还没研究过,刚才简单看了一下,估计不行,回头再研究一下。不过class是个类选择器,很多标签都可以用。是否可以获得document的text后,正则解析出你想要的东西。
      

  8.   

    欢迎。
    今天整理优化了下代码,遇到个异常,你遇到木?"InvalidArgument=“tgb”的值对于“windowId”无效。"
    在这一行代码:
    HtmlElement el = webBrowser1.Document.Window.Frames["tgb"].Document.GetElementById(name);