http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 8588|回复: 6

[其他] webBrowser1执行的问题怎么操作页面控件

[复制链接]
发表于 2013-4-16 13:55:57 | 显示全部楼层 |阅读模式
在图片中,的webBrowser1中是一个执行JS的网页..
网页代码大概如下
function Calculate()
{
var pt_uin = document.getElementById("pt_uin").value;
var pass = document.getElementById("pass").value;
var captcha = document.getElementById("captcha").value;
var G = QXWEncodePwd(pt_uin,pass,captcha);
document.write(G);
}


<input type="text" name="pt_uin" id="pt_uin" />
<input type="text" name="pass" id="pass" />
<input type="text" name="captcha" id="captcha" />
<input type="text" name="p" id="p" />




C#的代码大致如下
        #region 加密密码
        public void JM(string pt_uin, string pass, string captcha)
        {
            he = webBrowser1.Document.GetElementById("pt_uin");
            he.SetAttribute("value", pt_uin);
            he = webBrowser1.Document.GetElementById("pass");
            he.SetAttribute("value", pass);
            he = webBrowser1.Document.GetElementById("captcha");
            he.SetAttribute("value", captcha);
            webBrowser1.Navigate("javascript:Calculate();");
        }
                #endregion


        private void button1_Click(object sender, EventArgs e)
        {
            qq = textBox1.Text;
            pass = textBox2.Text;
            string url = "https://ssl.ptlogin2.qq.com/check?uin=" + qq + "&appid=1003903&js_ver=10025&js_type=0&login_sig=XaZkLSUGEkUeCKMa9KSphNTcw6JNFu707JGMms0Ir4eGT*zBx3nu3GrFywftWUJD&u1=http%3A%2F%2Fweb.qq.com%2Floginproxy.html&r=0.5501766135943944";
            retstr=asd(url, ref cookie);//获取Cookie
            code = yzyzm(retstr,1);//获取验证码
            pt_uin = yzyzm(retstr, 2);//获取pt_uin
            JM(pt_uin, pass, code);//控制网页执行JS代码
            JMPass = webBrowser1.DocumentText;//加密密码     获取webBrowser1的源代码, 上面的JM函数控制了网页,JS代码Document.Write(G)输出了加密后的字符串,然后直接获取就是加密的密码了,    问题就在这里.如果直接在JM(pt_uin, pass, code);后面获取源代码,可能webBrowser1还没执行好.所以获取的是没执行JS的时候的源代码,而不是执行了JS后输出的源代码...问题就是我应该如何在网页执行完Document.Write(G);后再执行 JMPass = webBrowser1.DocumentText;呢?
}

登录窗口

登录窗口


1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2013-4-16 14:12:17 | 显示全部楼层
你在这个事件里处理就行,当页面加载完成之后才会执行这个事件
webBrowser1_DocumentCompleted
类似于这样的[code=csharp]//本事件是当每次加载完成当前页面后才会执行的
        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            //e.Url是当前加载的页面,
            if (e.Url.ToString().Contains("http://sufeinet.com"))
            {
                //执行操作1
            }
            else if (e.Url.ToString().Contains("http://baidu.com"))
            {
                //执行操作2
            }
        }[/code]
 楼主| 发表于 2013-4-16 14:25:09 | 显示全部楼层
不行的...我试过了...因为Document.Write(G);这句执行后,是不会触发这个事件的...我试过了
发表于 2013-4-16 14:42:44 | 显示全部楼层
bin8673853 发表于 2013-4-16 14:25
不行的...我试过了...因为Document.Write(G);这句执行后,是不会触发这个事件的...我试过了

其实我说的是加载完成之后,那你就让这个事件执行之后给一个状态信息,或者是让这个方法触发一下你的那个方法,使用Ajax,document.write(G);在这句下面调用那个方法 ,返正是自己的页面
发表于 2013-4-16 16:40:39 | 显示全部楼层
browser.DocumentCompleted += BrowserOnDocumentCompleted;
            browser.Navigate(url);
            while (browser.ReadyState != WebBrowserReadyState.Complete)
            {
                Application.DoEvents();
            }

            if (browser.Document == null) return null;
            //在这里执行你要做的事情
 楼主| 发表于 2013-4-18 16:38:10 | 显示全部楼层
谢谢上面的前辈和飞哥....我觉得应该把JS写成C#的代码能更好的调用..呵呵..谢谢了~飞哥帮我结下贴吧..
发表于 2013-4-18 17:41:47 | 显示全部楼层
bin8673853 发表于 2013-4-18 16:38
谢谢上面的前辈和飞哥....我觉得应该把JS写成C#的代码能更好的调用..呵呵..谢谢了~飞哥帮我结下贴吧..

已结
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-6-9 04:14

© 2014-2021

快速回复 返回顶部 返回列表