我在MFC中用Microsoft Web浏览器加载了网易的网页。我想要程序找到这个登录按钮元素,<input type="submit" value="登录" />,并点击它。pobjAllElement->item(COleVariant(strName),COleVariant((long)0),&pDisp);
这句代码只能通过ID 或 NAME 来找到元素吧。但是我现在想找到一个按钮。只能通过按钮的type和value来找,应该怎样找到这个按钮啊?

解决方案 »

  1.   

    循环获取所有元素指针,调用元素指针的get_tagName方法,如果是“Input”,然后再检查 "innerText"属性
      

  2.   

    我想要程序找到这个登录按钮元素,<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);
        }
     }
      

  3.   

    1、IHTMLElementCollection 调用 get_length可以获取元素的个数,不要硬编码指定100。
    2、pAllElem->item(name,name,(IDispatch**)&pElem);//获取元素对象指针
    不知是我眼花还是你忘了贴,我没看到你的name这个变量什么时候赋的值,可能这就是你的那句运行出错的原因。你可以从0到itemCount遍历,获取每个元素的指针。多看看MSDN,IHTMLElementCollection说的还是比较清楚的。
      

  4.   

    另外,在COM里,使用 QueryInterface 获取的指针用完了别忘了 Release
      

  5.   

    不好意思,确实有点儿眼花,居然没看到 “name.lVal = i;”
    可能是因为你只赋值了,没有指定类型。
    循环前 执行一下:
    name.vt = VT_I4;
    试试
      

  6.   

    pElem->get_tagName(&tag)这一句是得到元素的 NAME 吧? 但是我根本不知道登录按钮的NAME是什么,怎么在程序中判断得到是登录按钮的 NAME 呢?找到登录按钮以后是不是 pElem->put_onclick 这样模拟点击它? 我把程序中的if(ss.CompareNoCase("Input") ==0) 这一句去掉以后弹出了很多个对话框,但是对话框里面显示的全是乱码,怎么会这样呢?
      

  7.   

    tagName就是Input、DIV之类的名字,按钮上的“登陆”等文字可以通过get_InnerText或者get_OuterText得到。put_onclick是更改页面代码里onclick函数的代码,不是模拟点击。你可以或者该按钮的位置,然后向IE控件发送鼠标消息。
      

  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);
        }