怎样找到这个登录按钮?

sgrwetrwertwetrwetrw 2006-07-07 08:27:18
我在MFC中用Microsoft Web浏览器加载了网易的网页。我想要程序找到这个登录按钮元素,<input type="submit" value="登录" />,并点击它。

pobjAllElement->item(COleVariant(strName),COleVariant((long)0),&pDisp);
这句代码只能通过ID 或 NAME 来找到元素吧。但是我现在想找到一个按钮。只能通过按钮的type和value来找,应该怎样找到这个按钮啊?
...全文
260 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
lhwnd=(HWND)m_ie.GetHwnd() 这样可以得到IE控件的句柄吗?
模拟点击登录按钮是不是只要
SendMessage(lhwnd, WM_LBUTTONDOWN, 0,0)
SendMessage(lhwnd, WM_LBUTTONUP, 0,0) 就可以了?但是怎么得到登录按钮的x,y,好点击那里呢?
我想得到按钮上的“登陆”文字,请问这样写对吗?为什么总是报 “应用程序错误”?






IHTMLElement * pElem = NULL;
//LPDISPATCH pDispatch;
IDispatch * pDispatch=NULL;
IHTMLDocument2 * pDoc=NULL;
IHTMLElementCollection * pAllElem = NULL;
VARIANT name;
BSTR tag; //for Element's tagName
// long p; //for IHTMLElementCollection's item number
pDispatch=m_ie.GetDocument();
//ASSERT(pDispatch);
HRESULT hr=pDispatch->QueryInterface(IID_IHTMLDocument2,(void**)&pDoc);
pDoc->get_all(&pAllElem);
// ASSERT(pAllElem);
if(pAllElem!=NULL)
{
name.vt = VT_I4;

//AfxMessageBox("gethere1");
for(int i=0;i<100;i++)//遍历所有元素
{
name.lVal = i;
pAllElem->item(name,name,(IDispatch**)&pElem);//获取元素对象指针
ASSERT(pElem);///////////////////////运行出错!!!!!!!!!!!!!
pElem->get_outerText(&tag);//获取tagName
CString ss(tag); //转化成CString
if(ss.CompareNoCase("登录") ==0)//比较是否为table
AfxMessageBox(ss); //在对话框中显示tagName
::SysFreeString(tag);
}
wglacier 2006-07-12
  • 打赏
  • 举报
回复
tagName就是Input、DIV之类的名字,按钮上的“登陆”等文字可以通过get_InnerText或者get_OuterText得到。put_onclick是更改页面代码里onclick函数的代码,不是模拟点击。你可以或者该按钮的位置,然后向IE控件发送鼠标消息。
  • 打赏
  • 举报
回复
pElem->get_tagName(&tag)这一句是得到元素的 NAME 吧? 但是我根本不知道登录按钮的NAME是什么,怎么在程序中判断得到是登录按钮的 NAME 呢?找到登录按钮以后是不是 pElem->put_onclick 这样模拟点击它? 我把程序中的if(ss.CompareNoCase("Input") ==0) 这一句去掉以后弹出了很多个对话框,但是对话框里面显示的全是乱码,怎么会这样呢?
wglacier 2006-07-08
  • 打赏
  • 举报
回复
不好意思,确实有点儿眼花,居然没看到 “name.lVal = i;”
可能是因为你只赋值了,没有指定类型。
循环前 执行一下:
name.vt = VT_I4;
试试

wglacier 2006-07-08
  • 打赏
  • 举报
回复
另外,在COM里,使用 QueryInterface 获取的指针用完了别忘了 Release
wglacier 2006-07-08
  • 打赏
  • 举报
回复
1、IHTMLElementCollection 调用 get_length可以获取元素的个数,不要硬编码指定100。
2、pAllElem->item(name,name,(IDispatch**)&pElem);//获取元素对象指针
不知是我眼花还是你忘了贴,我没看到你的name这个变量什么时候赋的值,可能这就是你的那句运行出错的原因。你可以从0到itemCount遍历,获取每个元素的指针。

多看看MSDN,IHTMLElementCollection说的还是比较清楚的。
  • 打赏
  • 举报
回复
我想要程序找到这个登录按钮元素,<input type="submit" value="登录" />,并点击它,请高手帮我改改这段代码
IHTMLElement * pElem = NULL;
//LPDISPATCH pDispatch;
IDispatch * pDispatch=NULL;
IHTMLDocument2 * pDoc=NULL;
IHTMLElementCollection * pAllElem = NULL;
VARIANT name;
BSTR tag; //for Element's tagName
// long p; //for IHTMLElementCollection's item number
pDispatch=m_ie.GetDocument();
ASSERT(pDispatch);
HRESULT hr=pDispatch->QueryInterface(IID_IHTMLDocument2,(void**)&pDoc);
pDoc->get_all(&pAllElem);
ASSERT(pAllElem);
if(pAllElem!=NULL)
{
//AfxMessageBox("gethere1");
for(int i=0;i<100;i++)//遍历所有元素
{
name.lVal = i;
pAllElem->item(name,name,(IDispatch**)&pElem);//获取元素对象指针
ASSERT(pElem);///////////////////////运行出错!!!!!!!!!!!!!
pElem->get_tagName(&tag);//获取tagName
CString ss(tag); //转化成CString
if(ss.CompareNoCase("Input") ==0)//比较是否为table
AfxMessageBox(ss); //在对话框中显示tagName
::SysFreeString(tag);
}
}
wglacier 2006-07-07
  • 打赏
  • 举报
回复
循环获取所有元素指针,调用元素指针的get_tagName方法,如果是“Input”,然后再检查 "innerText"属性

18,357

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧