社区
网络及通讯开发
帖子详情
cppwebbrowser navigate方法 身份验证的问题
h13bk
2005-11-28 04:14:34
某些网站需要用户身份才能浏览一些页面,当使用cppwebbrowser控件在浏览时,我已经以合法用户登录后,如果新的页面是在cppwebbrowser中直接点击网页上的连接打开则没有问题,但是如果我想用navigate或者navigate2方法直接跳转到需要浏览的页面时,就会出现用户身份不符合的非法连接错误,请问如何解决?
...全文
543
11
打赏
收藏
cppwebbrowser navigate方法 身份验证的问题
某些网站需要用户身份才能浏览一些页面,当使用cppwebbrowser控件在浏览时,我已经以合法用户登录后,如果新的页面是在cppwebbrowser中直接点击网页上的连接打开则没有问题,但是如果我想用navigate或者navigate2方法直接跳转到需要浏览的页面时,就会出现用户身份不符合的非法连接错误,请问如何解决?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
11 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
dxqxiaoqiang
2006-02-20
打赏
举报
回复
各位老大,我上面提到的地址验证是怎么回事,请高手指导。
dxqxiaoqiang
2006-02-20
打赏
举报
回复
有这样一个网页,http://www.pampers.com.cn/bsod/seebaby.asp?ID=BJ01109,
直接Navigate http://www.pampers.com.cn/bsod/seebaby.asp?ID=BJ01109,就会告诉你地址来源错误,
如果从http://www.pampers.com.cn/bsod/page3d.asp搜索宝宝:BJ01109进入http://www.pampers.com.cn/bsod/seebaby.asp?ID=BJ01109,后refresh()就没有问题。
这里的地址验证服务器可能是如何判断地来源错误的?
minlulu
2006-02-06
打赏
举报
回复
save
Lo
2006-01-19
打赏
举报
回复
同意楼上
蒋晟
2005-12-26
打赏
举报
回复
Session是每个进程一个的,所以你要保持Session的话就要处理newwindow2事件,创建一个包含浏览器控件的窗口,然后返回给newwindow2,这样新的页面会在本进程内打开而不是在IE进程内打开。
gordonwg
2005-12-25
打赏
举报
回复
study
h13bk
2005-12-16
打赏
举报
回复
顶
h13bk
2005-12-12
打赏
举报
回复
老兄,不行啊,这样只能跳转到带有明确用户名密码参数的页面,比方说你例子中的test=333333&PassWord=343200,但是我现在要跳转的只是一个地址,在ie里也只能看到但单纯的.asp结尾的一个字符串,根本不知道它参数的格式(或者会员身份是用cookie之类的检测),然后就算用模拟登陆的办法自动填表进入了,模拟点击连接的时候,有的连接需要弹出新的窗口,这时如果不处理onnewwindow2事件,则弹出ie,显示检测不到会员的权限,如果在onnewwindow2中 *ppDisp=CppWebBrowser1->Application; *Cancel=false; 结果就什么也没有了,我想知道在浏览器中(ie,tt)之类的在弹出新窗口的时候到底怎样处理才能正常显示新的带有会员权限页面?
h13bk
2005-12-10
打赏
举报
回复
多谢,我试试
guanshangming
2005-12-01
打赏
举报
回复
刚刚在CSDN看到的,漏了url地址,供参考。
主 题: CBC程序如何模拟IE登陆web系统,并且访问会员功能?
作 者: _zZ (精灵)
等 级:
信 誉 值: 100
所属社区: C++ Builder 基础类
问题点数: 20
回复次数: 7
发表时间: 2005-11-18 10:41:29
因为测试系统的需要,必须用cbc程序登陆一个有口令的web系统,然后取得页面自动分析海量数据正确与否,但是在登录以后会遇到302错误,其实就是登录验证页面完成后跳转到服务页面,我在取得跳转的页面之后,web系统认为是非法连接,再次跳转,有没有办法实现模拟浏览器点击登录网页呢?
这种功能肯定有,因为在使用专业压力测试软件时候,他们都可以模拟登录以及后续的业务操作,不会被web系统人为是"盗链"也能自动使用302跳转.
这样的程序怎么写呀!高手
(注解:当然不指望适用对有"图形验证码"的系统进行登录:)
回复人: cool222(CSDN 政治辅导员) ( ) 信誉:92 2005-11-18 11:18:00 得分: 0
给你一个直接Post的函数
如:
WebPostData(CppWebBrowser1,"http://211.91.2.221/pass.asp";
,"test=333333&PassWord=343200");
我试过,可以用
void __fastcall TForm1::WebPostData(TCppWebBrowser *CppWebBrowser, String sURL, String sPostData)
{
BSTR bstrHeaders = NULL;
TVariant vFlags = {0}, vTargetFrameName={0}, vPostData={0}, vHeaders={0};
LPSAFEARRAY psa;
LPCTSTR cszPostData = sPostData.c_str();
UINT cElems = lstrlen(cszPostData);
LPSTR pPostData;
LPVARIANT pvPostData;
bstrHeaders = SysAllocString(L"Content-Type: application/x-www-form-urlencodedrn");
if (!bstrHeaders){
Application->MessageBox("Could not allocate bstrHeaders", "Warning", MB_OK | MB_ICONWARNING);
return;
}
V_VT(&vHeaders) = VT_BSTR;
V_BSTR(&vHeaders) = bstrHeaders;
pvPostData = vPostData;
if(pvPostData){
VariantInit(pvPostData);
psa = SafeArrayCreateVector(VT_UI1, 0, cElems);
if(!psa){
return;
}
SafeArrayAccessData(psa, (LPVOID*)&pPostData);
memcpy(pPostData, cszPostData, cElems);
SafeArrayUnaccessData(psa);
V_VT(pvPostData) = VT_ARRAY | VT_UI1;
V_ARRAY(pvPostData) = psa;
}
CppWebBrowser->Navigate((TVariant)sURL, &vFlags, &vTargetFrameName, &vPostData, &vHeaders);
}
更多TCppWebBrowser组件相关文章参阅:http://www.chinaeic.com/bbs/forums.php?forumid=20
Top
回复人: _zZ(精灵) ( ) 信誉:100 2005-11-24 09:46:00 得分: 0
好像还是不行
WebPostData(CppWebBrowser1,"http://aa.aa.com/a.asp?a=1&b=2","");
出来一个列表,找到其中的一个url=newUrlString
WebPostData(CppWebBrowser1,newUrlString,"");
这个时候web会认为不是从http://aa.aa.com/a.asp?a=1&b=2 过来的页面访问,作为盗链,跳转首页,web页面到是显示的很正常,但是我要的那个页面就是不出来!
怎么样在的一页上模拟点击其中一个url呢??!!!
高手!好人做到低!!....
Top
回复人: XBox360(菜)(鸟) ( ) 信誉:100 2005-11-24 10:05:00 得分: 0
我这里有个函数,可以自动填表
偶修改了之后用这个实现了自动登陆等一些功能
你自己修改一下吧
void __fastcall TForm1::PutInput(TCppWebBrowser *CppWebBrowser1, AnsiString ActionStr)
{
//赋值
AnsiString MyStr = ActionStr;
AnsiString SName,SId,SValue;
SName = MyStr.SubString(1,MyStr.Pos(",")-1);
MyStr = MyStr.SubString(MyStr.Pos(",")+1,MyStr.Length()-MyStr.Pos(","));
SId = MyStr.SubString(1,MyStr.Pos(",")-1);
SValue = MyStr.SubString(MyStr.Pos(",")+1,MyStr.Length());
if(SValue==NULL)SValue="";
VARIANT id, index,id1,index1;
IDispatch *spDispatch;
IHTMLDocument2 *pDoc2;
IHTMLElement *pElement;
IHTMLElementCollection *pElementCol;
IHTMLFormElement *pFormElement;
IHTMLInputElement *pInputElement;
IDispatch *WebDocument=static_cast<IDispatch*>(CppWebBrowser1->Document);
pDoc2=static_cast<IHTMLDocument2*>(WebDocument);
//首先获取IWebBrowser2接口
if (SUCCEEDED(pDoc2->get_forms(&pElementCol))) //得到form
{
long p=0;
if(SUCCEEDED(pElementCol->get_length(&p))) //哪一个form
if(p!=0)
{
for(long i=0;i<=(p-1);i++)
{
V_VT(&id) = VT_I4;
V_I4(&id) = i;
V_VT(&index) = VT_I4;
V_I4(&index) = 0;
if(SUCCEEDED(pElementCol->item(id,index, &spDispatch)))
{
if(SUCCEEDED(spDispatch->QueryInterface(IID_IHTMLFormElement,(void**)&pFormElement)))
{
long q=0;
if(SUCCEEDED(pFormElement->get_length(&q))) //得到form中的控件个数
for(long j=0;j<=(q-1);j++)
{
V_VT(&id) = VT_I4;
V_I4(&id) = j;
V_VT(&index) = VT_I4;
V_I4(&index) = 0;
if(SUCCEEDED(pFormElement->item(id,index, &spDispatch)))
{
if(SUCCEEDED(spDispatch->QueryInterface(IID_IHTMLElement,(void**)&pElement)))
{
if(SUCCEEDED(spDispatch->QueryInterface(IID_IHTMLInputElement,(void**)&pInputElement)))
{
//AfxMessageBox("已经获取IHTMLInputTextElement");
BSTR Value;
BSTR Type;
BSTR Id;
BSTR Name;
pInputElement->get_type(&Type); //获取类型
// pInputElement->get_value(&Value); //获取值
pElement->get_id(&Id);//获取Id的方法不一样
// pInputElement->get_name(&Name); //获取它的名字
AnsiString tempName;
tempName = AnsiString(Id).UpperCase();
if(tempName!=NULL && ((tempName.Trim()).Length()>0) && tempName == SId.UpperCase())
{
tempName = AnsiString(Type).UpperCase();
if(tempName == "TEXT") //获取和设置文本框的值
{
// WideString temp = SValue;
pInputElement->put_value((WideString)SValue.c_str());
}
else if(tempName == "PASSWORD") //获取和设置密码框的值
{
pInputElement->put_value((WideString)SValue.c_str());
}
else if(tempName == "RADIO") //获取和设置单选的值
{
pElement->click(); //模拟单击
}
else if(tempName == "CHECKBOX") //获取和设置多选框的值
{
pElement->click(); //模拟单击
// pInputElement->put_checked(j);
}
else if(tempName == "BUTTON") //非提交按钮
{
//pElement->click(); //模拟单击
}
else if(tempName == "SUBMIT") //提交按钮
{
//模拟单击
}
break;
}//如果不符,则不做处理
pInputElement->Release();
}
else //不是input框
{
}
pElement->Release();
}//if pelement
spDispatch->Release();
}
}
pFormElement->Release();
}
spDispatch->Release();
}
}
}
}
if(pDoc2) pDoc2->Release();
}
Top
回复人: _zZ(精灵) ( ) 信誉:100 2005-11-25 10:09:00 得分: 0
很好谢谢!get_form这个我肯定是需要的:)
我还需要一个所有URL的对象,然后模拟点击其中某个URL (xURL->click())然后得到新的body对象; 是不是通过get_links得到所有URL对象呢?具体程序怎么写?我在网络上搜了半天都没有找到,求大家帮忙。
h13bk
2005-12-01
打赏
举报
回复
顶
T
Cpp
Web
Browser
如何调用
navigat
e
OleVariant TargetFrameName,PostData,Heads,Flags; WideString URL; TargetFrameName=AnsiString("");//指定Frame为空字符串时,则在当前Frame中打开网页 PostData = OleVariant(false);//不发送数据 Heads = AnsiSt
Selenium初级 | 使用
navigat
e系列
方法
操作网页
前面我们学了使用get系列
方法
去打开网页,获取页面标题等,使用
navigat
e系列的
方法
也可以打开网页,还可以在不同的页面间进行切换,比如前进到上一个页面,回退到下一个页面。 这些操作和get系列
方法
不同的是,get系列
方法
每一个都是全新的操作,相当于自带了一个默认的刷新页面的功能,而
navigat
e系列的
方法
是基于浏览器的历史记录在操作。 本篇文章介绍四个最常用的
navigat
e系列的
方法
:...
有关于微软的I
Web
Browser
2::
Navigat
e2/
Navigat
e
方法
收藏
有关于微软的I
Web
Browser
2::
Navigat
e2/
Navigat
e
方法
收藏 新一篇: 说说BES | 旧一篇: 有关于JAVA与后端C应用UTF8字符的通信 function StorePage(){d=document;t=d.selection?(d.selection.type!=None?d.selection.createRange().text:
uni-app微信小程序uni.
navigat
eTo跳转无效
问题
;记录一次uni-app页面跳转无效,来回跳转
问题
;wx.
navigat
eTo ,跳转超过10次怎么点不动的解决办法。
场景需求:从小程序A页面跳转到小程序B页面,然后B页面还可以跳到A页面。 跳转失效原因: –1.uni.
navigat
eTo只能跳转到非tabBar页面,tabBar导航栏页面只能用uni.switchTab
方法
跳转; –2.uni.
navigat
eTo跳转的页面栈太多了,超过十层页面栈就会导致跳转失败。 解决办法: 1.尽量使用uni.redirectTo替换uni.
navigat
eTo;因为uni.redirectTo会关闭当前页面,跳转到应用内的某个页面。 2.wx.
navigat
eTo .
【比较】C
Web
Browser
2类
Navigat
e
方法
的一些
问题
C
Web
Browser
2::
Navigat
e2()之后,有时会收不到DocumentComplete事件? 这个事件在所有资源(包括链接的CSS、脚本、图片等等)下载完毕之后触发。 IE的一个版本存在这样的
问题
。 浏览器控件被隐藏时这个事件也不会被触发 C
Web
Brows
网络及通讯开发
1,317
社区成员
8,874
社区内容
发帖
与我相关
我的任务
网络及通讯开发
C++ Builder 网络及通讯开发
复制链接
扫一扫
分享
社区描述
C++ Builder 网络及通讯开发
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章